Pular para o conteúdo principal

Variáveis no container (JWT, PostgreSQL, …)

Template sem segredos: .env.example. Deploy: deploy/index.md. Runbook BD: runbooks/postgres.md.

Além de Postgres e JWT, produção deve definir REDIS_*, SMTP_* e CORS_ORIGIN. Não commite .ENV.

ECONNREFUSED 127.0.0.1:5432 no Docker

Significa que no container não chegaram DATABASE_HOST / AUTH_DATABASE_HOST (ou estão vazias). O código cai nos defaults localhost + 5432, que dentro do container apontam para o próprio container, não para o teu servidor PostgreSQL (ex. 31.97.20.140).

Correção: no painel do serviço (Swarm, etc.), injeta exatamente as mesmas chaves que no ficheiro local. A BD principal aceita qualquer destes conjuntos: POSTGRES_* (POSTGRES_HOST, POSTGRES_PORT, POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DATABASE), ou DATABASE_*, ou libpq (PGHOST, PGPORT, PGUSER, PGPASSWORD, PGDATABASE). O segundo banco (login) continua só com AUTH_DATABASE_*.

Ao arranque, se detetar Docker (/.dockerenv) sem host resolvido para a BD principal (nenhum de POSTGRES_HOST / DATABASE_HOST / PGHOST) ou sem AUTH_DATABASE_HOST, a app falha de imediato com mensagem explícita (em vez de várias tentativas TypeORM).

JWT

JWT_SECRET continua a ser preferível no ambiente; se faltar, o código pode usar um fallback (ver jwt.config.ts).

Docker Compose (local)

  • Coloca o teu .ENV na mesma pasta que compose.yaml (todas as chaves: PORT, NODE_ENV, DATABASE_*, AUTH_DATABASE_*, JWT_SECRET, JWT_EXPIRES_IN_SECONDS, …).

  • Comando (obrigatório o --env-file, senão os ${VAR} do Compose ficam vazios):

    docker compose --env-file .ENV up -d --build
  • O compose.yaml passa direto para o container todas as chaves em environment: (POSTGRES_, AUTH_DATABASE_, JWT_*, …), preenchidas a partir do .ENV. O volume ./.ENV:/app/.ENV duplica o ficheiro para o bootstrap-env.ts (ex. chaves vazias no painel).

  • Se usares só .env minúsculo, ajusta env_file e o volume no compose.yaml (há comentário de exemplo no ficheiro).

Docker Swarm / painel (ex.: gevtech)

O compose.yaml com volume ./.ENV assume que corres o Compose na máquina onde o ficheiro existe. Em plataformas que só fazem pull da imagem, não há .ENV no servidor — aí tens de colar no painel as mesmas variáveis que no teu .ENV local (PORT, NODE_ENV, DATABASE_HOST, DATABASE_PORT, DATABASE_USER, DATABASE_PASSWORD, DATABASE_NAME, AUTH_DATABASE_*, JWT_SECRET, JWT_EXPIRES_IN_SECONDS, APP_URL, PASSWORD_RESET_PAGE_URL, SMTP_*, …).

A imagem não inclui .env. É preciso uma destas opções:

  1. Variáveis de ambiente do serviço — copiar do teu .env local para o painel: JWT_SECRET, DATABASE_* / POSTGRES_*, AUTH_DATABASE_*, PORT, etc.
  2. Secret em ficheiro — montar o segredo (ex. /run/secrets/jwt_secret) e definir JWT_SECRET_FILE=/run/secrets/jwt_secret.
  3. Config / volume — montar um ficheiro de ambiente em /app/.env dentro do container; o bootstrap-env carrega antes do Nest.

Se o serviço só faz pull da imagem e arranca sem env, o erro JWT_SECRET não definido continua até configurares o ponto 1, 2 ou 3.