可选 HTTPS 部署
August 1, 2026 · View on GitHub
默认的 http://127.0.0.1:8420 和局域网 HTTP 行为不变。按访问场景选择一个入口:
| 场景 | 推荐入口 | 证书 | 客户端地址 |
|---|---|---|---|
| 有公网域名,PC / 手机 / 远程插件访问 | docker-compose.https.yml + Caddy | 自动申请、续期,浏览器直接信任 | https://obc.example.com |
| 仅可信局域网或自管网络 | 内置 TLS Proxy / Docker tls profile | 本地 CA 或自有证书,客户端需手动信任 | https://192.168.1.20:8443 |
两种模式都只增加传输入口,不替代 OpenBiliClaw 的密码门禁或扩展设备认证,也不要同时启用。
最简公网方案:Caddy 自动 HTTPS(推荐)
仓库提供可叠加到源码和预构建 Compose 的 docker-compose.https.yml。Caddy 自动完成
证书申请、HTTPS 重定向、续期及 WebSocket 反代;桌面 Web、移动 Web 和浏览器插件共用同一
域名。后端 8420 只绑定宿主机 loopback,公网只开放 80/443。Caddy 会先检查后端密码
门禁;enabled=false 时仅在容器 loopback 等待,不绑定 80/443,避免首次配置产生裸奔窗口。
前置条件
- 一个公网 DNS 名称,例如
obc.example.com,其 A/AAAA 记录指向这台服务器。只有服务器 确实能接收公网 IPv6 时才发布 AAAA。 - 防火墙和云安全组放行 TCP
80、TCP443;overlay 同时发布 UDP443供 HTTP/3 使用。 - Docker Compose
2.24.4+,因为 overlay 使用!override精确替换后端端口列表。 - 公网暴露前必须开启 Web 密码门禁;远程插件还必须启用独立的
ext-key设备认证。
预构建镜像
mkdir -p ~/openbiliclaw && cd ~/openbiliclaw
curl -fsSLO https://raw.githubusercontent.com/whiteguo233/OpenBiliClaw/main/docker-compose.prebuilt.yml
curl -fsSLO https://raw.githubusercontent.com/whiteguo233/OpenBiliClaw/main/docker-compose.https.yml
# 只填 DNS 名称,不带 https://、端口或路径
export OPENBILICLAW_DOMAIN=obc.example.com
docker compose -f docker-compose.prebuilt.yml -f docker-compose.https.yml up -d
源码构建
在仓库根目录执行:
export OPENBILICLAW_DOMAIN=obc.example.com
docker compose -f docker-compose.yml -f docker-compose.https.yml up -d --build
首次签发证书需要密码门禁已启用、DNS 已生效且公网 80/443 能到达该主机。Caddy 的证书
状态与配置目录分别持久化在 openbiliclaw_caddy_data、openbiliclaw_caddy_config volume,
重建容器不会丢失。
开启访问门禁
# 交互式设置 Web 登录密码
docker exec -it openbiliclaw-backend openbiliclaw set-password
# 为远程插件生成设备密钥并开启交换;完整密钥只显示一次
docker exec -it openbiliclaw-backend openbiliclaw ext-key generate
docker exec -it openbiliclaw-backend openbiliclaw ext-key enable
# CLI 写入的是持久配置;重启后端加载门禁,再重启 Caddy 重新附着共享网络命名空间
docker restart openbiliclaw-backend
docker restart openbiliclaw-caddy
如果只需要 PC / 手机 Web,不用运行两条 ext-key 命令;Web 密码仍是公网入口的硬前置。
Caddy 在密码启用前会持续打印等待提示,并且不会申请证书或监听公网端口。
然后使用:
- PC Web:
https://obc.example.com/web - 手机 Web / PWA:
https://obc.example.com/m/ - 插件设置:协议选
HTTPS,主机填obc.example.com,端口填443,再填上一步生成的设备密钥
桌面 Web 的手机版二维码会保留当前 HTTPS 域名和端口;插件二维码也沿用插件配置的 HTTPS 地址,因此扫码不会再退回私网 IP 或明文 HTTP。
状态与排错
docker compose -f docker-compose.prebuilt.yml -f docker-compose.https.yml ps
docker compose -f docker-compose.prebuilt.yml -f docker-compose.https.yml logs openbiliclaw-caddy
curl https://obc.example.com/api/health
源码部署把上面命令的第一个 -f 改成 docker-compose.yml。签发失败时依次检查 DNS、云安全组、
主机防火墙,以及 80/443 是否被其他进程占用。不要同时启动源码 Compose 的 tls profile;
公网 Caddy 与 LAN TLS Proxy 是两种互斥入口。
LAN / self-managed TLS Proxy
面向可信局域网或自管网络的轻量 TLS 入口。默认关闭,不是公网生产级反向代理。
只有远程浏览器策略要求 HTTPS、且你愿意在客户端安装本地 CA(或提供自己的证书)时,才需要 启用本组件。公网域名优先使用上面的 Caddy overlay。
访问路径与安全边界
HTTP(默认): 客户端 ───────────────→ FastAPI :8420
HTTPS(可选): 客户端 → TLS Proxy :8443 → FastAPI :8420(本机/Compose 内网 HTTP)
- Web Origin 必须是
https://,并与请求Host的规范化 host+port 精确一致;https://evil.example:8443不会因为端口相同而放行。 - 扩展 Origin 只接受结构合法的
chrome-extension://与moz-extension://。 - 无
Origin的 CLI、健康检查等非浏览器调用可继续使用。 - TLS 响应中的 cookie 会补
Secure;重复Set-Cookie不会被合并。 - 证书下载端点只公开
ca.crt与ca.crl;另有不含秘密的/healthz。ca.key/srv.key会在代理层直接返回 404。 - HTTP/1.1 GET、POST、HEAD 与 WebSocket Upgrade 会转发;chunked 请求体不支持。
- TLS 不替代密码门禁。局域网暴露时仍建议配置
openbiliclaw set-password;远程扩展 仍需默认关闭的ext-key设备认证。
非 Docker 部署
# 1. 安装可选证书依赖
uv sync --extra tls
# pip 安装也可使用: pip install "openbiliclaw[tls]"
# 2. 写入持久配置;SAN 必须是客户端实际访问的 IP/hostname
uv run openbiliclaw tls-proxy enable --san 192.168.1.20 --san openbiliclaw.lan
# 3. TLS 代理只跟随 serve-api 启动
uv run openbiliclaw serve-api
打开:
- 桌面 Web:
https://192.168.1.20:8443/web - 移动 Web:
https://192.168.1.20:8443/m/ - 扩展后端地址:
https://192.168.1.20:8443
openbiliclaw start 当前不启动 TLS 入口;使用该功能时应运行 serve-api。TLS 已启用时,
证书解析、SSL context 或端口绑定失败会让 serve-api 以非零状态退出,不会静默退回 HTTP。
Docker Compose(源码 compose)
首次启动前设置远程客户端会使用的 SAN:
export OPENBILICLAW_TLS_SAN_NAMES="192.168.1.20,openbiliclaw.lan"
export OPENBILICLAW_TLS_PORT=8443
docker compose --profile tls up -d --build
Compose 把 OPENBILICLAW_TLS_SAN_NAMES 传为代理容器内的 SAN_NAMES,两者都是逗号分隔的
hostname/IP 列表。OPENBILICLAW_TLS_PORT 同时控制宿主机映射端口和容器监听端口。
docker-compose.prebuilt.yml 当前不包含该 profile;预构建部署请使用成熟外部网关或切换到
源码 docker-compose.yml。
查看明确的证书/SAN/绑定错误:
docker compose logs openbiliclaw-tls-proxy
证书与 SAN
自动生成必须显式开启(CLI 集成与 Compose profile 已明确开启)。首次生成包含:
- 固定本机 SAN:
localhost、127.0.0.1 - 配置的
san_names/SAN_NAMES - 本地 CA、服务器证书和 CRL;RSA 2048,有效期 3650 天
没有远程 SAN 时,自动证书只适合 localhost。 服务即使监听 0.0.0.0:8443,也不
代表证书可用于局域网 IP;客户端会正确报告 hostname mismatch。
已有 srv.crt + srv.key 时代理绝不覆盖。若配置新增 SAN,而现有证书不包含它,启动会
明确失败并列出缺失项。重签步骤:
- 停止 TLS 代理;
- 备份
cert_dir(Docker 为openbiliclaw_certsvolume); - 自有证书:签发包含全部配置 SAN 的新
srv.crt/srv.key后原位替换; - 自动生成证书:把旧的
ca.crt、ca.key、ca.crl、srv.crt、srv.key移到备份目录, 确认活动目录不再有半套 cert/key 后重启; - 在客户端重新信任新 CA。
只存在 cert 或 key 其中一个时,代理会 fail loudly,不会在半残目录里补写另一半。
信任本地 CA
首次可用忽略校验的命令下载 CA(只下载公钥证书):
curl --insecure https://192.168.1.20:8443/ca.crt -o openbiliclaw-ca.crt
- Windows:导入「受信任的根证书颁发机构」。
- macOS:钥匙串访问 → 系统 → 导入,并明确设为信任。
- Linux/Chrome:按发行版系统 CA 或 NSS 数据库流程导入。
不要复制、下载或分享 ca.key / srv.key。
配置与环境变量
非 Docker Config 的显式覆盖范围只有:
| 环境变量 | 对应配置 |
|---|---|
OPENBILICLAW_TLS_PROXY_ENABLED | [tls_proxy].enabled |
OPENBILICLAW_TLS_PROXY_PORT | [tls_proxy].port |
OPENBILICLAW_TLS_PROXY_CERT_DIR | [tls_proxy].cert_dir |
OPENBILICLAW_TLS_SAN_NAMES | [tls_proxy].san_names(逗号分隔) |
独立代理容器使用 LISTEN_HOST、LISTEN_PORT、BACKEND_HOST、BACKEND_PORT、CERT_DIR、
CERT_FILE、KEY_FILE、CA_CERT_FILE、CRL_FILE、AUTO_GEN_CERTS 与 SAN_NAMES。这些是
容器入口参数,不是通用 Config 环境变量;不要假设任意 [tls_proxy] 字段都能自动映射。
端口与客户端切换
openbiliclaw serve-api --tls-port 9443 可临时覆盖 TOML 端口,但只有
[tls_proxy].enabled=true 时才会启动。Docker 则设置 OPENBILICLAW_TLS_PORT 后重建/重启
profile。启用 TLS 不会自动改扩展或书签地址,也不会关闭原始 :8420 HTTP 映射;需要
TLS-only 策略时应同时调整 Compose 端口发布或主机防火墙。把插件后端配置切到 https
后,手机版二维码和 loopback /api/qr-info 探测会沿用 HTTPS,不会向 TLS 端口发送明文 HTTP。