第 25 章:命令行与部署

1 | 卷四:纵深 |
QwenPaw 不只有 Web UI——它有完整的命令行工具和 Docker 部署方案。这一章看 CLI 命令的全景、Cloudflare 隧道、Docker 容器化部署。
CLI 命令全景
qwenpaw 命令(别名 copaw)用 Click 框架实现,LazyGroup 延迟加载子命令:
| 命令 | 用途 |
|---|---|
qwenpaw init | 交互式初始化(配置 Provider、渠道、技能) |
qwenpaw app | 启动 FastAPI 服务(核心命令) |
qwenpaw doctor | 诊断检查(可选 fix 子命令修复) |
qwenpaw agents list | 列出所有 Agent |
qwenpaw agents create | 创建新 Agent |
qwenpaw agents chat | Agent 间通信 |
qwenpaw models | Provider/模型配置 |
qwenpaw skills | 技能管理 |
qwenpaw cron list/run/create | 定时任务管理 |
qwenpaw plugin install/list | 插件管理 |
qwenpaw acp | 以 ACP Agent 模式运行(stdio JSON-RPC) |
qwenpaw task | 无头单任务执行 |
qwenpaw desktop | 启动桌面 WebView 窗口 |
qwenpaw mission start/status | Mission 模式任务管理 |
qwenpaw channels list/config | 频道配置管理 |
qwenpaw update | 自更新 |
qwenpaw app 的选项
1 | qwenpaw app --host 0.0.0.0 --port 8088 --reload --log-level info |
启动流程:uvicorn.run("qwenpaw.app._app:app", host, port, ...)
qwenpaw init 的流程
交互式引导:
- 选择 LLM Provider 并输入 API Key
- 选择聊天平台(钉钉/飞书/微信等)
- 选择要安装的技能
- 写入 config.json
加 --defaults 跳过交互,使用默认配置。
qwenpaw doctor 的检查项
- Provider 连接是否正常
- API Key 是否有效
- 工作区目录是否存在
- 配置文件格式是否正确
- 技能是否完整
doctor fix 自动修复发现的问题(保守策略,先备份)。
Cloudflare 隧道——内网穿透
CloudflareTunnelDriver 用 cloudflared 把本地服务暴露到公网:1
2
3
4
5
6
7
8
9
10
11async def start(self, local_port: int) -> TunnelInfo:
# 1. 检查/下载 cloudflared
binary = await BinaryManager.get_binary_path()
# 2. 启动隧道进程
self._proc = await asyncio.create_subprocess_exec(
binary, "tunnel", "--url", f"http://localhost:{local_port}",
stderr=asyncio.subprocess.PIPE,
)
# 3. 等待公网 URL(30 秒超时)
url = await self._wait_for_url(timeout=30)
return TunnelInfo(public_url=url)
BinaryManager 自动下载 cloudflared,支持 macOS/Linux/Windows,SHA256 校验。
安全提醒:Cloudflare 隧道把你的本地服务暴露到了公网。如果你的 QwenPaw 没有启用 Web 认证,任何人都能通过这个公网 URL 访问你的 Agent。启用隧道前务必开启认证:设置
QWENPAW_AUTH_ENABLED=true并配置用户名和密码。
Docker 部署
多阶段构建
1 | # Stage 1: 构建前端 |
Supervisord 管理四个进程
1 | dbus (D-Bus 系统消息) |
Docker Compose
1 | services: |
三个命名卷分别存储数据、密钥、备份。端口绑定到 127.0.0.1——默认只允许本地访问。
备份与恢复
backup/ 模块实现了完整的备份恢复:
创建备份:选定的 Agent 配置、密钥、技能池打包为 ZIP 文件。SSE 进度通知。
恢复备份:两阶段提交——先写入临时目录,验证成功后原子替换。恢复前自动停止受影响的 Agent。
Token 用量统计
TokenUsageManager 记录每次 LLM 调用的 Token 消耗:1
2
3
4
5
6
7
8
9
10# 每日按 Provider+Model 汇总
{
"2026-05-11": {
"openai:gpt-4o": {
"prompt_tokens": 15000,
"completion_tokens": 3000,
"call_count": 25
}
}
}
TokenRecordingModelWrapper 包裹 ChatModel,在每次调用后自动记录用量。
工程权衡
为什么 Docker 里要装 Chromium 和 XFCE?
QwenPaw 的 browser_use 工具用 Playwright 控制浏览器。在容器中没有物理显示器,用 Xvfb 虚拟显示器 + Chromium 运行浏览器自动化。这是 CI/CD 和服务器部署的常见模式。
为什么用 Supervisord 而非 systemd?
Docker 容器通常运行单一进程。但 QwenPaw 需要虚拟显示器(Xvfb)和桌面环境(XFCE4)。Supervisord 管理多个进程比 systemd 更适合容器环境。
自检
- 知道
qwenpaw app启动 FastAPI 服务 - 知道 Cloudflare 隧道提供内网穿透
- 知道 Docker 部署用 Supervisord 管理四个进程
- 知道 Token 用量按 Provider+Model 每日汇总
最后一章我们看测试与质量——怎么保证改了这里不会破坏那里。