Zwölf Builds

Eine Seedbox auf einem 50-TB-Speicherknoten, mit Berechtigungen, die halten

qBittorrent auf einem S-50 mit NVMe-Staging-Stufe, einer gehärteten Unit, Gruppenberechtigungen, die jeden neuen Download überleben, und einem Proxy, der die Oberfläche vom öffentlichen Internet fernhält.

Was hier gebaut wird

Ein Storage-Node mit qBittorrent als Dienst ohne Privilegien: unfertige Daten werden auf die NVMe-Ebene geschrieben, fertige Dateien auf die Fünfzig-Terabyte-Bulk-Ebene verschoben, alles gehört einer gemeinsamen Gruppe, sodass ein zweites Konto sie über SFTP lesen kann, ohne dass man mühsam Rechte ändern muss, und eine Weboberfläche, die nur über einen authentifizierten Proxy erreichbar ist.

Der naheliegende Weg ist, das Paket zu installieren, durch die Oberfläche zu klicken und weiterzumachen. Das funktioniert zwei Wochen lang, bis die erste Datei mit der falschen Gruppe ankommt und Ihr Sync-Benutzer sie nicht lesen kann, und dann sind es vierzigtausend Dateien mit der falschen Gruppe.

Bevor Sie beginnen

  • Ein S-50: fünfzig Terabyte Bulk hinter einer Ein-Terabyte-NVMe-Ebene, an einem Zehn-Gigabit-Port. Der Traffic ist im Rahmen der Fair Use unbegrenzt, und die Nutzungsrichtlinie ist kurz und präzise darüber, was darüber laufen darf. Verbreitungsrechte sind Ihr Problem, keine Fußnote.
  • Debian 13, Root und ein Hostname wie box.example.com.

1. Benutzer, Gruppen, Layout

apt update && apt install -y qbittorrent-nox nginx apache2-utils acl
groupadd -g 3000 media
useradd -r -g media -u 3000 -d /srv/qbt -m -s /usr/sbin/nologin qbt
useradd -m -G media sync

Zwei Konten, eine Gruppe. Der Daemon läuft als qbt und meldet sich nie an; sync ist das Konto, mit dem Sie Dateien abholen und nichts schreiben können. Nun die Verzeichnisse und die beiden Flags, die das dauerhaft zum Laufen bringen:

install -d -o qbt -g media -m 2775 /srv/nvme/incomplete
install -d -o qbt -g media -m 2775 /srv/bulk/complete
setfacl -d -m g:media:rwx /srv/bulk/complete
setfacl -d -m g:media:rwx /srv/nvme/incomplete

Modus 2775 setzt das Setgid-Bit, sodass jede darin erstellte Datei die Gruppe media erbt statt der primären Gruppe des erstellenden Benutzers. Die Standard-ACL gewährt dieser Gruppe dann Lese- und Schreibrechte an neuen Einträgen, unabhängig von der Prozess-Umask. Zusammen bedeutet das, dass die Berechtigungsfrage einmal beantwortet wird und nicht nach jedem Download erneut.

Bei einem S-50 sind die Bulk-Ebene und die NVMe separate Blockgeräte. Bestätigen Sie, welche welche ist, bevor Sie sich auf die Pfade festlegen:

lsblk -o NAME,SIZE,ROTA,MOUNTPOINT

2. Der Daemon

Starten Sie ihn einmal, damit er eine Konfigurationsdatei schreibt, dann stoppen Sie ihn und bearbeiten diese Datei. Sich mit der Oberfläche für Einstellungen herumzuschlagen, die in einer Textdatei leben, ist eine verschwendete Nachmittagsarbeit.

sudo -u qbt qbittorrent-nox --webui-port=8080 &
sleep 5 && pkill -u qbt qbittorrent-nox

Bearbeiten Sie /srv/qbt/.config/qBittorrent/qBittorrent.conf, sodass die Abschnitte [BitTorrent] und [Preferences] Folgendes enthalten:

[BitTorrent]
Session\DefaultSavePath=/srv/bulk/complete
Session\TempPath=/srv/nvme/incomplete
Session\TempPathEnabled=true
Session\Port=51413
Session\DiskCacheSize=2048
Session\MaxConnections=800
Session\MaxUploads=40
Session\GlobalMaxSeedingMinutes=-1
Session\Preallocation=true

[Preferences]
WebUI\Address=127.0.0.1
WebUI\Port=8080
WebUI\LocalHostAuth=false
WebUI\CSRFProtection=true
Downloads\UseIncompleteExtension=true

Das Zwischenspeichern auf NVMe ist der ganze Trick. Torrent-Schreibvorgänge sind klein und verstreut, was das schlechteste Muster für die Bulk-Ebene ist; die NVMe absorbiert sie, und die fertige Datei wird als ein sequenzieller Kopiervorgang verschoben. Vorallokation verhindert Fragmentierung auf dem Weg dorthin.

3. Eine Unit, die nicht umherwandert

/etc/systemd/system/qbittorrent.service:

[Unit]
Description=qBittorrent
After=network-online.target
Wants=network-online.target

