1panel 面板怎么部署 Node 项目
照着这篇做完,你就能在 1Panel 面板上把一个 Node 项目跑起来,并绑好域名和 HTTPS,以后更新代码也知道点哪里重新发布。下面以 1Panel 社区版 v1.10.x 和 Node.js 20.18.0 为例,全程在面板里点。
第一步:装好 Node 运行环境
这一步的结果是:服务器上有一个 1Panel 托管的 Node 版本,后面创建项目时能直接选。
左侧菜单点「网站」→「运行环境」→ 顶部切到「Node.js」标签 → 点「创建运行环境」。版本选 20.18.0,名称填 node20,其余默认,点「确定」。等状态变成「已启动」即可。
注意:不要在 SSH 里用 apt、yum 或 nvm 再装一份 Node。1Panel 创建项目时用的是它自己装的这个版本,两边不一致会出现「命令跑得通、面板里起不来」的情况。
第二步:把代码放到服务器并构建
这一步的结果是:项目目录里有完整的代码和构建产物。
点左侧「文件」,进入 /opt/1panel/www/sites/,新建目录 myapp。如果你有 Git 仓库,更推荐点左侧「终端」,执行:
cd /opt/1panel/www/sites/myapp
git clone 你的仓库地址 .
npm ci
npm run build
没有仓库就用「文件」页面的「上传」按钮把打包好的代码传进 myapp,再在「终端」里执行 npm ci && npm run build。
注意:本地打包上传时不要把
node_modules一起传,架构和依赖容易对不上;.env文件也不建议走 Git,直接在服务器上创建。
第三步:创建 Node 项目
这一步的结果是:项目被 1Panel 接管,能开机自启、异常自动重启。
左侧「网站」→「Node 项目」→「创建项目」,按下表填写:
- 名称:myapp
- Node 版本:node20
- 项目目录:
/opt/1panel/www/sites/myapp - 包管理器:npm
- 启动命令:
npm run start(如果package.json里没有 start,就写node dist/main.js,路径按你的构建输出改) - 端口:3000
- 端口外部访问:先关掉,后面用反向代理接入
点「确定」,列表里状态变成「运行中」就成功了。
注意:启动命令必须是前台运行的命令。不要写
pm2 start xxx,1Panel 自己管进程,两套东西抢同一个端口会反复报EADDRINUSE。
注意:
.env里配置的PORT要和这里填的端口一致,否则面板探测不到进程,状态会显示异常。
第四步:本机验证是否真的通了
点左侧「终端」,执行:
curl -I http://127.0.0.1:3000
返回 200 或 301 就说明服务正常。如果报连接被拒绝,回到「Node 项目」页面点开该项目,看「日志」页里的报错。
注意:Express、Koa 这类框架默认监听所有网卡;如果代码里写死了
listen(3000, 'localhost'),反向代理可能连不上,改成0.0.0.0或直接去掉第二个参数。
第五步:绑域名并开 HTTPS
这一步的结果是:外网能通过 https://你的域名 访问这个 Node 服务。
左侧「网站」→「网站」→「创建网站」,类型选「反向代理」,主域名填 app.example.com,代理地址填 http://127.0.0.1:3000,点「确定」。随后点该网站的「配置」→「HTTPS」→ 勾选「启用 HTTPS」→「申请证书」,选 Let's Encrypt,开启自动续签,保存。
注意:申请证书前,域名的 DNS 解析必须已经指向这台服务器并且生效,否则签发会失败。80 端口也要能被外网访问,Let's Encrypt 校验要用。
第六步:以后怎么更新
代码有改动时,在「终端」里执行:
cd /opt/1panel/www/sites/myapp
git pull
npm ci
npm run build
然后回到「网站」→「Node 项目」,找到 myapp,点「重启」。整个过程不用碰服务器上的其他服务。
小结
- 先用「网站 → 运行环境 → Node.js」装好 Node,别在系统里另外装一份。
- 代码放
/opt/1panel/www/sites/下,先npm ci && npm run build再创建项目。 - 创建项目时启动命令要前台运行,端口和
.env保持一致,别混用 PM2。 - 对外访问走「网站 → 网站 → 反向代理」,再用「配置 → HTTPS」一键签证书。
- 更新流程固定为:拉代码 → 装依赖 → 构建 → 面板里点「重启」。
原文链接:https://www.gj0.com/thread-962.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。