Files
serverAppConfigs/serverAppConfigs-docs/Dankserver/ARR-Stack.md
T
Frank 5829a0bfe8 docs: rename docs/ -> serverAppConfigs-docs/ per system-wide PROJECTNAME-docs convention
All in-repo path references (AGENTS.md, README, old scripts, report artifacts,
test code paths) rewritten in the same commit; focused-test map extended for
.gitignore, old/scripts/*, dankclaw/comfyui/*, and report/* per this repo's
own convention ('add one before committing'). Obsidian wikilinks are
title-based and unaffected.
2026-08-28 02:20:06 -07:00

11 KiB
Raw Blame History

*arr Stack

The *arr suite is a collection of automated media management tools for Usenet and BitTorrent. For Dankserver — which runs Copyparty, Calibre-Web, RomM, and Jellyfin — the *arr stack provides automatic downloading and library management that Copyparty alone does not cover: quality profile enforcement, series/movie discovery, metadata enrichment, and automated file organization.

The core chain is: Prowlarr (indexer API aggregator) → Sonarr/Radarr/Lidarr/Readarr (media-specific managers) → qBittorrent (download client) → Jellyfin (media server scan → auto-refresh).

Service Overview

Service Role Image Port Min RAM
Prowlarr Indexer management lscr.io/linuxserver/prowlarr:latest 9696 256 MB
Radarr Movie management lscr.io/linuxserver/radarr:latest 7878 512 MB
Sonarr TV show management lscr.io/linuxserver/sonarr:latest 8989 512 MB
Lidarr Music management lscr.io/linuxserver/lidarr:latest 8686 256 MB
Readarr Ebook/audiobook management lscr.io/linuxserver/readarr:latest 8787 256 MB
qBittorrent Torrent download client lscr.io/linuxserver/qbittorrent:latest 8080 512 MB
Jackett Indexer proxy (optional) lscr.io/linuxserver/jackett:latest 9117 256 MB
Whisparr NSFW movie management (optional) lscr.io/linuxserver/whisparr:latest 6969 256 MB

Minimum total RAM: ~3 GB for full stack (headroom recommended).

Architecture

graph LR
    I[Indexers<br/>Torrents, Usenet] --> P[Prowlarr<br/>Indexer Manager]
    P --> S[Sonarr<br/>TV]
    P --> R[Radarr<br/>Movies]
    P --> L[Lidarr<br/>Music]
    P --> Rd[Readarr<br/>Books]
    S --> Q[qBittorrent]
    R --> Q
    L --> Q
    Rd --> Q
    Q --> M1[/tv/]
    Q --> M2[/movies/]
    Q --> M3[/music/]
    Q --> M4[/books/]
    M1 --> J[Jellyfin]
    M2 --> J
    M3 --> J
    M4 --> CW[Calibre-Web]

Docker Compose

networks:
  appnet:
    driver: bridge

services:
  prowlarr:
    image: lscr.io/linuxserver/prowlarr:latest
    container_name: prowlarr
    restart: unless-stopped
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=America/New_York
      - UMASK_SET=022
    volumes:
      - /opt/prowlarr/config:/config
      - /mnt/media/downloads:/downloads:ro
    ports:
      - "9696:9696"
    networks: [appnet]

  radarr:
    image: lscr.io/linuxserver/radarr:latest
    container_name: radarr
    restart: unless-stopped
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=America/New_York
      - UMASK_SET=022
    volumes:
      - /opt/radarr/config:/config
      - /mnt/media/movies:/movies
      - /mnt/media/downloads:/downloads
    ports:
      - "7878:7878"
    networks: [appnet]

  sonarr:
    image: lscr.io/linuxserver/sonarr:latest
    container_name: sonarr
    restart: unless-stopped
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=America/New_York
      - UMASK_SET=022
    volumes:
      - /opt/sonarr/config:/config
      - /mnt/media/tv:/tv
      - /mnt/media/downloads:/downloads
    ports:
      - "8989:8989"
    networks: [appnet]

  lidarr:
    image: lscr.io/linuxserver/lidarr:latest
    container_name: lidarr
    restart: unless-stopped
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=America/New_York
      - UMASK_SET=022
    volumes:
      - /opt/lidarr/config:/config
      - /mnt/media/music:/music
      - /mnt/media/downloads:/downloads
    ports:
      - "8686:8686"
    networks: [appnet]

  readarr:
    image: lscr.io/linuxserver/readarr:latest
    container_name: readarr
    restart: unless-stopped
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=America/New_York
      - UMASK_SET=022
    volumes:
      - /opt/readarr/config:/config
      - /mnt/media/books:/books
      - /mnt/media/downloads:/downloads
    ports:
      - "8787:8787"
    networks: [appnet]

  qbittorrent:
    image: lscr.io/linuxserver/qbittorrent:latest
    container_name: qbittorrent
    restart: unless-stopped
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=America/New_York
      - UMASK_SET=022
    volumes:
      - /opt/qbittorrent/config:/config
      - /mnt/media/downloads:/downloads
      - /mnt/media/downloads/incomplete:/downloads/incomplete
    ports:
      - "8080:8080"
    networks: [appnet]

  # Optional: Jackett for niche indexers
  jackett:
    image: lscr.io/linuxserver/jackett:latest
    container_name: jackett
    restart: unless-stopped
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=America/New_York
      - UMASK_SET=022
    volumes:
      - /opt/jackett/config:/config
      - /opt/jackett/torrences:/torrences
    ports:
      - "9117:9117"
    networks: [appnet]

  # Optional: Whisparr for adult content
  whisparr:
    image: lscr.io/linuxserver/whisparr:latest
    container_name: whisparr
    restart: unless-stopped
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=America/New_York
      - UMASK_SET=022
    volumes:
      - /opt/whisparr/config:/config
      - /mnt/media/whisparr-movies:/whisparr-movies
      - /mnt/media/downloads:/downloads
    ports:
      - "6969:6969"
    networks: [appnet]

Caddy Configuration

radarr.dankserver.local {
    reverse_proxy localhost:7878
}

sonarr.dankserver.local {
    reverse_proxy localhost:8989
}

lidarr.dankserver.local {
    reverse_proxy localhost:8686
}

readarr.dankserver.local {
    reverse_proxy localhost:8787
}

prowlarr.dankserver.local {
    reverse_proxy localhost:9696
}

qbittorrent.dankserver.local {
    reverse_proxy localhost:8080
}

# Optional: Jackett
jackett.dankserver.local {
    reverse_proxy localhost:9117
}

# Optional: Whisparr
whisparr.dankserver.local {
    reverse_proxy localhost:6969
}

Configuration Steps

Phase 1: Download Client

  1. Deploy qBittorrent first (or Transmission).
  2. In the qBittorrent Web UI, set No auth mode for LAN (Settings → Web UI).
  3. Create download categories: movies, tv, music, books.
  4. Change the default Web UI password.

Phase 2: Indexer Management

  1. Deploy Prowlarr.
  2. Add indexers (3–5 recommended for testing). Use the Test button on each.
  3. Add qBittorrent as a download client in Prowlarr.
  4. Verify search from the Prowlarr web UI.

Phase 3: Arr Apps (one at a time)

  1. Deploy Sonarr first (TV shows are the most common use case).
  2. Add Prowlarr as the indexer source (Settings → Indexers → Add Prowlarr).
  3. Add qBittorrent as the download client with categories.
  4. Add a test series. Wait for the episode to download. Verify in /tv/.
  5. Repeat for Radarr, Lidarr, Readarr.

Phase 4: Media Server Integration

  1. Configure Jellyfin libraries pointing to /movies, /tv, /music, /books.
  2. Set On Download notifications in each arr app → Jellyfin webhook URL.
  3. Test end-to-end: Add a movie in Radarr → download → verify in Jellyfin.

Quality Profiles

Each arr app uses a hierarchical quality system:

  1. Quality Profile — Defines tiers (e.g., 2160p → 1080p BluRay → 720p).
  2. Cutoff — The quality target. Downloads at or above cutoff are accepted.
  3. Custom Formats — Additional filters (e.g., "Has HDR", "Is Director's Cut").
  4. Search on Grab — When content becomes available, all indexers are queried.

Radarr (Movies)

Profile: Movies 4K
  Tiers:
    1. 2160p BluRay REMUX
    2. 2160p BluRay
    3. 2160p WEB-DL
    4. 1080p BluRay
    5. 1080p WEB-DL
    6. 720p
  Cutoff: 1080p BluRay

Sonarr (TV)

Profile: TV - Standard
  Tiers: 2160p → 1080p → 720p
  Min Size: 500 MB
  Max Size: 50 GB
  Cutoff: 1080p
  Language Profile: English audio preferred

Lidarr (Music)

Profile: Music - Standard
  Tiers: Lossless (FLAC) → 320 kbps → 192 kbps
  Cutoff: 320 kbps (or Lossless)

Metadata Sources

App Primary Source Secondary
Radarr TMDB TheMovieDB API
Sonarr TMDB TVDB
Lidarr MusicBrainz —
Readarr Goodreads, StoryGraph —
Whisparr XH TMDB

*arr Stack vs Copyparty

Feature Copyparty *arr Stack
Auto-download from torrents Basic (RSS + scripts) Native, integrated
Quality profiles No Multi-tier, custom formats
Series/movie tracking No Watch lists, air dates
Manual library management Yes Yes, metadata-driven
Multi-user watchlists No Yes
Complexity Low Medium
Resource usage Minimal Moderate

Use Copyparty for curated file collections. Use *arr for automatic downloads. Use both together for maximum functionality — point *arr download directories at Copyparty's watched folders.

Disk Layout

/mnt/media/
├── movies/         → Radarr root
├── tv/             → Sonarr root
├── music/          → Lidarr root
├── books/          → Readarr root
├── whisparr-movies/ → Whisparr root
├── downloads/      → qBittorrent download dir
│   ├── movies/
│   ├── tv/
│   ├── music/
│   └── books/
└── incomplete/     → qBittorrent incomplete downloads

Gotchas

  • Timezone mismatch: All containers should use the same TZ. Sonarr's scheduler is timezone-sensitive.
  • File permissions: Set umask=022 in qBittorrent. Ensure arr apps can read/move downloaded files.
  • Network conflicts: *arr apps use many ports. Check for conflicts with existing Dankserver services.
  • Prowlarr API key rotation: If rotated, update it in every arr app.
  • qBittorrent Web UI password: Change default on first run.
  • Readarr stability: Readarr is still in development. Do not rely on it for mission-critical collections.
  • Whisparr separate Jellyfin library: Keep adult content separate from regular media.
  • RSS feed in qBittorrent: Can auto-add torrents matching a pattern. Useful for podcast-like series.

Best Practices

  1. Use tags to route content to specific download clients or categories.
  2. Enable the Blocklist in arr apps to prevent re-downloading failed torrents.
  3. Set download limits in qBittorrent to avoid bandwidth saturation.
  4. Back up arr configs regularly (they are small SQLite DBs + JSON).
  5. Monitor Prowlarr indexer health — broken indexers hide new content.
  6. Start with default quality profiles. Add custom formats gradually.
  7. Back up arr configs: ./radarr/config, ./sonarr/config, etc.

See Also