You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Node.js前后端+Docker项目正确部署到Heroku

Heroku Node.js 前后端多容器部署问题修复方案

核心前置规则说明

Heroku 容器部署不识别本地的docker-compose.yml和Procfile,所有进程配置完全依赖根目录下Dockerfile.<进程名>的命名规则,本地调试用的docker-compose配置在线上完全不生效。


问题根因排查

你第二次部署时仅将前端Dockerfile命名为Dockerfile.web,后端Dockerfile未匹配Heroku的进程命名规则,也没有给后端进程配置扩容规则,因此后端服务完全没有启动,接口自然无响应。此外你的端口监听写法也存在错误,即使后端启动也无法接收外部请求。


分步修复方案

1. 修正Dockerfile命名

  • 将/frontend/Dockerfile移动到项目根目录,重命名为Dockerfile.web
  • 将/backend/Dockerfile移动到项目根目录,重命名为Dockerfile.api

2. 修正后端端口监听逻辑

你之前的process.env.PORT || localhost:5000写法存在两处错误:一是监听地址不能写死localhost,二是端口需要优先读取Heroku分配的动态环境变量PORT,正确写法如下:

const port = process.env.PORT || 5000;
// 必须监听0.0.0.0才能接收外部流量
app.listen(port, '0.0.0.0', () => {
  console.log(`后端服务已启动,端口:${port}`);
});

3. 配置前端反向代理(如果用Nginx托管前端)

如果你的前端镜像是用Nginx托管静态资源,需要在Nginx配置中添加/api路径的反向代理规则,把接口请求转发到后端api进程:

location /api/ {
proxy_pass http://api:$PORT/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}

如果是用Vite/Create React App内置的代理,仅在本地开发生效,生产环境必须用Nginx或者前端服务的代理规则转发请求。

4. 重新执行部署命令

  1. 推送两个进程的镜像:heroku container:push web api --app 你的应用名
  2. 释放镜像到生产环境:heroku container:release web api --app 你的应用名
  3. 给两个进程配置扩容规则:heroku ps:scale web=1 api=1 --app 你的应用名

部署后验证

  • 查看后端进程日志确认启动正常:heroku logs --ps api --app 你的应用名
  • 查看请求日志排查接口错误:heroku logs --tail --app 你的应用名

内容的提问来源于stack exchange,提问作者Andrewn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 13:54:03