ما يبنيه هذا الدليل
عقدة تخزين تشغّل qBittorrent كخدمة غير مميزة: البيانات غير المكتملة تُكتب على طبقة NVMe، والبيانات المكتملة تُنقل إلى الطبقة الضخمة (خمسون تيرابايت)، وكل الملفات مملوكة لمجموعة مشتركة بحيث يمكن حساب ثانٍ قراءتها عبر SFTP دون أي حفريات في الأذونات، وواجهة ويب لا تُتاح إلا عبر وكيل مُصادَق.
النهج الواضح هو تثبيت الحزمة، والنقر عبر الواجهة، والمضي قدمًا في يومك. ينجح ذلك لمدة أسبوعين، حتى يصل أول ملف بمجموعة خاطئة ولا يتمكن مستخدم المزامنة من قراءته، وعندها يكون هناك أربعون ألف ملف بمجموعة خاطئة.
قبل أن تبدأ
- خادم S-50: خمسون تيرابايت من التخزين الضخم خلف طبقة NVMe بسعة تيرابايت واحد، على منفذ عشر غيغابت. الحركة غير محدودة ضمن الاستخدام العادل، وسياسة الاستخدام المقبول قصيرة ومحددة بشأن ما قد يعبرها. حقوق التوزيع مشكلتك أنت، وليست حاشية.
- دبيان 13، صلاحية الجذر، واسم مضيف مثل
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 syncحسابان، مجموعة واحدة. الخفي يعمل باسم qbt ولا يسجل الدخول أبدًا؛ sync هو الحساب الذي تسحب به الملفات ولا يمكنه الكتابة. الآن الدلائل، والعلامتان اللتان تجعلان هذا يعمل بشكل دائم:
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=trueالمرحلية على NVMe هي الحيلة كلها. كتابات التورنت صغيرة ومتناثرة، وهو النمط الأسوأ للطبقة الضخمة؛ تمتصها NVMe، ويُنسخ الملف المكتمل عبرها كنسخة تسلسلية واحدة. يمنع الحجز المسبق التجزؤ في الطريق.
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. النواة وجدار الحماية
عشر غيغابت مع عدة مئات من الأقران تحتاج مخازن مؤقتة أكبر للـ socket وجدول اتصالات لن يمتلئ:
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 مفتوحان، وواجهة الويب مربوطة بـ loopback وبالتالي لا تحتاج شيئًا.
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;
}
}تحقق منه
استخدم شيئًا بسرب كبير ومُزرع جيدًا ورخصة لا لبس فيها. صورة مثبّت دبيان الحالية هي الخيار التقليدي وتشبع منفذ عشر غيغابت بشكل أكثر إقناعًا من أي شيء آخر يمكنك اختباره قانونيًا.
أضف التورنت عبر الواجهة، ثم شاهد طبقة المرحلية تمتلئ:
watch -n2 "du -sh /srv/nvme/incomplete /srv/bulk/complete"أثناء تشغيله، أكّد أن المنفذ يمكن الوصول إليه فعليًا وليس مجرد فتح في جدار الحماية الخاص بك، نظرًا لأن المنفذ غير القابل للوصول ينتج صندوق بذور ينزّل بشكل مقبول ولا يبذّر لأي شخص:
ss -tn state established sport = :51413 | wc -lالاتصالات الواردة على ذلك المنفذ تعني أن الأقران وجدوك. صفر، مع الكثير من الاتصالات الصادرة، يعني أنك أنت فقط من يتصل بالخارج.
عند اكتمال التنزيل، تحقق من الأشياء الثلاثة التي وُجد هذا البناء من أجلها:
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 يمكنه قراءتها دون أي إصلاح يدوي للأذونات. هذا الأمر الثالث هو الذي يثبت أن عمل setgid وACL أتى ثماره.
أخيرًا، أثبت أن الواجهة غير مكشوفة:
curl -m5 http://box.example.com:8080/ ; echo "exit $?"
curl -sI https://box.example.com/ | head -1يجب أن يفشل الأول في الاتصال، ويجب أن يُرجع الثاني 401. أي شيء آخر يعني أن ربط العنوان في الخطوة الثانية لم ينجح.
بعد ذلك
اضبط نسبة بذر عالمية أو حدًا زمنيًا للمشاركة ما لم تكن تنوي البذر إلى الأبد، لأن خمسين تيرابايت تمتلئ أسرع مما يتوقع أي شخص. إذا وصلتنا شكوى حول حركة مرور من مثيلك، فالعملية موصوفة في صفحة إساءة الاستخدام: تُحوَّل إليك، ولا نبحث في قرصك.