Ce que cela construit
Un nœud de stockage exécutant qBittorrent en tant que service non privilégié : les données incomplètes sont écrites sur le niveau NVMe, les données terminées sont déplacées vers le niveau de masse de cinquante téraoctets, le tout appartient à un groupe partagé afin qu'un second compte puisse les lire via SFTP sans aucune archéologie de chmod, et une interface web accessible uniquement via un proxy authentifié.
L'approche évidente est d'installer le paquet, de cliquer à travers l'interface et de continuer votre journée. Cela fonctionne pendant quinze jours, jusqu'à ce que le premier fichier arrive avec le mauvais groupe et que votre utilisateur de synchronisation ne puisse pas le lire, et il y a alors quarante mille fichiers avec le mauvais groupe.
Avant de commencer
- Un S-50 : cinquante téraoctets de masse derrière un niveau NVMe d'un téraoctet, sur un port dix gigabits. Le trafic n'est pas compté dans le cadre d'une utilisation équitable, et la politique d'utilisation acceptable est courte et précise sur ce qui peut y transiter. Les droits de distribution sont votre problème, pas une note de bas de page.
- Debian 13, root, et un nom d'hôte tel que
box.example.com.
1. Utilisateurs, groupes, disposition
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 syncDeux comptes, un groupe. Le démon tourne sous qbt et ne se connecte jamais ; sync est le compte avec lequel vous récupérez les fichiers et ne peut rien écrire. Maintenant les répertoires, et les deux drapeaux qui rendent cela permanent :
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/incompleteLe mode 2775 définit le bit setgid, donc chaque fichier créé à l'intérieur hérite du groupe media au lieu du groupe principal de l'utilisateur créateur. L'ACL par défaut accorde ensuite à ce groupe la lecture et l'écriture sur les nouvelles entrées, quel que soit l'umask du processus. Ensemble, ils signifient que la question des permissions est résolue une fois pour toutes plutôt qu'après chaque téléchargement.
Sur un S-50, le niveau de masse et le NVMe sont des dispositifs de blocs séparés. Confirmez lequel est lequel avant de vous engager dans les chemins :
lsblk -o NAME,SIZE,ROTA,MOUNTPOINT2. Le démon
Démarrez-le une fois pour qu'il écrive un fichier de configuration, puis arrêtez-le et modifiez ce fichier. Lutter contre l'interface pour des paramètres qui vivent dans un fichier texte est une perte de temps.
sudo -u qbt qbittorrent-nox --webui-port=8080 &
sleep 5 && pkill -u qbt qbittorrent-noxModifiez /srv/qbt/.config/qBittorrent/qBittorrent.conf pour que les sections [BitTorrent] et [Preferences] contiennent :
[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=trueLa mise en staging sur NVMe est tout l'astuce. Les écritures de torrents sont petites et dispersées, ce qui est le pire modèle possible pour le niveau de masse ; le NVMe les absorbe, et le fichier terminé se déplace en une seule copie séquentielle. La préallocation empêche la fragmentation à l'entrée.
3. Une unité qui ne peut pas divaguer
/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.targetUMask=0002 et Group=media sont ce qui maintient les nouveaux fichiers inscriptibles par le groupe. Sans le premier, setgid vous donne le bon groupe sur des fichiers que personne dans ce groupe ne peut écrire, ce qui est une demi-réussite subtile et irritante.
systemctl daemon-reload && systemctl enable --now qbittorrent4. Noyau et pare-feu
Dix gigabits avec plusieurs centaines de pairs nécessite des tampons de socket plus grands et une table de connexions qui ne se remplira pas :
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 --systemPare-feu : le port torrent ouvert sur les deux familles, SSH et HTTPS ouverts, l'interface web liée à loopback et ne nécessitant donc rien.
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. L'interface, derrière un proxy
certbot certonly --standalone -d box.example.com
htpasswd -c /etc/nginx/qbt.htpasswd youserver {
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;
}
}Vérification
Utilisez quelque chose avec un essaim large et bien ensemencé et une licence sans ambiguïté. Une image d'installation Debian actuelle est le choix traditionnel et sature un port dix gigabits plus convaincamment que tout ce que vous pouvez légalement tester avec.
Ajoutez le torrent via l'interface, puis regardez le niveau de staging se remplir :
watch -n2 "du -sh /srv/nvme/incomplete /srv/bulk/complete"Pendant qu'il tourne, confirmez que le port est réellement accessible plutôt que simplement ouvert dans votre propre pare-feu, car un port inaccessible produit une seedbox qui télécharge de manière acceptable mais ne partage avec personne :
ss -tn state established sport = :51413 | wc -lLes connexions entrantes sur ce port signifient que des pairs vous ont trouvé. Zéro, avec beaucoup de connexions sortantes, signifie que seul vous appelez vers l'extérieur.
Lorsque le téléchargement se termine, vérifiez les trois choses pour lesquelles cette construction existe :
ls -l /srv/nvme/incomplete
ls -ln /srv/bulk/complete
sudo -u sync cat /srv/bulk/complete/*.iso > /dev/null && echo "sync can read"Le répertoire de staging est vide, les fichiers terminés montrent le groupe 3000 avec lecture et écriture de groupe, et le compte sync peut les lire sans aucune correction manuelle des permissions. Cette troisième commande est celle qui prouve que le setgid et les ACL ont payé.
Enfin, prouvez que l'interface n'est pas exposée :
curl -m5 http://box.example.com:8080/ ; echo "exit $?"
curl -sI https://box.example.com/ | head -1Le premier devrait échouer à la connexion, le second devrait retourner 401. Toute autre chose et la liaison d'adresse de l'étape deux n'a pas pris.
Ensuite
Définissez un ratio de partage global ou une limite de temps de partage à moins que vous n'ayez l'intention de semer tout pour toujours, car cinquante téraoctets se remplissent plus vite que quiconque ne s'y attend. Si une plainte nous parvient concernant le trafic de votre instance, le processus est décrit sur la page d'abus : elle vous est transférée, et nous ne fouillons pas votre disque.