Complete Media Automation Stack: Radarr, Sonarr, and Prowlarr for Home Server Bliss

Automate your media library with Radarr, Sonarr, Prowlarr, and Overseerr. Set up intelligent downloading, quality management, and request handling in this comprehensive guide.

• 11 min read
self-hostedmedia-automationdockerhomelabradarrsonarr
Complete Media Automation Stack: Radarr, Sonarr, and Prowlarr for Home Server Bliss

The Automation Layer Your Media Server Deserves

You’ve got Jellyfin running. Your movies are organized. Your TV shows are neatly labeled. But every time you want to add something new, you’re hunting down releases, checking quality, manually renaming files, and hoping the subtitles sync.

There’s a better way.

The *arr stack—a family of applications with intentionally obvious naming—automates the entire process. Want a new movie? Click a button. The system finds the best release, downloads it, renames it, organizes it, and notifies you when it’s ready. New episode of your favorite show? It’ll be waiting for you the morning after it airs.

This isn’t piracy software. It’s a media management layer that works with any content source. Whether you’re managing personal rips, public domain films, or legal downloads, these tools turn hours of manual work into minutes of configuration.

Let’s build your autonomous media pipeline.


What Each Tool Does (And Why You Need Them All)

Media automation stack architecture diagram The flow: requests → managers → downloaders → organized media

The *arr ecosystem can feel overwhelming at first. Each app has a specific job, and they work together like a well-oiled machine. Here’s the breakdown:

ApplicationRolePortWhat It Automates
RadarrMovie Manager7878Finds movies, manages quality, renames files
SonarrTV Show Manager8989Tracks episodes, season packs, upgrades
ProwlarrIndexer Hub9696Aggregates torrent/usenet indexers, syncs to apps
OverseerrRequest Portal5055Web UI for family/friends to request content
RecyclarrQuality Sync-Keeps TRaSH Guide settings updated automatically
LidarrMusic Manager8686Album tracking, artist monitoring (optional)
BazarrSubtitle Manager6767Auto-downloads subtitles for all media (optional)

The Workflow in Practice

  1. You want a movie → Add it to Radarr or request via Overseerr
  2. Radarr checks → Monitors indexer feeds for your quality criteria
  3. Release found → Sends to your download client (qBittorrent, NZBGet, etc.)
  4. Download completes → Radarr imports, renames, and moves to your media folder
  5. Jellyfin scans → Picks up the new file automatically
  6. You watch → No manual intervention required

For TV shows, Sonarr handles this automatically. New episodes? Downloaded the morning after broadcast. Better quality release appears? Automatically upgraded.


The Docker Advantage: One Volume to Rule Them All

Before we install anything, let’s address the #1 mistake that causes headaches: volume mounting.

The most common pitfall in *arr setups is splitting your downloads and media into separate mounts. This breaks hardlinks (instant file moves) and forces full copies, wasting time and disk I/O.

The Wrong Way

# Don't do this!
volumes:
  - /path/to/movies:/movies
  - /path/to/downloads:/downloads  # Different filesystem = broken hardlinks

The Right Way

# Do this instead
volumes:
  - /path/to/data:/data  # Single mount for everything

With a single mount point:

  • Hardlinks work → Instant moves, no copying
  • Atomic moves → No re-downloading if interrupted
  • Permissions are simple → One directory to manage
/data/
├── media/
   ├── movies/        # Radarr library
   ├── tv/            # Sonarr library
   ├── music/         # Lidarr library
   └── books/         # Readarr library
├── downloads/
   ├── torrents/
   ├── movies/    # Active movie downloads
   ├── tv/        # Active TV downloads
   └── music/     # Active music downloads
   └── usenet/        # Usenet downloads
└── incomplete/        # Optional: staging area

Create this structure:

mkdir -p /data/{media/{movies,tv,music,books},downloads/{torrents/{movies,tv,music},usenet}}

Full Docker Compose Setup

Here’s a production-ready docker-compose.yml with all the essential components:

version: "3.8"

x-environment: &default-environment
  PUID: 1000
  PGID: 1000
  TZ: America/New_York
  UMASK: 002

x-volumes: &default-volumes
  - ./data:/data

