一台服务器可以运行多个 qBittorrent-nox,用于按任务用途分别管理种子。关键是让每个实例拥有自己的配置、运行用户、管理端口和下载目录。

本文以 Debian 12 为示例,手动部署两个全新实例,不依赖第三方一键脚本。命令按系统软件源安装的 qBittorrent-nox 设计;不同发行版、软件版本与既有部署可能需要调整。这是一份依据官方文档整理的部署教程,没有使用某台生产服务器的实测结果。

如果已经有符合特定服务结构的主实例,也可以参考本站的 more-qb 脚本介绍。那篇文章使用同一用户和独立 profile;本文使用不同 Linux 用户,适合从头部署,两套方案不要混着执行。

1. 先规划实例

本文使用以下参数,端口均为示例:

项目实例一实例二
Linux 用户qbt1qbt2
用户家目录/var/lib/qbt1/var/lib/qbt2
WebUI 端口80828083
BT 监听端口2333423335
下载目录/mnt/qbt1/mnt/qbt2
systemd 服务[email protected][email protected]

WebUI 端口用于浏览器管理,BT 端口用于与其他客户端传输数据。 改了 WebUI 端口,不代表 BT 端口也变了。

多实例仍共享服务器的 CPU、内存、磁盘和网络带宽。它方便拆分任务,但不会凭空增加磁盘性能,也不保证上传更快。

2. 检查环境并安装

以下服务器命令以 root 执行;普通用户可先使用 sudo -i。不要把服务器命令粘贴进博客编辑器。

先查看环境:

cat /etc/os-release
findmnt -T /mnt
df -hT /mnt
getent passwd qbt1 qbt2
ss -lntup | grep -E ':(8082|8083|23334|23335)([[:space:]]|$)'

getent 和端口筛选没有输出,分别表示未找到这两个用户、未找到这些端口的监听记录;这两项查询可能返回非零退出码,并不代表系统异常。若已经存在同名用户、实例目录、服务文件,或示例端口已占用,先换一套名称与端口,不要覆盖旧配置。

/mnt 必须是你确认过的数据存储位置。如果预期的数据盘未挂载,先处理挂载,否则后面的目录可能建在系统盘上。本文不会格式化磁盘、调整 RAID 或修改 swap。

安装发行版仓库中的软件,并确认实际版本:

apt update
apt install -y qbittorrent-nox sudo
command -v qbittorrent-nox
qbittorrent-nox --version
apt-cache policy qbittorrent-nox

本文服务文件假设程序位于 /usr/bin/qbittorrent-nox。如果路径不同,后文的启动命令也要对应修改。不要为了和示例版本完全一致而降级软件;用于 PT 时,另行确认站点允许的客户端版本。

3. 创建用户和下载目录

useradd --system --user-group --create-home --home-dir /var/lib/qbt1 --shell /usr/sbin/nologin qbt1
useradd --system --user-group --create-home --home-dir /var/lib/qbt2 --shell /usr/sbin/nologin qbt2

install -d -o qbt1 -g qbt1 -m 0750 /mnt/qbt1
install -d -o qbt2 -g qbt2 -m 0750 /mnt/qbt2
install -d -o qbt1 -g qbt1 -m 0700 /var/lib/qbt1/.config/qBittorrent
install -d -o qbt2 -g qbt2 -m 0700 /var/lib/qbt2/.config/qBittorrent

两个用户没有交互登录 shell,但可以由 systemd 或管理员通过 sudo -u 启动程序。

默认配置分别位于:

  • /var/lib/qbt1/.config/qBittorrent/qBittorrent.conf
  • /var/lib/qbt2/.config/qBittorrent/qBittorrent.conf

不同用户通常也有各自的会话与种子恢复数据目录。因此,本文不需要额外使用 --profile。Linux 用户隔离也不是完整沙箱,不应把它理解成容器级隔离。

4. 首次启动:先限制管理界面

在两个尚未启动过的全新实例中,预先创建最小配置,让 WebUI 只监听服务器回环地址。下面的写入命令不能用来重置已有实例:

cat > /var/lib/qbt1/.config/qBittorrent/qBittorrent.conf <<'EOF'
[Preferences]
WebUI\Address=127.0.0.1
WebUI\LocalHostAuth=true
WebUI\AuthSubnetWhitelistEnabled=false
EOF

