域名部署详细教程(DNS + 反代 + HTTPS + announce)
服务已经按 建站手把手教程 在服务器上跑起来、用 IP 能访问之后,这篇教你怎么用自己的域名 + HTTPS 正式对外。每一步都给命令和可直接抄的 Nginx 配置。不懂的词查 术语小词典。
这篇解决什么问题
现在你大概是用 http://服务器IP:3000 访问的。正式开站要换成 https://你的域名.com:用户好记、浏览器不报不安全、tracker 走加密 announce(passkey 不会被明文截获)。核心就三件事:域名解析 → 反代 + 证书 → 把 announce 地址改成域名。
TL;DR
- 域名商后台加 A 记录指向服务器公网 IP;
- 开放 80 / 443 端口(云安全组 + 系统防火墙两层);
- 装 Nginx,443 反代到 3000(web)/8080(api)/7070(tracker),用 certbot 申请 Let's Encrypt 证书;
- 后台「站点设定 → 基础设定 → Tracker 地址」填
https://你的域名.com(根地址即可,系统自动拼/announce/<passkey>); - 验证:浏览器开
https://你的域名.com/setup、下载一颗种子确认能连 tracker。
第 1 步:域名解析(DNS)
登录你买域名的平台(阿里云/Cloudflare/Namecheap 等),做两件事:
| 记录类型 | 主机名 | 指向 | 说明 |
|---|---|---|---|
| A | @(或 www) | 服务器公网 IPv4 | 主域名指向机器 |
| AAAA(可选) | @ | 服务器 IPv6 | 有 IPv6 才加 |
要不要单独的
tracker.你的域名.com子域?不用。tracker 和网站用同一个域名即可,靠 Nginx 路径区分(下一步)。省一个子域就少一份证书管理。
怎么算生效: 终端跑 ping 你的域名.com 能解析到你的服务器 IP;或用 dig 你的域名.com +short。DNS 生效有几分钟到几小时的传播时间(看 TTL),改完耐心等。
第 2 步:开放端口(防火墙 / 安全组)
两层都要开(云厂商「安全组」+ 服务器自身防火墙如 ufw/firewalld):
| 端口 | 协议 | 用途 | 是否必须 |
|---|---|---|---|
| 80 | TCP | HTTP(证书申请验证 + 跳转 HTTPS) | 必须 |
| 443 | TCP | HTTPS(用户访问 + tracker announce) | 必须 |
| 7070 | TCP | tracker HTTP(走 443 反代时不需公网开) | 走 443 则不必 |
| 6969 | UDP | tracker UDP(默认不启用,私有站用 HTTP announce 足够) | 通常不必 |
关键点:BT 客户端是通过你的 443 端口(经 Nginx)连 tracker 的,不是直连 7070。所以只要你把 announce 走 HTTPS(推荐),7070/6969 都不需要对公网开放,只让 Nginx 在本地转发即可。更安全、端口更少。
第 3 步:反向代理 + HTTPS(核心)
3.1 装 Nginx
# Debian/Ubuntu
sudo apt update && sudo apt install -y nginx
# CentOS
sudo dnf install -y nginx && sudo systemctl enable --now nginx3.2 写入站点配置
新建 /etc/nginx/sites-available/fluxtorrent.conf(或 /etc/nginx/conf.d/fluxtorrent.conf),内容整段复制,把 pt.example.com 换成你的域名:
# 边缘限流(tracker 防启动风暴;阈值远高于正常 1800s 汇报间隔)
limit_req_zone $binary_remote_addr zone=ann_perip:10m rate=60r/s;
limit_conn_zone $binary_remote_addr zone=ann_conn:10m;
server {
listen 80;
server_name pt.example.com;
# 证书申请期间允许 ACME 验证;平时这条会把所有流量跳 HTTPS
location /.well-known/acme-challenge/ { root /var/www/certbot; }
location / { return 301 https://$host$request_uri; }
}
server {
listen 443 ssl http2;
server_name pt.example.com;
ssl_certificate /etc/letsencrypt/live/pt.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/pt.example.com/privkey.pem;
client_max_body_size 32m; # 种子上传(.torrent 文件)
# tracker announce:放最前,优先匹配 /announce/,转发到本地 7070
location /announce/ {
limit_req zone=ann_perip burst=120 nodelay;
limit_conn ann_conn 120;
limit_req_status 429;
proxy_pass http://127.0.0.1:7070;
proxy_set_header Host $host;
}
# 后台接口
location /api/ { proxy_pass http://127.0.0.1:8080; }
# 网站(页面 + 静态资源 + 同源 /api 转发都由 web 容器处理)
location /_next/ { proxy_pass http://127.0.0.1:3000; }
location / { proxy_pass http://127.0.0.1:3000; }
}启用并校验:
sudo ln -s /etc/nginx/sites-available/fluxtorrent.conf /etc/nginx/sites-enabled/ 2>/dev/null
sudo nginx -t # 显示 syntax is ok 才算通过
sudo systemctl reload nginx3.3 申请 HTTPS 证书(Let's Encrypt,免费)
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d pt.example.com按提示填邮箱、同意条款,证书会自动签发并写入上面配置的 /etc/letsencrypt/live/pt.example.com/ 路径。certbot 还会自动把 80→443 跳转和证书续期都配好。
用 1Panel / 宝塔? 面板里「网站 → 创建网站 → 反向代理」填
http://127.0.0.1:3000,再在网站设置里「申请 Let's Encrypt 证书 + 强制 HTTPS」即可,不用手敲 Nginx(详见 面板部署)。但/announce/→ 7070 这条 tracker 反代面板不会自动加,仍需在面板的高级配置里补上那段location /announce/。
第 4 步:把 announce 地址改成域名(关键)
Nginx 起好后,去后台改 tracker 地址,让种子里的 announce 变成你的域名:
浏览器开
https://你的域名.com/admin(或装完向导直接点「去管理后台」);站点设定 → 基础设定 → Tracker 地址,填:
https://pt.example.com⚠️ 填根地址就行,不要手填
/announce。系统会自动在后面拼/announce/<你的passkey>;就算你手滑写了https://pt.example.com/announce,代码也会自动剥掉多余的/announce(这个坑历史上出过 P0 双路径 bug,现已修复并兜底)。(推荐)HTTPS announce:同一页还有「HTTPS announce 地址」,也填
https://pt.example.com。填了之后,发出的种子会走 BEP12 双 tier——https首选 +http回退,passkey 加密传输,老客户端连不上 https 也能自动降级。改完后,已经发出去的旧种子要重新下载才带新地址(announce 是烧进
.torrent文件里的,不会自动变)。
怎么验证 announce 正确:
- 发一颗测试种子(或后台找一颗),用文本编辑器打开下载的
.torrent,搜announce,应看到https://pt.example.com/announce/xxxxxxxx; - 或更直接:下载种子后用客户端做种,看能否连上 tracker(做种一小时魔力正常入账,见 开站第一周)。
第 5 步:CORS 等收尾
- 编辑服务器上的
docker/.env,确保有:CORS_ORIGINS=https://pt.example.com(多个域名逗号分隔)。改完docker compose up -d重启生效。 - WebAuthn(两步验证)的域名会自动取 announce 地址的 host,不用单独设;
- 如果之前向导里 announce 填的是 IP,现在改成域名后,记得回向导结束页或后台确认「开站检查清单」里 announce 不再是本地回环。
第 6 步:验证全链路
curl https://pt.example.com/api/v1/health # 应返回 {"status":"up"}浏览器访问 https://pt.example.com:
- 地址栏显示小锁(HTTPS 生效);
- 页面正常、能登录;
- 下载一颗种子,客户端能连上 tracker(做种统计走动)。
到这,你的站就是正式的公网 HTTPS 站了。
常见问题
| 现象 | 原因 | 怎么办 |
|---|---|---|
| 浏览器打不开 443 | 证书路径错 / 防火墙 443 没开 | nginx -t 看报错;确认安全组+系统防火墙都开了 443 |
| 页面能开但种子连不上 tracker | Nginx 没代理 /announce/ 到 7070 | 检查 3.2 的 location /announce/ 段,reload nginx |
| 改了 announce 还是 127.0.0.1 | 后台值没改 / 旧种子缓存 | 确认后台是域名;已发种子重新下载 |
| announce 报 404/421 | announce_url 拼错或带了多余端口 | 填根地址 https://域名,不要带 :7070、不要带 /announce |
| 要不要开 6969/UDP | 默认不需要 | 私有站走 HTTP(S) announce 即可(行业惯例);除非你显式配了 TRACKER_UDP_URL |
| certbot 报错「无法验证域名」 | 80 端口没开 / DNS 未生效 | 确认 80 开着、域名已解析到本机 IP,等 DNS 传播 |
词看不懂?→ 术语小词典