The Ultimate Guide to Jellyfin and *ARR Stack: Complete Media Server Setup
Published on January 9, 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
# ===========================================================================
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
FlareSolverr is a proxy server that solves Cloudflare and DDoS-Guard protection challenges. Many torrent indexers use Cloudflare to protect their sites, which can block automated access. FlareSolverr acts as a middleman, solving CAPTCHAs and challenges so Prowlarr can access these protected sites.
Configuration
For Cloudflare-protected indexers:
- Navigate to Prowlarr:
http://your-server-ip:9696 - Settings โ Indexers โ Add under Indexer Proxies
- Select FlareSolverr
- Host:
http://flaresolverr:8191 - Test โ Save
After configuration, Prowlarr will automatically route requests for protected indexers through FlareSolverr.
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.
Initial Configuration
- Navigate to
http://your-server-ip:7878 - Set authentication: Settings โ General โ Authentication
- Note API Key for Prowlarr/Jellyseerr
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.
Configuration
- Navigate to
http://your-server-ip:8989 - Same setup 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.
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
DLNA (Digital Living Network Alliance) allows Jellyfin to stream media to DLNA-compatible devices like smart TVs and game consoles without requiring the Jellyfin app.
Dashboard โ DLNA:
- Enable if you need DLNA streaming to smart TVs
Native Installation (Non-Docker)
Linux:
sudo apt install jellyfin
# Access at http://localhost:8096 macOS: Not officially supported. Use Docker instead.
Windows: Download MSI installer from https://jellyfin.org/downloads/ and run 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โre always using the best practices for media quality.
Installation
# Via pip
pip install recyclarr
# Or Docker
docker run --rm -v /data/config/recyclarr:/config ghcr.io/recyclarr/recyclarr:latest Configuration
Create ~/.config/recyclarr/recyclarr.yml:
radarr:
main:
base_url: http://localhost:7878
api_key: YOUR_RADARR_API_KEY
quality_profiles:
- name: HD-1080p
sonarr:
main:
base_url: http://localhost:8989
api_key: YOUR_SONARR_API_KEY
quality_profiles:
- name: HD-1080p Sync
recyclarr 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.