# 48 生产发布 本流程由维护电脑发起,使用已有 SSH 密钥。生产只更新 `ai-chatbot`,不运行数据库迁移, 不更新 ZCode 原生运行时,不重启主机、Nginx 或其他 PM2 应用。 ## 已核实的机器 | 用途 | SSH 入口 | 主机 | | --- | --- | --- | | 构建机 | `root@192.168.102.146:22` | `dao02-Default-string`,Ubuntu 24.04,Node 20 | | 同一构建机的公网入口 | `root@45.192.99.48:23322` | FRP 转发,不是生产宿主机 | | 生产机 | `root@45.192.99.48:64192` | `SfSTE0ttmsycO`,CentOS Stream 9,Node 20 | | 维护连接跳板 | `root@192.168.58.20:22` | 已信任的 NAS,仅转发 SSH | 公网页面 `https://ai.yydd.ai/` 由生产 Nginx 转发至 `127.0.0.1:3125` 的 PM2 应用。 脚本固定验证生产、构建机的 SSH 指纹和主机名;私钥留在维护电脑,不转发 SSH Agent。 构建机原有 `/var/www/ai-chatbot` 是旧实例,本流程不会使用或覆盖它。 ## 操作入口 维护电脑需要 Python 3.9+、Paramiko、Git,以及已信任的 SSH `known_hosts`。 默认使用 `~/.ssh/45.192.99.48.pem` 和跳板密钥 `~/.ssh/youyidian_prod_ed25519`。 可用 `--key`、`--jump-key`、`--known-hosts` 覆盖本机路径,不要把私钥提交到仓库。 ```powershell python scripts/production48.py status python scripts/production48.py jobs # 完成 PR 合并后,确认远端 main 的最新提交,工作区必须干净。 git fetch origin git switch main git merge --ff-only origin/main python scripts/production48.py build ``` `build` 将确定的 `origin/main` 提交通过 `git archive` 送到构建机, 在 `/opt/ai-chatbot-builds/<时间-提交>/source` 安装锁定依赖并构建。 使用 pnpm 9.12.3,不改变全局 pnpm。安装时不运行依赖脚本,构建时禁用自动安装系统服务。 构建保持 TypeScript 检查,限制 Next 构建并行度和 Node 内存,并降低进程优先级。 构建机仅收到 `NEXT_PUBLIC_*` 等公开页面配置,以及指向本机关闭端口的占位数据库配置。 不会收到生产数据库密码、AI Key、认证密钥或存储凭据。随后在构建机回环地址启动隔离候选实例, 核对构建 ID 并执行公开路由烟测,测试结束自动关闭该候选实例。 成功后会输出发布 ID,例如 `20261030T120000Z-0123456789ab`。后续步骤使用这个完整 ID: ```powershell python scripts/production48.py stage --release <发布ID> python scripts/production48.py activate --release <发布ID> python scripts/production48.py status # 仅对当前生效的这一版执行回滚: python scripts/production48.py rollback --release <发布ID> ``` `stage` 校验传输 SHA256,在 `/var/www/ai-chatbot-releases/<发布ID>` 解包。 它检查压缩包路径、磁盘容量、锁文件、实际依赖包清单和共享 public 文件校验和。 完成解包后至少保留 1 GiB 空间;不足时停止,不自动删除历史构建。 当前和旧浏览器标签页所需的静态资源通过硬链接保留,不改动旧构建。 `activate` 会重新核对生产版本和任务状态,拒绝在最近一小时仍有未结束生成任务时切换。 更早的历史挂起记录只写入发布回执,不会自动修改数据库中的状态。 它保存旧 PM2 配置和启动快照,然后仅更新 `ai-chatbot` 的工作目录并重启这个应用, 因此会有短暂切换窗口。健康检查同时核对进程目录、构建 ID、首页和路由。 检查失败自动恢复旧配置并再次验活;通过后执行 `pm2 save`,让重启后使用已验收版本。 ## 共享运行资料与边界 初版发布复用原目录 `/var/www/ai-chatbot` 中的 `node_modules`、`public`、`.env.local`、 `tmp` 和模型配置备份,均通过链接使用,不复制、删除或覆盖。 生产依赖必须与构建依赖的校验清单相符,Node ABI 必须一致。 若本次修改了依赖锁文件或 public 中的文件,脚本会停止,须先单独审查并准备对应运行资料, 不能绕过校验强行切换。本流程适用于应用代码迭代;数据库、共享资源和原生 Agent 升级各自单独发布。 原生产 checkout 的支线及未提交改动仍保留,不能据其 Git HEAD 判断已发布版本。 实际发布证据是:运行 cwd、`.next/BUILD_ID`、该目录 `release.json` 和 `activation.json`。 维护电脑的 `.git/releases/<发布ID>/` 保留提交、构建日志、烟测、传输校验和及操作回执。 服务器回滚配置可能含环境元数据,目录权限为 0700、文件为 0600,不放入公开目录或 Git。 仓库历史全量 lint 仍有已记录的问题,不能声称全部质量门禁通过。 每次 PR 须记录本次改动的验证、历史失败和未覆盖项目;当前流程不会自动触发生产发布。