Servarr Setup Guide - Preventing Tracker Bans¶
Reference guide for configuring the *arr stack, qBittorrent, and Prowlarr to prevent Hit & Run violations on private trackers.
Source: TRaSH Guides and Servarr Wiki
Recommended Folder Structure (Docker)¶
The key principle: all data must be on the same filesystem for hardlinks to work. Never use separate mount points like /movies and /downloads.
data/
├── torrents/
│ ├── movies/
│ ├── tv/
│ ├── music/
│ └── books/
├── usenet/
│ ├── incomplete/
│ └── complete/
│ ├── movies/
│ ├── tv/
│ ├── music/
│ └── books/
└── media/
├── movies/
├── tv/
├── music/
└── books/
Docker Volume Mounts¶
| Application | Volume Mount | Purpose |
|---|---|---|
| qBittorrent | /data/torrents:/data/torrents |
Torrent downloads only |
| Radarr/Sonarr/Lidarr | /data:/data |
Full access for hardlinks + atomic moves |
| Jellyfin/Plex | /data/media:/data/media |
Read-only media access |
Permissions Setup¶
sudo chown -R $USER:$USER /data
sudo chmod -R a=,a+rX,u+w,g+w /data
qBittorrent Settings (TRaSH Recommended)¶
Downloads¶
- Default Torrent Management Mode: Automatic - ensures completed downloads move from incomplete to category save paths
- Default Save Path:
/data/torrents(root for all categories) - Keep incomplete torrents in: optional, creates extra I/O if on different drive
- Copy .torrent files for finished downloads: disabled
- Download and media library should NEVER be the same location
Connection¶
- Disable UPnP/NAT-PMP for security
- Don't enable automatic port mapping
Speed¶
- Set upload/download to 70-80% of max speed for shared networks
- Enable "Limit uTP protocol"
- Disable "Apply rate limit to transport overhead"
BitTorrent¶
- Encryption: Allow encryption (not enforce)
- Anonymous mode: Disable for private trackers (reduces speeds)
- Auto-Add Trackers: NEVER enable on private trackers
Seeding Limits (Critical for H&R Prevention)¶
TRaSH recommends: Disable seeding limits in qBittorrent entirely. Instead, manage seeding through: 1. Per-indexer seed times in Prowlarr 2. *arr app download client settings 3. Or use qBit Manage for advanced control
This ensures each tracker's specific requirements are respected rather than applying one global limit.
Prowlarr Settings (Per-Indexer Seed Times)¶
This is where you set seed requirements per tracker:
Prowlarr → Settings → Indexers → click each indexer → Seed Ratio / Seed Time
| Tracker | Minimum Seed Time | Recommended Setting |
|---|---|---|
| Private trackers (general) | Varies by tracker | Check tracker rules page |
| DigitalCore | 5 days (ratio 1:1 OR 5 days) | Seed Time: 7200 min (5 days) |
| TorrentLeech | Check rules | Set accordingly |
| Public trackers | No requirement | Seed Time: 1440 min (1 day) |
Prowlarr passes these seed requirements down to the *arr apps, which then tell qBittorrent the minimum seed time for each specific torrent based on its source indexer.
*arr App Settings (Radarr/Sonarr/Lidarr)¶
Download Client Configuration¶
Settings → Download Clients → qBittorrent entry:
- Remove Completed: ON — but ONLY if Prowlarr seed times are configured correctly. The *arr app will wait until the seed time from Prowlarr is satisfied before removing.
- Remove Failed: ON
- Seed Time (in the download client entry): Leave blank to use Prowlarr's per-indexer values. If set here, it overrides Prowlarr for all indexers.
Quality Profiles¶
- Upgrades Allowed: If ON, Radarr will keep grabbing "better" releases even if the movie is already downloaded. This can cause duplicate grabs. Set upgrade thresholds carefully.
Hardlinks¶
What they are: A file that exists in multiple locations without using double storage. Both /data/torrents/movies/file.mkv and /data/media/movies/Movie/file.mkv point to the same data on disk.
Why they matter:
- Torrent keeps seeding from /data/torrents/ while the media library serves from /data/media/
- No extra disk space used
- Instant "move" during import (atomic move)
Requirements: - Same filesystem/partition (cannot hardlink across different mounts) - Filesystem must support hardlinks (ext4, xfs, btrfs — NOT exFAT) - Cannot hardlink directories, only files
Verification: Check link count with stat file.mkv — Links > 1 means hardlinked.
Common Issues & Fixes¶
Torrents stuck in "incomplete" directory¶
- Cause: Automatic Torrent Management was disabled
- Fix: Enable Default Torrent Management Mode: Automatic in qBittorrent Options → Downloads. For existing torrents, select all → right-click → enable Automatic Torrent Management
*arr app keeps re-grabbing the same release¶
- Cause 1: Movie/show file not detected — rescan in the *arr app
- Cause 2: Quality upgrade — *arr found a "better" release. Check quality profile settings
- Cause 3: Import failed (permissions, path issues) — check *arr logs
Torrents removed too early (H&R risk)¶
- Cause: "Remove Completed" enabled without proper seed times in Prowlarr
- Fix: Configure per-indexer seed times in Prowlarr FIRST, then enable Remove Completed
Hardlinks not working (link count = 1)¶
- Cause: Download and media paths on different filesystems
- Fix: Ensure both paths are on the same mount point. Use a single
/datavolume mount.
Third-Party Tools¶
Cross-Seed¶
Automates cross-seeding — finding the same release on other trackers and seeding it without re-downloading. This is the most effective way to build ratio on private trackers passively.
How it works:
- Cross-seed reads your existing torrents from qBittorrent
- Searches your Prowlarr indexers for matching releases on other trackers
- When a match is found, it hardlinks the existing files into a link directory
- Injects the matched
.torrentinto qBittorrent pointing at the hardlinked files - qBittorrent hash-checks, confirms the data matches, and starts seeding immediately
No extra disk space is used (hardlinks), and no re-downloading occurs.
Docker Compose:
cross-seed:
image: ghcr.io/cross-seed/cross-seed:6
container_name: cross-seed
user: "1000:1000" # must match your torrent client's user
ports:
- 2468:2468
volumes:
- /path/to/appdata/cross-seed:/config
- /path/to/appdata/qbittorrent/qBittorrent/BT_backup:/torrents:ro
- /data:/data # single mount — required for hardlinks to work
command: daemon
restart: unless-stopped
Volume Mounts
Cross-seed and qBittorrent must share the same /data mount for hardlinks to work. Using separate mounts (e.g., /data/torrents and /data/torrents/cross-seed) causes EXDEV: cross-device link not permitted errors even if they're on the same physical drive.
Key config options (/config/config.js):
module.exports = {
// Prowlarr torznab feeds — private trackers only
torznab: [
"http://prowlarr:9696/<INDEXER_ID>/api?apikey=<PROWLARR_API_KEY>",
],
// qBittorrent injection
torrentClients: [
"qbittorrent:http://<user>:<pass>@qbittorrent:8080",
],
useClientTorrents: true, // read torrents from qBit API (recommended)
linkDirs: ["/data/torrents/cross-seed"],
linkType: "hardlink",
action: "inject",
duplicateCategories: true, // prevent *arr re-importing cross-seeded torrents
// Sonarr/Radarr for ID-based matching (more accurate)
sonarr: ["http://sonarr:8989/?apikey=<SONARR_API_KEY>"],
radarr: ["http://radarr:7878/?apikey=<RADARR_API_KEY>"],
excludeRecentSearch: "3 days",
port: 2468,
};
Finding Prowlarr indexer IDs: The number in the torznab URL corresponds to the indexer ID in Prowlarr. You can find them via the Prowlarr API: curl http://localhost:9696/api/v1/indexer -H "X-Api-Key: <key>" and look at the id field.
Setup checklist:
- Create link directory:
mkdir -p /data/torrents/cross-seed - Set ownership:
chown 1000:1000 /data/torrents/cross-seed - Mount
/data(not subdirectories) in the cross-seed container - Only add private tracker indexers to
torznab(public trackers have no ratio) - Set
duplicateCategories: trueto prevent *arr apps from re-importing - Verify logs show "Your configuration is valid!" after first start
qBit Manage¶
Automated qBittorrent management tool that can:
- Tag torrents by tracker
- Apply per-tracker seeding rules
- Clean up orphaned files
- Remove unregistered torrents
- Cross-seed management
Useful as an alternative to relying solely on *arr apps for torrent lifecycle management.
Trackerslist Injection (Safe Selective Auto-Tracker)¶
ngosang/trackerslist speeds up public torrents by appending extra trackers, but enabling it globally injects public trackers into private ones — an instant permaban. The safe approach uses BEP 27 flag detection plus a Prowlarr-synced hostname blocklist to classify each torrent and inject only into public ones.
See the dedicated guide: qBittorrent Tracker Safety Guide — covers the problem, BEP 27 primer, two-gate architecture, setup, and daily operation.
Quick Checklist: Preventing Private Tracker Bans¶
- qBittorrent: Automatic Torrent Management = ON
- qBittorrent: Seeding limits = DISABLED (let Prowlarr handle it)
- qBittorrent: Anonymous mode = OFF (for private trackers)
- qBittorrent: Auto-add trackers (global) = OFF — see the qBittorrent Tracker Safety Guide for a safe selective alternative
- Prowlarr: Seed time set per-indexer (match or exceed tracker minimums)
- *arr apps: Remove Completed = ON (after Prowlarr seed times are set)
- *arr apps: Seed Time field in download client = BLANK (use Prowlarr values)
- Folder structure: Single
/datamount for hardlinks - Permissions: PUID/PGID consistent across all containers
- Cross-seed: Running with private tracker indexers for automated ratio building
- Cross-seed:
linkDirson same filesystem as torrent data (single/datamount)