Jump to content

Installing swizzin

From Pulsed Media Wiki

On a fresh Debian 12 server, the swizzin installer produces a working seedbox (nginx, qBittorrent and the swizzin web panel) in about 18 minutes of wall-clock time, dialogs included, and right after the install, with no torrent added, the whole server used 395 MiB of RAM. swizzin itself, an open-source (GPL-3.0) set of bash scripts, is described on the Swizzin page: its history, design and app catalogue. Everything here was recorded by Pulsed Media on 29 October 2026 in a single install on a 6 vCPU VM on a shared test host; the gotchas come from that run, the installer's source and the swizzin README.

Requirements

Item Requirement
Operating system Debian 12 (Bookworm), the version tested here. The project's full list is under Supported systems; Debian 13 is not on it.
Access A full root login shell: log in as root, or use su - or sudo -i. Not plain su and not sudo -s (see Gotchas).
Internet The installer runs apt and clones swizzin and its panel during the install.
Hostname Optional. On the test VM the self-signed TLS certificate came out issued for the fully qualified name the server resolved for itself (see Step 1), so set the name before the install.
Tested on VM with 6 vCPU, 3 GB RAM and a 32 GB disk, Debian 12, swizzin master (README version 3.15.0) fetched from s5n.sh on 29 October 2026

Step 1: Prepare the server

Start from a fresh Debian 12 install with SSH. The test VM got its name this way before the install: a short hostname, plus an /etc/hosts line giving the full name. Its certificate then showed CN = seedbox.example.com.

hostnamectl set-hostname seedbox
# and in /etc/hosts:
127.0.1.1   seedbox.example.com seedbox

Then become root with a full login environment:

su -
# or: sudo -i

Step 2: Download the installer and read it

The swizzin README offers a one-liner, bash <(curl -sL s5n.sh) && . ~/.bashrc. Downloading the script first leaves it on disk to read before it runs as root; unlike the one-liner, it does not reload ~/.bashrc at the end:

curl -fsSL -o swizzin-setup.sh https://s5n.sh
less swizzin-setup.sh

The script is 427 lines, but it only bootstraps: it clones the master branch of the swizzin repository and runs that as root, so what you read is the loader, not the install. A minimal Debian install may not have curl; apt install curl adds it. The README also gives a wget form of the one-liner.

Step 3: Run it and wait for the first dialog

bash swizzin-setup.sh

Expect a long silence before the first question: on the test VM the first dialog appeared after 540 seconds (9 minutes). Before asking anything, the installer installs git, clones swizzin, runs apt update and a full apt upgrade, enables the contrib and non-free repositories and installs its base packages. An excerpt of the console output:

...     Performing apt upgrade
        108 packages to upgrade.
        ✔   Apt upgrade complete
...
INFO    Enabling contrib repo
INFO    Enabling non-free repo
...
...     Performing installation of 11 apt packages
        (sudo rsyslog vnstat tcl tcl-dev build-essential apt-transport-https bc gnupg2 cracklib-runtime ccze)

The installer writes its log to /root/logs/swizzin.log, which is the first place to look if a step fails.

Step 4: Answer the dialogs

The dialogs come in this order: welcome, master user name, password, password confirmation, core features, optional apps, qBittorrent version. Inside a checklist, move with the arrow keys, tick with Space and confirm with Enter.

swizzin installer welcome dialog
The first dialog, about 9 minutes after starting the script on the test VM. Enter continues.
swizzin installer master username prompt
The "master" user logs in to the panel and gets the first qBittorrent instance. The test run used seedadmin.

The password dialog says "Leave empty to generate." The next dialog asks for the same password again. The installer checks the password's strength when it creates the master user; on the test run the console showed "Password passed".

swizzin core features checklist with nginx, qBittorrent and panel ticked
"Choose your clients and core features": nginx, qBittorrent and panel ticked, as on the test run. The list scrolls; rTorrent, Deluge, autobrr and vsftpd are in it too.
swizzin optional apps list
"Make some more choices": optional apps. Enter with nothing ticked skips this screen; any of them can be added later with box install.
swizzin qBittorrent version dialog
The highlighted default is Debian's own package, 4.5.2 on Debian 12. The upstream list starts one arrow key below with 5.1 (5.1.4), then 5.0 (5.0.5), as of 29 October 2026.

The test run kept the default, so everything measured on this page is with qBittorrent 4.5.2; the 5.1 option was not tested.

Step 5: Let the install finish

After the last dialog (on this run, the qBittorrent version) swizzin asks nothing more. On the test VM, package installation took 7 minutes 47 seconds by the installer's own count, and the whole run took about 18 minutes from bash swizzin-setup.sh.

Two lines like sed: can't read /srv/fancyindex/header.html: No such file or directory (and the same for footer.html) appear during the nginx step. On the test run the next line was "Fancyindex installed", the install completed and the panel worked.

The end of the output (excerpt):

