Skip to main content

The ARR Stack

Quick Overview

Purpose: Automated media management and downloading system
Components: Sonarr, Radarr, Lidarr, Readarr, Prowlarr, qBittorrent, Gluetun
Host: SYNLORTINAS
Status: 🟢 Active

📋 Description

The "ARR" stack is a collection of open-source software for managing and downloading media content from Usenet and BitTorrent. The name comes from the fact that most of the applications in the stack end with "arr". These applications provide a web-based user interface to automate the process of finding, downloading, and organizing movies, TV shows, music, and books.

Why Use the ARR Stack?

  • Automated Downloads: Set up once, enjoy forever
  • Quality Control: Define preferred quality profiles
  • Organization: Automatic file naming and organization
  • Integration: Works with Plex, Jellyfin, Emby
  • Privacy: VPN protection via Gluetun
  • Unified Interface: Manage all media from one place

🏗️ Architecture Overview

📦 Core Components

ComponentPurposePortWeb Interface
SonarrTV Show Management8989https://son.billpantzartzis.info
RadarrMovie Management7878https://rad.billpantzartzis.info
LidarrMusic Management8686https://lid.billpantzartzis.info
ReadarrBook/Audiobook Management8787https://rea.billpantzartzis.info

🚀 Deployment

Prerequisites

Requirements
  • Docker and Docker Compose installed
  • VPN subscription (NordVPN, ExpressVPN, etc.)
  • Sufficient storage space (minimum 1TB recommended)
  • Static IP or DDNS for remote access

Docker Compose Configuration

/volume2/docker/arr/docker-compose.yaml
# ARR Stack with Gluetun VPN Protection
# Source: https://github.com/automation-avenue/youtube-39-arr-apps-1-click

version: '3.8'

services:
# ==================== VPN CONTAINER ====================
gluetun:
image: qmcgaw/gluetun:latest
container_name: gluetun
restart: unless-stopped
cap_add:
- NET_ADMIN
devices:
- /dev/net/tun:/dev/net/tun
volumes:
- ${ARRPATH}Gluetun:/gluetun
ports:
# ARR Stack Ports
- 9696:9696 # Prowlarr
- 7878:7878 # Radarr
- 8989:8989 # Sonarr
- 8686:8686 # Lidarr
- 8787:8787 # Readarr
- 8080:8080 # qBittorrent WebUI
- 6881:6881 # qBittorrent
- 6881:6881/udp
environment:
# VPN Configuration (adjust for your provider)
- VPN_SERVICE_PROVIDER=nordvpn
- VPN_TYPE=openvpn
- OPENVPN_USER=${VPN_USER}
- OPENVPN_PASSWORD=${VPN_PASSWORD}
- SERVER_COUNTRIES=Netherlands
# Optional settings
- FIREWALL_OUTBOUND_SUBNETS=192.168.1.0/24
- FIREWALL_INPUT_PORTS=8080,9696,7878,8989,8686,8787
env_file:
- .env
- .secrets_gluetun.env
healthcheck:
test: ["CMD", "/gluetun-entrypoint", "healthcheck"]
interval: 30s
timeout: 10s
retries: 3

# ==================== INDEXER MANAGER ====================
prowlarr:
image: linuxserver/prowlarr:latest
container_name: prowlarr
network_mode: "service:gluetun"
depends_on:
gluetun:
condition: service_healthy
volumes:
- ${ARRPATH}Prowlarr/config:/config
- ${ARRPATH}Prowlarr/backup:/data/Backup
restart: unless-stopped
env_file:
- .env

# ==================== MEDIA MANAGERS ====================
sonarr:
image: linuxserver/sonarr:latest
container_name: sonarr
network_mode: "service:gluetun"
depends_on:
- prowlarr
volumes:
- ${ARRPATH}Sonarr/config:/config
- ${ARRPATH}Sonarr/backup:/data/Backup
- ${ARRPATH}Media/TV:/tv
- ${ARRPATH}Downloads:/downloads
restart: unless-stopped
env_file:
- .env

radarr:
image: linuxserver/radarr:latest
container_name: radarr
network_mode: "service:gluetun"
depends_on:
- prowlarr
volumes:
- ${ARRPATH}Radarr/config:/config
- ${ARRPATH}Radarr/backup:/data/Backup
- ${ARRPATH}Media/Movies:/movies
- ${ARRPATH}Downloads:/downloads
restart: unless-stopped
env_file:
- .env

