Imagem: postgres:16-alpine Pasta: /opt/server/infra/postgres/ Container name: postgres Endereço interno: postgres:5432

Para que serve

Banco Postgres único, compartilhado entre todos os projetos. Cada projeto recebe seu próprio database + role (usuário) com privilégios isolados — nunca compartilhamos credenciais entre projetos.

Variáveis

infra/postgres/.env (gerado pelo bootstrap):
POSTGRES_USER=postgres        # superuser
POSTGRES_PASSWORD=<gerado>    # 48 hex chars
POSTGRES_DB=postgres          # DB inicial (do superuser)

Volume

./data → /var/lib/postgresql/data
Backup: parar o container e tar da pasta data/, ou pg_dumpall rodando dentro do container.

Sem porta exposta

Postgres não publica porta no host. Acesso apenas via server_net:
  • De outro container: postgres:5432
  • Do host (debug): docker compose exec -it postgres psql -U postgres
Se algum dia precisar conectar de fora (ex.: ferramenta gráfica), use SSH tunnel: ssh -L 5432:localhost:5432 vinicius@servidor e conecte em localhost:5432.

Subir

cd /opt/server/infra/postgres
docker compose up -d
Ele leva alguns segundos pra inicializar. O healthcheck (pg_isready) garante que está pronto antes de ser marcado healthy.

Provisionar DB para um projeto

Use o create-db.sh (descrito em Criar bancos):
cd /opt/server/infra/postgres
./create-db.sh meuprojeto
Isso cria:
  • Database meuprojeto
  • Role meuprojeto com senha aleatória
  • Salva credenciais em secrets/meuprojeto.env

Padrão de uso pelos projetos

No docker-compose.yml do projeto:
services:
  app:
    env_file: /opt/server/infra/postgres/secrets/meuprojeto.env
    environment:
      DATABASE_URL: ${DATABASE_URL}
    networks:
      - server_net

networks:
  server_net:
    external: true
Ou copia/symlink o secrets/<projeto>.env para dentro da pasta do projeto.