services:
  # ===== INDEXER MANAGEMENT =====
  prowlarr:
    image: lscr.io/linuxserver/prowlarr:latest
    container_name: prowlarr
    environment:
      <<: *default-environment
    volumes:
      - ./config/prowlarr:/config
    ports:
      - 9696:9696
    restart: unless-stopped
    networks:
      - media_network
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9696/ping"]
      interval: 30s
      timeout: 10s
      retries: 3

  # ===== MOVIE MANAGEMENT =====
  radarr:
    image: lscr.io/linuxserver/radarr:latest
    container_name: radarr
    environment:
      <<: *default-environment
    volumes:
      - ./config/radarr:/config
      <<: *default-volumes
    ports:
      - 7878:7878
    restart: unless-stopped
    networks:
      - media_network
    depends_on:
      - prowlarr
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:7878/ping"]
      interval: 30s
      timeout: 10s
      retries: 3

  # ===== TV SHOW MANAGEMENT =====
  sonarr:
    image: lscr.io/linuxserver/sonarr:latest
    container_name: sonarr
    environment:
      <<: *default-environment
    volumes:
      - ./config/sonarr:/config
      <<: *default-volumes
    ports:
      - 8989:8989
    restart: unless-stopped
    networks:
      - media_network
    depends_on:
      - prowlarr
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8989/ping"]
      interval: 30s
      timeout: 10s
      retries: 3

  # ===== REQUEST MANAGEMENT =====
  overseerr:
    image: lscr.io/linuxserver/overseerr:latest
    container_name: overseerr
    environment:
      <<: *default-environment
    volumes:
      - ./config/overseerr:/config
    ports:
      - 5055:5055
    restart: unless-stopped
    networks:
      - media_network
    depends_on:
      - radarr
      - sonarr

  # ===== TRASH GUIDE SYNC =====
  recyclarr:
    image: ghcr.io/recyclarr/recyclarr:latest
    container_name: recyclarr
    volumes:
      - ./config/recyclarr:/config
    restart: unless-stopped
    networks:
      - media_network

  # ===== DOWNLOAD CLIENT =====
  qbittorrent:
    image: lscr.io/linuxserver/qbittorrent:latest
    container_name: qbittorrent
    environment:
      <<: *default-environment
      WEBUI_PORT: 8090
    volumes:
      - ./config/qbittorrent:/config
      <<: *default-volumes
    ports:
      - 8090:8090
      - 6881:6881
      - 6881:6881/udp
    restart: unless-stopped
    networks:
      - media_network

  # ===== OPTIONAL: VPN CONTAINER =====
  # Uncomment if you need VPN routing
  # gluetun:
  #   image: qmcgaw/gluetun
  #   container_name: gluetun
  #   cap_add:
  #     - NET_ADMIN
  #   environment:
  #     - VPN_SERVICE_PROVIDER=your_provider
  #     - OPENVPN_USER=your_username
  #     - OPENVPN_PASSWORD=your_password
  #   volumes:
  #     - ./config/gluetun:/gluetun
  #   ports:
  #     - 8090:8090  # qBittorrent through VPN
  #   restart: unless-stopped
  #   networks:
  #     - media_network

networks:
  media_network:
    driver: bridge
    ipam:
      config:
        - subnet: 172.28.0.0/16

Launch the Stack

# Create directory structure
mkdir -p config data

# Start everything
docker compose up -d

# Check status
docker compose ps

All services should show healthy or running within 30 seconds.


Prowlarr: Your Indexer Hub

Prowlarr indexer configuration screen Prowlarr’s indexer dashboard showing connected indexers

Prowlarr eliminates the tedium of configuring indexers in each app individually. Add an indexer once, sync it everywhere.

Initial Setup

  1. Navigate to http://your-server:9696
  2. Complete the setup wizard
  3. Go to Settings → Apps
  4. Add Radarr and Sonarr:
    • Radarr: Prowlarr Server = http://radarr:7878
    • Sonarr: Prowlarr Server = http://sonarr:8989

Adding Indexers

  1. Go to Indexers → Add Indexer
  2. Select your indexer type (public or private)
  3. Enter credentials if required
  4. Test and save
  5. Prowlarr automatically syncs to Radarr and Sonarr

Private Tracker Tips

If you use private trackers:

  • Enable Flaresolverr for Cloudflare-protected sites
  • Use Prowlarr’s Cardigann support for custom indexers
  • Monitor your ratio within Prowlarr’s dashboard

Radarr: Movie Management Done Right

Radarr movie library with quality profiles Radarr’s movie library with automatic quality tracking

Radarr is your personal movie librarian. Tell it what you want, and it handles the rest.

Connecting the Pieces

  1. Navigate to http://your-server:7878
  2. Settings → Media Management
    • Root Folder: /data/media/movies
    • Enable “Rename Movies”
    • Standard movie format: {Movie Title} ({Release Year}) {Quality Title}
  3. Settings → Download Clients → Add
    • Host: qbittorrent
    • Port: 8090
    • Category: movies
  4. Settings → Indexers
    • Should auto-populate from Prowlarr

Quality Profiles

Radarr uses quality profiles to determine which releases to grab:

ProfileUse Case
AnyGrab first available release
HD-720pBudget setups, small storage
HD-1080pStandard recommendation
Ultra-HD4K collectors with bandwidth
RemuxBit-perfect Blu-ray rips

