Estrutura de Diretórios e Modelo de Execução¶
Status¶
Aprovado
Contexto¶
A estrutura de /opt/pagesaude cresceu sem um critério registrado, gerando dúvidas recorrentes:
- se a raiz
/opt/pagesaudecontinua adequada ou se deveríamos usar diretórios padrão do sistema operacional (/srv,/var/lib,/var/log); - onde aplicações devem ficar em relação aos serviços de infraestrutura compartilhados;
- se diretórios dedicados de
logs,data,storage,volumes,scriptsebackupsdevem existir; - qual componente deve rodar como container Docker e qual deve rodar direto no sistema operacional via systemd.
Sem esse critério escrito, cada novo serviço foi provisionado por analogia, o que dificulta a evolução e a automação.
Decisão¶
Raiz e organização¶
Manter /opt/pagesaude como raiz do que este repositório provisiona, com três diretórios:
/opt/pagesaude
├── apps/ # aplicações de negócio (webapps, workers)
├── services/ # infraestrutura compartilhada (banco, cache, proxy, observabilidade)
└── secrets/ # segredos gerados pelo provisionamento, fora do versionamento
Aplicações e serviços de infraestrutura permanecem separados por diretório, mas na mesma raiz: o ciclo de vida dos dois é gerenciado pelo mesmo provisionamento, e separá-los em raízes diferentes só aumentaria o número de caminhos a manter.
/opt é adequado porque todo o conteúdo é software adicional, autocontido e gerenciado por
esta automação — exatamente o propósito do diretório no FHS. Migrar para /srv e /var/lib
espalharia um conjunto coeso por vários pontos do sistema, exigiria migração de dados em
produção e não traria ganho operacional.
Logs e dados¶
- Logs: apenas
stdout/stderr. A coleta é feita pelo Alloy via socket do Docker, com rotação configurada no próprio compose (logging.options). Não criar diretórios de log por aplicação nem montar/logs. - Dados persistentes: volumes Docker nomeados, declarados no
compose.yamldo serviço. Não criar/data,/storageou/volumesmanualmente no host. - Backups: permanecem sob o fluxo do serviço de backup do PostgreSQL
(
services/database/postgres/backup/), não em diretório solto no host.
Container ou systemd¶
| Executar via | Critério | Exemplos |
|---|---|---|
| systemd (host) | O componente precisa existir antes ou independentemente do Docker | Docker engine, sshd, agente do provedor, cron do host |
| Container | Todo o resto | aplicações, PostgreSQL, Redis, Traefik, stack de observabilidade, Portainer |
A regra prática: se o componente é pré-requisito para rodar containers, ele é do sistema
operacional; se ele pode ser expresso como um compose.yaml versionado neste repositório,
ele é container.
Consequências¶
- A estrutura atual é preservada; não há migração de dados nem janela de indisponibilidade.
- Novos serviços têm um lugar previsível e um critério objetivo de execução.
- Aplicações que hoje gravam log em arquivo precisam migrar para
stdoutao serem integradas — a coleta não lê arquivos dentro de containers. - Serviços que exigirem estado no host (fora de volume Docker) passam a ser exceção e precisam de justificativa registrada em nova ADR.