--- title: 生产部署与运维踩坑(宝塔/PM2/升级) type: experience permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/生产部署与运维踩坑宝塔-pm2-升级 stable_id: 2939ce96-a6f6-418a-9a70-568980dbdc2a scope: project project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a memory_type: experience status: active revision: 1 restored_from_commit: 6a6a895eafcca6052e81a14fca103a42635dd1c2 created_at: '2026-09-23T15:08:07.372480+00:00' updated_at: '2026-09-23T15:08:07.372574+00:00' tags: - production - pm2 - baota - upgrade - pitfall --- - **宝塔“Node/PM2 项目”面板不会配置开机自启**:只做 `pm2 save` 不够,服务器重启后应用不在线(2026-09-03 续费重启后发生)。新服务器部署后必须 `pm2 startup systemd -u root --hp /root` + `pm2 save`,并检查 `systemctl is-enabled pm2-root`。resurrect 对在跑应用幂等。 - 服务器 MySQL 5.7 业务账号无 PROCESS 权限,`mysqldump` 必须加 `--no-tablespaces`。 - 上传到 Linux 的 shell 脚本必须 LF 无 BOM(CRLF 会让 bash 报错);本机 ps1 正文用英文,读远端中文需 `[Console]::OutputEncoding = UTF8`。 - 升级包必须解压到线上目录之外;`upgrade.sh/ps1` 会拒绝根目录/同目录/互相嵌套路径,并校验部署哨兵与包完整性;部署目录勿用 NTFS Junction。 - 生产包启动报缺 `.prisma/client/default`:安装依赖后必须在 apps/api 执行 `prisma generate`(init/upgrade 脚本已包含)。 - 安装向导建库:宝塔/云 DB 通常已预建库+账号,`ensureDatabase` 幂等跳过;自建 MySQL 业务账号需建库权限或填管理员账号,不自动 GRANT。 - 升级模式保留旧 `.env`,旧部署无 `SETTING_ENCRYPTION_KEY` 会回退 JWT_SECRET(无回归);Docker/remote 复用 `.deploy/deploy-secrets.json` 保证密钥稳定,否则旧数据因新随机密码连不上。 - 历史 `appIconUrl` 若存 `/uploads/...` URL,local→OSS 后可能指向旧路径;前端按所在端回退默认图标 `/admin/app-icon.svg`、`/trace/app-icon.svg`。