ai-chatbot/docs/production-48.md

4.7 KiB
Raw Blame History

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 覆盖本机路径,不要把私钥提交到仓库。

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:

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 须记录本次改动的验证、历史失败和未覆盖项目;当前流程不会自动触发生产发布。