MiGPT 自动化部署 CI/CD 实战:30 分钟把值夜班交给 crontab
MiGPT 自动化部署 CI/CD 实战30 分钟把值夜班交给 crontab【免费下载链接】mi-gpt 将小爱音箱接入 ChatGPT 和豆包改造成你的专属语音助手。项目地址: https://gitcode.com/GitHub_Trending/mi/mi-gpt凌晨两点容器挂了你手动敲完 deploy.sh 才发现.env里忘了换新的模型地址——这就是部署全靠人肉的代价。MiGPT 是把小爱音箱接入 ChatGPT 和豆包这类大模型、改造成你专属语音助手的开源项目跑通一遍你会发现它的部署链路其实很短一次构建、一个容器、一段让机器自己执行的定时任务。 先跑通构建从源码到能装的包整个流程不需要额外平台把下面几样备齐就行项要求Docker Engine20.10Node.js20.14.0项目默认在 20 上跑pnpm9.1.1与 Dockerfile 锁定的版本一致关键文件package.json、Dockerfile、.env、.migpt.js先读懂构建链路我们做的是最简形态的 CI/CD持续集成与持续交付把构建和发布自动化不上一套重型流水线平台。打开package.json构建入口把三个动作串成一条链pnpm build一条命令跑完// package.json 中的构建入口 build: npx -y prisma generate rm -rf dist tsupprisma generate让 PrismaNode.js 的 ORM负责对象和数据库表的映射根据prisma/schema.prisma生成数据库客户端rm -rf dist先清掉旧产物防止残留文件混进发布tsup面向 TypeScript 的打包工具把源码编译进dist/目录。顺序不能乱先生成、再清理、后编译否则 Prisma 客户端是旧的。把镜像拆成三个工位项目的 Dockerfile 用了多阶段构建≈ 半成品在流水线上逐工位加工最后只把成品装箱。三个工位各干各的FROM base as runtime # 工位一只装生产依赖 RUN pnpm install --production pnpm prisma generate FROM runtime as dist # 工位二装全量依赖并跑 tsup 出产物 RUN pnpm install pnpm tsup FROM base as release # 工位三只拷产物不带构建工具 COPY --fromdist /app/dist ./dist有两处细节值得抄作业--mounttypecache把 pnpm 存储目录挂成缓存重复构建不用重新下载依赖env-$TARGETARCH阶段为 amd64/arm64/arm 三种架构各备了一份基础镜像所以同一个 Dockerfile 能同时构建 x86 服务器、ARM NAS 和树莓派的镜像。⚠️ 这一步如果卡住了pnpm install失败先删node_modules重装别急着删pnpm-lock.yaml锁文件正是保证本地和生产版本一致的东西postinstall会自动跑数据库迁移如果迁移报错执行pnpm run db:reset清掉.mi.json、.bot.json和prisma/app.db再试。 装进容器本地先跑一次再上线本机把镜像构建出来打包镜像听起来玄其实就一条命令。给目标机器的架构构建构建机与部署机同架构时可以省略--platform# 构建 amd64 镜像树莓派/ARM NAS 改成 linux/arm/v7 docker build --platform linux/amd64 -t mi-gpt:local .首次启动验证先跑本地镜像别碰线上。启动前按 docs/settings.md 配好.env和.migpt.js音箱账号、设备 did、模型 key 都在里面本地调试细节见 docs/development.mddocker run -d \ --name mi-gpt \ --env-file .env \ -v $(pwd)/.migpt.js:/app/.migpt.js \ mi-gpt:local--env-file把环境变量装进容器-v把配置文件挂进去——镜像随便重建账号和模型配置都不会丢。启动后盯终端日志看到服务已启动并且音箱能应声本地就算验收通过。如果音箱应了但语音播报怪怪的别慌先核对命令映射配置里的ttsCommand和wakeUpCommand必须和音箱具体型号的 SIID/AIID 对得上⚠️ 这一步如果卡住了启动报找不到 bot是数据库与本地映射记录不匹配跑pnpm run db:reset后重启报初始化 db 失败检查项目路径是否含中文或空格只保留英文字母、数字和下划线。 让机器替你值班自动更新、监控与回滚一份部署脚本收口把停旧、建新、启新写进一个deploy.sh。以后更新只敲这一条命令机器也能替你做#!/bin/bash set -e # 任何一步出错立即停止 git pull origin main # 拉最新代码 docker build -t mi-gpt:latest . # 构建新镜像 docker stop mi-gpt || true # 停旧容器已停则忽略 docker run -d --name mi-gpt \ --restart always \ --env-file .env \ -v $(pwd)/.migpt.js:/app/.migpt.js \ mi-gpt:latest--restart always让容器在宿主机重启或崩溃后自动拉起这一行能省掉很多次半夜的返工。让 crontab 替你值夜班crontab 是 Linux 自带的定时任务调度器可以理解为只给脚本响的闹钟# crontab -e 添加每天凌晨 3 点自动更新并部署 0 3 * * * /opt/mi-gpt/deploy.sh /var/log/migpt-deploy.log 21两个细节脚本写绝对路径cron 不认识相对路径21把报错也写进日志否则机器半夜静默失败你根本不知道。上线前先用crontab -l确认条目再手动触发一次看日志。出问题先回退一步监控不必一上来就堆 Prometheus两条命令能覆盖八成日常检查docker ps -f namemi-gpt # 容器还活着吗 docker logs -f mi-gpt --tail 50 # 看最后 50 行日志想上看板的话接一下 Docker 指标重点盯两个数容器运行时长短了反复重启 在崩溃循环和内存占用本服务 512MB 设为警戒线即可。回滚靠习惯每次部署给镜像打 tag 留档出问题就把旧版重新贴回latest# 查看历史版本回滚到出问题前的 tag docker tag mi-gpt:v4.1.0 mi-gpt:latest ./deploy.sh再往深走一点的调优方向分层瘦身依赖安装与代码拷贝分开放代码只改一行时依赖层直接命中缓存Dockerfile 已经这么拆了自己魔改时别破坏这个分层。区分环境.env.development和.env.production分开存放测试 key 和生产 key 混用的坑一次就够痛。加健康检查Dockerfile 补一条HEALTHCHECK探测启动端口服务假死时容器状态会变unhealthy告警更好触发。⚠️ 这一步如果卡住了crontab 到点不执行先查grep CRON /var/log/syslog并确认路径是绝对路径找不到旧镜像可回滚多半是 tag 没留从docker images里补一个再重跑部署脚本。上线前逐条过一遍清单本地pnpm build通过且dist/产物生成镜像在目标架构下构建成功容器启动后音箱实际应声.env与.migpt.js已挂载且包含最新模型配置crontab 任务试跑一次部署日志无报错至少保留一个旧版本镜像 tag 用于回滚【免费下载链接】mi-gpt 将小爱音箱接入 ChatGPT 和豆包改造成你的专属语音助手。项目地址: https://gitcode.com/GitHub_Trending/mi/mi-gpt创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考