Docker 绑定域名、反代与 HTTPS
目标:把 Docker 版 danmu_api 从 服务器IP:9321 改成你自己的 域名 访问。
说明:这页前半段通用,后半段二选一:Caddy 或 Nginx。
权限:下面命令默认按 root 写;如果你不是 root,就在需要权限的命令前面加 sudo。
开始前先确认这 4 件事:
第 1 步:先看清整体流程
Section titled “第 1 步:先看清整体流程”danmu_api。第 2 步:先把 Docker 端口改成只监听本机
Section titled “第 2 步:先把 Docker 端口改成只监听本机”先回到主服务目录:
cd ~/danmu-api再打开主服务的 Compose 文件:
nano docker-compose.yml把原来的:
- "9321:9321"改成:
- "127.0.0.1:9321:9321"第 3 步:重建容器,并确认现在只绑定到 127.0.0.1
Section titled “第 3 步:重建容器,并确认现在只绑定到 127.0.0.1”先回到主服务目录:
cd ~/danmu-api再重建容器:
docker compose up -d最后检查端口绑定:
docker compose ps正常情况下,你应该能看到:
127.0.0.1:9321->9321/tcp127.0.0.1:9321->9321/tcp,后面就能安全交给反代。第 4 步:给域名先建一条 DNS 记录
Section titled “第 4 步:给域名先建一条 DNS 记录”这条 Docker / VPS 路线通常只需要一条 A 记录:子域名指向 VPS 公网 IP。这里不是填云平台给的 CNAME,也不是先改 nameserver。
推荐直接用一个子域名,例如:
api.example.com大多数 DNS 提供商里,这条记录都可以先按下面这个口径填:
A 记录最常见:主机名填 api,记录值填 VPS 公网 IP。如果你的 DNS 在 Cloudflare,第一次先用 DNS only 灰云。找不到添加记录的位置时,看 云平台绑定域名页里的 Cloudflare 填记录步骤;Docker 这条线的记录值仍然填 VPS 公网 IP。如果不托管 Cloudflare,再看 域名商直接解析。
第 5 步:先选一条路线
Section titled “第 5 步:先选一条路线”下面两条路线只走一条:
路线 A:Caddy
Section titled “路线 A:Caddy”A-1:安装 Caddy
Section titled “A-1:安装 Caddy”apt updateapt install -y caddycaddy versionsystemctl status caddy --no-pager --lines=0Active: active (running) 就可以继续。A-2:写 Caddyfile
Section titled “A-2:写 Caddyfile”nano /etc/caddy/Caddyfile改成下面这样:
api.example.com { encode gzip reverse_proxy 127.0.0.1:9321}这里只需要改 1 个地方:
api.example.com换成你自己的完整域名
127.0.0.1:9321。A-3:校验并重载 Caddy
Section titled “A-3:校验并重载 Caddy”caddy validate --config /etc/caddy/Caddyfilesystemctl reload caddyValid configuration,再 reload。A-4:用 HTTPS 域名做部署后自检
Section titled “A-4:用 HTTPS 域名做部署后自检”先打开普通页面:
https://你的域名/87654321再打开管理员页面:
https://你的域名/你的ADMIN_TOKEN部署后自检 跑一遍弹幕测试,就说明 Caddy 这条线已经跑通。路线 B:Nginx + Certbot
Section titled “路线 B:Nginx + Certbot”B-1:安装 Nginx
Section titled “B-1:安装 Nginx”apt updateapt install -y nginxnginx -vsystemctl status nginx --no-pager --lines=0Active: active (running) 就可以继续。B-2:写 Nginx 站点配置
Section titled “B-2:写 Nginx 站点配置”nano /etc/nginx/sites-available/danmu-api.conf改成下面这样:
server { server_name 你的域名;
location / { proxy_pass http://127.0.0.1:9321; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }}这里只需要改 1 个地方:
你的域名换成你自己的完整域名
127.0.0.1:9321。B-3:启用站点并重载 Nginx
Section titled “B-3:启用站点并重载 Nginx”ln -s /etc/nginx/sites-available/danmu-api.conf /etc/nginx/sites-enabled/danmu-api.confrm -f /etc/nginx/sites-enabled/defaultnginx -tsystemctl reload nginxnginx -t 是否通过,再 reload。B-4:安装 Certbot
Section titled “B-4:安装 Certbot”apt install -y certbot python3-certbot-nginxcertbot --versioncertbot —nginx。B-5:申请 HTTPS
Section titled “B-5:申请 HTTPS”certbot --nginx -d 你的域名如果它问你要不要把 HTTP 自动跳到 HTTPS,直接选“跳转”那一项。
B-6:用 HTTPS 域名做部署后自检
Section titled “B-6:用 HTTPS 域名做部署后自检”先打开普通页面:
https://你的域名/87654321再打开管理员页面:
https://你的域名/你的ADMIN_TOKEN部署后自检 跑一遍弹幕测试,就说明 Nginx 这条线已经跑通。最常见的 4 个问题
Section titled “最常见的 4 个问题”1)域名一直打不开
Section titled “1)域名一直打不开”先检查两件事:
- DNS 记录是不是还没生效
- 服务器的
80和443有没有放行
如果当前机器用的是 UFW,可以先执行:
ufw allow 80/tcpufw allow 443/tcp2)证书一直没签下来
Section titled “2)证书一直没签下来”最常见的原因:
- 域名还没真正指到这台 VPS
80/443被拦住了- Cloudflare 一上来就开了代理
第一次做这条线时,Cloudflare 建议先用 DNS only。
3)还是在直接访问旧的 9321
Section titled “3)还是在直接访问旧的 9321”回去再看一次:
docker compose ps确认端口是不是已经变成:
127.0.0.1:9321->9321/tcp4)reload 后还是不通
Section titled “4)reload 后还是不通”如果你走的是 Caddy:
journalctl -u caddy -n 50 --no-pager如果你走的是 Nginx:
journalctl -u nginx -n 50 --no-pager这页做完后,下一步看哪里
Section titled “这页做完后,下一步看哪里”参考来源:Caddy 官方反向代理文档、Caddy Linux service 文档、huangxd-/danmu_api README、Ubuntu 软件源中的 nginx / certbot / python3-certbot-nginx 包信息,以及本次按正文真实命令整理的终端实操图。
纠错与建议
这一步有问题?
可以直接提交纠错或建议。我会按页面和步骤整理处理。
教程反馈