Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Subindo aplicação node (typeorm) + postgres + docker-compose

Olá, equipe e comunidade Alura, nas duas últimas semanas estou tentando subir uma aplicação backend de node + postgres com docker-compose, mas estou recebendo diversos erros, alguns eu consegui resolver, mas tem um que eu não estou conseguindo de jeito nenhum.

Error: connect ECONNREFUSED 127.0.0.1:5432 (esse é o bendito erro)

Vou compartilhar alguns trechos de código como docker-compose, datasource e o Dockerfile usado para construir a imagem.

Arquivo docker-compose.yml

version: "3.9"

networks:
  backend-network:
    driver: bridge

volumes:
  data:

services:
  backend:
    image: <minha-imagem-do-docker-hub>
    networks:
      - backend-network
    depends_on:
      - postgres
    environment:
      SECRET: ${SECRET}
      DB_HOST: ${POSTGRES_HOST}
      DB_USER: ${POSTGRES_USER}
      DB_PASSWORD: ${POSTGRES_PASSWORD}
      DB_NAME: ${POSTGRES_DB}
      DB_PORT: ${POSTGRES_PORT}
    ports:
      - "${SERVER_PORT}:${SERVER_PORT}"

  postgres:
    image: postgres
    networks:
      - backend-network
    volumes:
      - data:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB}
    ports:
      - "${POSTGRES_PORT}:${POSTGRES_PORT}"

Arquivo Dockerfile para construir a imagem

FROM node:16
WORKDIR /app
COPY package*.json .
RUN npm install
COPY . .
CMD ["npm", "start"]

Arquivo datasource para typeorm

const AppDataSource = new DataSource({
    type: "postgres",
    host: process.env.POSTGRES_HOST,
    port: Number(process.env.POSTGRES_PORT),
    username: process.env.POSTGRES_USER,  
    password: process.env.POSTGRES_PASSWORD, 
    database: process.env.POSTGRES_DB,  
    entities: [`${entPath}/*`],
    synchronize: true,
});

Vi algumas pessoas usando AppDataSource.manager e na minha aplicação eu não fiz isso, não sei se isso é um problema.

O mais estranho é que quando eu rodo a aplicação com os scripst do package.json daplicação com npm tudo funciona normalmente, nesse caso o nome do host precisa ser (localhost) para funcionar. Por favor, preciso de ajuda pra sair logo dessa task, já tem mto tempo que eu to preso nisso hahahah.

Vou compartilhar também esse erro, estou utilizando a porta padrão mesmo, acho que não tem problema compartilhar essa informação, dado que esse não será o ambiente final da aplicação.

at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1278:16) {
  errno: -111,
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '127.0.0.1',
  port: 5432
}

Valeu galera, conto com vcs todos para resolver esse problema e desde já agradeço a colaboração de todos.

Abraço, Thales.

2 respostas
solução!

Olá, Thales. Tudo bem?

O erro ECONNREFUSED 127.0.0.1:5432 geralmente indica que sua aplicação está tentando se conectar ao PostgreSQL no endereço 127.0.0.1 (localhost) dentro do contêiner, mas o PostgreSQL está rodando em outro contêiner. No Docker, cada contêiner tem seu próprio localhost, então você precisa garantir que sua aplicação está se conectando ao contêiner correto.

Aqui estão algumas sugestões para resolver esse problema:

  1. Verifique o DB_HOST: No seu arquivo docker-compose.yml, você está usando a variável de ambiente ${POSTGRES_HOST} para o DB_HOST. Certifique-se de que essa variável está definida corretamente e que o valor seja o nome do serviço do PostgreSQL no docker-compose.yml, que no seu caso é postgres. Portanto, DB_HOST deve ser postgres.

  2. Verifique as portas: Certifique-se de que a porta que você está usando na sua aplicação para se conectar ao PostgreSQL é a mesma que está mapeada no docker-compose.yml. No seu caso, está usando ${POSTGRES_PORT}. Se você não definiu essa variável de ambiente, o padrão é 5432.

  3. Ordem de inicialização: O depends_on no docker-compose garante que o contêiner do PostgreSQL seja iniciado antes do seu backend, mas não garante que o PostgreSQL esteja pronto para aceitar conexões. Você pode precisar adicionar um script de espera para garantir que o PostgreSQL esteja pronto antes que seu aplicativo tente se conectar.

  4. Verifique as variáveis de ambiente: Certifique-se de que todas as variáveis de ambiente necessárias estão definidas corretamente. Você pode verificar isso rodando docker-compose config para ver a configuração final que o Docker está usando.

Aqui está um exemplo de como você pode definir o DB_HOST diretamente no docker-compose.yml:

    environment:
      SECRET: ${SECRET}
      DB_HOST: postgres
      DB_USER: ${POSTGRES_USER}
      DB_PASSWORD: ${POSTGRES_PASSWORD}
      DB_NAME: ${POSTGRES_DB}
      DB_PORT: ${POSTGRES_PORT}

Espero que essas dicas ajudem a resolver o problema. Bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!

Caramba cara, ajudou demais HAHAHAH, problema resolvido! A dica do docker-compose config foi extremamente util, esse comando poderia ser melhor explorado nas formações sobre docker. Mas enfim, vc me salvou demais, muito obrigado pela ajuda !!!!!!!!!!!!!!

Grande abraço :)