|
| 1 | +# MaiBot WebUI Compose TLS/SSL 教程 |
| 2 | + |
| 3 | +本文档专门说明 Docker Compose 部署下如何通过 Caddy 为 MaiBot WebUI 提供 HTTPS。 |
| 4 | + |
| 5 | +## 1. 目标结构 |
| 6 | + |
| 7 | +启用后,网络结构应为: |
| 8 | + |
| 9 | +```text |
| 10 | +浏览器 |
| 11 | + -> https://maibot.example.com |
| 12 | + -> Caddy 容器 :80/:443 |
| 13 | + -> core 容器 :8001 |
| 14 | + -> MaiBot WebUI |
| 15 | +``` |
| 16 | + |
| 17 | +这意味着: |
| 18 | + |
| 19 | +1. core 不再直接对公网暴露 8001 |
| 20 | +2. Caddy 统一接管 80 和 443 |
| 21 | +3. Caddy 通过 Docker 网络访问 core:8001 |
| 22 | + |
| 23 | +## 2. 仓库里已经补了什么 |
| 24 | + |
| 25 | +本仓库已补充以下内容: |
| 26 | + |
| 27 | +1. 根目录 docker-compose.yml 中新增了默认注释的 Caddy 示例块 |
| 28 | +2. 根目录 docker-compose.yml 中新增了默认注释的 Caddy 数据卷定义 |
| 29 | +3. dashboard/docs/Caddyfile.docker.example 提供了 Docker Compose 专用配置模板 |
| 30 | +4. dashboard/docs/Caddyfile.host.example 提供了非 Docker 宿主机专用配置模板 |
| 31 | + |
| 32 | +## 3. 你需要手动注释或启用哪一段 |
| 33 | + |
| 34 | +你要求默认保持注释状态,因此这里只明确告诉你需要操作的段落。 |
| 35 | + |
| 36 | +### 3.1 需要注释掉的现有段落 |
| 37 | + |
| 38 | +启用 Caddy 以后,请注释掉根目录 docker-compose.yml 中 core 服务下这一段端口映射: |
| 39 | + |
| 40 | +```yaml |
| 41 | +ports: |
| 42 | + - "18001:8001" |
| 43 | +``` |
| 44 | +
|
| 45 | +原因很简单: |
| 46 | +
|
| 47 | +1. 这段会把 WebUI 的明文 HTTP 直接暴露到宿主机 |
| 48 | +2. 启用 HTTPS 以后,应由 Caddy 对外暴露 80 和 443 |
| 49 | +3. 避免出现“HTTPS 入口和 HTTP 入口同时暴露”的混乱状态 |
| 50 | +
|
| 51 | +### 3.2 需要取消注释并启用的段落 |
| 52 | +
|
| 53 | +启用时你需要在根目录 docker-compose.yml 中取消注释这两部分: |
| 54 | +
|
| 55 | +1. caddy 服务块 |
| 56 | +2. volumes 里的 caddy_data 和 caddy_config |
| 57 | +
|
| 58 | +## 4. 启用前需要准备什么 |
| 59 | +
|
| 60 | +1. 域名已经解析到你的服务器公网 IP |
| 61 | +2. 宿主机的 80 和 443 未被占用 |
| 62 | +3. 防火墙和云安全组已放行 80 和 443 |
| 63 | +4. WebUI 当前可以通过 compose 正常启动 |
| 64 | +5. 你已经准备修改 dashboard/docs/Caddyfile.docker.example 里的域名 |
| 65 | +
|
| 66 | +## 5. Caddy 配置文件如何写 |
| 67 | +
|
| 68 | +Docker Compose 模式请使用:dashboard/docs/Caddyfile.docker.example |
| 69 | +
|
| 70 | +非 Docker 宿主机模式请使用:dashboard/docs/Caddyfile.host.example |
| 71 | +
|
| 72 | +最小可用配置如下: |
| 73 | +
|
| 74 | +```caddyfile |
| 75 | +maibot.example.com { |
| 76 | + reverse_proxy core:8001 |
| 77 | +} |
| 78 | +``` |
| 79 | + |
| 80 | +建议你至少做这两处修改: |
| 81 | + |
| 82 | +1. 把 maibot.example.com 改成你的真实域名 |
| 83 | +2. 如果你有额外安全要求,再按需增加 header 配置 |
| 84 | + |
| 85 | +## 6. compose 启用步骤 |
| 86 | + |
| 87 | +### 6.1 修改 WebUI 配置 |
| 88 | + |
| 89 | +先在 config/bot_config.toml 中确认: |
| 90 | + |
| 91 | +```toml |
| 92 | +[webui] |
| 93 | +mode = "production" |
| 94 | +secure_cookie = true |
| 95 | +trust_xff = true |
| 96 | +``` |
| 97 | + |
| 98 | +trusted_proxies 的建议值取决于你的实际网络。 |
| 99 | + |
| 100 | +如果 Caddy 和 core 在同一个 Docker 网络里,建议先按实际来源地址或网段填写。不要为了省事直接把范围开得过大。 |
| 101 | + |
| 102 | +### 6.2 修改 Caddyfile |
| 103 | + |
| 104 | +编辑 dashboard/docs/Caddyfile.docker.example,把域名替换为真实值。 |
| 105 | + |
| 106 | +### 6.3 修改 compose |
| 107 | + |
| 108 | +1. 注释掉 core 服务里对外暴露 WebUI 的 ports 段 |
| 109 | +2. 取消注释 caddy 服务块 |
| 110 | +3. 取消注释底部 volumes 里的 caddy_data 和 caddy_config |
| 111 | + |
| 112 | +### 6.4 启动服务 |
| 113 | + |
| 114 | +```bash |
| 115 | +docker compose up -d |
| 116 | +``` |
| 117 | + |
| 118 | +### 6.5 查看日志 |
| 119 | + |
| 120 | +```bash |
| 121 | +docker compose logs -f caddy |
| 122 | +docker compose logs -f core |
| 123 | +``` |
| 124 | + |
| 125 | +## 7. Let's Encrypt 申请与续期 |
| 126 | + |
| 127 | +### 7.1 证书申请触发条件 |
| 128 | + |
| 129 | +Caddy 容器启动后,满足以下条件时会自动申请证书: |
| 130 | + |
| 131 | +1. 域名已解析到当前服务器 |
| 132 | +2. 80 和 443 对公网开放 |
| 133 | +3. Caddy 能成功接收到针对该域名的请求 |
| 134 | + |
| 135 | +### 7.2 自动续期说明 |
| 136 | + |
| 137 | +Caddy 会自动续期。你通常不需要编写 crontab,也不需要手工执行 certbot。 |
| 138 | + |
| 139 | +你只需要确保: |
| 140 | + |
| 141 | +1. caddy_data 卷被持久化 |
| 142 | +2. 容器会长期运行 |
| 143 | +3. 域名长期指向同一台服务器或新服务器已同步迁移数据 |
| 144 | +4. 80 和 443 没被防火墙阻断 |
| 145 | + |
| 146 | +### 7.3 续期检查建议 |
| 147 | + |
| 148 | +建议定期执行: |
| 149 | + |
| 150 | +```bash |
| 151 | +docker compose logs --tail=200 caddy |
| 152 | +docker compose ps |
| 153 | +``` |
| 154 | + |
| 155 | +重点关注: |
| 156 | + |
| 157 | +1. ACME 申请失败 |
| 158 | +2. 证书续期失败 |
| 159 | +3. 端口绑定失败 |
| 160 | +4. 域名解析不一致 |
| 161 | + |
| 162 | +## 8. 常见错误与排查 |
| 163 | + |
| 164 | +### 8.1 证书申请失败 |
| 165 | + |
| 166 | +优先检查: |
| 167 | + |
| 168 | +1. 域名是否指向服务器公网 IP |
| 169 | +2. 是否已经开启 CDN 代理但未正确放通验证流量 |
| 170 | +3. 80 和 443 是否被云厂商安全组拦截 |
| 171 | +4. 宿主机是否还有别的程序占用了 80 或 443 |
| 172 | + |
| 173 | +### 8.2 登录失败 |
| 174 | + |
| 175 | +优先检查: |
| 176 | + |
| 177 | +1. webui.secure_cookie 是否已启用 |
| 178 | +2. 请求是否真正走 https:// 域名 |
| 179 | +3. 代理是否正确传递了 X-Forwarded-Proto |
| 180 | + |
| 181 | +### 8.3 WebSocket 连接失败 |
| 182 | + |
| 183 | +优先检查: |
| 184 | + |
| 185 | +1. Caddy 是否已正确反向代理到 core:8001 |
| 186 | +2. 页面是否通过 HTTPS 打开 |
| 187 | +3. 浏览器开发者工具里是否出现混合内容报错 |
| 188 | + |
| 189 | +## 9. 迁移建议 |
| 190 | + |
| 191 | +如果你目前已经在用: |
| 192 | + |
| 193 | +```yaml |
| 194 | +ports: |
| 195 | + - "18001:8001" |
| 196 | +``` |
| 197 | +
|
| 198 | +那说明当前还是“宿主机明文 HTTP 暴露 WebUI”模式。迁移到 HTTPS 时建议: |
| 199 | +
|
| 200 | +1. 先准备好域名 |
| 201 | +2. 先改好 Caddyfile |
| 202 | +3. 再切换 compose 暴露方式 |
| 203 | +4. 切换后直接以 https://域名 访问,不再继续使用 http://服务器IP:18001 |
0 commit comments