Blame
|
1 | # Downloads |
||||||
| 2 | ||||||||
| 3 | ← [[Home]] |
|||||||
| 4 | ||||||||
| 5 | Services running on PCT 101 (downloads, 192.168.2.190). All standalone containers — not Swarm-managed. |
|||||||
| 6 | ||||||||
| 7 | --- |
|||||||
| 8 | ||||||||
| 9 | ## Services |
|||||||
| 10 | ||||||||
| 11 | | Container | URL | Port | Purpose | |
|||||||
| 12 | |-----------|-----|------|---------| |
|||||||
| 13 | | `qbittorrent-mam` | `qbittorrent.carr-family.org` | 8080 | MyAnonamouse torrent client | |
|||||||
|
14 | | `qbittorrent-vpn` | `qbittorrent-vpn.carr-family.org` | 8081 (via gluetun) | VPN-routed general torrents | |
||||||
|
15 | | `gluetun-proton` | — | — | ProtonVPN gateway for qbittorrent-vpn | |
||||||
| 16 | | `qui` | `qui.carr-family.org` | 7476 | Multi-instance qBittorrent web UI | |
|||||||
| 17 | ||||||||
|
18 | **Compose files on PCT 101:** |
||||||
| 19 | - `qbittorrent-mam` + `qui`: `/root/stacks/qbittorrent-mam/docker-compose.yml` |
|||||||
| 20 | - `qbittorrent-vpn` + `gluetun-proton`: `/root/stacks/bittorrent-vpn/docker-compose.yml` |
|||||||
| 21 | ||||||||
| 22 | All four containers excluded from Watchtower — `qbittorrent-vpn` uses `network_mode: "service:gluetun"` which is incompatible with rolling restart. |
|||||||
|
23 | |||||||
| 24 | --- |
|||||||
| 25 | ||||||||
| 26 | ## qbittorrent-mam |
|||||||
| 27 | ||||||||
| 28 | MAM (MyAnonamouse) torrent client. Image: `linuxserver/qbittorrent:4.6.7`. |
|||||||
| 29 | ||||||||
| 30 | - **WebUI:** `192.168.2.190:8080`, creds: `admin / 32Ab0321!!` |
|||||||
| 31 | - **Config:** `/mnt/tank/appdata/qbittorrent/` |
|||||||
|
32 | - **Volume:** `/mnt/tank/media:/data` — **only this mount**. Do not add a separate bookingest mount; `bookingest` is accessible as `/data/bookingest` via the main mount, and a separate mount would break hardlinks (files would span datasets). |
||||||
| 33 | - **Ports:** 8080 (WebUI), 52525 TCP+UDP (BitTorrent) |
|||||||
|
34 | |||||||
| 35 | **Tuned settings (4-core Xeon E5-1620 v2, 8 GB RAM, 1 Gbps):** |
|||||||
|
36 | |||||||
| 37 | | Setting | Value | Notes | |
|||||||
| 38 | |---------|-------|-------| |
|||||||
| 39 | | `max_active_downloads` | 70 | | |
|||||||
| 40 | | `disk_cache` | 512 MB | ZFS has its own ARC; auto mode balloons to ~6 GB | |
|||||||
| 41 | | `max_connec` | 1000 | | |
|||||||
| 42 | | `max_connec_per_torrent` | 200 | | |
|||||||
|
43 | |||||||
| 44 | ### Categories |
|||||||
| 45 | ||||||||
| 46 | | Category | Save Path | Used By | |
|||||||
| 47 | |----------|-----------|---------| |
|||||||
| 48 | | `MAM` | `/data/content/books-seeds` | Direct MAM ebook downloads | |
|||||||
| 49 | | `audiobooks` | `/data/content/audiobooks` | Audiobookshelf library | |
|||||||
|
50 | | `books-shelfmark` | `/data/bookingest` | Shelfmark ebook downloads | |
||||||
| 51 | | `audiobook-shelfmark` | `/data/bookingest` | Unused | |
|||||||
|
52 | |||||||
| 53 | ### On-completion Hook |
|||||||
| 54 | ||||||||
|
55 | Script: `/mnt/tank/appdata/qbittorrent/scripts/hardlink-to-ingest.sh` — fires only for `MAM` category. Hardlinks by file extension (preserving directory structure): |
||||||
| 56 | ||||||||
| 57 | | Extensions | Destination | |
|||||||
| 58 | |------------|-------------| |
|||||||
| 59 | | `.epub`, `.mobi`, `.azw3`, `.pdf`, etc. | `/data/bookingest` (CWA ingest) | |
|||||||
| 60 | | `.m4b`, `.mp3`, `.m4a`, `.aax`, etc. | `/data/content/audiobooks` (Audiobookshelf) | |
|||||||
| 61 | | `.cbz`, `.cbr`, `.cb7`, `.cbt`, etc. | `/data/content/comics` (Komga) | |
|||||||
|
62 | |||||||
|
63 | Hardlinks work because `bookingest` (`/tank/media/bookingest`) and `books-seeds` (`/tank/media/content/books-seeds`) are both on the `tank/media` ZFS dataset. Do not move bookingest back to the `tank` root dataset. |
||||||
|
64 | |||||||
|
65 | A background `chown 1000:1000` runs 5 minutes after each MAM torrent completes to keep CWA import ownership correct. |
||||||
|
66 | |||||||
| 67 | ### Fixing Incorrect Save Paths |
|||||||
| 68 | ||||||||
|
69 | The qBittorrent API `setLocation` returns 200 but silently fails. The only reliable fix: |
||||||
| 70 | ||||||||
| 71 | 1. `docker kill --signal SIGKILL qbittorrent-mam` (SIGKILL skips state save; graceful stop would overwrite your edits) |
|||||||
| 72 | 2. Patch `qBt-savePath` **and** `save_path` in `/mnt/tank/appdata/qbittorrent/qBittorrent/BT_backup/<hash>.fastresume` |
|||||||
| 73 | 3. Delete all `*.fastresume.*` stale backup files in that directory |
|||||||
|
74 | 4. `docker start qbittorrent-mam` |
||||||
|
75 | 5. Force-recheck the affected torrents via API or WebUI |
||||||
|
76 | |||||||
| 77 | --- |
|||||||
| 78 | ||||||||
| 79 | ## qbittorrent-vpn + gluetun-proton |
|||||||
| 80 | ||||||||
|
81 | VPN-routed torrents via ProtonVPN. |
||||||
|
82 | |||||||
| 83 | - **Compose:** `/root/stacks/bittorrent-vpn/docker-compose.yml` on PCT 101 |
|||||||
|
84 | - **WebUI:** `192.168.2.190:8081` (via gluetun network), `qbittorrent-vpn.carr-family.org` (external) |
||||||
| 85 | - `qbittorrent-vpn` uses `network_mode: "service:gluetun"` — traffic routes through gluetun's ProtonVPN tunnel |
|||||||
| 86 | - Both containers excluded from Watchtower (`com.centurylinklabs.watchtower.enable=false`) — update manually |
|||||||
|
87 | |||||||
| 88 | --- |
|||||||
| 89 | ||||||||
| 90 | ## qui |
|||||||
| 91 | ||||||||
|
92 | Multi-instance qBittorrent web UI at `qui.carr-family.org`. Port 7476. Not in Swarm — static route in Traefik `routes.yml` → `192.168.2.190:7476`. |
||||||
|
93 | |||||||
|
94 | **Configured instances:** |
||||||
|
95 | - `qbittorrent-mam` → `http://192.168.2.190:8080` (admin / 32Ab0321!!) |
||||||
| 96 | - `qbittorrent-vpn` → `http://192.168.2.190:8081` |
|||||||
|
97 | |||||||
| 98 | Config: `/mnt/tank/appdata/qui/` |
|||||||
