Plataforma de documentação — arquitetura e operação¶
Este documento é sobre o site de documentação (docs.garantora.com.br) — o que ele é, como rodar, validar e publicar. Para o deploy do produto, ver deployment.md.
Arquitetura da solução¶
Markdown puro em docs/ → Material for MkDocs gera um site estático (site/, artefato — nunca versionado) → servido por nginx num container próprio (docs) → exposto direto pelo nginx nativo do host (systemd + certbot, fora deste repositório) — não há Caddy nesta stack (migração db/redis/mailpit para serviços nativos, que também aposentou o Caddy interno do dev-remote em favor do roteamento por path no próprio nginx do host).
flowchart LR
Docs["docs/*.md\n+ mkdocs.yml"] -->|"mkdocs build --strict"| Site["site/\n(artefato estático)"]
Site -->|"COPY (no build da imagem)"| Nginx["container docs\nnginx:alpine\n127.0.0.1:8082"]
Nginx -->|"proxy_pass :8082"| HostNginx["nginx do HOST\n(fora do git) + certbot"]
HostNginx --> Internet(("docs.garantora.com.br")) Mesmo padrão do web (build em duas etapas — Node/Python gera o artefato, nginx serve), mesma rede Docker (garantora-devremote_default) — nenhum proxy público novo dentro do Docker, nenhum segundo gerenciador de dependências (requirements-docs.txt é pip, como a própria API já usa por baixo do uv). O nginx do host é compartilhado com outra stack (advfl) que já divide a VPS — ver infra/dev-remote/README.md, "Topologia".
O site é aberto, sem senha: até 2026-10-15 o server do nginx do host exigia Basic Auth (auth_basic com um .htpasswd em formato apr1), e ela foi retirada — a documentação passou a ser lida sem credencial.
Por que dev-remote, e não produção. Até 2026-08-30 este site vivia em
infra/prd(a mesma migração que o criou), e cada atualização de Markdown só ficava visível depois de um deploy de produção — o que não é o objetivo de um site de documentação em desenvolvimento ativo. O tweak "docs fora de produção" moveu tudo parainfra/dev-remote: agora publicar a documentação é reconstruir o containerdocsdo dev-remote (ver "Como publicar" abaixo). Produção não serve maisdocs.garantora.com.brem nenhuma forma.
Como rodar localmente¶
python3 -m venv .venv-docs && source .venv-docs/bin/activate
pip install -r requirements-docs.txt
mkdocs serve # http://127.0.0.1:8000, hot reload
mkdocs serve não passa pelo nginx do host — é só para escrever e revisar antes de publicar.
Como criar uma especificação, fix ou ADR¶
Desde 2026-10-15 não há skill próprio para escrever spec ou fix — os antigos /spec, /fix e /tweak foram removidos, e o trabalho é conduzido pelo plugin Superpowers. A fonte de como cada tipo de trabalho anda, e de onde ele grava, é a seção Fluxo de desenvolvimento do CLAUDE.md da raiz; aqui fica só o que toca a documentação:
- Specification (funcionalidade) — o
brainstormingescreve emdocs/specifications/NNNN-slug/specification.md, sobre o template../doc-templates/specification.md; o plano dowriting-plansvai ao lado, emplan.md. Não emdocs/superpowers/, que é o padrão do plugin. - Fix (defeito) —
docs/fixes/NNNN-slug.md, sobre o template../doc-templates/fix.md; evidência e print emdocs/fixes/assets/. - O número sai de
bash scripts/proximo-numero-spec.shoubash scripts/proximo-numero-fix.sh— sequencial, nunca reutilizado. - Ajuste direto (ícone, palavra, espaçamento) — não gera documento: o registro é a mensagem de commit. A pasta
../tweaks/é só histórico do tempo em que o/tweakescrevia ali, e não recebe arquivo novo. - ADR — copie
../doc-templates/adr.mdparadocs/decisions/ADR-NNNN-slug.md(próximo número sequencial) e adicione a linha na tabela de../decisions/index.md.
Em todos os casos, adicione a entrada correspondente em ../metadata/catalog.yaml, no mesmo formato das existentes, e a linha na tabela do índice da pasta (specifications/index.md, fixes/index.md). Ninguém faz isso automaticamente: sem a entrada, o documento só é alcançável por URL direta no site publicado. O roadmap.md, que até 2026-10-15 vivia como ROADMAP.md na raiz do repositório, agora está em docs/ e é publicado com o resto.
Como gerar o site¶
--strict transforma todo aviso (link quebrado, referência de nav ausente, âncora inexistente) em falha — é a validação principal desta plataforma. O resultado vai para site/ (artefato, .gitignore, nunca commitado).
Como validar¶
mkdocs build --strict # links, nav, âncoras — falha se qualquer um estiver errado
python3 scripts/docs_lint.py # front matter, IDs duplicados, catálogo consistente com os arquivos
scripts/docs_lint.py cobre o que o mkdocs build não cobre: YAML de front matter válido, id único no repositório inteiro, type/status dentro da lista controlada (../metadata/README.md), toda entrada do catálogo apontando para um arquivo que existe, e todo arquivo com front matter tendo entrada no catálogo.
Como publicar¶
O site faz parte da stack infra/dev-remote, não da de produção — não há passagem por /ship. Há dois caminhos, conforme de onde vem o conteúdo:
- O que está no checkout do dev-remote —
/devremote-rebuild docs(ou junto de outros serviços:/devremote-rebuild web docs). Reconstrói a imagemdocsa partir da árvore de trabalho do checkout principal e recria o container. - Uma branch de trabalho, para validar pela web antes do merge —
Monta dois worktrees temporários — a infra de build (Dockerfile, nginx) sempre da main, o conteúdo (docs/, mkdocs.yml, requirements-docs.txt) da branch pedida —, roda mkdocs build --strict se houver .venv-docs no host (senão a validação acontece no build da imagem), reconstrói a imagem garantora-devremote-docs e recria só o container docs, sem mexer no HEAD do checkout principal nem em api/web. O site passa a servir aquela branch até a próxima publicação — ele é um só, compartilhado pelo time.
O que fica fora do repositório. Quem termina o TLS público e roteia por domínio é o nginx nativo do host (systemd + certbot) — não há Caddy nesta stack. docs.garantora.com.br é um server próprio, apontando para o container docs publicado em 127.0.0.1:8082 (ver infra/dev-remote/README.md, "Topologia" e "Provisionamento"):
- DNS — A record de
docs.garantora.com.br→145.223.94.55(já feito). serverdo nginx do host —/etc/nginx/sites-available/docs.garantora.com.br, com o certificado emitido pelo certbot; umproxy_passpara127.0.0.1:8082, semauth_basic.
Como atualizar¶
Editar o Markdown em docs/ (página nova entra também no nav do mkdocs.yml), rodar as validações acima e publicar por um dos dois caminhos de "Como publicar".
Como fazer backup¶
O site é derivado — site/ é reconstruído a partir de docs/ a cada build, e docs/ já está versionado no Git como o resto do repositório. Não há dado próprio a salvar (diferente do Postgres): o backup deste componente é o backup do repositório.
Como fazer rollback¶
Depois, /devremote-rebuild docs reconstrói a imagem docs com o conteúdo revertido (ou bash scripts/publicar-preview-docs.sh main, para voltar o site à main depois de uma prévia de branch). Não há "deploy inteiro" a reverter aqui — o site de documentação não é mais parte da stack de produção (ver deployment.md para o rollback do produto, que é independente).
Como diagnosticar erros¶
| Sintoma | Causa provável | Onde olhar |
|---|---|---|
mkdocs build --strict falha | link relativo quebrado, arquivo referenciado no nav sem existir, ou front matter YAML inválido | a própria mensagem de erro cita arquivo e linha |
| Site sobe mas página em branco/404 | docs_dir/nav desalinhado com a árvore real, ou build falhou silenciosamente antes do COPY no docs.Dockerfile | docker compose logs docs, e rodar mkdocs build --strict local primeiro |
docs.garantora.com.br não responde | DNS não apontado, server do nginx do host ausente/errado, ou certificado ainda não emitido | na VPS: nginx -t, systemctl status nginx, certbot certificates — depois docker compose logs docs para o container em si |
| 401 ao abrir o site | o server do nginx do host ainda tem auth_basic — o site não tem mais senha desde 2026-10-15 | na VPS: /etc/nginx/sites-available/docs.garantora.com.br, depois nginx -t e systemctl reload nginx |
| O site mostra conteúdo de outra branch | a última publicação foi uma prévia (publicar-preview-docs.sh <branch>) | republicar a main (ver "Como fazer rollback") |
| Mermaid não renderiza | sintaxe do bloco mermaid errada, ou pymdownx.superfences sem o custom_fences do mkdocs.yml | inspecionar o console do navegador; conferir mkdocs.yml |
Como a IA deve consumir esta documentação¶
Ver ../ai-guide.md — não duplicado aqui.