[Service]
User=qbt
Group=media
UMask=0002
ExecStart=/usr/bin/qbittorrent-nox
Restart=on-failure
NoNewPrivileges=yes
PrivateTmp=yes
PrivateDevices=yes
ProtectSystem=strict
ProtectHome=yes
ProtectKernelTunables=yes
RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX
ReadWritePaths=/srv/qbt /srv/nvme/incomplete /srv/bulk/complete
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target

UMask=0002 und Group=media sorgen dafür, dass neue Dateien gruppenschreibbar bleiben. Ohne das Erste ergibt Setgid die richtige Gruppe für Dateien, die niemand in der Gruppe schreiben kann – ein subtiler und nerviger halber Erfolg.

systemctl daemon-reload && systemctl enable --now qbittorrent

4. Kernel und Firewall

Zehn Gigabit mit mehreren hundert Peers braucht größere Socket-Puffer und eine Verbindungstabelle, die nicht voll läuft:

cat > /etc/sysctl.d/70-seedbox.conf <<EOF
net.core.rmem_max = 33554432
net.core.wmem_max = 33554432
net.ipv4.tcp_rmem = 4096 87380 33554432
net.ipv4.tcp_wmem = 4096 65536 33554432
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
net.netfilter.nf_conntrack_max = 524288
EOF
sysctl --system

Firewall: Der Torrent-Port offen in beiden Familien, SSH und HTTPS offen, die Weboberfläche an Loopback gebunden und daher ohne eigene Freigabe.

table inet filter {
  chain input {
    type filter hook input priority filter; policy drop;
    ct state established,related accept
    iif lo accept
    ip6 nexthdr icmpv6 accept
    ip protocol icmp accept
    tcp dport { 22, 443 } accept
    tcp dport 51413 accept
    udp dport 51413 accept
  }
}

5. Die Oberfläche hinter einem Proxy

certbot certonly --standalone -d box.example.com
htpasswd -c /etc/nginx/qbt.htpasswd you
server {
  listen 443 ssl;
  server_name box.example.com;
  ssl_certificate     /etc/letsencrypt/live/box.example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/box.example.com/privkey.pem;
  client_max_body_size 100m;

  location / {
    auth_basic "closed";
    auth_basic_user_file /etc/nginx/qbt.htpasswd;
    proxy_pass http://127.0.0.1:8080;
    proxy_set_header X-Forwarded-Host $http_host;
    proxy_http_version 1.1;
  }
}

Verifizieren

Nehmen Sie etwas mit großem, gut geseedetem Schwarm und eindeutiger Lizenz. Ein aktuelles Debian-Installer-Image ist die traditionelle Wahl und sättigt einen Zehn-Gigabit-Port überzeugender als alles andere, womit Sie legal testen können.

Fügen Sie den Torrent über die Oberfläche hinzu und beobachten Sie dann, wie sich die Staging-Ebene füllt:

watch -n2 "du -sh /srv/nvme/incomplete /srv/bulk/complete"

Während er läuft, bestätigen Sie, dass der Port tatsächlich erreichbar ist und nicht nur in Ihrer eigenen Firewall offen, da ein unerreichbarer Port eine Seedbox erzeugt, die akzeptabel herunterlädt und niemandem seedet:

ss -tn state established sport = :51413 | wc -l

Eingehende Verbindungen auf diesem Port bedeuten, dass Peers Sie gefunden haben. Null bei vielen ausgehenden Verbindungen bedeutet, dass nur Sie nach außen wählen.

Wenn der Download abgeschlossen ist, prüfen Sie die drei Dinge, für die dieser Build existiert:

ls -l /srv/nvme/incomplete
ls -ln /srv/bulk/complete
sudo -u sync cat /srv/bulk/complete/*.iso > /dev/null && echo "sync can read"

Das Staging-Verzeichnis ist leer, die fertigen Dateien zeigen die Gruppe 3000 mit Gruppen-Lese- und Schreibrechten, und das Konto sync kann sie ohne manuelles Korrigieren der Rechte lesen. Dieser dritte Befehl beweist, dass sich die Setgid- und ACL-Arbeit ausgezahlt hat.

Beweisen Sie schließlich, dass die Oberfläche nicht exponiert ist:

curl -m5 http://box.example.com:8080/ ; echo "exit $?"
curl -sI https://box.example.com/ | head -1

Der erste sollte bei der Verbindung fehlschlagen, der zweite sollte 401 zurückgeben. Alles andere bedeutet, dass die Adressbindung aus Schritt zwei nicht gegriffen hat.

Danach

Setzen Sie ein globales Seed-Verhältnis oder eine Share-Time-Grenze, es sei denn, Sie möchten alles für immer seeden, denn fünfzig Terabyte füllen sich schneller, als irgendjemand erwartet. Falls eine Beschwerde über Datenverkehr von Ihrer Instanz bei uns eingeht, ist der Prozess auf der Abuse-Seite beschrieben: Sie wird an Sie weitergeleitet, und wir durchsuchen nicht Ihre Festplatte.

Bereit, wenn Sie es sind

Wählen Sie eine Stadt. Wählen Sie eine Größe. Bezahlen Sie in Coins.

Keine Formulare darüber, wer Sie sind, kein Warten auf einen Menschen, der Sie genehmigt, kein Anruf zur Verifizierung. Die Rechnung wird beglichen, und die Zugangsdaten landen in Ihrem Posteingang.