Simplified Chinese: README.zh-CN.md
Dedicated-Seedbox is the shared backend for building and managing Debian/Ubuntu seedbox installations. It provides a single CLI, seedboxctl, for qBittorrent instances, host tuning, BBR variants, Docker/Vertex, autobrr, autoremove-torrents, status reporting, logs, and diagnostics.
The project is designed to be used in two ways:
- Dedicated servers or VPS hosts where you have root access and can manage users, systemd services, APT packages, kernel/network tuning, Docker, and BBR.
- Shared or rootless seedbox accounts where you only control your own Unix account and want to run qBittorrent without
sudo.
- Features
- Supported environments
- Quick start
- CLI overview
- Components
- Paths, logs, and state
- Upgrade and uninstall
- Troubleshooting
seedboxctl performs runtime detection before making changes.
| Item | Support |
|---|---|
| OS | Debian 11 or newer; Ubuntu 20.04 or newer. |
| Architecture | amd64 / x86_64 and arm64 / aarch64 |
| Init system | systemd is required for host/system services. Rootless mode can fall back to screen or daemon mode. |
| Package manager | APT-based Debian/Ubuntu hosts for root/admin installs. |
| Rootless installs | Supported for qBittorrent only. Rootless mode does not run APT, create users, tune the host, install Docker, or install BBR. |
Host-level components such as tuning, Docker, Vertex, and BBR should be run only on a host or full VM that you control.
bash <(wget -qO- https://raw.githubusercontent.com/jerry048/Dedicated-Seedbox/main/Install.sh) \
-u jerry048 \
-p 'change-this-password' \
-c 3072 \
-q 5.2.2 -l v2.0.13 \
-b -v -r \
-x
seedboxctl versionbash <(wget -qO- https://raw.githubusercontent.com/jerry048/Dedicated-Seedbox/main/Install.sh) --rootless \
-u jerry048 \
-p 'change-this-password' \
-c 3072 \
-q 5.2.2 -l v2.0.13 \
--service-mode auto
~/.local/bin/seedboxctl version1. -u: Linux user; in rootless mode, WebUI username
2. -p: password
3. -c: qBittorrent cache size in MiB
4. -q: qBittorrent versions, for example 5.2.2
5. -l: libtorrent versions, for example v1.2.20
6. -b: Install autobrr; root required
7. -v: Install Vertex; root required
8. -r: Install autoremove-torrents; root required
9. -3: Install BBRv3; root required
10.-x: Install BBRx; root required
11.-o: Prompt for custom ports
12.-T: Disable tuning
13.--storage-path PATH: Use PATH backing storage for host tuning; default is qBittorrent download path
14.--disk-scheduler-all: Apply scheduler policy to all eligible physical disks, not only download-path disks
15.-L: Installer language
16.-h: Show help
seedboxctl install --profile dedicated|shared [options]
seedboxctl qbittorrent add-user|install-self|upgrade|uninstall|status|logs [options]
seedboxctl autobrr install|upgrade|uninstall|status [options]
seedboxctl autoremove-torrents install|upgrade|uninstall|status [options]
seedboxctl vertex install|upgrade|uninstall|status [options]
seedboxctl docker install|uninstall|status [options]
seedboxctl tuning apply|uninstall|status [options]
seedboxctl bbr install|uninstall|status [options]
seedboxctl status [--json]
seedboxctl logs qbittorrent --user USER
seedboxctl doctor [--bundle]
seedboxctl list qbittorrent
seedboxctl versionUse built-in help for component-specific flags:
seedboxctl help
seedboxctl qbittorrent help
seedboxctl tuning help
seedboxctl bbr help
seedboxctl autobrr help
seedboxctl autoremove-torrents help
seedboxctl vertex help
seedboxctl docker helpInstall a root-managed instance for a Linux user with distro packages :
printf '%s' 'change-this-password' | sudo seedboxctl qbittorrent add-user \
--user jerry048 \
--password-stdin \
--source distro \
--cache 3072 \
--web-port 8080 \
--incoming-port 45000Install a rootless instance for the current user:
printf '%s' 'change-this-password' | seedboxctl qbittorrent install-self \
--password-stdin \
--webui-username jerry048 \
--source static \
--qb-version 5.2.2 \
--libtorrent-version v2.0.13 \
--cache 3072 \
--web-port 8080 \
--incoming-port 45000 \
--service-mode autoCommon qBittorrent options:
| Option | Description |
|---|---|
--password-stdin |
Read the WebUI password from stdin. Recommended. |
--password-file FILE |
Read the WebUI password from a file. |
--password PASSWORD |
Pass the WebUI password as an argument. Convenient, but less safe. |
--cache MIB |
qBittorrent cache size in MiB. Default: 3072. |
--qb-tuning-profile PROFILE |
Config-tuning profile: auto, legacy, 1g-hdd, 1g-hdd-raid0, 1g-ssd, 1g-nvme, 1g-ceph, 10g-hdd, 10g-hdd-raid0, 10g-ssd, 10g-nvme, or 10g-ceph. |
--web-port PORT |
WebUI port. Default: 8080. Aliases: --qb-web-port, --qb-port. |
--incoming-port PORT |
Incoming BitTorrent port. Default: 45000. Alias: --qb-incoming-port. |
--source distro |
Install/use the OS qbittorrent-nox package. Root/admin mode only. |
--source static |
Use a bundled or downloaded static qbittorrent-nox build. |
--source existing |
Use an existing qbittorrent-nox from PATH, ~/bin, or ~/.local/bin. |
--qb-version VERSION |
qBittorrent version for static source. |
--libtorrent-version VERSION |
libtorrent version for static source. |
--service-mode MODE |
system, user, screen, daemon, auto, or prompt. |
--webui-username NAME |
Set WebUI username separately from the Unix user. |
--allow-unverified-downloads |
Permit downloads without SHA-256 verification. Avoid for production unless you have reviewed the artifact source. |
List available qBittorrent sources and static manifest entries:
seedboxctl list qbittorrentStatic qBittorrent versions are selected from manifests/qbittorrent.tsv. If --qb-version or --libtorrent-version is missing, or if the supplied pair is not listed for the current architecture, an interactive install prints the manifest choices and asks you to select one. Non-interactive installs, such as CI/cron/no-TTY sessions, print the valid choices and exit so you can rerun with a valid manifest pair. --source distro and --source existing do not use the manifest and do not show the version menu.
Static binary resolution order after a manifest pair is selected:
- A matching bundled binary under
Torrent Clients/qBittorrent/<arch>/. - A URL from
manifests/qbittorrent.tsv. - A default raw GitHub URL derived from the selected qBittorrent/libtorrent version and architecture.
Downloaded static binaries require a SHA-256 checksum unless --allow-unverified-downloads is explicitly passed.
--qb-tuning-profile auto is the default. It detects the highest non-loopback NIC speed and the storage backing the download path, then maps to one of the table profiles. Use --qb-tuning-profile legacy to keep the older automatic heuristic, or pass a profile explicitly:
| Profile | Async I/O threads | Send buffer low | Send buffer watermark | Factor |
|---|---|---|---|---|
1g-hdd |
4 | 1024 | 4096 | 150 |
1g-hdd-raid0 |
8 | 1024 | 8192 | 150 |
1g-ssd |
12 | 1024 | 8192 | 200 |
1g-nvme |
16 | 1024 | 16384 | 200 |
1g-ceph |
8 | 1024 | 16384 | 200 |
10g-hdd |
4 | 1024 | 16384 | 150 |
10g-hdd-raid0 |
8 | 1024 | 16384 | 150 |
10g-ssd |
16 | 2048 | 32768 | 200 |
10g-nvme |
32 | 2048 | 32768 | 200 |
10g-ceph |
16 | 2048 | 32768 | 200 |
Additional version-gated settings are applied only where they belong:
| Gate | Settings written |
|---|---|
| libtorrent 2.x | Session\HashingThreadsCount; Session\DiskIOType for NVMe/Ceph profiles. |
| qBittorrent 4.4.5+ | Session\ConnectionSpeed=500 |
| qBittorrent 4.5.5+ | Session\DiskQueueSize and Session\RequestQueueSize |
| qBittorrent 5.0.1+ with libtorrent 2.x Ceph profiles | Session\DiskIOType=SimplePreadPwrite; older libtorrent-2 qBittorrent releases use Posix because SimplePreadPwrite did not exist yet. |
Status and logs:
sudo seedboxctl qbittorrent status --user jerry048
sudo seedboxctl qbittorrent status --user jerry048 --json
sudo seedboxctl qbittorrent logs --user jerry048
sudo journalctl -u seedbox-qbittorrent-jerry048.service -n 200 --no-pagerRootless status and logs:
seedboxctl qbittorrent status
seedboxctl qbittorrent logs
systemctl --user status seedbox-qbittorrent.service --no-pager
journalctl --user -u seedbox-qbittorrent.service -n 200 --no-pagerApply adaptive seedbox tuning:
sudo seedboxctl tuning applyUseful tuning options:
--storage auto|hdd|ssd|sata-ssd|nvme
--interface IFACE
--netdev IFACE
--link-speed-mbps N
--link-speed 1g|10g|25g|2500m
--txqueuelen N
--initial-cwnd N
--no-sysctl
--no-limits
--no-ring-buffer
--no-rss
--no-rps
--no-rfs
--no-xps
--no-initial-cwnd
--no-disk-scheduler
--no-net-queue-tuning
Tuning writes managed drop-ins instead of editing broad system files directly:
/etc/sysctl.d/99-seedbox.conf
/etc/security/limits.d/99-seedbox.conf
/etc/default/seedbox-tuning
/usr/local/sbin/seedbox-runtime-tuning
/etc/systemd/system/seedbox-safe-tuning.service
Check or remove tuning:
sudo seedboxctl tuning status
sudo seedboxctl tuning uninstallA reboot may be required to fully revert runtime kernel/network values after uninstall.
Read more about the BBR variants at here
Install a BBR algorithm:
sudo seedboxctl bbr install --bbr-algo bbrxSupported algorithms:
bbrv3
bbrx
bbrw
bbr_brutal
bbrw_brutal
Pin and verify the external BBR installer:
sudo seedboxctl bbr install \
--bbr-algo bbrx \
--bbr-script-url 'https://raw.githubusercontent.com/jerry048/Trove/<commit>/BBR-Install/BBRInstall.sh' \
--bbr-raw-base 'https://raw.githubusercontent.com/jerry048/Trove/<commit>/BBR-Install/BBR' \
--bbr-script-sha256 '<sha256>'Check or remove BBR-managed state:
sudo seedboxctl bbr status
sudo seedboxctl bbr uninstall --bbr-algo bbrxbbrv3 uses a kernel package path and may require a reboot. For DKMS-based variants, if headers for the running kernel are missing locally and cannot be installed with apt install linux-headers-$(uname -r), Seedbox automatically installs the distribution generic kernel image and headers, records a pending BBR state, and asks you to reboot into the generic kernel before rerunning BBR installation. DKMS/kernel changes are high risk; test on a disposable VPS first.
Install Docker:
sudo seedboxctl docker install --docker-source officialAlternative distro packages:
sudo seedboxctl docker install --docker-source distroStatus and uninstall:
sudo seedboxctl docker status
sudo seedboxctl docker uninstall
sudo seedboxctl docker uninstall --purge --yesInstall Vertex in Docker:
sudo seedboxctl vertex install \
--vertex-port 3000 \
--vertex-data-dir /root/vertexDefaults:
image: lswl/vertex:stable
data: /root/vertex
port: 3000
Use host networking only when you intentionally want Docker host networking:
sudo seedboxctl vertex install --host-networkStatus, uninstall:
sudo seedboxctl vertex status
sudo seedboxctl vertex uninstall
sudo seedboxctl vertex uninstall --purge --yesInstall autobrr for a user:
sudo seedboxctl autobrr install \
--user jerry048 \
--autobrr-port 7474Status, uninstall:
sudo seedboxctl autobrr status --user jerry048
sudo seedboxctl autobrr uninstall --user jerry048
sudo seedboxctl autobrr uninstall --user jerry048 --purge --yesFor standard GitHub release assets, seedboxctl attempts to resolve and verify the matching checksums file. For custom URLs, provide --autobrr-sha256 or explicitly pass --allow-unverified-downloads after reviewing the artifact.
Install under a target user's home with pipx:
sudo seedboxctl autoremove-torrents install --user jerry048The generated config is a safe starter template. Edit it before enabling automatic removal:
sudo -e /home/jerry048/.config/autoremove-torrents/config.yml
sudo systemctl enable --now seedbox-autoremove-torrents-jerry048.timerInstall and enable the timer immediately:
sudo seedboxctl autoremove-torrents install --user jerry048 --enable-autoremoveUpgrade, status, uninstall:
sudo seedboxctl autoremove-torrents upgrade --user jerry048
sudo seedboxctl autoremove-torrents status --user jerry048
sudo seedboxctl autoremove-torrents uninstall --user jerry048
sudo seedboxctl autoremove-torrents uninstall --user jerry048 --purge --yes/opt/seedbox/Dedicated-Seedbox/ # default minimal runtime
/opt/seedbox/qbittorrent/ # static qBittorrent binaries
/var/log/seedbox/ # action logs
/var/log/seedbox/steps/ # per-step command logs
/var/log/seedbox/latest.log # latest log symlink
/var/lib/seedbox/state/ # component state files
/home/<user>/.config/qBittorrent/qBittorrent.conf
/home/<user>/qbittorrent/Downloads
/etc/systemd/system/seedbox-qbittorrent-<user>.service
~/.local/share/seedbox/Dedicated-Seedbox/ # default minimal runtime
~/.local/share/seedbox/qbittorrent/ # static qBittorrent binaries
~/.local/state/seedbox/logs/ # action logs
~/.local/state/seedbox/logs/steps/ # per-step command logs
~/.local/state/seedbox/state/ # state files
~/.config/qBittorrent/qBittorrent.conf
~/.config/systemd/user/seedbox-qbittorrent.service
~/qbittorrent/Downloads
~/bin/qbittorrent-nox # convenience symlink for static installs
~/.local/bin/seedbox-qbittorrent-restart # screen/daemon restart helper when used
Overall status:
seedboxctl status
seedboxctl status --jsonDiagnostic summary:
seedboxctl doctor
seedboxctl doctor --bundleUpgrade distro package based install:
sudo seedboxctl qbittorrent upgrade --user jerry048 --source distroUpgrade static install:
printf '%s' 'change-this-password' | sudo seedboxctl qbittorrent upgrade \
--user jerry048 \
--password-stdin \
--source static \
--qb-version 5.2.2 \
--libtorrent-version v2.0.13Non-destructive uninstall:
sudo seedboxctl qbittorrent uninstall --user jerry048This stops and removes startup files but keeps qBittorrent config and downloads.
Purge qBittorrent config/data:
sudo seedboxctl qbittorrent uninstall --user jerry048 --purge --yesRootless uninstall:
seedboxctl qbittorrent uninstall
seedboxctl qbittorrent uninstall --purge --yessudo seedboxctl autobrr upgrade --user jerry048
sudo seedboxctl autoremove-torrents upgrade --user jerry048
sudo seedboxctl vertex upgrade
sudo seedboxctl autobrr uninstall --user jerry048
sudo seedboxctl autoremove-torrents uninstall --user jerry048
sudo seedboxctl vertex uninstall
sudo seedboxctl docker uninstall
sudo seedboxctl tuning uninstall
sudo seedboxctl bbr uninstall --bbr-algo bbrxUse --purge --yes only when you intentionally want to remove component data/configuration.
Start with:
seedboxctl doctor
seedboxctl statusCreate a diagnostic bundle:
seedboxctl doctor --bundleRoot/admin logs:
/var/log/seedbox/latest.log
/var/log/seedbox/steps/
/var/lib/seedbox/state/
Rootless logs:
~/.local/state/seedbox/logs/latest.log
~/.local/state/seedbox/logs/steps/
~/.local/state/seedbox/state/
qBittorrent system service:
sudo systemctl status seedbox-qbittorrent-jerry048.service --no-pager
sudo journalctl -u seedbox-qbittorrent-jerry048.service -n 200 --no-pagerqBittorrent rootless user service:
systemctl --user status seedbox-qbittorrent.service --no-pager
journalctl --user -u seedbox-qbittorrent.service -n 200 --no-pagerqBittorrent screen fallback:
screen -ls
screen -r seedbox-qbittorrentCommon causes detected by doctor and step logs include APT locks, DNS failures, failed downloads, missing commands, permission errors, occupied ports, checksum mismatches, and qBittorrent password-hash family changes during upgrade/downgrade.