lidarr:
image: linuxserver/lidarr:latest
container_name: lidarr
network_mode: "service:gluetun"
depends_on:
- prowlarr
volumes:
- ${ARRPATH}Lidarr/config:/config
- ${ARRPATH}Media/Music:/music
- ${ARRPATH}Downloads:/downloads
restart: unless-stopped
env_file:
- .env

readarr:
image: linuxserver/readarr:develop
container_name: readarr
network_mode: "service:gluetun"
depends_on:
- prowlarr
volumes:
- ${ARRPATH}Readarr/config:/config
- ${ARRPATH}Media/Books:/books
- ${ARRPATH}Downloads:/downloads
restart: unless-stopped
env_file:
- .env

# ==================== DOWNLOAD CLIENT ====================
qbittorrent:
image: linuxserver/qbittorrent:latest
container_name: qbittorrent
network_mode: "service:gluetun"
depends_on:
- gluetun
restart: unless-stopped
labels:
- "com.centurylinklabs.watchtower.enable=false"
volumes:
- ${ARRPATH}qBittorrent/config:/config
- ${ARRPATH}Downloads:/downloads
environment:
- WEBUI_PORT=8080
- TORRENTING_PORT=6881
env_file:
- .env
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s

# ==================== OPTIONAL SERVICES ====================
# Uncomment to enable

# homarr:
# container_name: homarr
# image: ghcr.io/ajnart/homarr:latest
# restart: unless-stopped
# volumes:
# - ${ARRPATH}Homarr/configs:/app/data/configs
# - ${ARRPATH}Homarr/icons:/app/public/icons
# - ${ARRPATH}Homarr/data:/data
# ports:
# - '7575:7575'
# env_file:
# - .env

# jellyfin:
# image: linuxserver/jellyfin:latest
# container_name: jellyfin
# ports:
# - '8096:8096'
# - '7359:7359/udp'
# - '1900:1900/udp'
# volumes:
# - ${ARRPATH}Jellyfin/config:/config
# - ${ARRPATH}Media/Movies:/data/movies:ro
# - ${ARRPATH}Media/TV:/data/tvshows:ro
# - ${ARRPATH}Media/Music:/data/music:ro
# - ${ARRPATH}Media/Books:/data/books:ro
# env_file:
# - .env
# restart: unless-stopped

⚙️ Configuration

Initial Setup Workflow

Setup Order

Follow this sequence for smooth configuration:

  1. Start Gluetun and verify VPN connection
  2. Configure Prowlarr with indexers
  3. Set up download client (qBittorrent)
  4. Configure each ARR app
  5. Test with a manual search

Service Configuration

📡 Prowlarr Configuration
  1. Access Prowlarr at http://localhost:9696
  2. Add Indexers:
    • Click "Indexers" → "Add Indexer"
    • Search for your preferred trackers
    • Configure with API keys/credentials
  3. Add Applications:
    • Go to "Settings" → "Apps"
    • Add Sonarr, Radarr, Lidarr, Readarr
    • Use http://localhost:PORT for each
  4. Configure Download Client:
    • Settings → Download Clients
    • Add qBittorrent
    • Host: localhost, Port: 8080
📺 Sonarr Configuration
  1. Access Sonarr at http://localhost:8989
  2. Media Management:
    • Settings → Media Management
    • Enable "Rename Episodes"
    • Set naming format: {Series Title} - S{season:00}E{episode:00} - {Episode Title}
  3. Quality Profiles:
    • Settings → Profiles
    • Create profiles (e.g., "HD-1080p", "Any")
  4. Root Folders:
    • Settings → Media Management
    • Add root folder: /tv
  5. Download Client:
    • Should be auto-configured by Prowlarr
🎬 Radarr Configuration
  1. Access Radarr at http://localhost:7878
  2. Media Management:
    • Settings → Media Management
    • Enable "Rename Movies"
    • Format: {Movie Title} ({Release Year})
  3. Quality Profiles:
    • Settings → Profiles
    • Set preferred quality
  4. Root Folders:
    • Add root folder: /movies
