概述
Caddy 反向代理(57条消息)用于在 tiger-host 服务器上提供 HTTPS 终结和流量转发。主要服务 Supabase、Mattermost 等应用的反向代理和 SSL 证书自动管理。同时也是 Nexora Platform (claw-bot) 的核心入口层,负责所有 Docker 服务的 TLS 终结和路由分发。
关键事件
- 2026-03-07: 通过 DNS 前缀查出域名,配置域名连接
- 2026-03-07: 配置 SSL 证书,使用 Caddy 中转 externalacr.azurecr.io
- 2026-03-07: 推送 caddy:2-alpine 镜像到 ACR
- 2026-03-10: 配置 Supabase 反向代理,将
/pg路径流量切到 Kong 网关(Port 8000) - 2026-03-15: 排查连接被拒绝问题,检查 Caddyfile 配置
- 2026-04-02: 总结 Supabase 完整信息(包含 key 等),输出为 Markdown
技术要点
- 域名: tiger-host.chinanorth3.cloudapp.chinacloudapi.cn
- 容器镜像: externalacr.azurecr.io/caddy:2-alpine
- 路由规则:
/pg*→ Supabase Kong (Port 8000) - SSL: Caddy 自动管理 Let’s Encrypt 证书
经验教训
- Caddy Admin API 路由更新必须用
PATCH /id/<rid>而非PUT— PUT 是插入到该位置(非替换),重复调用会累加同@id路由,第二次起 400。deployer 的lib/caddy.js04-20 因此踩坑修复 - Caddy 自动 HTTPS 功能极大简化了证书管理
- 反向代理路径匹配需注意通配符和优先级
- 容器化部署的 Caddy 需要正确挂载 Caddyfile 和数据目录
- 修改 Caddyfile 后需要
caddy reload生效 - Docker 网络隔离:Caddy 容器(
mattermost-caddy在web-net)与 Supabase Kong(在supabase_default)不在同一 Docker 网络时导致 502。修复:docker network connect supabase_default mattermost-caddy+ 在 docker-compose.yml 永久添加supabase_default网络 - HTML 缓存控制:Caddy 默认不设 Cache-Control header,对 PWA 的 index.html 需显式设置
no-cache(参见 pwa-ios-deployment)
ClawCraft 反向代理配置
CraftBot 在部署 clawcraft 时大量使用 Caddy 反向代理:
生产环境 (craft.clawlines.net on owl)
- 静态文件 + SPA fallback + API 反代 + gzip
/clawcraft/*→ owl Gateway :18789- SSL 证书 Let’s Encrypt 自动获取
- SSE 关键配置:
flush_interval -1防止流式响应被缓冲
开发环境 (craft.dev.dora.restry.cn)
- clawedbot Caddy 做全量反代 → owl:18852
- owl Caddy 处理静态文件和 API 路由
- 踩坑:两层 Caddy 都需要
flush_interval -1,否则 SSE 被缓冲导致 EventSource 无限重连
域名变更
clawcraft.octopus-ops.net— 已停用(2026-03-18)- 统一使用
craft.clawlines.net
相关主题
BiBot / Nexora 相关配置
以下信息来源于 bibot 和 nexora 的 Mattermost DM 聊天记录。
Agentic BI 开发环境 (bi.dev.dora.restry.cn)
BiBot 诊断并修复了 Caddy 路由问题:
- 原始问题:Caddy 把所有流量代理到 port 3016(pm2 静态文件服务),
/api/*无法到达后端 - 修复配置:添加路由规则
/api/*→ 后端 8899,其他 → 前端 3016 - 端口错误:曾配置指向 port 5173(无服务),实际前端在 3016、后端在 3017
Nexora Platform (claw-bot)
Nexora 在 claw-bot 服务器管理 Caddy 容器化部署(端口 80, 443, 8888),通过 FRP 内网穿透出公网:
| 域名 | 目标 |
|---|---|
| gitea.nexora.restry.cn | Gitea (3000) |
| outline.nexora.restry.cn | Outline (3000 内部) |
| portainer.nexora.restry.cn | Portainer (9000) |
| uptime.nexora.restry.cn | Uptime Kuma (3001) |
| www.nexora.restry.cn | 静态门户站 |
TLS 证书签发注意事项:
- ACME HTTP-01 挑战时需确保 Caddy 在 80 端口也处理
www域名请求 - 原
:80块只有respond "Lobster Platform OK",不处理 www 的 ACME 路径 - 修复后所有域名 TLS 自动签发正常
安全事件:Nexora 曾为解决 OpenClaw 回调问题配置 claw.nexora.restry.cn 反向代理暴露 Gateway:18789 到公网,被用户否决后立即回滚。
Agent Portal (portal.dev.dora.restry.cn)
Agent Portal 部署在 clawedbot 服务器上,Caddy 在 mattermost-caddy Docker 容器内:
- 前后端分离路由:
/api/*→172.17.0.1:3002(Express API server)/→172.17.0.1:3013(pm2 serve 静态文件)
- 踩坑经历:
- 最初 Caddyfile 缺少
/api/*分流,所有请求打到 pm2 静态服务,API 被 SPA fallback 吃掉返回 HTML - pm2 dev-portal 和 server.cjs 曾端口竞争 3013,需停掉 pm2 让 server.cjs 独占
- 修复后将 Caddy 源文件同步到
matrix/caddy/Caddyfile,容器重启不丢配置
- 最初 Caddyfile 缺少
- SSE 支持:需确保 SSE endpoint
/api/ops/stream的flush_interval -1配置
2026-04-23 给 mvp-deployer 加 caddy-ratelimit 限流
image-studio 上线前需要做 IP 限流防止 access key 爆破和 Azure 调用费被刷。Caddy 限流 rate_limit 指令是社区插件 caddy-ratelimit(mholt/caddy-ratelimit),apt 装的官方版(/usr/bin/caddy v2.11.2)不带这个模块——caddy list-modules | grep rate 空输出,必须换二进制。
步骤
- caddyserver.com/download 勾选
caddyserver/caddy-ratelimit下载带模块的 v2.11.2 二进制 → 替换/usr/bin/caddy(旧版备份caddy.bak)→ 重启caddy.service - 通过 admin API(
localhost:2019)注入 4 档限流到image-studio的 subroute——其他三站(deploy.mvp / shutiao-world / realtime-voice)路由原样保留 - 顺手修了重启丢路由的炸弹:admin API 动态加的路由会被
systemctl restart caddy全清,只剩 Caddyfile 里的。systemdoverride.conf改ExecStart=/usr/bin/caddy run --resume,让 Caddy 启动时从autosave.json自动恢复
4 档限流(按 IP,触发返 429)
| 接口 | 限速 | 防什么 |
|---|---|---|
/api/auth/login | 5 req/分 | access key 爆破 |
/api/user/topup | 10 req/分 | 充值码爆破 |
/api/generate | 20 req/分 | 刷 Azure 调用费 |
其他 /api/* | 60 req/分 | 兜底 |
字段坑
mholt/caddy-ratelimit 模块用的字段是 rate_limits 不是 zones(与某些早期文档/示例不一致),写错配置会 admin API 400。
沉淀
整套流程沉淀为 skill devops/caddy-ratelimit-setup:二进制下载/替换 + systemd --resume 修复 + 模板 ratelimit subroute JSON。下次给别的站点(如 shutiao-world)加限流直接套。
2026-04-28 mvp.restry.cn apex 静态 file_server route
之前 deployer 上的 Caddy 只有泛域名 *.mvp.restry.cn(业务子域反代),apex mvp.restry.cn 裸响应。微信公众号验证文件必须落根域名,新增 mvp-route-apex 静态 file_server route,root = /opt/mvp-deployer/public/root/。验证:https://mvp.restry.cn/ → 200 (OK),/MP_verify_3lJy8k1UnlqLETkk.txt → 200。后续任何”放在根目录”的文件丢这个目录即可,无需再改 Caddy。详见 deployer 04-28 收尾。