Skip to content

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


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

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.

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
  • Cause: Download and media paths on different filesystems
  • Fix: Ensure both paths are on the same mount point. Use a single /data volume 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:

  1. Cross-seed reads your existing torrents from qBittorrent
  2. Searches your Prowlarr indexers for matching releases on other trackers
  3. When a match is found, it hardlinks the existing files into a link directory
  4. Injects the matched .torrent into qBittorrent pointing at the hardlinked files
  5. 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: true to 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 /data mount for hardlinks
  • Permissions: PUID/PGID consistent across all containers
  • Cross-seed: Running with private tracker indexers for automated ratio building
  • Cross-seed: linkDirs on same filesystem as torrent data (single /data mount)