Skip to content

宝塔面板部署方式(从零到上线) ​

本篇是用 宝塔(BT-Panel)面板建站的完整步骤:装宝塔 → 起 compose 栈 → 安装向导 → 域名 HTTPS → 发种邀请。用命令行(SSH)看 SSH 部署方式;用 1Panel 看 1Panel 部署方式。域名原理见 域名部署。不懂的词查 术语小词典。

全程地图(先看这张,心里有数) ​

整条路 9 个阶段,每阶段末尾都有「完成标志」——对上了才进下一阶段,卡住就查常见问题:

A 准备服务器 ──→ B 装宝塔 ──→ C 传代码+配密码 ──→ D 起栈(6 容器)
                                                    │ 完成=health 返回 up
                                                    ▼
E 浏览器装向导(四步)──→ F 开站检查 ──→ G 域名+HTTPS(6 小步)──→ H 发种邀请 ──→ I 备份
        完成=✅安装完成                    完成=小锁亮+tracker 通

三条铁律,先记住再动手(每条都是真实站长踩过的):

  1. 别混用部署形态:整站是 6 个容器的 compose 栈。不要用宝塔「Python/Node 项目」部署、不要在面板里单独装 MySQL/Redis(和栈里的抢端口);
  2. 终端命令都在仓库目录里跑:本文以 ~/FluxTorrent 为准(git clone 路线)。跑命令前 pwd 确认自己在哪;
  3. 每步只做本文写的事:宝塔界面里其他按钮/配置(SSL 段、伪静态、缓存)都是它自己管理的,别顺手改。

🚀 嫌阶段 C/D 手动步骤多? 服务器侧其实一条命令就够(自动拉代码 + 自动生成 .env 三项机密 + 端口冲突自动避让 + 起栈):

bash
curl -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 登进去。

  1. 买一台 VPS:2 核 4G 起步、有公网 IPv4、系统选 Ubuntu 22.04/24.04 LTS(宝塔对 CentOS/Ubuntu 都支持,本文以 Ubuntu 为例)。记下公网 IP;
  2. 自己电脑开 PowerShell(Windows)或终端(Mac),ssh root@你的IP 登录(密码在你邮件/云厂商控制台里);
  3. 基础安全(建议,可跳过):adduser deploy && usermod -aG sudo deploy;防火墙 ufw 先别开,阶段 G 再开 80/443。

✅ 完成标志:终端提示符变成 root@你的机器名:~#。

💡 复制粘贴:SSH 终端里粘贴 = 右键或 Ctrl+Shift+V;复制 = 鼠标拖选后右键。本文的命令块都可以整段复制粘贴(多行会逐行自动执行)。


阶段 B:安装宝塔 ​

做什么:装面板(它管网站的域名/证书/文件),顺带装 Docker。

  1. 服务器终端跑官方脚本(装完会打印面板地址、账号、密码,务必截图或抄下来):
bash
wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh
  1. 浏览器开面板地址登录(地址一般是 http://你的IP:8888/随机路径,注意云安全组要放行 8888 才能打开);
  2. 首次进入 → 软件商店 → 搜「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。

⚠️ 两条路线目录不同(~/FluxTorrent vs /opt/fluxtorrent),后面所有阶段的 cd 按你选的路线走。找不到文件时先 pwd 看自己在哪、ls 看目录内容,别凭印象猜。

然后配环境——.env 是本站的真实配置文件(.env.example 只是模板,永远不动它)。先复制一份再改,两种方式选一种:

方式 1(终端两行):

bash
cp docker/.env.example docker/.env
nano docker/.env     # 改完保存 Ctrl+O 回车,退出 Ctrl+X

方式 2(宝塔「文件」界面点着改,不碰命令行编辑器):

  1. 宝塔「文件」上方地址栏粘贴 /root/FluxTorrent/docker(路线 2 则 /opt/fluxtorrent/docker)回车进入;
  2. 在文件列表找到 .env.example——看不到就找「显示隐藏文件」类开关(点开头的文件在部分版本里默认不显示);
  3. 勾选 .env.example → 「复制」→ 目标填当前目录 → 确定后出现副本 → 勾选副本 → 「重命名」→ 输入 .env;
  4. 双击 .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 个服务全部拉起(首次要拉镜像,几分钟)。

bash
cd ~/FluxTorrent        # 路线 2(上传解压)则改为 cd /opt/fluxtorrent
docker compose -f docker/docker-compose.yml up -d

怎么确认成了:

bash
docker compose -f docker/docker-compose.yml ps

6 个容器(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 或别的栈)。快速定位:

bash
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(安全默认,外网摸不到),手动临时对外开:
bash
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,检测到向导已完成会自动删),然后终端:

bash
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(随意)只是个标签
目标 URLhttp://127.0.0.1:3000web 容器的宿主端口
发送域名$host⚠️ 默认是 127.0.0.1,必须改。它是转发时的 Host 头,传 127.0.0.1 会污染后端生成绝对链接(RSS/回调/跳转)
内容替换留空一条都不加
代理目录不动不开高级功能

③ 申请证书:点站点名 → 「SSL」标签页 → Let's Encrypt:

  1. 前提自查:域名 A 记录已生效——终端 dig mfwg.ptang.top +short 能返回你的服务器 IP(mfwg → 37.120.176.130 这种记录在域名商后台加;刚加的要等几分钟到几小时);
  2. 文件验证方式默认即可,勾选域名 → 点「申请」。失败九成是 DNS 没生效或 80 端口没放行(G.2);
  3. 成功后把 「强制 HTTPS」开关打开(宝塔会自动在 80 端口加跳转)。

G.4 补 tracker 反代(重要) ​

默认反代只代理了网站(3000),tracker 的 /announce/ 和同源 /api/ 要补,否则用户做不了种。两种方式:

方式 1(一键脚本,推荐)——SSH 里一条命令(在仓库目录下):

bash
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(新版宝塔默认模板):

  1. 往下滚动找到 #PHP-INFO-START 这一行(大约在 SSL 配置、错误页配置之后);
  2. 在 #PHP-INFO-START 的正上方(也就是 #ERROR-PAGE-END 之后)插入下面四行,让它成为这个 server 块里的一个 location:
nginx
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 的受管块两条都写。

插入后那一段长这样(对照确认位置对不对):

nginx
    #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 步:

  1. 浏览器开 https://你的域名.com/admin(用阶段 E 黄框里设的新密码登录);
  2. 左侧 「站点设定 → 基础设定」→ Tracker 地址 填 https://你的域名.com(根地址,不要带 /announce——系统自动拼 /announce/<passkey>);
  3. (推荐)同页「HTTPS announce 地址」也填 https://你的域名.com → 种子走 BEP12 双 tier(https 首选 + http 回退),passkey 加密传输;
  4. 编辑 docker/.env(面板双击或终端 nano):CORS_ORIGINS=https://你的域名.com;
  5. 收回 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 阶段完成) ​

bash
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:发第一颗种子 + 邀请 ​

做什么:空站没人留,先自己传内容打底。

  1. 点阶段 E 结束页「发布第一颗种子」(或站内 /upload)传一个真实资源;
  2. 建议管理组先传 20–50 个再开门迎客(方法见 内容冷启动);
  3. 邀请:向导给的首个邀请码交给第一人;更多在后台「邀请管理」发,或 /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 栈方式重来

词看不懂?→ 术语小词典