Pro tip: Use Recyclarr to import TRaSH Guide’s optimized quality profiles instead of manually configuring custom formats.


Sonarr: TV Show Automation

Sonarr series calendar showing upcoming episodes Sonarr’s calendar view showing upcoming episodes and downloads

Sonarr does for TV what Radarr does for movies—with a crucial difference: it tracks individual episodes, season packs, and ongoing series.

Initial Configuration

  1. Navigate to http://your-server:8989
  2. Settings → Media Management
    • Root Folder: /data/media/tv
    • Enable “Rename Episodes”
    • Standard episode format: {Series Title} - S{season:00}E{episode:00} - {Episode Title}
  3. Settings → Download Clients → Add
    • Same as Radarr, but category: tv

Series Types

Sonarr categorizes shows differently for good reason:

TypeBehavior
StandardNormal episode-based shows (most content)
DailyTalk shows, news programs (aired by date)
AnimeAnime series with special numbering

Monitoring Strategies

  • All Episodes: Download everything (good for completed series)
  • Future Episodes: Only grab new releases
  • Pilot Episode: Test the waters before committing
  • Recent Episodes: Last 90 days + future

Recyclarr: TRaSH Guide Automation

Manually configuring quality profiles and custom formats is tedious—and easy to mess up. TRaSH Guides maintain optimal settings for popular release groups. Recyclarr keeps your Radarr and Sonarr synchronized with those guides automatically.

Configuration

Create config/recyclarr/recyclarr.yml:

# Recyclarr configuration
sonarr:
  - instance: sonarr
    base_url: http://sonarr:8989
    api_key: !env_var SONARR_API_KEY

    # Quality definitions
    delete_old_custom_formats: true
    replace_existing_custom_formats: true

    # Import TRaSH Guide profiles
    include:
      - template: sonarr-quality-definition-series
      - template: sonarr-v4-quality-profile-web-1080p
      - template: sonarr-v4-custom-formats-web-1080p

radarr:
  - instance: radarr
    base_url: http://radarr:7878
    api_key: !env_var RADARR_API_KEY

    delete_old_custom_formats: true
    replace_existing_custom_formats: true

    include:
      - template: radarr-quality-definition-movie
      - template: radarr-quality-profile-web-1080p
      - template: radarr-custom-formats-web-1080p

Get Your API Keys

# Radarr API key
curl -s http://localhost:7878/api/v3/system/status | jq -r '.apiKey'

# Sonarr API key
curl -s http://localhost:8989/api/v3/system/status | jq -r '.apiKey'

Set them in your environment or .env file:

export SONARR_API_KEY=your_sonarr_key
export RADARR_API_KEY=your_radarr_key

Run the Sync

docker compose exec recyclarr recyclarr sync

Add a cron job to keep settings updated:

# Sync TRaSH Guide settings daily
0 3 * * * docker compose exec -T recyclarr recyclarr sync >> /var/log/recyclarr.log 2>&1

Overseerr: Request Management for Everyone

Overseerr web interface for media requests Overseerr’s clean interface for browsing and requesting media

Your family doesn’t need to learn Radarr’s interface. Overseerr gives them a Netflix-like experience for requesting content.

Setup Overview

  1. Navigate to http://your-server:5055
  2. Sign in with your Jellyfin/Plex account
  3. Connect to Radarr and Sonarr:
    • Settings → Services → Add Radarr
    • Settings → Services → Add Sonarr
  4. Configure permissions for different user types

User Experience

When someone requests a movie:

  1. Search in Overseerr’s clean interface
  2. Click “Request”
  3. Notification goes to approvers (if enabled)
  4. Once approved, Radarr/Sonarr handles everything
  5. User gets notified when it’s ready

Notification Setup

Overseerr supports multiple notification channels:

  • Email: SMTP configuration
  • Discord: Webhook for server announcements
  • Telegram: Bot for instant notifications
  • Pushbullet/Pushover: Mobile push notifications

Jellyfin Integration: The Final Piece

Your media automation stack and Jellyfin are natural partners. Jellyfin handles playback; the *arr stack handles acquisition.

Library Setup

In Jellyfin:

  1. Dashboard → Libraries → Add Media Library
  2. Movies Library:
    • Folder: /data/media/movies
    • Enable “Save artwork into media folders”
  3. TV Library:
    • Folder: /data/media/tv
    • Enable “Save artwork into media folders”

Automatic Scanning

Configure Jellyfin to scan for new content:

# Real-time monitoring (recommended)
# Jellyfin monitors directories automatically

# Scheduled scan (backup)
# Dashboard → Libraries → Advanced → Scan media library automatically
# Set to "Daily" or "Every 6 hours"

Webhook Notifications (Optional)

