The ARR Stack
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
- Media Management
- Indexing & Downloading
- Optional Components
| Component | Purpose | Port | Web Interface |
|---|---|---|---|
| Sonarr | TV Show Management | 8989 | https://son.billpantzartzis.info |
| Radarr | Movie Management | 7878 | https://rad.billpantzartzis.info |
| Lidarr | Music Management | 8686 | https://lid.billpantzartzis.info |
| Readarr | Book/Audiobook Management | 8787 | https://rea.billpantzartzis.info |
| Component | Purpose | Port | Web Interface |
|---|---|---|---|
| Prowlarr | Indexer Manager | 9696 | https://prow.billpantzartzis.info |
| qBittorrent | Download Client | 8080 | https://bit.billpantzartzis.info |
| Gluetun | VPN Container | - | No UI (VPN tunnel) |
| Component | Purpose | Port | Status |
|---|---|---|---|
| Homarr | Dashboard | 7575 | 🟡 Optional |
| Jellyfin | Media Server | 8096 | 🟡 Optional |
| Bazarr | Subtitle Management | 6767 | 🔴 Disabled |
🚀 Deployment
Prerequisites
- 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
- Complete Stack
- Environment Variables
- Minimal Setup
# 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
# Main path for all ARR apps
ARRPATH=/volume2/docker/arr/
# For Windows: ARRPATH=C:/Docker/arr/
# User/Group IDs
PUID=1026
PGID=100
# Timezone
TZ=Europe/Amsterdam
# Optional: Umask for file permissions
UMASK=002
# VPN Credentials (keep this file secure!)
VPN_USER=your_vpn_username
VPN_PASSWORD=your_vpn_password
# Optional: VPN Server
VPN_SERVER_HOSTNAME=nl123.nordvpn.com
# Minimal ARR Stack without VPN
version: '3.8'
services:
prowlarr:
image: linuxserver/prowlarr:latest
container_name: prowlarr
ports:
- 9696:9696
volumes:
- ./prowlarr:/config
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Amsterdam
sonarr:
image: linuxserver/sonarr:latest
container_name: sonarr
ports:
- 8989:8989
volumes:
- ./sonarr:/config
- ./media/tv:/tv
- ./downloads:/downloads
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Amsterdam
qbittorrent:
image: linuxserver/qbittorrent:latest
container_name: qbittorrent
ports:
- 8080:8080
- 6881:6881
- 6881:6881/udp
volumes:
- ./qbittorrent:/config
- ./downloads:/downloads
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Amsterdam
⚙️ Configuration
Initial Setup Workflow
Follow this sequence for smooth configuration:
- Start Gluetun and verify VPN connection
- Configure Prowlarr with indexers
- Set up download client (qBittorrent)
- Configure each ARR app
- Test with a manual search
Service Configuration
📡 Prowlarr Configuration
- Access Prowlarr at
http://localhost:9696 - Add Indexers:
- Click "Indexers" → "Add Indexer"
- Search for your preferred trackers
- Configure with API keys/credentials
- Add Applications:
- Go to "Settings" → "Apps"
- Add Sonarr, Radarr, Lidarr, Readarr
- Use
http://localhost:PORTfor each
- Configure Download Client:
- Settings → Download Clients
- Add qBittorrent
- Host:
localhost, Port:8080
📺 Sonarr Configuration
- Access Sonarr at
http://localhost:8989 - Media Management:
- Settings → Media Management
- Enable "Rename Episodes"
- Set naming format:
{Series Title} - S{season:00}E{episode:00} - {Episode Title}
- Quality Profiles:
- Settings → Profiles
- Create profiles (e.g., "HD-1080p", "Any")
- Root Folders:
- Settings → Media Management
- Add root folder:
/tv
- Download Client:
- Should be auto-configured by Prowlarr
🎬 Radarr Configuration
- Access Radarr at
http://localhost:7878 - Media Management:
- Settings → Media Management
- Enable "Rename Movies"
- Format:
{Movie Title} ({Release Year})
- Quality Profiles:
- Settings → Profiles
- Set preferred quality
- Root Folders:
- Add root folder:
/movies
- Add root folder:
⬇️ qBittorrent Configuration
- Access qBittorrent at
http://localhost:8080- Default login:
admin/adminadmin
- Default login:
- Change Password:
- Tools → Options → Web UI
- Download Settings:
- Default Save Path:
/downloads/complete - Temp Path:
/downloads/incomplete
- Default Save Path:
- Connection Settings:
- Disable UPnP/NAT-PMP (using VPN)
- BitTorrent Settings:
- Enable DHT, PeX, LPD
- Encryption: Prefer encryption
VPN Configuration
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
- Manual Add
- Import Lists
- Automation
-
Search for Media:
- Open respective ARR app
- Click "Add [Media Type]"
- Search by name
- Select correct match
-
Configure Download:
- Choose quality profile
- Select root folder
- Set monitoring options
-
Initiate Download:
- Click "Add + Search"
- Monitor progress in Activity tab
Configure automatic imports from:
- IMDb lists
- Trakt lists
- TMDb collections
- Spotify playlists (Lidarr)
- Goodreads shelves (Readarr)
Setup:
- Settings → Import Lists
- Add list with URL/credentials
- Set quality profile
- Enable automatic add
RSS Feeds:
- Automatic downloading of new releases
- Configure in Settings → Indexers → RSS
Custom Filters:
- Release profiles for preferred keywords
- Restrictions for unwanted terms
- Quality preferences
Notifications:
- Discord/Slack webhooks
- Email notifications
- Plex/Jellyfin library updates
Folder 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:
- Check VPN credentials in
.secrets_gluetun.env - Verify VPN subscription is active
- Try different VPN server:
SERVER_COUNTRIES=Germany
# or specific server
VPN_SERVER_HOSTNAME=de123.nordvpn.com - Check Gluetun logs:
docker logs gluetun --tail 50
🔍 Prowlarr Can't Find Releases
Symptoms: No search results in ARR apps
Solutions:
- Verify indexers are configured correctly
- Check indexer health in Prowlarr
- Test indexer manually in Prowlarr
- Ensure VPN is connected (check IP)
- Verify API limits not exceeded
📁 Permission Issues
Symptoms: Downloads complete but can't import
Solutions:
- Check PUID/PGID match system user:
id username - Fix permissions:
sudo chown -R 1026:100 /volume2/docker/arr/
sudo chmod -R 755 /volume2/docker/arr/ - Set correct umask in environment
🌐 Cannot Access Web UI
Symptoms: Connection refused on web interfaces
Solutions:
- Verify containers are running:
docker ps - Check port mappings:
docker port gluetun - Ensure firewall allows connections
- 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
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
- 💬 r/sonarr
- 💬 r/radarr
- 🎥 TRaSH Guides
- 🎥 Setup Tutorial
Related Services
Last Updated: December 2024
Stack Version: Latest (auto-updating)
Host: SYNLORTINAS (192.168.1.81)
Support: Infrastructure Team