12개 구축

50TB 스토리지 노드의 시드박스, 유지되는 권한

S-50의 qBittorrent, NVMe 스테이징 계층, 강화된 유닛, 모든 새 다운로드에서 유지되는 그룹 권한, 공용 인터넷에서 인터페이스를 차단하는 프록시.

이 빌드가 만드는 것

스토리지 노드에서 qBittorrent를 권한 없는 서비스로 실행합니다. 불완전한 데이터는 NVMe 티어에 기록되고, 완료된 데이터는 50테라바이트 대용량 티어로 이동되며, 모든 파일은 공유 그룹이 소유하게 하여 두 번째 계정이 chmod 작업 없이 SFTP로 읽을 수 있게 합니다. 웹 인터페이스는 인증된 프록시를 통해서만 접근할 수 있습니다.

분명한 방법은 패키지를 설치하고 인터페이스를 클릭하며 하루를 보내는 것입니다. 그러나 이 방법은 첫 파일이 잘못된 그룹으로 도착하고 동기화 사용자가 읽을 수 없게 되는 때까지, 약 2주 정도만 유효합니다. 그때쯤이면 4만 개의 파일이 잘못된 그룹으로 쌓여 있습니다.

시작하기 전에

  • S-50: 10기가비트 포트에 연결된 1테라바이트 NVMe 티어 뒤에 50테라바이트 대용량 스토리지. 트래픽은 공정 사용 정책에 따라 무제한이며, 허용 가능한 사용 정책은 무엇이 허용되는지에 대해 간결하고 구체적입니다. 배포 권한은 각주가 아니라 사용자의 책임입니다.
  • 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 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,MOUNTPOINT

2. 데몬

설정 파일을 생성하도록 한 번 시작한 다음 중지하고 해당 파일을 편집합니다. 텍스트 파일에 있는 설정을 위해 인터페이스와 싸우는 것은 시간 낭비입니다.

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.target

UMask=0002Group=media는 새 파일을 그룹 쓰기 가능으로 유지하는 것입니다. 첫 번째가 없으면 setgid는 그룹의 아무도 쓸 수 없는 파일에 올바른 그룹을 부여하여 미묘하고 성가신 반쪽 성공을 만듭니다.

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

4. 커널 및 방화벽

수백 개의 피어가 있는 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는 열려 있으며, 웹 인터페이스는 루프백에 바인딩되어 있으므로 아무것도 필요하지 않습니다.

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 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;
  }
}

검증

크고 시드가 잘 되어 있으며 라이선스가 명확한 것을 사용하십시오. 현재 Debian 설치 프로그램 이미지는 전통적인 선택이며, 합법적으로 테스트할 수 있는 다른 어떤 것보다 10기가비트 포트를 더 설득력 있게 포화시킵니다.

인터페이스를 통해 토렌트를 추가한 다음 스테이징 티어가 채워지는 것을 확인하십시오:

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

실행 중에 포트가 방화벽에서 열려 있는 것뿐만 아니라 실제로 도달 가능한지 확인하십시오. 도달할 수 없는 포트는 다운로드는 잘 되지만 시드가 되지 않는 시드박스를 만듭니다:

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

해당 포트의 들어오는 연결은 피어가 사용자를 찾았음을 의미합니다. 나가는 연결이 많은데 0이면 우리만 전화를 거는 것입니다.

다운로드가 완료되면 이 빌드가 존재하는 세 가지를 확인하십시오:

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을 반환해야 합니다. 그 외의 경우 2단계의 주소 바인딩이 적용되지 않은 것입니다.

이후

영원히 모든 것을 시드할 의도가 아니라면 전역 시드 비율 또는 공유 시간 제한을 설정하십시오. 50테라바이트는 예상보다 빨리 채워지기 때문입니다. 사용자 인스턴스의 트래픽에 대한 불만이 우리에게 도달하면 남용 페이지에 설명된 절차가 적용됩니다. 즉, 불만이 사용자에게 전달되며, 우리는 사용자의 디스크를 살펴보지 않습니다.

준비 완료

도시를 고르고, 크기를 고르고, 코인으로 결제하세요.

신원 확인 양식도, 승인을 기다리는 담당자도, 검증을 위한 전화도 없습니다. 청구서가 결제되면 자격 증명이 받은 편지함에 도착합니다.