Gotenberg — Wiki Interna

API stateless de conversão de documentos para PDF (HTML, URL, Markdown, DOCX, XLSX, ODT, etc.) hospedada na infraestrutura do escritório Daniel Frederighi Advogados Associados. Esta página é a documentação operacional para uso interno da equipe de Tecnologia e IA.

Serviço ativo Versão: Gotenberg 8 Endpoint: gotenberg.dfasys.com Rede interna: dfanet Acesso da API: somente IP da VPS

1. Sobre o serviço

Gotenberg é uma API HTTP self-hosted que converte documentos para PDF usando, internamente, Chromium (renderização web) e LibreOffice (formatos Office). É stateless: não armazena arquivos, não persiste estado, e pode ser escalado horizontalmente sem coordenação.

Casos de uso típicos no escritório:

  • Gerar PDFs de petições, pareceres e relatórios a partir de HTML ou DOCX renderizado por templates;
  • Converter páginas web em PDF para anexar a processos (preservar prova digital);
  • Mesclar PDFs (juntada de documentos);
  • Carimbar/converter PDFs vindos de fluxos do N8N, Chatwoot ou da plataforma de custódia de áudios.

Documentação oficial completa: gotenberg.dev/docs — esta wiki cobre apenas o nosso uso interno.

2. Como acessar

Externamente (via Traefik)

URL pública: https://gotenberg.dfasys.com

Protegida por IP allowlist: apenas requisições originadas do IP público da própria VPS são aceitas. Qualquer outro IP recebe 403 Forbidden.

Internamente (rede Swarm)

Hostname interno: http://gotenberg_gotenberg:3000

Para serviços rodando dentro da dfanet (N8N, Evolution, Chatwoot, etc.), esta é a forma recomendada: não passa pelo Traefik, é mais rápido e dispensa qualquer autenticação.

3. Segurança e ACL

O Traefik aplica um middleware IPAllowList em todos os endpoints da API (/forms/*, /health, /version, /metrics). Apenas o IP público da VPS está na lista.

OrigemResultado
Requisição da própria VPS (curl, scripts cron, etc.)✓ Permitido
Outro container do Swarm via dfanet✓ Permitido (não passa pelo Traefik)
Qualquer outro IP externo✗ 403 Forbidden

Esta página de wiki (rota /) é pública. Não documente segredos, IPs internos sensíveis, credenciais ou caminhos de processos aqui.

Para liberar um novo IP, editar o middleware gotenberg-ipallow no arquivo /root/gotenberg.yaml e fazer docker stack deploy -c gotenberg.yaml gotenberg.

4. Endpoints principais

MétodoCaminhoFunção
GET/healthHealthcheck (status do Chromium e LibreOffice)
GET/versionVersão do Gotenberg em execução
GET/metricsMétricas Prometheus
POST/forms/chromium/convert/htmlConverte HTML enviado (multipart) em PDF
POST/forms/chromium/convert/urlRenderiza uma URL e devolve PDF
POST/forms/chromium/convert/markdownConverte Markdown em PDF (via template HTML)
POST/forms/chromium/screenshot/urlScreenshot PNG/JPEG de uma URL
POST/forms/libreoffice/convertConverte DOCX/XLSX/ODT/PPT em PDF
POST/forms/pdfengines/mergeMescla múltiplos PDFs em um só
POST/forms/pdfengines/convertConverte PDF para PDF/A (arquivamento)

5. Exemplos práticos

5.1 — HTML → PDF (a partir de arquivo local)

# index.html é o documento principal; arquivos extras (CSS, imagens) também
# podem ser anexados na mesma chamada multipart.
curl -X POST \
  -F "files=@index.html" \
  -F "files=@style.css" \
  -F "marginTop=0.4" -F "marginBottom=0.4" \
  -F "paperWidth=8.27" -F "paperHeight=11.69"   # A4 em polegadas \
  -o saida.pdf \
  https://gotenberg.dfasys.com/forms/chromium/convert/html

5.2 — URL → PDF

curl -X POST \
  -F "url=https://example.com" \
  -F "waitDelay=1s" \
  -o pagina.pdf \
  https://gotenberg.dfasys.com/forms/chromium/convert/url

5.3 — DOCX → PDF

curl -X POST \
  -F "files=@peticao.docx" \
  -o peticao.pdf \
  https://gotenberg.dfasys.com/forms/libreoffice/convert

5.4 — Mesclar PDFs

curl -X POST \
  -F "files=@parte1.pdf" \
  -F "files=@parte2.pdf" \
  -F "files=@parte3.pdf" \
  -o juntada.pdf \
  https://gotenberg.dfasys.com/forms/pdfengines/merge

5.5 — Converter para PDF/A (arquivamento de longo prazo)

curl -X POST \
  -F "files=@original.pdf" \
  -F "pdfa=PDF/A-2b" \
  -o arquivo.pdf \
  https://gotenberg.dfasys.com/forms/pdfengines/convert

PDF/A é o padrão recomendado para arquivamento legal de documentos. Combina bem com a plataforma de custódia de áudios para garantir integridade dos anexos.

6. Integrações internas

Para serviços rodando no Swarm, usar o hostname interno evita o Traefik e o IPAllowList:

# Dentro do N8N (HTTP Request node), Chatwoot, Evolution, etc.
POST http://gotenberg_gotenberg:3000/forms/libreoffice/convert

Configurações recomendadas:

  • N8N: usar nó HTTP Request com Send Binary File habilitado.
  • Scripts Bash/cron na própria VPS: a URL pública também funciona; serão liberados pelo allowlist.
  • Paperclip AI (paperclip.dfasys.com): chamar via DNS interno se for adicionado à dfanet.

7. Operação e manutenção

AçãoComando
Statusdocker service ls | grep gotenberg
Logs em tempo realdocker service logs gotenberg_gotenberg -f
Re-deploydocker stack deploy -c /root/gotenberg.yaml gotenberg
Atualizar imagemdocker service update --image gotenberg/gotenberg:8 gotenberg_gotenberg
Reiniciardocker service update --force gotenberg_gotenberg
Parardocker stack rm gotenberg

8. Limites e tuning

ParâmetroValor atualOnde alterar
Timeout por requisição300s--api-timeout em gotenberg.yaml
Tamanho máximo do corpo512 MB--api-body-limit em gotenberg.yaml
Limite de CPU2 vCPUdeploy.resources.limits.cpus
Limite de RAM2048 MBdeploy.resources.limits.memory
Réplicas1deploy.replicas

Conversões com muitas imagens ou planilhas Excel grandes podem encostar no limite de RAM. Aumentar para 4 GB se aparecer OOM nos logs.

9. Troubleshooting

403 Forbidden

O IP de origem não está no allowlist. Verifique se a chamada está sendo feita da própria VPS ou ajuste o middleware no gotenberg.yaml.

504 Gateway Timeout

A conversão ultrapassou os 300s. Reduzir tamanho do documento, simplificar CSS pesado ou aumentar --api-timeout.

Falha em DOCX com fontes específicas

LibreOffice usa as fontes embarcadas no container. Para usar fontes corporativas, montar um volume em /usr/share/fonts/truetype/dfa e rodar fc-cache -f. Coordenar com a equipe de TI antes.

PDFs sem acentos ou caracteres especiais

Garantir que o HTML declare <meta charset="utf-8"> e que os arquivos sejam enviados em UTF-8 (não Latin-1).