Variáveis no container (JWT, PostgreSQL, …)
Canónico no site MkDocs: operacao/env-container.md. Template local: .env.example. Deploy: deploy/index.md.
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
.ENVna mesma pasta quecompose.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.yamlpassa direto para o container todas as chaves emenvironment:(POSTGRES_, AUTH_DATABASE_, JWT_*, …), preenchidas a partir do.ENV. O volume./.ENV:/app/.ENVduplica o ficheiro para obootstrap-env.ts(ex. chaves vazias no painel). -
Se usares só
.envminúsculo, ajustaenv_filee o volume nocompose.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:
- Variáveis de ambiente do serviço — copiar do teu
.envlocal para o painel:JWT_SECRET,DATABASE_*/POSTGRES_*,AUTH_DATABASE_*,PORT, etc. - Secret em ficheiro — montar o segredo (ex.
/run/secrets/jwt_secret) e definirJWT_SECRET_FILE=/run/secrets/jwt_secret. - Config / volume — montar um ficheiro de ambiente em
/app/.envdentro do container; obootstrap-envcarrega 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.