部署NestJS+PostgreSQL(Docker)至DigitalOcean时连接被拒绝求助
问题
尝试将NestJS项目部署至DigitalOcean时遇到数据库连接问题,操作步骤如下:
- 创建Docker网络后,启动Postgres容器:
docker run --name postgre -d -p 5432:5432 --network backend -e POSTGRES_PASSWORD=0808 -e POSTGRES_DB=webs postgres
- 修改
.env.production中的数据库主机为容器名:
POSTGRES_HOST=postgre
其余配置与.env.deployment一致,完整环境变量配置如下:
POSTGRES_HOST=localhost POSTGRES_PORT=5432 POSTGRES_USER=postgres POSTGRES_DB=webs POSTGRES_PASSWORD=0808
- 拉取DockerHub镜像启动NestJS容器:
docker container run -p 3000:3000 --network backend --env .env.production --name mindgame musnn/mindgame
启动后出现错误:
[Nest] 1 - 01/07/2023, 10:02:59 AM ERROR [ExceptionHandler] connect ECONNREFUSED 127.0.0.1:5432 SequelizeConnectionRefusedError: connect ECONNREFUSED 127.0.0.1:5432
同时附上app.module.ts与Dockerfile配置,求解决方法。
解决方法
1. 修正NestJS容器的环境变量加载命令
你使用的--env .env.production参数错误,Docker中加载整个.env文件需要用--env-file参数,正确启动命令为:
docker container run -p 3000:3000 --network backend --env-file .env.production --name mindgame musnn/mindgame
这是核心问题——之前的命令未正确加载.env.production里的POSTGRES_HOST=postgre,导致应用仍使用默认的localhost连接数据库。
2. 验证Postgres容器状态
执行命令检查Postgres容器是否正常运行:
docker ps
确保postgre容器处于Up状态,若未运行则启动它:
docker start postgre
也可进入容器验证数据库可用性:
docker exec -it postgre psql -U postgres -d webs
能正常进入则说明Postgres服务无问题。
3. 确认Docker网络连通性
进入NestJS容器测试与Postgres的连通性:
docker exec -it mindgame sh ping postgre
若能ping通则网络正常;若不行,检查两个容器是否都在backend网络中:
docker network inspect backend
查看输出的Containers部分,确认两个容器均在该网络内。
4. 检查NestJS数据库配置
确保app.module.ts正确读取环境变量,以Sequelize为例,配置应类似:
@Module({ imports: [ SequelizeModule.forRoot({ dialect: 'postgres', host: process.env.POSTGRES_HOST, port: parseInt(process.env.POSTGRES_PORT, 10), username: process.env.POSTGRES_USER, password: process.env.POSTGRES_PASSWORD, database: process.env.POSTGRES_DB, autoLoadModels: true, synchronize: true, }), ], }) export class AppModule {}
避免硬编码host: 'localhost'。
5. 检查Dockerfile环境变量设置
确保Dockerfile中没有用ENV指令硬设置POSTGRES_HOST=localhost,否则会覆盖外部传入的环境变量。
内容的提问来源于stack exchange,提问作者Nuran Gozalova
相关产品推荐
相关产品推荐