SUCCESS Panel installed
INFO    Package installation took 7 minutes and 47 seconds
SUCCESS Swizzin installation complete!
INFO    Seedbox can be accessed at https://<server-ip>
INFO    You can now use the box command to manage swizzin features, e.g. `box install nginx panel`
...
INFO    Shell completions for the box command have been installed. They will be applied the next time you log into a
        bash shell

Step 6: Log in to the panel and qBittorrent

Open https://seedbox.example.com/ (or the server's IP) and accept the self-signed certificate warning; the panel then redirects to /login. Plain HTTP on port 80 redirects to HTTPS.

swizzin panel login page
The swizzin panel login. Sign in with the master user from Step 4.

qBittorrent's web UI is at /qbittorrent/, behind nginx basic authentication. As a smoke test, the Debian 13.7.0 netinst torrent was added through qBittorrent's web API and reached 60% at about 10 MiB/s from 73 seeds. The speed says more about the test VM's connection than about swizzin.

Step 7: Manage it with box

Open a new login shell first (see Gotchas):

exec bash -l
box list

box list prints the installable apps, which the swizzin page groups by use; add one with box install followed by its name. The full command syntax is under The box command.

swizzin's own documentation covers each app: box basics and the per-app pages linked from the installer log.

What the install produced

Numbers taken straight after the installer finished, with no torrent loaded yet.

Measure Result
Debian packages 468 before, 671 after (+203)
RAM in use, whole VM 395 MiB
qbittorrent-nox (v4.5.2, the default) 37 MiB resident
swizzin panel (Python) 66 MiB resident
php-fpm (main process) 29 MiB resident
Root filesystem used 2.7 GiB
Service accounts panel runs as user swizzin, qBittorrent as the master user, not as root
Master user's home directory mode 750
TLS certificate self-signed, valid until October 2036

What ss -tlnp showed listening over TCP (UDP not checked):

Listening on Service
All addresses, ports 80 and 443 nginx (HTTP redirects to HTTPS)
All addresses, port 22 SSH
Every interface address, peer port (59730 on the test VM) qBittorrent, for BitTorrent peers
127.0.0.1 only (port 8333 on the test VM) swizzin panel, reached through nginx
127.0.0.1 only (port 10317 on the test VM) qBittorrent web UI, reached through nginx

What the installer leaves to you

swizzin finishes with a working seedbox, but four things on the test VM were left for the admin to decide:

Area State on the test VM What to do
Firewall No rules: iptables policies ACCEPT, ufw inactive Work from the console or with a way back in. Check ss -tulnp for what listens, allow loopback, established connections, SSH, 80, 443 and qBittorrent's peer port (TCP and UDP), then drop the rest. Not tested on this run.
/proc Mounted without hidepid. Without it, Linux lets every user list every other user's processes and their command lines With more than one account (box adduser), consider hidepid=2; test it on the server before relying on it.
TCP Congestion control cubic, qdisc fq_codel, net.core.rmem_max 212992 Measure throughput before changing them.
Panel assets The dashboard HTML references scripts and styles on ajax.googleapis.com, cdnjs.cloudflare.com, cdn.jsdelivr.net and stackpath.bootstrapcdn.com The viewer's browser fetches them from those hosts; host copies locally if that matters to you.

Gotchas and troubleshooting

Run it as root, but not through sudo -s

The script's first check, read from its source (the test itself ran as root), stops a non-root user with "Swizzin setup requires user to be root. su or sudo -s and run again". The README says the opposite: do not use plain su or sudo -s, because without a full root login the environment is not root's, and the mandatory cracklib password check can fail to find its binary. Follow the README and use su - or sudo -i.

The password dialog offers a generated password (not tested)

The password dialog says "Leave empty to generate." The test run typed its own password, so this path and where a generated password is shown were not checked. Type your own.

The qBittorrent version default is the older build

The version dialog highlights Debian's repository build, 4.5.2 on Debian 12. Pressing Enter out of habit installs that; move the selection first if you want another branch.

bash: box: command not found right after the install

On the test VM, running box list in the shell that had run the installer returned bash: box: command not found. exec bash -l (or logging out and back in) fixed it. The cause was not traced; the README one-liner ends with . ~/.bashrc, which the download-first method skips.

A second software screen follows the checklist

After "Choose your clients and core features" a second list, "Make some more choices", asks about optional apps. Its entries are mostly different (autobrr appears in both). Enter with nothing ticked skips it.

FAQ

How do I replace the self-signed certificate?

The box list catalogue includes a letsencrypt app. This guide did not test it.

Can the install run without the dialogs?

The README documents an unattended mode (--unattend with the app names plus --user and --pass) and an --env file option. This guide did not test either. A password given on the command line ends up in the shell history.

Rather not run the server?

The steps above, plus the firewall and the hidepid decision, are a one-time job; keeping swizzin and Debian patched afterwards is not. A Pulsed Media seedbox skips both: PM Software Stack (PMSS) comes installed, with updates, monitoring and support handled by Pulsed Media, which has run seedboxes since 2010 and operates its own datacenters in Finland. PMSS is open source too, if you would rather install it on your own Debian 12 server.

See also