03-16~18:部署与认证¶
Dad 的关键产品决策¶
代码结构重构¶
03-18 决策: - 把代码拆分为 plugin 和 UI 两个目录 - 不拆成两个项目(保留 monorepo 便利性) - 测试机部署时不要容器,直接部署插件和前端
部署约束明确¶
关键约束:
ClawCraft 绝不能部署到本机,只能部署到远程测试服务器
proxy-kr-tiger
认证架构决策¶
03-18 决策: - 接口必须有认证 - 采用 Logto JWT Token 验证 - 复用现有 Logto 认证链路
技术问题与根因分析¶
测试服迁移问题(03-18)¶
问题 1:DNS 指向旧 IP
- craft.clawlines.net 初始访问失败
- DNS 仍指向旧 IP 20.214.152.42
问题 2:Caddy 403 - Caddy 用户对 restry home 目录无读取权限
问题 3:插件未加载
- /clawcraft/config 返回 HTML 而不是 JSON
- 根因:
- 配置里写成了 clawline,不是 clawcraft
- allow 列表里也没有 clawcraft
- 插件放置位置不对
问题 4:Gateway 启动失败
- Gateway 启动时 JSON 文件被写成 0 bytes
- openclaw gateway start 依赖 systemd service,但用户态 DBUS 环境异常
认证实现策略演进¶
最初尝试:每个 handler 内部嵌套 requireAuth
- 问题:代码侵入性高,闭合结构复杂
最终方案:路由层包装
- 编写 withAuth() wrapper
- 在 registerHttpRoute 时统一包裹 handler
认证覆盖范围:
- handleState
- handleEvents(SSE,token 从 query param 取)
- handleConfig
- handleChat
- 及其他插件 HTTP 路由
开发环境认证问题(03-20 早)¶
问题:开发环境走 HTTP 时,Logto 依赖的 Crypto.subtle 受限,无法登录
初始方案:HTTP 环境跳过 Logto
Dad 否决:开发环境也必须登录
最终方案:改为 HTTPS 开发环境
- 不使用路径前缀代理(对 SPA 资源路径不友好)
- 使用 子域名方案
- 复用现有 Docker Caddy
- 利用通配符 DNS:*.dora.restry.cn
错误代码回滚: - Dad 要求把之前"跳过 Logto"的错误代码全部还原 - bot 对 4 个相关 commit 执行 revert
解决方案¶
测试服部署配置¶
目标机器:owl (4.193.115.141:18822)
部署目标:
- 插件 API 运行在 18789
- 前端通过 Caddy 提供
- 域名:craft.clawlines.net
Caddy 配置职责:
- 静态文件服务
- /clawcraft/* 反代到插件 API
插件安装修正¶
- 修正插件 id / allow 配置
- 将插件放到正确的
extensions/目录 - 恢复被清空的 JSON 配置
- 修复 systemd 用户 bus 问题
验证结果: - 插件注册成功(11 routes, 9 hooks, v0.6.0) - API 返回 200 - 前端登录页正常
认证中间件实现¶
// withAuth() wrapper 示例
function withAuth(handler) {
return async (ctx) => {
const token = ctx.query.token || ctx.headers.authorization;
// 验证 Logto JWT(ES384 JWKS)
if (!await verifyToken(token)) {
return { status: 401 };
}
return handler(ctx);
};
}
开发环境 HTTPS 配置¶
域名规划:
- craft.dev.dora.restry.cn → 开发前端
- 通过 Caddy 做 SSL 终结
选型理由:
- HTTPS 可满足 Crypto.subtle
- 子域名比路径代理更适合 Vite/SPA
- 复用现有 Caddy,避免额外证书与端口管理复杂度
里程碑¶
03-16¶
- [x] 新建云端 VM
owl作为 ClawCraft 节点 - [x] 配置
craft.clawlines.net域名
03-17¶
- [x] 对话系统 P0 修复:从"发送后刷新、历史丢失"恢复为可持久化
- [x] QA 流程沉淀为技能
skills/adversarial-qa/ - [x] 频道状态统一改为读取 world store 中的
channels - [x] 一次性配置 39 个模型
03-18¶
- [x] 代码完成 plugin/UI 双目录重构(commit
15930b7) - [x] 测试服迁移到 owl
- [x] DNS + Caddy + 权限问题修复
- [x] 插件加载问题修复
- [x] Logto JWT 认证正式落地
- [x] TypeScript 编译通过
- [x] 部署到 owl 测试服成功
部署约束记录¶
| 环境 | 域名 | 服务器 | 说明 |
|---|---|---|---|
| 生产 | craft.clawlines.net |
owl | 静态目录 serve |
| 开发 | craft.dev.dora.restry.cn |
内网反代 | HTTPS 子域名 |
| 旧域名 | clawcraft.octopus-ops.net |
- | 已废弃 |