一键导入
deploy-vps
PicPilot 生产 VPS 部署与清理。发布/重新部署/回滚 Docker 栈、更新 cliproxyapi、健康检查、删除旧镜像与遗留存档时使用。触发词:部署 picpilot、deploy、发布、回滚、cleanup、清理旧镜像、删除遗留数据、verify-vps、/deploy-vps。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
PicPilot 生产 VPS 部署与清理。发布/重新部署/回滚 Docker 栈、更新 cliproxyapi、健康检查、删除旧镜像与遗留存档时使用。触发词:部署 picpilot、deploy、发布、回滚、cleanup、清理旧镜像、删除遗留数据、verify-vps、/deploy-vps。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
| name | deploy-vps |
| description | PicPilot 生产 VPS 部署与清理。发布/重新部署/回滚 Docker 栈、更新 cliproxyapi、健康检查、删除旧镜像与遗留存档时使用。触发词:部署 picpilot、deploy、发布、回滚、cleanup、清理旧镜像、删除遗留数据、verify-vps、/deploy-vps。 |
生产环境为四个独立 Compose 项目,源码与实盘分离。
| 用途 | 路径 |
|---|---|
| 源码 | /root/picpilot |
| PicPilot 实盘 | /opt/picpilot(.env 含密钥,勿提交) |
| CLIProxyAPI 实盘 | /opt/cliproxyapi |
| Docker Copilot 实盘 | /opt/dockercopilot |
| Caddy 入口 实盘 | /opt/caddy |
| 配置模板(仓库) | deploy/picpilot/、deploy/caddy/、deploy/cliproxyapi/、deploy/dockercopilot/ |
| 部署脚本(仓库) | deploy/deploy.sh、deploy/setup-vps.sh、deploy/verify-vps.sh、deploy/cleanup-vps.sh |
| 实盘脚本(同步后) | /opt/picpilot/deploy.sh 等 |
实盘配置改动后,脱敏并 cp 回 deploy/ 对应子目录再提交。
/opt/cliproxyapi → cliproxyapi (cliproxyapi-net)
/opt/dockercopilot → dockercopilot (dockercopilot-net)
/opt/caddy → caddy (picpilot-net + cliproxyapi-net + dockercopilot-net)
/opt/picpilot → picpilot (picpilot-net + cliproxyapi-net)
| 容器名 | Compose 项目 | 说明 |
|---|---|---|
caddy | caddy | TLS 入口(80/443) |
cliproxyapi | cliproxyapi | 上游出图 API |
dockercopilot | dockercopilot | Docker 管理面板 |
picpilot | picpilot | Go 后端 + 前端静态(单镜像单容器) |
| 域名 | Caddy 反代目标 |
|---|---|
image.xxww.online | picpilot:3001 |
api.xxww.online | cliproxyapi:8317 |
dc.xxww.online | dockercopilot:12712 |
| 层级 | picpilot 栈 | cliproxyapi 栈 |
|---|---|---|
| 容器名 / Compose 服务名 | picpilot | cliproxyapi |
| Docker 镜像名 | picpilot-api:X.Y.Z | eceasy/cli-proxy-api:latest |
picpilot-api:X.Y.Z = Go 后端 + 前端 dist/(server-go/Dockerfile 多阶段构建,上下文为仓库根)PICPILOT_VERSION,不带 v 前缀,禁止 latestcontainer_name(简短、稳定);脚本与 docker logs 统一用容器名picpilot-net(picpilot 栈创建,caddy 外部加入);caddy 还加入 cliproxyapi-net、dockercopilot-net.env):http://cliproxyapi:8317 / http://cliproxyapi:8317/v1/opt/dockercopilot/.env 的 DOCKERCOPILOT_SECRETcaddy_data(独立 caddy 栈,非 picpilot_caddy_data)/opt/picpilot/data/cliproxyapi-logs → /opt/cliproxyapi/data/logs| 旧名 | 替代 |
|---|---|
picpilot-auth(镜像名) | picpilot-api |
cliproxy(容器) | cliproxyapi |
picroilot-caddy / picpilot-caddy | caddy(独立 /opt/caddy) |
frontend 独立容器 | 已并入 picpilot 镜像 |
/opt/picpilot/data/cliproxy/ | /opt/cliproxyapi/data/ |
改完 deploy/ 模板后,同步到 VPS(agent 部署前应执行):
ROOT=/root/picpilot
# cliproxyapi
cp "$ROOT/deploy/cliproxyapi/compose.yml" /opt/cliproxyapi/
cp "$ROOT/deploy/update-cliproxyapi.sh" /opt/cliproxyapi/
chmod +x /opt/cliproxyapi/update-cliproxyapi.sh
# caddy
cp "$ROOT/deploy/caddy/compose.yml" /opt/caddy/
cp "$ROOT/deploy/caddy/Caddyfile" /opt/caddy/
# picpilot 栈 + 运维脚本
cp "$ROOT/deploy/picpilot/compose.yml" /opt/picpilot/
cp "$ROOT/deploy/deploy.sh" /opt/picpilot/
cp "$ROOT/deploy/verify-vps.sh" /opt/picpilot/
cp "$ROOT/deploy/cleanup-vps.sh" /opt/picpilot/
chmod +x /opt/picpilot/{deploy,verify-vps,cleanup-vps}.sh
勿覆盖 /opt/picpilot/.env、/opt/cliproxyapi/.env、/opt/dockercopilot/.env(含密钥)。
容器名变更后需重建:
docker rm -f <旧容器名> 2>/dev/null || true
cd /opt/<栈目录> && docker compose -p <项目名> up -d
cd /root/picpilot
# 可选本地验证
npm run build && npm test && (cd server-go && go test ./...)
bash /opt/picpilot/deploy.sh # 自动读 package.json version
# 或显式指定
bash /opt/picpilot/deploy.sh 0.1.28
deploy.sh 流程:git pull → 同步确保 cliproxyapi / dockercopilot 已起 → build picpilot → up -d picpilot → 确保 caddy 已起 → 内置健康检查 → docker image prune -f。
package.json → X.Y.Z(SW 缓存名 picpilot-vX.Y.Z 构建时自动注入)cd /root/picpilot
npm run build && npm test && (cd server-go && go test ./...) && npm run lint
git add package.json
git commit -m "release: vX.Y.Z — <摘要>"
git push origin main
git tag -a vX.Y.Z -m "vX.Y.Z — <摘要>"
git push origin vX.Y.Z
bash /opt/picpilot/deploy.sh X.Y.Z
cp /root/picpilot/deploy/caddy/Caddyfile /opt/caddy/Caddyfile # 若从仓库改
cd /opt/caddy && docker compose -p caddy restart caddy
bash /opt/picpilot/verify-vps.sh
bash /opt/cliproxyapi/update-cliproxyapi.sh
cd /opt/dockercopilot
docker compose -p dockercopilot pull
docker compose -p dockercopilot up -d
cd /root/picpilot
bash deploy/setup-vps.sh
# 编辑 /opt/cliproxyapi/.env、/opt/dockercopilot/.env、/opt/picpilot/.env(填真实密钥)
cd /opt/cliproxyapi && docker compose -p cliproxyapi up -d
cd /opt/dockercopilot && docker compose -p dockercopilot up -d
cd /opt/picpilot && PICPILOT_VERSION=X.Y.Z docker compose -p picpilot up -d picpilot
cd /opt/caddy && docker compose -p caddy up -d
bash /opt/picpilot/deploy.sh
cd /opt/picpilot
PICPILOT_VERSION=<旧版本> docker compose -p picpilot up -d picpilot
bash /opt/picpilot/verify-vps.sh
若旧镜像已删,checkout 旧 tag 后重新 deploy.sh <旧版本>。
bash /opt/picpilot/verify-vps.sh
应 15 项全绿:
cliproxyapi / caddy / picpilot / dockercopilot 运行中picpilot-net 存在;caddy、picpilot 在其上cliproxyapi-net、dockercopilot-netdc.xxww.online 可达"component":"go-server"image.xxww.online、api.xxww.online HTTP 200cliproxyapi:8317 可达cliproxyapi-logs 符号链接存在curl -sk https://image.xxww.online/api/health
curl -sk https://api.xxww.online/v1/models | head -c 200
curl -sk -o /dev/null -w '%{http_code}\n' https://dc.xxww.online/manager
使用 deploy/cleanup-vps.sh(同步后在 /opt/picpilot/ 或直接从仓库运行)。
bash /root/picpilot/deploy/cleanup-vps.sh --dry-run
bash /root/picpilot/deploy/cleanup-vps.sh
# 保留 3 个 picpilot-api 版本镜像
bash /root/picpilot/deploy/cleanup-vps.sh --keep 3
| 类型 | 内容 |
|---|---|
| Docker 镜像 | 全部 picpilot-frontend:*、*-test、临时镜像、picpilot-api:latest、遗留 picpilot-auth:* |
| Docker 镜像 | 旧版 picpilot-api(默认保留当前 + 上一版) |
| Docker 卷 | 悬空卷、docker_file_caddy_data |
| 构建缓存 | docker builder prune -af |
| 遗留数据 | /opt/picpilot/data/cliproxy/、cliproxyapiapi/、根目录空 auth.db |
| 应用备份 | /opt/picpilot/data/picpilot/_deleted_backup_* |
| 仓库日志 | deploy/cliproxyapi/logs/*.log |
/opt/picpilot/data/picpilot/(auth.db、用户图片)/opt/cliproxyapi/data/(上游配置与 auths)/opt/dockercopilot/data/caddy_data 卷(Caddy 证书)脚本自动跑 verify-vps.sh;若失败则停止,检查服务。
bash /opt/picpilot/deploy.sh X.Y.Z
bash /root/picpilot/deploy/cleanup-vps.sh --keep 2
| 现象 | 检查 |
|---|---|
502 + lookup frontend | 旧 Caddy 配置:docker compose -p caddy restart caddy |
502 + lookup auth / lookup picpilot | picpilot 未起或 Caddyfile 仍写 auth:3001:docker logs picpilot;确认反代为 picpilot:3001 |
502 + lookup cliproxy | 已改名为 cliproxyapi:更新 Caddyfile 并重启 caddy |
| 404 静态文件 | 镜像不对(旧 hono/latest):docker ps 确认 picpilot-api:X.Y.Z |
| 上游不可达 | docker inspect picpilot 是否在 cliproxyapi-net;.env 是否 http://cliproxyapi:8317 |
| Caddyfile 改了不生效 | docker compose -p caddy -f /opt/caddy/compose.yml restart caddy |
日志:
docker logs picpilotdocker logs caddydocker logs cliproxyapi;/opt/cliproxyapi/data/logs/main.logdocker logs dockercopilot密钥:/opt/picpilot/.env、/opt/cliproxyapi/.env、/opt/dockercopilot/.env 在仓库外,勿提交。
GH Actions ≠ VPS 生产:tag 触发 ghcr/GH Pages,与本机 deploy.sh 独立。
部署或配置变更时 agent 应:
package.json versiondeploy/ → /opt/(见「仓库 → 实盘同步」,不覆盖 .env)docker rm -f 旧容器 → docker compose up -ddeploy.sh(或用户指定版本)verify-vps.sh 确认 15 项通过--dry-run 再执行 cleanup-vps.shcp 回 deploy/picpilot/、deploy/caddy/ 再提交