宝塔面板部署方式(从零到上线)
本篇是用 宝塔(BT-Panel)面板建站的完整步骤:装宝塔 → 起 compose 栈 → 安装向导 → 域名 HTTPS → 发种邀请。用命令行(SSH)看 SSH 部署方式;用 1Panel 看 1Panel 部署方式。域名原理见 域名部署。不懂的词查 术语小词典。
全程地图(先看这张,心里有数)
整条路 9 个阶段,每阶段末尾都有「完成标志」——对上了才进下一阶段,卡住就查常见问题:
A 准备服务器 ──→ B 装宝塔 ──→ C 传代码+配密码 ──→ D 起栈(6 容器)
│ 完成=health 返回 up
▼
E 浏览器装向导(四步)──→ F 开站检查 ──→ G 域名+HTTPS(6 小步)──→ H 发种邀请 ──→ I 备份
完成=✅安装完成 完成=小锁亮+tracker 通三条铁律,先记住再动手(每条都是真实站长踩过的):
- 别混用部署形态:整站是 6 个容器的 compose 栈。不要用宝塔「Python/Node 项目」部署、不要在面板里单独装 MySQL/Redis(和栈里的抢端口);
- 终端命令都在仓库目录里跑:本文以
~/FluxTorrent为准(git clone 路线)。跑命令前pwd确认自己在哪; - 每步只做本文写的事:宝塔界面里其他按钮/配置(SSL 段、伪静态、缓存)都是它自己管理的,别顺手改。
🚀 嫌阶段 C/D 手动步骤多? 服务器侧其实一条命令就够(自动拉代码 + 自动生成
.env三项机密 + 端口冲突自动避让 + 起栈):bashcurl -fsSL https://github.com/gntv456/FluxTorrent/raw/master/scripts/quick-deploy.sh | sudo bash -s -- --install-docker跑完直接跳阶段 E 安装向导,宝塔面板到阶段 G(域名 HTTPS)才用上。脚本说明见 快速开始。手动走 C/D 的好处是你能看懂每一步在干什么——第一次装建议手动走一遍。
TL;DR(赶时间看这版)
| 阶段 | 一句话做什么 | 完成标志 |
|---|---|---|
| A 准备服务器 | 2 核 4G 起、Ubuntu、装宝塔(它自带 Docker) | 宝塔面板能登录 |
| B 起 compose 栈 | 终端跑一条 up -d(宝塔免费版无编排 UI) | 6 容器全 Up |
| C 安装向导 | 浏览器开 /setup,填四步 | 「✅ 安装完成」+ 邀请码 |
| D 域名 HTTPS | 宝塔建网站 + 反代 + 证书 + 一键补 tracker 反代 | 小锁亮、/announce/ 返回 4xx |
| E 发种邀请 | 传种子、发邀请码 | 第一颗种子有人做种 |
没耐心读全文? 先看 快速开始,或用命令行方式(SSH 部署)。
这篇能带你走到哪
从「买台干净服务器」到「https://你的域名.com 公网可访问、用户能做种」,终端命令很少(宝塔免费版没有 compose 编排 UI,起栈用终端跑一条命令)。预计 30–60 分钟。每一屏点什么、每个框填什么、怎么确认这步成了,本文都写到了。
阶段 A:准备服务器
做什么:买机器、能 SSH 登进去。
- 买一台 VPS:2 核 4G 起步、有公网 IPv4、系统选 Ubuntu 22.04/24.04 LTS(宝塔对 CentOS/Ubuntu 都支持,本文以 Ubuntu 为例)。记下公网 IP;
- 自己电脑开 PowerShell(Windows)或终端(Mac),
ssh root@你的IP登录(密码在你邮件/云厂商控制台里); - 基础安全(建议,可跳过):
adduser deploy && usermod -aG sudo deploy;防火墙ufw先别开,阶段 G 再开 80/443。
✅ 完成标志:终端提示符变成 root@你的机器名:~#。
💡 复制粘贴:SSH 终端里粘贴 = 右键或
Ctrl+Shift+V;复制 = 鼠标拖选后右键。本文的命令块都可以整段复制粘贴(多行会逐行自动执行)。
阶段 B:安装宝塔
做什么:装面板(它管网站的域名/证书/文件),顺带装 Docker。
- 服务器终端跑官方脚本(装完会打印面板地址、账号、密码,务必截图或抄下来):
wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh- 浏览器开面板地址登录(地址一般是
http://你的IP:8888/随机路径,注意云安全组要放行 8888 才能打开); - 首次进入 → 软件商店 → 搜「Docker」→ 安装 Docker 管理器(会带上 compose 插件)。
宝塔本身不自动装 Docker,要先装 Docker 管理器。
✅ 完成标志:宝塔面板能登录,软件商店里 Docker 管理器显示「已安装」。终端跑 docker compose version 有版本号输出。
阶段 C:上传代码 + 配环境
做什么:把代码放上服务器,改三个密码。
代码放哪二选一(两条路只能走一条,别混着来):
- 路线 1(终端 git clone,推荐):
git clone https://github.com/gntv456/FluxTorrent.git && cd FluxTorrent(SSH 形式:git clone git@github.com:gntv456/FluxTorrent.git && cd FluxTorrent)。代码会落在家目录~/FluxTorrent(root 登录即/root/FluxTorrent),后续命令都在这个目录里跑。若报destination path 'FluxTorrent' already exists,是以前克隆过:cd ~/FluxTorrent && git pull继续即可;残留半截目录则先cd ~再rm -rf ~/FluxTorrent后重克隆(rm 前必须先 cd 出去,否则 shell 还停在已删除的目录里,下一条命令会报No such file or directory)。 - 路线 2(宝塔「文件」上传):把仓库 zip 打包上传解压到
/opt/fluxtorrent,后续命令都在/opt/fluxtorrent里跑。想统一到这个位置也可以:克隆后mv ~/FluxTorrent /opt/fluxtorrent。
⚠️ 两条路线目录不同(
~/FluxTorrentvs/opt/fluxtorrent),后面所有阶段的cd按你选的路线走。找不到文件时先pwd看自己在哪、ls看目录内容,别凭印象猜。
然后配环境——.env 是本站的真实配置文件(.env.example 只是模板,永远不动它)。先复制一份再改,两种方式选一种:
方式 1(终端两行):
cp docker/.env.example docker/.env
nano docker/.env # 改完保存 Ctrl+O 回车,退出 Ctrl+X方式 2(宝塔「文件」界面点着改,不碰命令行编辑器):
- 宝塔「文件」上方地址栏粘贴
/root/FluxTorrent/docker(路线 2 则/opt/fluxtorrent/docker)回车进入; - 在文件列表找到
.env.example——看不到就找「显示隐藏文件」类开关(点开头的文件在部分版本里默认不显示); - 勾选
.env.example→ 「复制」→ 目标填当前目录 → 确定后出现副本 → 勾选副本 → 「重命名」→ 输入.env; - 双击
.env(或勾选后点「编辑」)打开在线编辑器,改完下面三项点「保存」。 嫌麻烦也可以把.env.example下载到自己电脑,本地改名为.env、用记事本改完,再通过「文件」上传回docker/目录——效果一样。
改哪三行(= 后面换成你自己的值;终端跑 openssl rand -base64 48 可以生成随机串):
| 改哪行 | 填什么 | 为什么 |
|---|---|---|
DB_PASSWORD= | 强密码,如 Db#2026xk9 | 数据库密码,忘了进不去库 |
REDIS_PASSWORD= | 另一个强密码 | 缓存密码 |
JWT_SECRET= | ≥32 位随机串,别含 change_me | 登录令牌签名密钥——知道它的人能伪造任意用户登录态,所以不能是弱值或默认值 |
其余行(含注释掉的 # 行)全部保持默认不动,配域名时(阶段 G)再回来改 CORS_ORIGINS。
✅ 完成标志:cat docker/.env | grep -E "PASSWORD|JWT"(或面板里看文件)三行都不是 change_me 开头。
阶段 D:起 compose 栈(终端)
做什么:一条命令把 6 个服务全部拉起(首次要拉镜像,几分钟)。
cd ~/FluxTorrent # 路线 2(上传解压)则改为 cd /opt/fluxtorrent
docker compose -f docker/docker-compose.yml up -d怎么确认成了:
docker compose -f docker/docker-compose.yml ps6 个容器(postgres/redis/api/worker/tracker/web)状态都是 Up(带 healthy 更好)即成功;再跑 curl http://localhost:8080/api/v1/health 期望返回 {"...status":"up"...}。
⚠️ 不要在面板里逐个容器点「启动/重启」——整个栈的生命周期交给 compose。也别用宝塔「Python/Node 项目」形态部署(那会把栈拆散,升级对不上)。MySQL/Redis 别在面板另装(栈内自带,再装抢端口)。
❌ 容器起不来/Created 不动? 九成是端口被同机旧服务占了(宿主 redis/MySQL 或别的栈)。快速定位:
docker inspect flux-redis --format '<span v-pre>{{.State.Error}}</span>' # 看到 address already in use 即是解法见常见问题表第 2 行(停旧服务或换端口,一条 FLUX_REDIS_PORT=6380 写进 .env 再 up -d)。
✅ 完成标志:6 容器全 Up + health 返回 status: up。
阶段 E:安装向导(逐屏)
做什么:让外网浏览器能打开安装页,四步点完。
第 1 小步:打开 3000 的对外访问——两种情况:
- 用了 quick-deploy.sh 的:脚本已自动把
WEB_BIND=0.0.0.0写进.env(向导未完成时),跳到第 2 小步; - 手动部署的:web 容器默认只绑
127.0.0.1(安全默认,外网摸不到),手动临时对外开:
echo "WEB_BIND=0.0.0.0" >> ~/FluxTorrent/docker/.env
cd ~/FluxTorrent && docker compose -f docker/docker-compose.yml up -d第 2 小步:到云厂商控制台(你买服务器的那家网页后台,不是宝塔)的「安全组/防火墙」放行 3000/TCP 入站。
第 3 小步:浏览器开 http://你的IP:3000/setup。
四步向导逐屏怎么点(详细每屏的截图说明在 SSH 部署·阶段 C,要点如下):
| 屏 | 填什么/点什么 | 注意 |
|---|---|---|
| ① 选站型 | 拿不准点「综合」 | 以后随时能换 |
| ② 站点信息 | 站点名填你的站名;黄框两框填相同的 ≥8 位新密码(这是以后的管理员密码);下方凭证框填 root + password123(当前密码——向导会自动「用旧密码登录→改成黄框新密码→继续」,凭证框永远填当前密码,别填 admin,不存在这个账号会报「凭证无效」);announce 清空留空(域名没配好前填了必错;页面也会提示) | 新密码记在安全的地方 |
| ③ 新手模板 | 拿不准点「跳过」 | 后台随时切 |
| ④ 合规确认 | 勾选 → 「完成安装」 | 不勾按钮是灰的 |
✅ 完成标志:看到「✅ 安装完成」+ 首个邀请码(复制保存)。IP 直连时完成页还有一张「反代 + HTTPS + 收回 3000」三步收尾卡——那就是阶段 G 要做的事,先不管。
第 4 小步(收尾):收回向导期间临时开的 3000——docker/.env 里删掉 WEB_BIND=0.0.0.0 那行(quick-deploy 写入的也是删行收回;或直接重跑 bash scripts/quick-deploy.sh,检测到向导已完成会自动删),然后终端:
cd ~/FluxTorrent && docker compose -f docker/docker-compose.yml up -d云厂商安全组把 3000/TCP 入站规则删掉(流量全走 443,3000 只留本机)。
阶段 F:开站前检查(1 分钟)
做什么:向导结束页有一张「开站检查清单」,每条带直达链接。此时 announce 一项必然是黄的(域名还没配,正常,阶段 G 修);SMTP 没配也不影响开站(找回密码暂时不可用,见 开站 checklist)。现在不用逐项改,记住入口在哪即可。
阶段 G:域名 + HTTPS(宝塔里做,6 小步)
做什么:把 http://IP:3000 换成 https://你的域名.com(用户好记、小锁亮、tracker 走加密)。前提:你已买好一个域名(阿里云/Cloudflare/Namecheap 均可,几十块一年)。
G.1 DNS 解析(在域名商后台,不在宝塔)
域名商后台找「DNS 解析/记录」→ 添加记录:
| 记录类型 | 主机记录 | 记录值 | TTL |
|---|---|---|---|
| A | @(或你的子域如 mfwg) | 你的服务器公网 IP | 默认即可 |
✅ 完成标志:终端 dig 你的域名 +short 输出你的服务器 IP(刚加的要等几分钟到几小时,没生效就先做 G.2,回头再验)。
G.2 开放端口(在云厂商控制台)
云安全组入站放行 80/TCP、443/TCP(22 保持)。tracker 走 443 反代,7070/6969 不用对公网开。
✅ 完成标志:安全组规则列表里有 80 和 443 两条入站规则。
G.3 建站点 + 反代 + 证书(逐字段)
① 添加站点:宝塔 「网站 → 添加站点」,表单逐项:
| 表单项 | 填什么 | 说明 |
|---|---|---|
| 域名 | mfwg.ptang.top(你的域名) | 一行一个;www 前缀想绑也再填一行 |
| PHP 版本 | 纯静态 | 我们不需要 PHP |
| 数据库 / FTP | 都不建 | 栈内自带 postgres |
| 站点目录 | 保持默认(/www/wwwroot/域名) | 空壳而已:所有流量走反代进容器,目录不会被读取,也不用往里放文件 |
② 添加反向代理:点站点名 → 「反向代理 → 添加反向代理」,表单逐项:
| 表单项 | 填什么 | 说明 |
|---|---|---|
| 代理名称 | flux(随意) | 只是个标签 |
| 目标 URL | http://127.0.0.1:3000 | web 容器的宿主端口 |
| 发送域名 | $host | ⚠️ 默认是 127.0.0.1,必须改。它是转发时的 Host 头,传 127.0.0.1 会污染后端生成绝对链接(RSS/回调/跳转) |
| 内容替换 | 留空 | 一条都不加 |
| 代理目录 | 不动 | 不开高级功能 |
③ 申请证书:点站点名 → 「SSL」标签页 → Let's Encrypt:
- 前提自查:域名 A 记录已生效——终端
dig mfwg.ptang.top +short能返回你的服务器 IP(mfwg→37.120.176.130这种记录在域名商后台加;刚加的要等几分钟到几小时); - 文件验证方式默认即可,勾选域名 → 点「申请」。失败九成是 DNS 没生效或 80 端口没放行(G.2);
- 成功后把 「强制 HTTPS」开关打开(宝塔会自动在 80 端口加跳转)。
G.4 补 tracker 反代(重要)
默认反代只代理了网站(3000),tracker 的 /announce/ 和同源 /api/ 要补,否则用户做不了种。两种方式:
方式 1(一键脚本,推荐)——SSH 里一条命令(在仓库目录下):
bash scripts/reverse-proxy.sh --domain mfwg.ptang.top脚本会:自动检测宝塔/系统 Nginx → 在站点配置里写入带标记的受管块(/api/ + /announce/ 两条 location,端口自动读 docker/.env,改端口重跑即刷新)→ nginx -t 校验后重载 → 自动画像体检(/api/v1/health 经域名可达?/announce/ 返回码正常?)→ 告诉你后台 Tracker 地址该填什么。幂等可重跑;想撤销就把标记块删掉。--dry 只看不做,--status 只体检不改。
方式 2(手动,面板里点)——点站点名 → 「配置文件」(就是 Nginx 配置全文)。你的配置是一个 server 块同时监听 80 和 443(新版宝塔默认模板):
- 往下滚动找到
#PHP-INFO-START这一行(大约在 SSL 配置、错误页配置之后); - 在
#PHP-INFO-START的正上方(也就是#ERROR-PAGE-END之后)插入下面四行,让它成为这个 server 块里的一个 location:
location /announce/ {
proxy_pass http://127.0.0.1:7070;
proxy_set_header Host $host;
}方式 2 只补了
/announce/——/api/通常走 G.3-② 那条全站反代已覆盖(/api/也是转 3000,web 容器统一出口);若你的反代只代理了根路径之外的东西,补一条location /api/ { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; }即可。方式 1 的受管块两条都写。
插入后那一段长这样(对照确认位置对不对):
#ERROR-PAGE-END
location /announce/ {
proxy_pass http://127.0.0.1:7070;
proxy_set_header Host $host;
}
#PHP-INFO-START两个「为什么插这里」: ① 必须在 include .../proxy/*.conf(你配置中间那行「引用反向代理规则」)加载的网站反代之前被匹配到——Nginx 取最长前缀匹配,/announce/ 比 / 长,所以写在文件任何位置其实都能赢过 /,但放在 include 前面最直观、以后排查不绕;② listen 80 和 listen 443 在同一个 server 块里,所以只插这一处,HTTP 和 HTTPS 两个口都生效。
点「保存」,宝塔自动重载 Nginx。改坏了别慌:整段复制出来备份,或删掉反代重建一次就恢复原状。
验证 tracker 反代通了:终端 curl -I https://你的域名/announce/ 返回 4xx/200 都算「通了」(404/403 = 已到 tracker 只是没带 passkey;502/504 = 反代没通,检查端口)。
G.5 后台改 announce 为域名 + 收紧 3000
做什么:告诉系统「种子的 tracker 地址 = 你的域名」,再把临时开的 3000 收回来。共 5 步:
- 浏览器开
https://你的域名.com/admin(用阶段 E 黄框里设的新密码登录); - 左侧 「站点设定 → 基础设定」→ Tracker 地址 填
https://你的域名.com(根地址,不要带/announce——系统自动拼/announce/<passkey>); - (推荐)同页「HTTPS announce 地址」也填
https://你的域名.com→ 种子走 BEP12 双 tier(https 首选 + http 回退),passkey 加密传输; - 编辑
docker/.env(面板双击或终端 nano):CORS_ORIGINS=https://你的域名.com; - 收回 3000(阶段 E 若还没做):
docker/.env删掉WEB_BIND=0.0.0.0行 →cd ~/FluxTorrent && docker compose -f docker/docker-compose.yml up -d→ 云安全组删 3000/TCP 规则。
G.6 验证上线(三连检,全过才算 G 阶段完成)
curl https://你的域名.com/api/v1/health # ① 期望 {"...status":"up"...}
curl -I https://你的域名.com/announce/ # ② 期望 4xx(404/403 都算通;502=反代没通)③ 浏览器开 https://你的域名.com:小锁亮、能登录、下载一颗种子客户端能连 tracker(做种一小时魔力入账)。
✅ 阶段 G 完成标志:三条全过。任何一条不过 → 对应修法:① 查栈/安全组 443;② 回 G.4;③ 小锁不亮=证书没生效(宝塔 SSL 页重申)、连不上 tracker=后台 announce 没改(G.5)。
阶段 H:发第一颗种子 + 邀请
做什么:空站没人留,先自己传内容打底。
- 点阶段 E 结束页「发布第一颗种子」(或站内
/upload)传一个真实资源; - 建议管理组先传 20–50 个再开门迎客(方法见 内容冷启动);
- 邀请:向导给的首个邀请码交给第一人;更多在后台「邀请管理」发,或
/invites自助生成;想开放注册 → 后台改注册模式open。
✅ 完成标志:站内有种子、BT 客户端做种中、第一个用户注册成功。
阶段 I:上线后两件事(别跳过)
- 备份(强烈建议):
scripts/backup.sh挂 cron(pg_dump + 附件卷 + 14 天轮转),并演练一次scripts/restore.sh --drill——没验证过的备份等于没有; - 监控(可选):
docker compose --profile monitoring up -d起 Prometheus + Grafana。
🎉 完成
https://你的域名.com 公网可访问、用户能注册能做种、有备份。后续运营看 运营 playbook。
常见问题
| 现象 | 原因 | 怎么办 |
|---|---|---|
| 宝塔找不到 compose 入口 | 免费版本就没有 | 阶段 D 用终端 docker compose up -d 起栈 |
| 容器列表里多个容器「异常/Created」,redis 起不来 | 6379(或 5432)被宿主上已有服务占用——常见于服务器上还跑着别的站(或宝塔软件商店装过 Redis/MySQL):docker inspect flux-redis --format '{{.State.Error}}' 看到 address already in use 即是 | 两选一:① 停掉抢端口的面板版 Redis/MySQL(宝塔「软件商店」里停用),再 docker compose up -d;② 保留旧服务,给本栈换端口——docker/.env 追加 FLUX_REDIS_PORT=6380(数据库同理 FLUX_DB_PORT=5433),再 up -d。注意同机的 sub2api 等其它栈自带 redis 时,它们抢的是自己的容器网络,不冲突;抢 127.0.0.1:6379 宿主端口的是宿主进程(ss -lntp | grep 6379 看 users: 里是不是 docker-proxy) |
| 网站能开但种子连不上 tracker | /announce/ 反代没补 | 回 G.4 在站点配置文件加那段 |
| 443 打不开 | 安全组/防火墙没开 443 | 云安全组 +(若开 ufw)ufw allow 443 |
| announce 仍 127.0.0.1 | 后台值没改 | G.5 改域名根地址,旧种子重下 |
| 用「Python/Node 项目」部署后升级乱 | 栈被拆散 | 改用 compose 栈方式重来 |
词看不懂?→ 术语小词典