Skip to content

Commit 33d408d

Browse files
committed
feat: 添加 Caddy 反向代理配置示例及 TLS/SSL 文档
1 parent 28afa6f commit 33d408d

5 files changed

Lines changed: 656 additions & 0 deletions

File tree

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
maibot.example.com {
2+
encode zstd gzip
3+
4+
header {
5+
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
6+
X-Content-Type-Options "nosniff"
7+
X-Frame-Options "SAMEORIGIN"
8+
Referrer-Policy "strict-origin-when-cross-origin"
9+
}
10+
11+
reverse_proxy core:8001
12+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
maibot.example.com {
2+
encode zstd gzip
3+
4+
header {
5+
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
6+
X-Content-Type-Options "nosniff"
7+
X-Frame-Options "SAMEORIGIN"
8+
Referrer-Policy "strict-origin-when-cross-origin"
9+
}
10+
11+
reverse_proxy 127.0.0.1:8001
12+
}
Lines changed: 203 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,203 @@
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

Comments
 (0)