Install the Jellyfin Webhook plugin to notify the *arr stack when playback starts/stops:

  1. Install from Jellyfin plugin catalog
  2. Configure webhook endpoint for Radarr/Sonarr
  3. Use for automatic library updates

For a complete Jellyfin setup guide, see our Jellyfin Media Server Guide.


Security: Locking Down Your Stack

Network security diagram for media stack Isolated network topology with VPN and reverse proxy

Internal Network Isolation

Your Docker Compose already creates an isolated network (media_network). Only expose what’s necessary:

ServiceExpose Externally?Reason
Overseerr✅ YesUser requests
Jellyfin✅ YesStreaming
Radarr/Sonarr⚠️ OptionalAdmin access only
Prowlarr❌ NoInternal only
qBittorrent❌ NoVia VPN only

VPN Configuration

If you’re using torrents, always use a VPN. The Gluetun container in the compose file routes traffic through your VPN provider:

# Route qBittorrent through VPN
qbittorrent:
  network_mode: "service:gluetun"
  # Remove port mappings - use Gluetun's instead

Reverse Proxy Setup

Use Caddy or Nginx Proxy Manager to expose services securely:

# Caddyfile
media.example.com {
    reverse_proxy overseerr:5055
}

radarr.example.com {
    basicauth {
        admin $2a$14$hashed_password
    }
    reverse_proxy radarr:7878
}

API Key Security

Never commit API keys to git. Use environment variables:

# .env file (add to .gitignore)
RADARR_API_KEY=abc123...
SONARR_API_KEY=def456...
PROWLARR_API_KEY=ghi789...

Troubleshooting Common Issues

Downloads Not Importing

Symptom: Downloads complete but Radarr/Sonarr shows “Warning: No files found”

Causes:

  1. Path mapping mismatch
  2. Permission issues

Fix:

# Check permissions
ls -la /data/downloads/torrents/movies/

# Should show same UID:GID across all files
chown -R 1000:1000 /data/

# Verify Docker PUID/PGID matches
docker compose exec radarr id

Also check Settings → Media Management → Remote Path Mappings in Radarr/Sonarr.

Slow Imports / Full Disk Copies

Symptom: Imports take forever instead of being instant

Cause: Hardlinks broken due to different mount points

Fix: Use a single /data volume as shown in the compose file.

Indexer Connection Failed

Symptom: Prowlarr shows “Unable to connect to indexer”

Fix:

  1. Check indexer credentials
  2. Enable “Test All” indexers in Prowlarr
  3. Check Flaresolverr for Cloudflare issues
  4. Verify network connectivity

Quality Not Upgrading

Symptom: Better releases available but not automatically grabbed

Fix:

  1. Enable “Upgrade Until” in quality profile
  2. Configure “Delay Profile” to wait for better releases
  3. Run Recyclarr sync to update custom formats

Hardware Recommendations for 2026

The *arr stack is surprisingly lightweight. Here’s what you actually need:

ComponentMinimumRecommendedNotes
CPU2 cores4 coresMore for concurrent downloads
RAM2 GB4 GBEach app uses ~100-200 MB
Storage50 GB500+ GBDepends on library size
Network10 Mbps100+ MbpsDownload speeds

Ideal Platforms

PlatformCostReasons
Intel N100 Mini-PC$150-250Low power, QuickSync for transcoding
Raspberry Pi 5$80-120ARM support, very low power
Used OptiPlex$100-200Budget x86, easy upgrades
Synology/QNAP NAS$300+Built-in Docker, storage included

The Automation Payoff

After initial setup, here’s what your media workflow looks like:

Before:

  1. Hunt for releases manually
  2. Download files
  3. Rename and organize
  4. Move to correct folder
  5. Scan library
  6. Fix metadata issues
  7. Find subtitles
  8. Total: 30-60 minutes per item

After:

  1. Click “Request” in Overseerr
  2. Total: 5 seconds

Everything else happens automatically. New episodes appear within hours of airing. Better quality releases replace old ones. Subtitles sync automatically. Your library maintains itself.

You’ve built the infrastructure. Now let it work for you.


Next Steps

  • Set up notifications in Overseerr so you know when content is ready
  • Configure Recyclarr for automated quality profile management
  • Add more managers: Lidarr for music, Readarr for books
  • Explore Bazarr for automatic subtitle management
  • Set up monitoring with Uptime Kuma or Grafana

Your automated media library awaits. Happy streaming!


Have questions or run into issues? The Servarr Wiki and TRaSH Guides are excellent resources for detailed configuration help.

Anthony Lattanzio

Anthony Lattanzio

Tech Enthusiast & Builder

I'm a tech enthusiast who loves building things with hardware and software. By night, I run a homelab that's grown way beyond what any reasonable person needs. Check out about me for more.

Comments

Powered by GitHub Discussions