MVP Deployer
轻量级 MVP 项目部署控制面,通过 RESTful API 实现”AI 写完代码 → zip 打包 → POST → 秒级上线 HTTPS”的全自动部署流水线。
概述
MVP Deployer 是由 quokka 设计并部署的极简项目部署系统,抛弃容器化编排复杂性,直接在宿主机上运行业务代码,用 PM2 管理进程、Caddy 动态反代,PostgreSQL 提供数据库。系统通过 RESTful API 接收打包好的 zip 代码包和部署配置,自动完成解压、依赖安装、进程启动和域名绑定。
双环境部署
| 内网版 (claw-bot) | 云端版 (Azure China) | |
|---|---|---|
| 主机 | 192.168.31.141 | 163.228.243.161 |
| API 地址 | https://deploy.nexora.restry.cn | https://deploy.mvp.restry.cn |
| 泛域名 | *.nexora.restry.cn | *.mvp.restry.cn |
| 外网穿透 | FRP 经 fw-n2 (40.162.94.187) | 直接公网 |
| Token | /opt/mvp-deployer/.credentials | 348bd8...0670 |
技术架构
AI Agent → zip + deploy.json → POST /api/deploy
↓
MVP Deployer API (Express, 端口 9800)
├── 解压 zip → /opt/mvp-apps/<project>/
├── npm install / pip install (按类型)
├── PM2 启动进程 (端口自动分配 4000-4999)
├── 修改 Caddyfile + docker exec caddy caddy reload
└── HTTPS 自动签发 (Let's Encrypt)
核心组件
| 文件 | 作用 |
|---|---|
server.js | Express API 主服务(deploy/undeploy/status/logs 4 个端点) |
lib/pm2.js | PM2 进程管理封装(启动/重启/停止/日志) |
lib/caddy.js | Caddy 配置管理(修改 Caddyfile + reload,上游地址用 172.18.0.1) |
lib/deployer.js | 核心流水线(解压 → 安装依赖 → PM2 启动 → Caddy 绑域名) |
public/index.html | Dashboard 暗色主题页面(实时刷新、状态卡片、日志查看器) |
scripts/bootstrap.sh | 轻量适配脚本(只装 PM2 + 部署 deployer) |
v1 → v2 关键改进
| 组件 | v1 原方案 | v2 适配后 |
|---|---|---|
| Caddy 路由管理 | Admin API (localhost:2019) | 修改 Caddyfile + docker exec caddy caddy reload |
| PostgreSQL | 新建 Docker 容器 | 复用已有容器,创建 mvpadmin 用户 |
| Bootstrap 脚本 | 全量安装 | 轻量适配(只装 PM2 + 部署 deployer) |
| 反代上游地址 | 127.0.0.1 | 172.18.0.1(Docker 网桥) |
| 端口分配 | 手动指定 | 自动分配 4000-4999 |
| 基础域名 | mvp.example.com | nexora.restry.cn / mvp.restry.cn |
OpenClaw Skill 集成
已安装到 ~/.openclaw/skills/mvp-deployer/,AI Agent 可通过以下方式调用:
/mvp-deploy \
--project "demo-api" \
--type "node" \
--port 3050 \
--run "node index.js"Skill 会自动将 Workspace 中的代码打包为 zip,通过预设 Token 调用 Deployer API 完成上线。
已知问题
hello-mvp.nexora.restry.cn有 TLS 证书问题(unrecognized name),可能是 Caddy 配置或 FRP 穿透导致- PM2 的
~/.npm-global/bin在非交互式 SSH 的 PATH 中不可用,已通过 systemd 环境变量修复 - Azure China VM 重启后 PM2 startup 可能不生效