Featured image of post 如何使用 Docker 部署合規的 qBittorrent 並自動阻擋吸血用戶

如何使用 Docker 部署合規的 qBittorrent 並自動阻擋吸血用戶

以 Docker Compose 整合 qBittorrent 標準版與 ClientBlocker,在符合 PT 站規範的前提下自動封鎖迅雷等吸血客戶端,並解決容器時區不同步問題,附實際封鎖日誌與心得。

1. 簡介

在參與 Private Tracker (PT) 社群時,遵守客戶端規範至關重要。許多 PT 站點為了維護公平性,明文禁止使用具有「反吸血」或「修改版」功能的客戶端(如 qBittorrent Enhanced Edition)。然而,使用標準版客戶端卻可能讓使用者在公開追蹤器(Public Trackers)上面臨吸血蟲(Leech)消耗上傳頻寬的問題。

本文將指導您如何透過 Docker 建構一個兩全其美的解決方案:

  1. 部署 qBittorrent 標準版(Official Standard Edition)以符合 PT 站規範。
  2. 掛載 qBittorrent-ClientBlocker 服務,在背景自動掃描並封鎖特定關鍵字(如迅雷、Baidu)的違規用戶。

此方案採用「設定後即忘(Set-and-Forget)」的架構,並解決了容器常見的時區不同步問題,確保日誌紀錄準確以便於除錯。

2. 先決條件

在開始之前,請確保您具備以下環境與資訊:

  • 作業系統:已安裝 Docker 與 Docker Compose 的 Linux 環境(如 Ubuntu 或 NAS 系統)。
  • 使用者 ID (PUID/PGID):確認您擁有存取掛載目錄權限的使用者 ID(本文範例為 1000)。
  • 路徑規劃:您已規劃好設定檔與下載目錄的存放路徑(本文將沿用現有的 /mnt/cloud1/... 路徑結構)。

3. Step 1 — 整合 Docker Compose 設定檔

我們將 qBittorrent 主程式與 ClientBlocker 整合在同一個 docker-compose.yml 檔案中。這不僅管理方便,還能讓兩個容器在同一個 Docker 網路內直接通訊,無需額外設定 bridge 網路。

請建立或編輯您的 docker-compose.yml 檔案,內容如下:

version: "3.7"
services:
  # ==========================================
  # 服務 1: qBittorrent 標準版 (符合 PT 規範)
  # ==========================================
  qbittorrent-standard:
    image: lscr.io/linuxserver/qbittorrent:latest
    container_name: qbittorrent-standard
    restart: unless-stopped
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Taipei        # 設定時區
      - WEBUI_PORT=8080        # 容器內部端口
      - TORRENTING_PORT=51134
    volumes:
      # 設定檔與下載目錄映射
      - /mnt/qbittorrent-standard/config:/config
      - /mnt/qbittorrent-standard/PTdl:/downloads
      # 【重要】掛載主機時間檔,確保日誌時間準確
      - /etc/localtime:/etc/localtime:ro
    ports:
      # Web UI 映射:外部 8086 -> 內部 8080
      - 8086:8080
      # BT 連線端口 (TCP/UDP 需一致)
      - 51134:51134
      - 51134:51134/udp

  # ==========================================
  # 服務 2: ClientBlocker (自動阻擋吸血蟲)
  # ==========================================
  qbit-clientblocker:
    image: simpletracker/qbittorrent-clientblocker:latest
    container_name: qbit-clientblocker
    restart: unless-stopped
    environment:
      - TZ=Asia/Taipei         # 與主程式保持一致

      # 【重要】開啟環境變數模式
      - useENV=true

      # qBittorrent 連線設定
      # 注意:在同一 Docker 網路內,直接使用容器名稱 "qbittorrent-standard"
      # 且端口使用內部端口 "8080" (而非外部的 8086)
      - clientURL=http://qbittorrent-standard:8080
      - clientUsername=${QBIT_USER}
      - clientPassword=${QBIT_PASS}

      # 封鎖名單 (JSON 格式,支援正則表達式)
      - blockList=["XL0012", "Xunlei", "Xfplay", "Baidu", "dht_nodes", "Go-http-client"]

      # 檢查頻率 (秒)
      - interval=60

      # 日誌設定 (設為 true 可看到詳細除錯資訊)
      - debug=false

    volumes:
      # 同樣掛載時間檔,確保 Log 時間正確
      - /etc/localtime:/etc/localtime:ro

    depends_on:
      - qbittorrent-standard