⬇️ qBittorrent Configuration
  1. Access qBittorrent at http://localhost:8080
    • Default login: admin / adminadmin
  2. Change Password:
    • Tools → Options → Web UI
  3. Download Settings:
    • Default Save Path: /downloads/complete
    • Temp Path: /downloads/incomplete
  4. Connection Settings:
    • Disable UPnP/NAT-PMP (using VPN)
  5. BitTorrent Settings:
    • Enable DHT, PeX, LPD
    • Encryption: Prefer encryption

VPN Configuration

Important Security Note

Never expose these services directly to the internet without VPN protection. The Gluetun container ensures all traffic is routed through the VPN.

🔐 Gluetun VPN Setup

Supported Providers:

  • NordVPN
  • ExpressVPN
  • Surfshark
  • ProtonVPN
  • Mullvad
  • Full list

Testing VPN Connection:

# Check VPN IP
docker exec gluetun curl -s ifconfig.me

# Check for DNS leaks
docker exec gluetun curl -s https://ipleak.net/json/

# View Gluetun logs
docker logs gluetun

Kill Switch: Gluetun includes an automatic kill switch. If VPN disconnects, all container traffic stops.

📖 Usage

Adding Media

  1. Search for Media:

    • Open respective ARR app
    • Click "Add [Media Type]"
    • Search by name
    • Select correct match
  2. Configure Download:

    • Choose quality profile
    • Select root folder
    • Set monitoring options
  3. Initiate Download:

    • Click "Add + Search"
    • Monitor progress in Activity tab

Folder Structure

Recommended Structure

Maintain consistent folder structure for all media types:

/volume2/docker/arr/
├── Downloads/
│ ├── complete/
│ └── incomplete/
├── Media/
│ ├── Movies/
│ │ └── Movie Name (Year)/
│ ├── TV/
│ │ └── Show Name/
│ │ └── Season 01/
│ ├── Music/
│ │ └── Artist/
│ │ └── Album/
│ └── Books/
│ └── Author/
└── [App]Config/
└── config files...

🔧 Troubleshooting

Common Issues

❌ VPN Connection Failed

Symptoms: Gluetun container keeps restarting

Solutions:

  1. Check VPN credentials in .secrets_gluetun.env
  2. Verify VPN subscription is active
  3. Try different VPN server:
    SERVER_COUNTRIES=Germany
    # or specific server
    VPN_SERVER_HOSTNAME=de123.nordvpn.com
  4. Check Gluetun logs:
    docker logs gluetun --tail 50
🔍 Prowlarr Can't Find Releases

Symptoms: No search results in ARR apps

Solutions:

  1. Verify indexers are configured correctly
  2. Check indexer health in Prowlarr
  3. Test indexer manually in Prowlarr
  4. Ensure VPN is connected (check IP)
  5. Verify API limits not exceeded
📁 Permission Issues

Symptoms: Downloads complete but can't import

Solutions:

  1. Check PUID/PGID match system user:
    id username
  2. Fix permissions:
    sudo chown -R 1026:100 /volume2/docker/arr/
    sudo chmod -R 755 /volume2/docker/arr/
  3. Set correct umask in environment
🌐 Cannot Access Web UI

Symptoms: Connection refused on web interfaces

Solutions:

  1. Verify containers are running:
    docker ps
  2. Check port mappings:
    docker port gluetun
  3. Ensure firewall allows connections
  4. Try accessing via container IP:
    docker inspect gluetun | grep IPAddress

📊 Monitoring

Health Checks

# Check all container status
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"

# Monitor resource usage
docker stats --no-stream

# View logs for all ARR containers
docker-compose logs -f --tail=50

# Check disk usage
df -h /volume2/docker/arr/

Backup Strategy

Regular Backups

Configuration databases contain all your settings and history. Back them up regularly!

#!/bin/bash
# Backup script for ARR stack

BACKUP_DIR="/volume2/backups/arr"
DATE=$(date +%Y%m%d)

# Stop containers
docker-compose stop

# Backup configs
for app in Prowlarr Sonarr Radarr Lidarr Readarr; do
tar -czf "$BACKUP_DIR/${app}_$DATE.tar.gz" \
"/volume2/docker/arr/${app}/config"
done

# Restart containers
docker-compose start

# Remove old backups (keep 30 days)
find "$BACKUP_DIR" -name "*.tar.gz" -mtime +30 -delete

🔗 Resources

Official Documentation

Community Resources


Maintenance Information

Last Updated: December 2024
Stack Version: Latest (auto-updating)
Host: SYNLORTINAS (192.168.1.81)
Support: Infrastructure Team