The Ultimate Guide to Jellyfin and *ARR Stack: Complete Media Server Setup
Published on May 21, 2026
This is the most comprehensive guide for setting up a complete home media server stack using Jellyfin and the *ARR suite of applications. We cover everything from basic concepts to advanced configurations, with step-by-step instructions for Linux/Unix, Windows, and macOS.
NOTE: This guide follows best practices from TRaSH-Guides, the official community resource developed in collaboration with Radarr and Sonarr development teams.
Table of Contents
- Understanding the Complete Stack
- Key Concepts Before Starting
- Prerequisites and System Preparation
- Folder Structure and Hardlinks
- Installing Docker
- Complete Docker Compose Configuration
- Download Client: qBittorrent with VPN
- Indexer Manager: Prowlarr
- Cloudflare Bypass: FlareSolverr
- Movie Manager: Radarr
- TV Show Manager: Sonarr
- Music Manager: Lidarr
- Book Manager: Readarr
- Comic Manager: Mylar3
- Subtitle Manager: Bazarr
- Media Server: Jellyfin
- Request Management: Jellyseerr
- Notifications: Notifiarr
- Reverse Proxy: Nginx Proxy Manager
- Remote Access: Tailscale VPN
- TRaSH-Guides Integration: Recyclarr
- Connecting Everything Together
- Maintenance, Backups, and Updates
- Troubleshooting Common Issues
1. Understanding the Complete Stack
All Applications Covered
| Application | Purpose | Default Port | Category |
|---|---|---|---|
| Jellyfin | Free, open-source media server | 8096 | Media Server |
| Radarr | Automated movie collection manager | 7878 | Media Manager |
| Sonarr | Automated TV show collection manager | 8989 | Media Manager |
| Lidarr | Automated music collection manager | 8686 | Media Manager |
| Readarr | Automated ebook/audiobook manager | 8787 | Media Manager |
| Mylar3 | Automated comic book manager | 8090 | Media Manager |
| Prowlarr | Indexer manager for all *arr apps | 9696 | Indexer |
| Bazarr | Automated subtitle downloader | 6767 | Subtitle |
| Jellyseerr | Media request management for Jellyfin | 5055 | Requests |
| qBittorrent | Torrent download client | 8080 | Downloader |
| Gluetun | VPN container for secure downloading | - | VPN |
| FlareSolverr | Cloudflare protection bypass | 8191 | Proxy |
| Notifiarr | Unified notifications (Discord/Telegram) | 5454 | Notifications |
| Nginx Proxy Manager | Reverse proxy with SSL | 81 | Networking |
| Tailscale | Secure remote access VPN | - | Networking |
| Recyclarr | TRaSH-Guides sync tool | - | Automation |
System Architecture Diagram
+-----------------------------------------------------------------------+
| USER ACCESS |
| +-----------+ +-----------+ +---------------------+ |
| | Tailscale | | NPM | | Jellyseerr | |
| | (Remote) | | (HTTPS) | | (Requests) | |
| +-----------+ +-----------+ +---------------------+ |
+-----------------------------------------------------------------------+
|
v
+-----------------------------------------------------------------------+
| MEDIA SERVER |
| +-------------+ |
| | Jellyfin | |
| +-------------+ |
| +-------------------+ |
| | Bazarr | |
| | (Subtitles) | |
| +-------------------+ |
+-----------------------------------------------------------------------+
^
| Hardlinks
+-----------------------------------------------------------------------+
| MEDIA MANAGERS (*ARR Apps) |
| +--------+ +--------+ +--------+ +--------+ +--------+ |
| | Radarr | | Sonarr | | Lidarr | |Readarr | | Mylar3 | |
| |(Movies)| | (TV) | |(Music) | |(Books) | |(Comics)| |
| +--------+ +--------+ +--------+ +--------+ +--------+ |
| +-------------+ |
| | Recyclarr | (TRaSH-Guides Sync) |
| +-------------+ |
+-----------------------------------------------------------------------+
|
v
+-----------------------------------------------------------------------+
| INDEXER LAYER |
| +-----------------------------+ |
| | Prowlarr | |
| | (Indexer Management) | |
| +-----------------------------+ |
| | |
| +-----------------------------+ |
| | FlareSolverr | |
| | (CF Bypass) | |
| +-----------------------------+ |
+-----------------------------------------------------------------------+
|
v
+-----------------------------------------------------------------------+
| DOWNLOAD LAYER |
| +-----------------------------+ |
| | Gluetun (VPN) | |
| +-----------------------------+ |
| | |
| +-----------------------------+ |
| | qBittorrent | |
| +-----------------------------+ |
+-----------------------------------------------------------------------+
|
v
+-----------------------------------------------------------------------+
| NOTIFICATIONS |
| (Notifiarr) |
| Discord / Telegram / Email |
+-----------------------------------------------------------------------+ 2. Key Concepts Before Starting
Hardlinks and Instant/Atomic Moves
What are Hardlinks? Hardlinks allow a single file to appear in multiple locations without duplicating storage space. They point to the same data blocks on the disk. This is crucial for *ARR apps to “import” files from your downloader to your media library without copying.
Benefits:
- No duplicate storage usage
- Instant “moves” regardless of file size
- Enables perma-seeding (torrents continue seeding while file is in library)
Requirements:
- All paths must be on the same filesystem/partition
- Supported filesystems: ext4, BTRFS (Linux), APFS (macOS), NTFS (Windows)
- Docker containers must have consistent path mappings
What are Atomic Moves? Atomic moves relocate files instantly within the same filesystem without copying and deleting. Files appear to move instantaneously regardless of size.
IMPORTANT: If downloads and media are on separate drives, hardlinks won’t work. Use tools like mergerfs (Linux) to combine multiple drives into a single filesystem.
Testing Hardlinks:
# Create a test file
touch /data/test.txt
# Create a hardlink
ln /data/test.txt /data/media/test.txt
# Verify - same inode number means hardlink works
ls -i /data/test.txt /data/media/test.txt
# Both should show the same inode number (first column)
# Clean up
rm /data/test.txt /data/media/test.txt Checking Filesystem:
# Linux/macOS - verify all paths are on same filesystem
df -h /data/torrents /data/media
# Both should show the same "Mounted on" location
# Windows - use Disk Management to verify same volume Docker vs Native Installation
| Aspect | Docker | Native |
|---|---|---|
| Consistency | Same across all OS | OS-specific tweaks needed |
| Isolation | Apps run in containers | Apps share system resources |
| Updates | Pull new image | Manual package updates |
| Complexity | Simple YAML config | Multiple config files |
| Resource Usage | Slightly higher | Lower |
| Recommended | Yes | Only if Docker unavailable |
Hardware Requirements
| Component | Minimum | Recommended | Optimal |
|---|---|---|---|
| CPU | 2-core 2GHz | 4-core 3GHz+ | 6+ cores for heavy transcoding |
| RAM | 4GB | 8GB | 16GB+ |
| OS Storage | 50GB SSD | 100GB SSD | 250GB NVMe |
| Media Storage | 1TB HDD | 4TB+ HDD array | RAID array |
| Network | 100 Mbps | Gigabit LAN | 2.5Gbps |
| GPU | None | Intel iGPU | Nvidia for NVENC |
Time Estimate
- Basic setup: 2-3 hours
- Full setup with all apps: 4-6 hours
- Full setup + optimization: 6-8 hours
3. Prerequisites and System Preparation
3.1: Update Your Operating System
Updating ensures security patches and compatibility with the latest software.
Linux/Unix (Ubuntu/Debian)
# Open terminal (Ctrl+Alt+T)
# Update package lists - fetches latest available versions from repositories
sudo apt update
# Upgrade all packages - installs available updates
# -y flag automatically answers "yes" to all prompts
sudo apt upgrade -y
# Reboot to apply kernel updates if prompted
sudo reboot Explanation:
sudo: Runs command with administrator privilegesapt: Advanced Package Tool - Debian/Ubuntu package managerupdate: Refreshes the package indexupgrade: Installs newer versions of packages
macOS
- Click Apple menu → System Settings → General → Software Update
- Click Update Now if updates are available
- Restart when prompted
Alternatively, via Terminal:
# Check for updates
softwareupdate -l
# Install all available updates
sudo softwareupdate -i -a
# Reboot
sudo shutdown -r now Windows
- Press Windows key + I to open Settings
- Navigate to Update & Security → Windows Update
- Click Check for updates
- Install all available updates
- Restart when prompted
Alternatively, via PowerShell (Admin):
# Install Windows Update module if needed
Install-Module PSWindowsUpdate -Force
# Check for updates
Get-WindowsUpdate
# Install all updates
Install-WindowsUpdate -AcceptAll -AutoReboot 3.2: Create Required Directories
A consistent folder structure is essential for hardlinks to work properly.
Linux/Unix
# Create base data directory with all required subdirectories
# mkdir: creates directories
# -p: creates parent directories if they don't exist, no error if existing
sudo mkdir -p /data/{torrents/{incomplete,complete/{movies,tv,music,books,comics}},usenet/{incomplete,complete/{movies,tv,music,books,comics}},media/{movies,tv,music,books,comics}}
# Create Docker config directories for each application
sudo mkdir -p /data/config/{jellyfin,radarr,sonarr,lidarr,readarr,mylar3,prowlarr,bazarr,jellyseerr,qbittorrent,gluetun,flaresolverr,notifiarr,npm}
# Set ownership to your user
# chown: changes file ownership
# -R: recursive (applies to all subdirectories)
# $USER:$USER: sets both user and group to current user
sudo chown -R $USER:$USER /data
# Verify your user ID and group ID (needed for Docker)
id -u # Returns PUID (e.g., 1000)
id -g # Returns PGID (e.g., 1000) macOS
# Create directories in home folder (no sudo needed)
mkdir -p ~/data/{torrents/{incomplete,complete/{movies,tv,music,books,comics}},usenet/{incomplete,complete/{movies,tv,music,books,comics}},media/{movies,tv,music,books,comics}}
mkdir -p ~/data/config/{jellyfin,radarr,sonarr,lidarr,readarr,mylar3,prowlarr,bazarr,jellyseerr,qbittorrent,gluetun,flaresolverr,notifiarr,npm}
# Permissions are automatically set to your user Windows (PowerShell as Administrator)
# Define base directory (use D: for secondary drive if preferred)
$base = "C:/data"
# Create all directories
$folders = @(
"torrents/incomplete",
"torrents/complete/movies",
"torrents/complete/tv",
"torrents/complete/music",
"torrents/complete/books",
"torrents/complete/comics",
"usenet/incomplete",
"usenet/complete/movies",
"usenet/complete/tv",
"usenet/complete/music",
"usenet/complete/books",
"usenet/complete/comics",
"media/movies",
"media/tv",
"media/music",
"media/books",
"media/comics",
"config/jellyfin",
"config/radarr",
"config/sonarr",
"config/lidarr",
"config/readarr",
"config/mylar3",
"config/prowlarr",
"config/bazarr",
"config/jellyseerr",
"config/qbittorrent",
"config/gluetun",
"config/flaresolverr",
"config/notifiarr",
"config/npm"
)
foreach ($folder in $folders) {
New-Item -ItemType Directory -Force -Path "$base/$folder"
}
# Set permissions - give your user full control
$acl = Get-Acl $base
$permission = $env:USERNAME, "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow"
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $permission
$acl.SetAccessRule($accessRule)
Set-Acl $base $acl WARNING: On Windows, hardlinks only work within the same NTFS volume. All data must be on the same drive letter.
3.3: Additional Prerequisites
Accounts Needed
- Torrent Indexers: Sign up for private trackers or use public indexers
- Usenet Provider: (Optional) NZBGet, SABnzbd compatible provider
- VPN Provider: NordVPN, Mullvad, ProtonVPN, PIA, etc.
- Domain Name: For HTTPS access via Nginx Proxy Manager
- Dynamic DNS: If your IP changes (DuckDNS, No-IP, etc.)
- Notifiarr Account: For notifications (free tier available)
Network Preparation
- Note your server’s local IP address
- Configure router to assign static IP (DHCP reservation)
- Prepare port forwarding if accessing remotely without VPN
4. Folder Structure and Hardlinks
The folder structure was created in section 3.2 above. This structure is based on TRaSH-Guides recommendations and enables hardlinks to work properly between your download client and *arr applications.
Folder Structure Overview:
/data/
├── torrents/
│ ├── incomplete/ # Downloads in progress
│ └── complete/
│ ├── movies/ # Completed movie torrents
│ ├── tv/ # Completed TV torrents
│ └── music/ # Completed music torrents
├── media/
│ ├── movies/ # Final movie library (hardlinked)
│ ├── tv/ # Final TV library (hardlinked)
│ └── music/ # Final music library (hardlinked)
└── config/ # Application configurations 5. Installing Docker
Docker is the recommended installation method for all applications.
Linux (Ubuntu/Debian)
# Remove old Docker versions if present
sudo apt remove docker docker-engine docker.io containerd runc 2>/dev/null
# Install prerequisites
sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release
# Add Docker's official GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# Add Docker repository
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Update package index and install Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Add your user to docker group (run Docker without sudo)
sudo usermod -aG docker $USER
# IMPORTANT: Log out and back in for group changes to take effect
# Or run: newgrp docker
# Start Docker and enable on boot
sudo systemctl start docker
sudo systemctl enable docker
# Verify installation
docker --version
docker compose version Windows
Enable WSL2 (Windows Subsystem for Linux):
- Open Settings → Apps → Optional features → More Windows features
- Check Windows Subsystem for Linux and Virtual Machine Platform
- Restart your computer
Install Ubuntu from Microsoft Store (search “Ubuntu”)
Download Docker Desktop from docker.com
Run installer, enable WSL2 backend when prompted
Launch Docker Desktop and complete setup wizard
Verify in PowerShell:
docker --version
docker compose version macOS
Download Docker Desktop from docker.com
Open the .dmg file and drag Docker to Applications
Launch Docker from Applications, grant permissions when prompted
Wait for Docker to start (whale icon in menu bar)
Verify in Terminal:
docker --version
docker compose version 6. Complete Docker Compose Configuration
Create the file docker-compose.yml in your docker directory.
- Linux:
/data/config/docker-compose.yml - macOS:
~/data/config/docker-compose.yml - Windows:
C:\data\config\docker-compose.yml
TIP: Adjust PUID, PGID, TZ, and volume paths for your system. Find your PUID/PGID with id -u and id -g.
version: '3.9'
# Define common environment variables
x-environment: &default-env
PUID: 1000
PGID: 1000
TZ: America/New_York
services:
# ===========================================================================
# VPN LAYER - Gluetun (All torrent traffic routed through this)
# ===========================================================================
gluetun:
image: qmcgaw/gluetun:latest
container_name: gluetun
cap_add:
- NET_ADMIN
devices:
- /dev/net/tun:/dev/net/tun
ports:
- 8080:8080 # qBittorrent Web UI
- 6881:6881 # qBittorrent TCP
- 6881:6881/udp # qBittorrent UDP
environment:
# === CHANGE THESE FOR YOUR VPN ===
- VPN_SERVICE_PROVIDER=nordvpn
- VPN_TYPE=wireguard
- WIREGUARD_PRIVATE_KEY=YOUR_PRIVATE_KEY_HERE
# For OpenVPN, use these instead:
# - VPN_TYPE=openvpn
# - OPENVPN_USER=your_username
# - OPENVPN_PASSWORD=your_password
- SERVER_COUNTRIES=Netherlands
- TZ=America/New_York
volumes:
- /data/config/gluetun:/gluetun
restart: unless-stopped
healthcheck:
test: ['CMD', 'wget', '-q', '--spider', 'http://ipinfo.io']
interval: 30s
timeout: 10s
retries: 3
# ===========================================================================
# DOWNLOAD LAYER - qBittorrent
# ===========================================================================
qbittorrent:
image: lscr.io/linuxserver/qbittorrent:latest
container_name: qbittorrent
network_mode: 'service:gluetun'
environment:
<<: *default-env
WEBUI_PORT: 8080
volumes:
- /data/config/qbittorrent:/config
- /data/torrents:/data/torrents
depends_on:
gluetun:
condition: service_healthy
restart: unless-stopped
# ===========================================================================
# INDEXER LAYER - Prowlarr
# ===========================================================================
prowlarr:
image: lscr.io/linuxserver/prowlarr:latest
container_name: prowlarr
environment:
<<: *default-env
ports:
- 9696:9696
volumes:
- /data/config/prowlarr:/config
restart: unless-stopped
# ===========================================================================
# CLOUDFLARE BYPASS - FlareSolverr
# ===========================================================================
# Alternatively, use Byparr as a drop-in replacement:
# image: ghcr.io/thephaseless/byparr:latest
# Or Solvearr:
# image: nabilak/solvearr
flaresolverr:
image: ghcr.io/flaresolverr/flaresolverr:latest
container_name: flaresolverr
environment:
- LOG_LEVEL=info
- TZ=America/New_York
ports:
- 8191:8191
restart: unless-stopped
# ===========================================================================
# MEDIA MANAGERS
# ===========================================================================
radarr:
image: lscr.io/linuxserver/radarr:latest
container_name: radarr
environment:
<<: *default-env
ports:
- 7878:7878
volumes:
- /data/config/radarr:/config
- /data:/data
restart: unless-stopped
sonarr:
image: lscr.io/linuxserver/sonarr:latest
container_name: sonarr
environment:
<<: *default-env
ports:
- 8989:8989
volumes:
- /data/config/sonarr:/config
- /data:/data
restart: unless-stopped
lidarr:
image: lscr.io/linuxserver/lidarr:latest
container_name: lidarr
environment:
<<: *default-env
ports:
- 8686:8686
volumes:
- /data/config/lidarr:/config
- /data:/data
restart: unless-stopped
readarr:
image: lscr.io/linuxserver/readarr:develop
container_name: readarr
environment:
<<: *default-env
ports:
- 8787:8787
volumes:
- /data/config/readarr:/config
- /data:/data
restart: unless-stopped
mylar3:
image: lscr.io/linuxserver/mylar3:latest
container_name: mylar3
environment:
<<: *default-env
ports:
- 8090:8090
volumes:
- /data/config/mylar3:/config
- /data:/data
restart: unless-stopped
# ===========================================================================
# SUBTITLE MANAGER - Bazarr
# ===========================================================================
bazarr:
image: lscr.io/linuxserver/bazarr:latest
container_name: bazarr
environment:
<<: *default-env
ports:
- 6767:6767
volumes:
- /data/config/bazarr:/config
- /data/media:/data/media
restart: unless-stopped
# ===========================================================================
# MEDIA SERVER - Jellyfin
# ===========================================================================
jellyfin:
image: jellyfin/jellyfin:latest
container_name: jellyfin
environment:
- TZ=America/New_York
ports:
- 8096:8096
- 8920:8920
- 7359:7359/udp
- 1900:1900/udp
volumes:
- /data/config/jellyfin:/config
- /data/config/jellyfin/cache:/cache
- /data/media:/media:ro
# Hardware transcoding (Intel)
# devices:
# - /dev/dri:/dev/dri
restart: unless-stopped
# ===========================================================================
# REQUEST MANAGEMENT - Jellyseerr
# ===========================================================================
jellyseerr:
image: fallenbagel/jellyseerr:latest
container_name: jellyseerr
environment:
- TZ=America/New_York
ports:
- 5055:5055
volumes:
- /data/config/jellyseerr:/app/config
restart: unless-stopped
# ===========================================================================
# NOTIFICATIONS - Notifiarr
# ===========================================================================
notifiarr:
image: golift/notifiarr:latest
container_name: notifiarr
hostname: media-server
environment:
- TZ=America/New_York
ports:
- 5454:5454
volumes:
- /data/config/notifiarr:/config
- /var/run/utmp:/var/run/utmp:ro
restart: unless-stopped
# ===========================================================================
# REVERSE PROXY - Nginx Proxy Manager
# ===========================================================================
npm:
image: jc21/nginx-proxy-manager:latest
container_name: npm
ports:
- 80:80
- 443:443
- 81:81
volumes:
- /data/config/npm:/data
- /data/config/npm/letsencrypt:/etc/letsencrypt
restart: unless-stopped Starting the Stack
# Navigate to config directory
cd /data/config
# Start all containers in detached mode
docker compose up -d
# View real-time logs
docker compose logs -f
# Check container status
docker compose ps
# Stop all containers
docker compose down
# Update all containers
docker compose pull && docker compose up -d 7. Download Client: qBittorrent with VPN
qBittorrent is a free, open-source BitTorrent client. When paired with Gluetun VPN container, all torrent traffic is securely routed through your VPN provider, protecting your privacy.
Initial Access
- Navigate to
http://your-server-ip:8080 - Default credentials: admin / check logs with
docker logs qbittorrent - Change password immediately: Tools → Options → Web UI → Authentication
Essential Configuration
Downloads Tab
- Default Save Path:
/data/torrents/complete - Keep incomplete in:
/data/torrents/incomplete - Enable: Append .!qB extension to incomplete files
- Enable: Pre-allocate disk space
Categories Setup
Right-click Categories sidebar → Add category:
| Category | Save Path |
|---|---|
| movies | /data/torrents/complete/movies |
| tv | /data/torrents/complete/tv |
| music | /data/torrents/complete/music |
| books | /data/torrents/complete/books |
| comics | /data/torrents/complete/comics |
Connection Tab
- Listening Port: 6881
- Enable: Use UPnP / NAT-PMP
- Global max connections: 500
- Per torrent max connections: 100
BitTorrent Tab
- Encryption mode: Require encryption
- Enable: DHT, PEX, LSD for better peer discovery
- Seeding limits: Ratio 1.0 or 1440 minutes, then Pause
Advanced Tab
- Enable: Ignore limits on local network for faster local transfers
Web UI Tab
- Enable Web UI if not using Docker
- Set port 8080
- Bypass authentication for localhost (optional for *arr apps)
Port Forwarding
If behind a router, forward port 6881 TCP/UDP:
- Access router admin (usually
http://192.168.1.1) - Find Port Forwarding section
- Add rule: Port 6881 (TCP and UDP) → Your server’s local IP
- Save and test
Native Installation (Non-Docker)
Linux/Unix:
sudo apt install qbittorrent -y
# Launch via menu or command: qbittorrent
# Set download path to /data/torrents macOS: Download from https://www.qbittorrent.org/download, install .dmg, launch. Set paths to ~/data/torrents.
Windows: Download installer from https://www.qbittorrent.org/download, run setup wizard. Set paths to C:\data\torrents.
VPN Integration (Alternative to Gluetun)
If not using Docker with Gluetun, configure VPN directly:
- Install OpenVPN or WireGuard
- Configure with your VPN provider’s .ovpn file
- In qBittorrent: Connection → Proxy → SOCKS5 (if VPN provides)
- Better alternative: Use Gluetun container as shown above
Verify VPN Connection
# Check if traffic goes through VPN
docker exec gluetun wget -qO- https://ipinfo.io/ip
# Should show VPN IP, not your real IP 8. Indexer Manager: Prowlarr
Prowlarr is a unified indexer manager that synchronizes your torrent and Usenet indexers with all your *arr applications. Instead of manually configuring indexers in Radarr, Sonarr, Lidarr, and Readarr separately, Prowlarr manages them centrally and pushes configurations to all connected apps automatically.
- Navigate to
http://your-server-ip:9696 - Set up authentication: Settings → General → Authentication → Forms
- Create username and strong password
- Note your API Key: Settings → General
Adding Indexers
- Go to Indexers → Add Indexer (+)
- Search for indexers (1337x, RARBG, etc.)
- Configure credentials if required
- Test connection → Save
Connecting to *arr Apps
- Settings → Apps → Add (+)
- Select application (Radarr, Sonarr, etc.)
- Prowlarr Server:
http://prowlarr:9696 - API Key: From each app’s Settings → General
- Sync Level: Full Sync
- Test → Save
- Click Sync App Indexers to push indexers
Native Installation (Non-Docker)
Linux:
# Download from https://prowlarr.servarr.com/
wget https://github.com/Prowlarr/Prowlarr/releases/latest/download/Prowlarr.develop.linux-core-x64.tar.gz
tar -xvzf Prowlarr*.tar.gz
cd Prowlarr
./Prowlarr macOS/Windows: Download installers from https://prowlarr.servarr.com/ and run the setup wizard.
9. Cloudflare Bypass: FlareSolverr and Alternatives
FlareSolverr is a proxy server designed to solve Cloudflare and DDoS-Guard protection challenges. Many torrent indexers use Cloudflare to protect their sites, which blocks automated scraping tools. FlareSolverr acts as a middleman, running an internal web browser to solve CAPTCHAs and challenges so Prowlarr can access these protected sites.
Community Alternatives: Byparr and Solvearr
While FlareSolverr has long been the standard, it can occasionally struggle with the latest Cloudflare Turnstile challenges. If you encounter issues with indexers failing to connect, you can use one of these drop-in replacements.
Byparr
Byparr is a modern, actively developed alternative designed specifically to overcome FlareSolverr limitations. It runs a headless Firefox browser using Camoufox (a privacy-focused browser fork designed for evasion) coupled with a FastAPI backend.
- Docker Image:
ghcr.io/thephaseless/byparr:latest - Default Port:
8191 - API Compatibility: It mimics the FlareSolverr API structure exactly, meaning you configure it in Prowlarr using the FlareSolverr proxy type.
Solvearr
Solvearr is a lightweight alternative that uses TLS fingerprint tampering instead of running a resource-heavy browser.
- Docker Image:
nabilak/solvearr - Default Port:
8191 - API Compatibility: Fully API-compatible with FlareSolverr.
Configuration
For Cloudflare-protected indexers, configure the proxy in Prowlarr:
- Navigate to Prowlarr:
http://your-server-ip:9696 - Go to Settings → Indexers and click the Add (+) button under Indexer Proxies.
- Select FlareSolverr as the proxy type (even if you are using Byparr or Solvearr).
- Set the Host field:
- For FlareSolverr or Byparr:
http://flaresolverr:8191(or your container’s service name and port) - For Solvearr:
http://solvearr:8191
- For FlareSolverr or Byparr:
- Test the connection and click Save.
After configuration, Prowlarr will automatically route requests for protected indexers through the configured proxy.
10. Movie Manager: Radarr
Radarr is an automated movie collection manager that monitors for new releases, searches indexers, and downloads movies automatically. It manages your movie library with features like quality upgrades, custom formats for HDR/DolbyVision, and seamless integration with download clients.
Radarr v6 is the current stable release. This version has been upgraded to run on .NET 8 and utilizes an updated SQLite database engine. A critical security change in Radarr v6 is the complete removal of legacy Basic Authentication (the browser pop-up). Users are now required to use Forms Authentication (a login page) or External Authentication (such as through a reverse proxy or single sign-on provider). Additionally, the default “wanted language” setting in quality profiles has been updated to “Original”.
Initial Configuration
- Navigate to
http://your-server-ip:7878 - Set authentication: Settings → General → Authentication (Forms or External is required)
- Note API Key for Prowlarr/Jellyseerr from Settings → General → Security
Media Management
Settings → Media Management:
- Rename Movies: Yes
- Standard Movie Format:
{Movie Title} ({Release Year}) {Quality Full} - Movie Folder Format:
{Movie Title} ({Release Year}) - Use Hardlinks instead of Copy: Yes
- Root Folder:
/data/media/movies
Download Client
Settings → Download Clients → Add:
- Type: qBittorrent
- Host:
gluetun(container name) - Port: 8080
- Username/Password: Your qBittorrent credentials
- Category:
movies - Test → Save
Quality Profiles
Use TRaSH-Guides profiles via Recyclarr (covered later) or manually:
- Create profile: “HD-1080p” with cutoff at Bluray-1080p
- Enable custom formats for HDR, DV, better releases
11. TV Show Manager: Sonarr
Sonarr is an automated TV show collection manager that monitors for new episodes, searches indexers, and downloads them automatically. It tracks release schedules, handles season packs, and upgrades quality when better versions become available.
Sonarr v4 is the current stable release. It has been rebuilt on .NET 6, completely removing the dependency on Mono and significantly improving performance. Sonarr v4 introduces several core feature and database changes, meaning it is not backwards-compatible with v3. The legacy “Preferred Words” and “Language Profiles” systems have been entirely replaced by “Custom Formats”, giving users much more granular control over release selection. Authentication is also enabled and required by default to secure the instance.
Configuration
- Navigate to
http://your-server-ip:8989 - Same setup and authentication pattern as Radarr
Media Management
- Standard Episode Format:
{Series Title} - S{season:00}E{episode:00} - {Episode Title} {Quality Full} - Season Folder Format:
Season {season:00} - Series Folder Format:
{Series Title} - Root Folder:
/data/media/tv
Download Client
Same as Radarr but Category: tv
12. Music Manager: Lidarr
Lidarr is an automated music collection manager that monitors for new albums, searches indexers, and downloads music automatically. It organizes your library by artist and album, supports various audio formats, and integrates with MusicBrainz for metadata.
Quick Configuration
- Port: 8686
- Root Folder:
/data/media/music - Category:
music - Naming:
{Artist Name}/{Album Title}/{track:00} - {Track Title}
13. Book Manager: Readarr
Readarr is an automated ebook and audiobook collection manager. It monitors for new releases from your favorite authors, searches indexers, and downloads books automatically. Supports both ebooks and audiobooks.
Quick Configuration
- Port: 8787
- Root Folder:
/data/media/books - Category:
books - Supports ebooks and audiobooks
14. Comic Manager: Mylar3
Mylar3 is an automated comic book collection manager that downloads comics, manages your library, and integrates with ComicVine for metadata. It tracks weekly releases and can automatically grab new issues as they become available.
Quick Configuration
- Port: 8090
- Root Folder:
/data/media/comics - Category:
comics - Integrates with ComicVine for metadata
15. Subtitle Manager: Bazarr
Bazarr is a companion application to Sonarr and Radarr that automatically finds and downloads subtitles for your media. It supports multiple subtitle providers and can match subtitles based on release name, quality, and language preferences.
Configuration
- Navigate to
http://your-server-ip:6767 - Settings → Sonarr: Add API key and URL (
http://sonarr:8989) - Settings → Radarr: Add API key and URL (
http://radarr:7878)
Subtitle Providers
Settings → Providers → Add:
- OpenSubtitles.com (requires account)
- Subscene
- YIFY Subtitles
Languages
Settings → Languages:
- Add preferred languages
- Set hearing impaired preferences
- Configure exclusions
16. Media Server: Jellyfin
Jellyfin is a free, open-source media server that streams your movies, TV shows, music, and books to any device. Unlike Plex or Emby, Jellyfin has no premium features behind a paywall—everything is completely free.
The current stable version series is Jellyfin v10.11.x (specifically v10.11.9). Key updates in recent releases include:
- Trickplay Support: Provides live video scrubbing previews. Keyframe extraction generates these previews up to 100x faster than traditional frame-by-frame rendering.
- Media Segments API: Built-in support for chapter, intro, and credits detection and skipping.
- Improved Transcoding and Audio: Software-based HDR tone mapping (HDR10, HLG, Dolby Vision) and support for Dolby AC-4 audio decoding.
Initial Setup
- Navigate to
http://your-server-ip:8096 - Select language
- Create admin account
- Add libraries:
- Movies:
/media/movies(Type: Movies) - TV Shows:
/media/tv(Type: Shows) - Music:
/media/music(Type: Music) - Books:
/media/books(Type: Books)
- Movies:
Hardware Transcoding (Intel QuickSync)
Hardware transcoding uses your CPU’s integrated graphics (Intel QuickSync) or dedicated GPU to convert video formats on-the-fly for devices that can’t play the original format. This dramatically reduces CPU usage during playback.
Dashboard → Playback → Transcoding:
- Enable Intel QuickSync
- Enable hardware decoding for all supported formats
- Enable VAAPI (Linux)
Networking
Dashboard → Networking:
- Enable: Allow remote connections
- Set Base URL if using reverse proxy (e.g.,
/jellyfin) - Add known proxies if using NPM
DLNA (Digital Living Network Alliance)
Starting with Jellyfin v10.9, DLNA support is removed from the core server code and is instead distributed as an optional, first-party plugin.
To use DLNA:
- Navigate to Dashboard → Plugins → Catalog.
- Install the DLNA plugin.
- Restart your Jellyfin server.
- Go to Dashboard → DLNA and enable the service.
Note: DLNA relies on UPnP/SSDP broadcasts over UDP port 1900. If you are running Jellyfin in a Docker container, you must configure host networking (network_mode: host) rather than bridge networking, otherwise client devices will be unable to discover the server.
Native Installation (Non-Docker)
Linux:
sudo apt install jellyfin
# Access at http://localhost:8096 macOS: Jellyfin officially supports macOS natively. You can install it using one of two methods:
- Official App: Download the official
.dmginstaller from the Jellyfin website (available for both Apple Silicon and Intel Macs), dragJellyfin.appto your Applications folder, and launch it. - Homebrew: Install via Homebrew cask in the Terminal:
brew install --cask jellyfin
Windows: Download the MSI installer from the official downloads page and run the setup wizard.
17. Request Management: Jellyseerr
Jellyseerr is a fork of Overseerr designed specifically for Jellyfin. It allows users to request movies and TV shows through a beautiful interface, which then integrates with Radarr and Sonarr to automatically download the content.
Initial Setup
- Navigate to
http://your-server-ip:5055 - Sign in with Jellyfin option
- Enter Jellyfin URL:
http://jellyfin:8096 - Authenticate with admin credentials
- Import users from Jellyfin
Connect to *arr Apps
Settings → Services:
- Add Radarr: URL, API Key, quality profile, root folder
- Add Sonarr: Same configuration
18. Notifications: Notifiarr
Notifiarr is a unified notification service that connects your *arr applications to Discord, Telegram, Slack, email, and other services. It provides rich notifications for downloads, upgrades, and system health.
Setup
- Create account at notifiarr.com
- Get API key from dashboard
- Configure in container or config file
Discord Integration
- Create Discord webhook in your server
- Add webhook URL in Notifiarr
- Configure notification triggers for each *arr app
19. Reverse Proxy: Nginx Proxy Manager
Nginx Proxy Manager (NPM) provides a web-based interface for managing Nginx reverse proxy configurations with automatic SSL certificate generation via Let’s Encrypt. It enables secure HTTPS access to all your services.
Initial Setup
- Navigate to
http://your-server-ip:81 - Default login:
admin@example.com/changeme - Change credentials immediately
Adding Proxy Hosts
For each application:
- Hosts → Proxy Hosts → Add
- Domain:
jellyfin.yourdomain.com - Forward Hostname/IP:
jellyfin(container name) - Forward Port:
8096 - Enable Websockets Support
- SSL tab → Request new SSL Certificate
- Enable Force SSL, HTTP/2
DNS Configuration
Point A record to your public IP for each subdomain.
20. Remote Access: Tailscale VPN
Tailscale is a zero-config VPN that creates a secure mesh network between your devices. It allows you to access your media server from anywhere in the world without exposing ports to the internet or setting up complex firewall rules.
Installation
Linux
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up Windows/macOS
Download from tailscale.com/download
Configuration
- Authenticate via browser
- Install on all client devices
- Access Jellyfin via Tailscale IP:
100.x.x.x:8096
Jellyfin Integration
Dashboard → Networking → Known Proxies:
- Add Tailscale subnet:
100.64.0.0/10
21. TRaSH-Guides Integration: Recyclarr
Recyclarr automatically syncs quality profiles, custom formats, and recommended settings from TRaSH-Guides to your Radarr and Sonarr instances. It ensures you are always using the best practices for media quality.
Installation
Recyclarr is best run via Docker, either as a one-off command or a cron job:
docker run --rm -v /data/config/recyclarr:/config ghcr.io/recyclarr/recyclarr:latest Configuration
Modern versions of Recyclarr separate sensitive details (like API keys and URLs) from the main configuration using a secrets.yml file, and identify quality profiles using unique trash_id values from the guide.
First, create secrets.yml in your Recyclarr configuration directory (e.g., /data/config/recyclarr/secrets.yml):
# secrets.yml
radarr_url: http://radarr:7878
radarr_apikey: 9f8e7d6c5b4a3b2a1a09887766554433
sonarr_url: http://sonarr:8989
sonarr_apikey: 1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d Next, create the main configuration file recyclarr.yml (e.g., /data/config/recyclarr/recyclarr.yml) referencing the secrets using the !secret tag:
# recyclarr.yml
radarr:
movies:
base_url: !secret radarr_url
api_key: !secret radarr_apikey
quality_profiles:
# HD-1080p profile sync via its unique TRaSH-Guide ID
- trash_id: 9a0e43cb7a892e3e9c4f2f5c5e0dcf8e
name: HD-1080p
reset_unmatched_scores:
enabled: true
sonarr:
tv:
base_url: !secret sonarr_url
api_key: !secret sonarr_apikey
quality_profiles:
# HD-1080p profile sync via its unique TRaSH-Guide ID
- trash_id: dcf20e2e9c4f2f5c5e0d9a0e43cb7a89
name: HD-1080p
reset_unmatched_scores:
enabled: true Syncing
To apply the configuration and push the formats to Radarr and Sonarr, run the sync command:
docker run --rm -v /data/config/recyclarr:/config ghcr.io/recyclarr/recyclarr:latest sync 22. Connecting Everything Together
Connection Summary
| From | To | Method |
|---|---|---|
| Prowlarr | All *arr apps | API Sync |
| All *arr apps | qBittorrent | Download Client |
| Bazarr | Radarr, Sonarr | API |
| Jellyseerr | Radarr, Sonarr, Jellyfin | API |
| Notifiarr | All apps | Webhooks |
API Key Locations
All apps: Settings → General → Security → API Key
23. Maintenance, Backups, and Updates
Backup Strategy
#!/bin/bash
# Backup script
BACKUP_DIR="/backup/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR
docker compose stop
tar -czf $BACKUP_DIR/configs.tar.gz /data/config/
docker compose start
# Keep 7 days
find /backup -type d -mtime +7 -exec rm -rf {} ; Updating Containers
cd /data/config
docker compose pull
docker compose up -d
docker image prune -f 24. Troubleshooting Common Issues
Container Won’t Start
docker logs container_name Permission Errors
Verify PUID/PGID match your user: id $USER
VPN Not Working
docker logs gluetun
docker exec gluetun wget -qO- https://ipinfo.io Downloads Not Moving
- Check path mappings are consistent
- Verify PUID/PGID permissions
- Ensure categories match
Getting Help
Quick Reference
| Service | URL | Port |
|---|---|---|
| Jellyfin | http://server:8096 | 8096 |
| qBittorrent | http://server:8080 | 8080 |
| Prowlarr | http://server:9696 | 9696 |
| Radarr | http://server:7878 | 7878 |
| Sonarr | http://server:8989 | 8989 |
| Lidarr | http://server:8686 | 8686 |
| Readarr | http://server:8787 | 8787 |
| Mylar3 | http://server:8090 | 8090 |
| Bazarr | http://server:6767 | 6767 |
| Jellyseerr | http://server:5055 | 5055 |
| FlareSolverr | http://server:8191 | 8191 |
| Notifiarr | http://server:5454 | 5454 |
| NPM Admin | http://server:81 | 81 |
Conclusion
You now have a complete automated media server with:
- Jellyfin streaming your media
- Radarr/Sonarr/Lidarr/Readarr/Mylar3 automating collection
- Prowlarr managing all indexers
- Bazarr handling subtitles
- Jellyseerr for media requests
- qBittorrent + Gluetun for secure downloads
- FlareSolverr bypassing Cloudflare
- Notifiarr for notifications
- NPM for HTTPS access
- Tailscale for secure remote access
- Recyclarr syncing TRaSH-Guides best practices
Happy streaming!
Comments
Sign in to join the discussion!
Your comments help others in the community.