これで作られるもの
ストレージノード で qBittorrent を非特権サービスとして実行します。不完全なデータは NVMe 層に書き込まれ、完了したデータは 50 テラバイトのバルク層に移動します。すべては共有グループが所有するため、2 番目のアカウントは chmod の修正なしに SFTP で読み取ることができ、Web インターフェースは認証済みプロキシ経由でのみアクセスできます。
明白なアプローチは、パッケージをインストールし、インターフェースをクリックして、一日を過ごすことです。それは 2 週間は機能しますが、最初のファイルが間違ったグループで到着し、同期ユーザーがそれを読み取れなくなるまでです。その頃には 4 万ファイルが間違ったグループになっています。
開始する前に
- S-50: 1 テラバイトの NVMe 層の背後にある 50 テラバイトのバルク、10 ギガビットポート。トラフィックはフェアユースの下で従量制ではなく、利用ポリシー はそれを超える可能性があるものについて簡潔かつ具体的です。配布権はあなたの問題であり、脚注ではありません。
- Debian 13、root、および
box.example.comのようなホスト名。
1. ユーザー、グループ、レイアウト
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 sync2 つのアカウント、1 つのグループ。デーモンは qbt として実行され、ログインしません。sync はファイルを取得するアカウントで、何も書き込めません。次にディレクトリと、これを永続的に機能させる 2 つのフラグ:
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モード 2775 は setgid ビットを設定するため、内部で作成されたすべてのファイルは、作成ユーザーのプライマリグループではなく media グループを継承します。デフォルト ACL は、プロセスの umask に関係なく、新しいエントリに対してグループに読み取りと書き込みを許可します。これらを合わせると、権限の問題はダウンロードのたびにではなく、一度だけ解決されます。
S-50 では、バルク層と NVMe は別々のブロックデバイスです。パスを確定する前に、どちらがどちらかを確認してください:
lsblk -o NAME,SIZE,ROTA,MOUNTPOINT2. デーモン
構成ファイルが書き込まれるように一度起動し、停止してそのファイルを編集します。テキストファイルにある設定のためにインターフェースと戦うのは午後を無駄にします。
sudo -u qbt qbittorrent-nox --webui-port=8080 &
sleep 5 && pkill -u qbt qbittorrent-nox/srv/qbt/.config/qBittorrent/qBittorrent.conf を編集して、[BitTorrent] と [Preferences] セクションに次の内容が含まれるようにします:
[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=trueNVMe 上のステージングがすべてのトリックです。トレントの書き込みは小さく散在しており、バルク層にとって最悪のパターンです。NVMe がそれらを吸収し、完了したファイルは 1 回のシーケンシャルコピーとして移動します。事前割り当てにより、途中の断片化が防止されます。
3. 迷子にならないユニット
/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 と Group=media により、新しいファイルがグループ書き込み可能になります。最初のものがなければ、setgid は、そのグループ内の誰も書き込めないファイルに正しいグループを提供し、これは微妙でイライラする半成功です。
systemctl daemon-reload && systemctl enable --now qbittorrent4. カーネルとファイアウォール
数百のピアを持つ 10 ギガビットには、より大きなソケットバッファと、いっぱいにならない接続テーブルが必要です:
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ファイアウォール: トレントポートは両方のファミリで開き、SSH と HTTPS は開き、Web インターフェースはループバックにバインドされているため、何も必要ありません。
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. プロキシの背後にあるインターフェース
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;
}
}検証
大規模でシードが多いスウォームと明確なライセンスを持つものを使用します。現在の Debian インストーライメージは伝統的な選択肢であり、法的にテストできる他のものよりも説得力をもって 10 ギガビットポートを飽和させます。
インターフェースからトレントを追加し、ステージング層が満たされるのを確認します:
watch -n2 "du -sh /srv/nvme/incomplete /srv/bulk/complete"実行中に、ポートが実際に到達可能であることを確認します。自分のファイアウォールで単に開いているだけではありません。到達不能なポートは、ダウンロードは許容できるが誰にもシードしないシードボックスを生成するためです:
ss -tn state established sport = :51413 | wc -lそのポートへの着信接続は、ピアがあなたを見つけたことを意味します。送信接続が多いのにゼロの場合、あなただけがダイヤルアウトしていることを意味します。
ダウンロードが完了したら、このビルドが存在する 3 つのことを確認します:
ls -l /srv/nvme/incomplete
ls -ln /srv/bulk/complete
sudo -u sync cat /srv/bulk/complete/*.iso > /dev/null && echo "sync can read"ステージングディレクトリは空で、完了したファイルはグループ 3000 でグループ読み取りと書き込みが可能であり、sync アカウントは手動の権限修正なしにそれらを読み取ることができます。この 3 番目のコマンドは、setgid と ACL の作業が報われたことを証明します。
最後に、インターフェースが公開されていないことを証明します:
curl -m5 http://box.example.com:8080/ ; echo "exit $?"
curl -sI https://box.example.com/ | head -1最初は接続に失敗し、2 番目は 401 を返すはずです。それ以外の場合は、ステップ 2 のアドレスバインディングが機能しませんでした。
その後
すべてを永遠にシードするつもりがない限り、グローバルなシード比率または共有時間制限を設定します。50 テラバイトは誰もが予想するよりも速く満たされるためです。あなたのインスタンスからのトラフィックに関する苦情が私たちに届いた場合、プロセスは abuse ページ に記載されています: それはあなたに転送され、私たちはあなたのディスクを調べません。