cat > /var/lib/qbt2/.config/qBittorrent/qBittorrent.conf <<'EOF'
[Preferences]
WebUI\Address=127.0.0.1
WebUI\LocalHostAuth=true
WebUI\AuthSubnetWhitelistEnabled=false
EOF

chown qbt1:qbt1 /var/lib/qbt1/.config/qBittorrent/qBittorrent.conf
chown qbt2:qbt2 /var/lib/qbt2/.config/qBittorrent/qBittorrent.conf
chmod 0600 /var/lib/qbt1/.config/qBittorrent/qBittorrent.conf
chmod 0600 /var/lib/qbt2/.config/qBittorrent/qBittorrent.conf

先启动第一个实例:

sudo -u qbt1 -H /usr/bin/qbittorrent-nox --webui-port=8082

阅读首次启动提示,并按提示接受法律声明。终端保持运行。

在自己电脑上另开一个终端,手动建立 SSH 隧道;把 你的SSH用户 和 服务器地址 替换为实际值:

ssh -N -L 18082:127.0.0.1:8082 -L 18083:127.0.0.1:8083 你的SSH用户@服务器地址

若 SSH 不是默认端口,给命令添加 -p 实际SSH端口。本地的 18082、18083 如果已占用,可以换成本地空闲端口。

保持隧道终端运行,然后在电脑浏览器中访问 http://127.0.0.1:18082/。这里的本地地址通过 SSH 转发到服务器,直接在电脑上访问服务器的 127.0.0.1 不会生效。

首次登录的用户名通常是 admin:

  • 4.6.1 之前的全新版本配置通常使用初始密码 adminadmin。
  • 4.6.1 及之后,在未设置持久密码时使用启动终端中打印的临时密码;以实际版本和终端提示为准。

登录后立即设置自己的强密码,并在设置中完成:

设置位置实例一的值
下载 → 默认保存路径/mnt/qbt1
连接 → 传入连接监听端口23334
连接 → 每次启动使用随机端口关闭

如果启用了“未完成文件保存在其他位置”,该路径也必须属于当前实例并具有写权限;初次部署可以先不启用。保持 WebUI 身份验证开启,不启用本地主机免认证或子网免认证。

保存后,在运行第一个实例的服务器终端按 Ctrl+C,等待进程退出,再初始化第二个实例:

sudo -u qbt2 -H /usr/bin/qbittorrent-nox --webui-port=8083

访问 http://127.0.0.1:18083/,设置第二个实例自己的密码、下载目录 /mnt/qbt2 和 BT 端口 23335,关闭随机端口,保存后同样用 Ctrl+C 退出。

先后初始化,是为了在同时运行前为两个实例设置不同的 BT 端口。不要直接假设初始默认端口已经隔离。

5. 用 systemd 管理

先创建实例参数目录和两个文件:

install -d -m 0755 /etc/qbt-multi
printf 'WEBUI_PORT=8082\n' > /etc/qbt-multi/qbt1.env
printf 'WEBUI_PORT=8083\n' > /etc/qbt-multi/qbt2.env

创建服务模板:

cat > /etc/systemd/system/[email protected] <<'EOF'
[Unit]
Description=qBittorrent-nox instance %i
Wants=network-online.target
After=network-online.target
RequiresMountsFor=/mnt/%i

[Service]
Type=exec
User=%i
Group=%i
Environment=HOME=/var/lib/%i
EnvironmentFile=/etc/qbt-multi/%i.env
WorkingDirectory=/var/lib/%i
ExecStart=/usr/bin/qbittorrent-nox --webui-port=${WEBUI_PORT}
Restart=on-failure
RestartSec=5
TimeoutStopSec=180
UMask=0027

[Install]
WantedBy=multi-user.target
EOF

systemd-analyze verify /etc/systemd/system/[email protected]
systemctl daemon-reload
systemctl enable --now [email protected] [email protected]

%i 是实例名,例如 qbt1。同一个模板会以不同用户读取各自参数。Type=exec 让 systemd 跟踪前台进程,不要再添加 -d 或 --daemon。