設定重點說明:

  1. 網路通訊: qbit-clientblocker 透過 http://qbittorrent-standard:8080 連線。請注意這裡使用的是內部端口 8080,而非您映射到主機的 8086。同一個 Compose 專案內的容器預設共享同一個 bridge 網路,可直接以容器名稱互相尋址。
  2. 時區同步: 兩個服務都加入了 TZ=Asia/Taipei 環境變數以及 - /etc/localtime:/etc/localtime:ro 掛載。這是修正日誌時間落後 8 小時的關鍵,缺一不可。
  3. 環境變數: QBIT_USERQBIT_PASS 建議存放在同目錄下的 .env 檔案中,避免密碼直接暴露在 YAML 檔內。

4. Step 2 — 部署服務

在啟動前,請先建立存放憑證的 .env 檔案:

# 在 docker-compose.yml 同目錄下建立 .env
echo "QBIT_USER=your_username" >> .env
echo "QBIT_PASS=your_password" >> .env

確認檔案內容無誤後,執行以下指令啟動服務:

docker-compose up -d

系統將會下載映像檔並啟動兩個容器。qbittorrent-standard 會先啟動,隨後 qbit-clientblocker 會依據 depends_on 的設定跟隨啟動。

5. Step 3 — 驗證運作與時區

由於 ClientBlocker 沒有圖形介面,我們必須檢查日誌來確認兩件事:連線是否成功以及時間是否正確

執行以下指令查看即時日誌:

docker logs -f qbit-clientblocker

請檢查以下輸出的關鍵資訊:

  1. 時間戳記 (Timestamp): 日誌開頭的時間是否與您當下的台灣時間一致?如果不一致(例如慢了 8 小時),代表 /etc/localtime 掛載未生效,請確認 volume 設定。
  2. 連線狀態: 是否出現 Connected to qBittorrent 或類似成功訊息?若出現 Connection refused,請檢查 clientURL 是否正確,以及 qBittorrent 的 Web UI 是否已啟用「略過本機連線身分驗證」。
  3. 封鎖動作: 當有下載任務時,若偵測到吸血端,應顯示如下日誌:
[2026-01-06 02:55:37][Task] 此次封禁客户端:1 个,此次封禁 IP: 0 个,当前封禁 IP 及客户端:713 个。
[2026-01-06 02:55:37][CheckPeer_AddBlockPeer (Bad-Client_Normal)] 219.xxx.149.102:29474 "-XL0019-"|"XunLei 0019" (TorrentInfoHash: xxxxx).
[2026-01-06 02:52:37][Task] 此次封禁客户端:2 个,此次封禁 IP: 0 个,当前封禁 IP 及客户端:712 个。
[2026-01-06 02:52:37][CheckPeer_AddBlockPeer (Bad-Client_Normal)] 113.78.xxx.175:7525 "-XL0019-"|"XunLei 0019" (TorrentInfoHash: xxxx).

正常運作時,除了在前端就被封鎖的 PT 種子以外,網路上分享的普通 BT 種子通常都會有 30~100 個封鎖訊息出現。

6. Step 4 — 日後維護與名單更新

ClientBlocker 的運作邏輯是「靜默守護」,一旦部署完成不需要日常介入。若您日後發現新的吸血軟體(例如某個新版的迅雷變種),更新封鎖名單只需三步:

  1. 編輯 docker-compose.yml,修改 blockList 欄位加入新關鍵字:
- blockList=["XL0012", "Xunlei", "NewVampireClient"]
  1. 執行以下指令重新建立容器以套用新設定:
docker-compose up -d --force-recreate qbit-clientblocker

加上 --force-recreate 可只重建 ClientBlocker 容器,不影響 qBittorrent 的下載任務。

7. 結論

透過此架構,您成功建立了一個乾淨且合規的下載環境。標準版的 qBittorrent 讓您能夠安全地在 PT 站生存,而外掛的 ClientBlocker 則在背景默默過濾來自公開網路的惡意吸血用戶。如果未來覺得此方案不順手,只需停止並移除容器,您的系統依然保持整潔,不會留下殘餘的設定檔垃圾。

8. 心得

跑了一段時間觀察封鎖日誌,統計下來有個有趣的發現:

被封鎖的 IP 來源大約 80% 來自中國,20% 來自台灣,從來沒有看過其他國家的 IP 被 ban 過。

中國那邊主要是迅雷(XunLei)系列,各種版本的變種輪流上場,封了舊的又來新的,有種打地鼠的既視感。台灣的部分就比較雜,但同樣是吸血不分享的行為模式。

說來也是不愧是同源同種,連吸血的習慣都如出一轍。至於其他國家的用戶,不管是歐美還是日韓,在日誌裡的能見度幾乎是零——不曉得是因為他們不下 BT,還是根本不需要靠吸血工具才能用。

總之這個工具值得長期跑著,安靜、低資源,默默做該做的事。