概述

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。deployerlib/caddy.js 04-20 因此踩坑修复
  • Caddy 自动 HTTPS 功能极大简化了证书管理
  • 反向代理路径匹配需注意通配符和优先级
  • 容器化部署的 Caddy 需要正确挂载 Caddyfile 和数据目录
  • 修改 Caddyfile 后需要 caddy reload 生效
  • Docker 网络隔离:Caddy 容器(mattermost-caddyweb-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.cnGitea (3000)
outline.nexora.restry.cnOutline (3000 内部)
portainer.nexora.restry.cnPortainer (9000)
uptime.nexora.restry.cnUptime 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,容器重启不丢配置
  • SSE 支持:需确保 SSE endpoint /api/ops/streamflush_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 空输出,必须换二进制。

步骤

  1. caddyserver.com/download 勾选 caddyserver/caddy-ratelimit 下载带模块的 v2.11.2 二进制 → 替换 /usr/bin/caddy(旧版备份 caddy.bak)→ 重启 caddy.service
  2. 通过 admin API(localhost:2019)注入 4 档限流到 image-studio 的 subroute——其他三站(deploy.mvp / shutiao-world / realtime-voice)路由原样保留
  3. 顺手修了重启丢路由的炸弹:admin API 动态加的路由会被 systemctl restart caddy 全清,只剩 Caddyfile 里的。systemd override.confExecStart=/usr/bin/caddy run --resume,让 Caddy 启动时从 autosave.json 自动恢复

4 档限流(按 IP,触发返 429)

接口限速防什么
/api/auth/login5 req/分access key 爆破
/api/user/topup10 req/分充值码爆破
/api/generate20 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 收尾。