RequiresMountsFor 根据对应路径的挂载关系安排依赖,但不会替你创建或正确配置数据盘挂载;部署前的 findmnt 检查仍然必要。

6. 验证是否真正启动

systemctl status [email protected] [email protected] --no-pager
ps -eo user,pid,args | grep '[q]bittorrent-nox'
ss -lntup | grep -E ':(8082|8083|23334|23335)([[:space:]]|$)'
curl -I http://127.0.0.1:8082/
curl -I http://127.0.0.1:8083/

检查重点是:两个服务均为 active (running);两个进程分别属于 qbt1 和 qbt2;WebUI 监听地址是 127.0.0.1;BT 端口与规划一致。UDP 在 ss 中显示为 UNCONN 是常见情况,不应只寻找 TCP 的 LISTEN。

通过 SSH 隧道分别进入两个 WebUI,再次核对保存路径。需要验证写权限时可以执行:

sudo -u qbt1 test -w /mnt/qbt1 && echo 'qbt1 download directory writable'
sudo -u qbt2 test -w /mnt/qbt2 && echo 'qbt2 download directory writable'

这些检查通过后,再添加自己有权下载、分发的小任务,验证实际下载和做种。不要只凭服务处于 running 状态判断全部部署完成。

7. 防火墙和远程访问

本文通过 SSH 隧道管理 WebUI,因此不需要对公网放行 8082、8083。

若使用并已启用 UFW,可按实际需要放行两个 BT 端口:

ufw allow 23334/tcp
ufw allow 23334/udp
ufw allow 23335/tcp
ufw allow 23335/udp

不要为了照抄命令临时启用另一套防火墙。使用 nftables、云安全组、供应商防火墙或路由器 NAT 时,在对应位置配置入站规则或端口转发。上述规则不会自动修改这些外部设备。

想改成域名访问,可另外配置 HTTPS 反向代理。若反向代理在容器中,容器自己的 127.0.0.1 不是服务器宿主机,不能直接套用本文的回环上游地址;需要先确认代理与 qBittorrent 的网络连通方式。

8. 常用管理和排错

单独重启第一个实例:

systemctl restart [email protected]

查看第二个实例最近的日志:

journalctl -u [email protected] -b -n 100 --no-pager

遇到问题先按症状排查:

现象优先检查
WebUI 打不开服务状态、SSH 隧道是否保持运行、本地转发端口是否正确
能登录但下载报错下载路径、未完成目录、挂载状态与目录权限
第二个实例启动失败是否仍有手动进程、端口冲突、实例用户或环境文件是否缺失
上传很慢种客需求、入站可达性、磁盘延迟、总带宽与任务并发
手改配置后又恢复是否未停服务,导致退出时程序覆盖了配置

如果必须手动编辑 qBittorrent.conf,先停止对应服务,备份文件后修改,再启动。不要在进程运行时反复改同一个配置文件。

多个实例默认不要共用同一个下载目录:一个实例移动、重命名或删除文件,可能影响另一个实例。确实需要共享辅种文件时,应另外设计权限与删除策略。

9. 备份与移除

一致性备份应在两个实例都已停止后进行,备份整个家目录,而不只是一个配置文件:

systemctl stop [email protected] [email protected]
tar -C / -czf /root/qbt-multi-backup-$(date +%Y%m%d-%H%M%S).tar.gz \
  var/lib/qbt1 var/lib/qbt2 etc/qbt-multi etc/systemd/system/[email protected]
systemctl start [email protected] [email protected]

执行前确认服务已停止、备份目标空间足够,执行后检查 tar 是否成功。备份中可能包含密码哈希、Tracker 地址和 passkey,应妥善保存。此备份不包含 /mnt/qbt1、/mnt/qbt2 的下载文件,数据需要单独备份。恢复时还需匹配用户 UID/GID 或重新检查所有权。

如果只想撤掉两个实例的自启和服务:

systemctl disable --now [email protected] [email protected]
rm /etc/systemd/system/[email protected]
systemctl daemon-reload

这组命令保留用户、配置、环境文件和下载数据,也不会卸载其他实例可能共用的 qBittorrent-nox。确认不再需要后,再分别处理剩余文件与用户,不要直接对下载目录使用递归删除。

参考资料