How to Install Prowlarr on Ubuntu 24.04 — Unified Indexer Manager for the *arr Stack
If you are running Sonarr for TV, Radarr for movies, and Lidarr for music, you have probably discovered a frustrating truth: every time you add or update an indexer, you need to repeat the work in each app. Prowlarr solves that problem. It is the central indexer manager for the entire Servarr ecosystem — configure an indexer once, push it to every downstream app automatically, and keep everything in sync from a single UI. This guide walks you through installing Prowlarr on an Ubuntu 24.04 VPS, hardening it for production, and wiring it into your existing media automation stack.
Need a server? The CloudCore Starter plan at EUR 7.99/month is perfect for Prowlarr alongside a small *arr stack. Deploy in under 60 seconds and start indexing immediately.
Table of Contents
What is Prowlarr?
Prowlarr is an open-source indexer manager and proxy built for the Servarr application suite. It replaces the older Jackett project with a more modern codebase, native integration with every *arr app, and a single pane of glass for managing hundreds of torrent trackers and Usenet indexers simultaneously.
At its core, Prowlarr does three jobs. First, it aggregates indexers. You add a tracker — public like 1337x or private like a closed torrent community — and Prowlarr learns how to query it, handle its login flow, and normalize its responses. Second, it pushes that configuration downstream. Instead of pasting API keys and URLs into Sonarr, Radarr, Lidarr, and Readarr one at a time, you connect each app to Prowlarr once, and every indexer you add automatically appears in every connected app with the right categories mapped. Third, it unifies search. From the Prowlarr UI you can query every indexer at once, compare result quality, and debug failures without bouncing between apps.
Prowlarr supports hundreds of indexer definitions out of the box, updated continuously by the Servarr community. It speaks the Torznab and Newznab protocols natively, so any app that accepts those standards — not just the *arr family — can use Prowlarr as its indexer backend. That includes tools like LazyLibrarian, Mylar3, and custom scripts.
Why Self-Host an Indexer Manager?
Running Prowlarr on your own VPS gives you direct control over an operationally critical piece of your media automation pipeline:
- Single source of truth for indexers — Adding a new tracker means editing one configuration. Prowlarr pushes changes to Sonarr, Radarr, and Lidarr within seconds. No more forgetting to update one app and wondering why releases are missing.
- Replaces Jackett entirely — Prowlarr is a true drop-in replacement for Jackett with one major advantage: native sync. Jackett requires you to paste Torznab URLs into every app manually; Prowlarr does this automatically and keeps them in sync.
- Central statistics and history — See which indexers are responding, failing, or rate-limiting. Prowlarr tracks per-indexer success rates, average response times, and grab history.
- Centralized proxy support — Configure HTTP proxies or Tor indexer proxies once in Prowlarr, and every downstream app inherits the routing.
- Privacy-respecting — Your indexer credentials, API keys, and search history stay on your server. No third-party SaaS ever sees which trackers you use.
- Unified search across all indexers — Search once in Prowlarr and query every indexer in parallel. Perfect for manually finding hard-to-locate releases that your *arr apps missed.
- Runs anywhere — Prowlarr is lightweight (roughly 100-200 MB of RAM at idle) and runs comfortably on a 2 vCPU / 4 GB VPS alongside Sonarr, Radarr, and Jellyfin or Plex.
Comparison: Prowlarr vs Jackett vs Manual Configuration
| Feature | Prowlarr | Jackett | Manual per-app |
|---|---|---|---|
| Add indexer once, sync to all apps | Yes | No | No |
| Native *arr app integration | Yes | Via Torznab URL | N/A |
| FlareSolverr support | Yes | Yes | Varies |
| Statistics and health monitoring | Yes | Limited | No |
| Tag-based routing to specific apps | Yes | No | Manual |
| Active development in 2026 | Yes | Maintenance only | N/A |
| RAM footprint | ~150 MB | ~200 MB | 0 (but more work) |
Prerequisites
Before you begin, make sure you have:
- A VPS running Ubuntu 24.04 LTS with root or sudo access
- SSH access to your server
- At least 2 vCPU and 2 GB of RAM (4 GB recommended if running alongside *arr apps)
- At least 10 GB of free disk space
- A domain name pointed at your server IP (optional but recommended for TLS)
- Sonarr, Radarr, or Lidarr already installed (optional — you can add them later)
Recommended Plan: CloudCore Starter>
Prowlarr is lightweight enough to run on our entry-level VPS plan:>
- 2 vCPU cores
- 4 GB RAM
- 80 GB NVMe SSD
- 32 TB bandwidth
- EUR 7.99/month>
Deploy from https://vps-server.host/store/vps. The Starter plan has enough headroom for Prowlarr plus Sonarr, Radarr, Lidarr, and a download client — the full *arr stack minus media playback.
Connect to your server via SSH:
ssh root@your-server-ipStep 1: Update System Packages
Bring your system up to date before installing anything new.
sudo apt update && sudo apt upgrade -yExpected output (abbreviated):
Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease
Reading package lists... Done
Calculating upgrade... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.Install the utilities we will need throughout this guide:
sudo apt install -y curl wget ca-certificates gnupg lsb-releaseIf the kernel was updated, reboot:
sudo rebootReconnect after a minute.
Step 2: Install Prowlarr via the Servarr Script
The Servarr team maintains an official install script that handles everything: downloading the latest Prowlarr release for your CPU architecture, creating a dedicated service user, installing to /opt/Prowlarr, and registering a systemd unit.
Download and run the script:
wget --content-disposition 'https://services.sonarr.tv/v1/download/main/latest?version=4&os=linux&arch=x64&installer=true' -O /tmp/ProwlarrInstall.shWait — the URL above is for Sonarr. The correct Prowlarr installer is served by the Servarr wiki. Use this command instead:
curl -fsSL https://raw.githubusercontent.com/Servarr/Wiki/master/servarr/servarr-install-script.sh -o /tmp/servarr-install.sh
sudo bash /tmp/servarr-install.shThe interactive installer will prompt you:
Select the application to install: 1) sonarr 2) radarr 3) lidarr 4) readarr 5) prowlarr 6) whisparr Choose: 5
Default User 'prowlarr' (press enter) or enter a custom user: Default Group 'media' (press enter) or enter a custom group: Default Data Directory '/var/lib/prowlarr' (press enter) or enter custom:
Accept the defaults unless you have a reason to change them. The script will:
prowlarr system user and media group/opt/Prowlarr/var/lib/prowlarr/etc/systemd/system/prowlarr.serviceExpected final output:
Installation complete
Browse to http://your-server-ip:9696 to finish setupStep 3: Verify the Installation
Check the systemd service:
sudo systemctl status prowlarrExpected output:
● prowlarr.service - Prowlarr Daemon
Loaded: loaded (/etc/systemd/system/prowlarr.service; enabled; preset: enabled)
Active: active (running) since Thu 2026-04-16 12:00:00 UTC; 1min ago
Main PID: 4321 (Prowlarr)
Tasks: 18
Memory: 142.0M
CPU: 3.410s
CGroup: /system.slice/prowlarr.service
└─4321 /opt/Prowlarr/Prowlarr -nobrowser -data=/var/lib/prowlarrConfirm the web UI is listening:
curl -I http://localhost:9696Expected output:
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Server: KestrelBefore you can reach the UI from your browser, open port 9696 in the firewall (if UFW is active):
sudo ufw allow 9696/tcpNavigate to http://your-server-ip:9696 in a browser. You should see the Prowlarr welcome screen.
Step 4: Initial Configuration and Authentication
Prowlarr ships with authentication disabled by default, which is fine behind a reverse proxy but dangerous on a public IP. Fix this immediately.
In the Prowlarr UI:
Forms (Login Page)EnabledYou will be prompted to log in. The web UI now requires credentials on every new browser session.
Record Your API Key
While you are in Settings → General, scroll to the Security section and copy the API Key value. You will need it in Step 7 when connecting Sonarr, Radarr, and Lidarr.
API Key: 7c3e9f82bd4a4c0192b8f1d6e7a8c4d5Treat this like a password. Anyone with the API key can query and modify your Prowlarr instance.
Change the Default Port (Optional)
If you want Prowlarr to listen on a different port (for example if 9696 conflicts with another service), edit the same settings page under Host → Port Number. Prowlarr will prompt you to restart the service after saving.
Step 5: Add Indexers (Public and Private)
Indexers are where Prowlarr earns its keep. Adding one is straightforward.
Navigate to Indexers → Add Indexer. A searchable list appears with hundreds of options.
Adding a Public Indexer
Public trackers require no login. To add 1337x as an example:
1337x in the indexer listRepeat for other public indexers you trust. Popular public options include The Pirate Bay, RARBG mirrors, EZTV, YTS, Nyaa, and LimeTorrents.
Adding a Private/Tracker Indexer
Private trackers require an account. For example, to add a generic private Torznab-compatible tracker:
Adding a Usenet Indexer (Newznab)
Usenet indexers use the Newznab protocol:
Newznab, or the specific indexer by name (e.g. NZBGeek, Drunken Slug)/api)Testing All Indexers at Once
From Indexers, click the Test All Indexers button in the toolbar. Prowlarr will query each configured indexer and show a green checkmark for successes and a red warning for failures. Red failures usually mean Cloudflare blocking (see Step 6), invalid credentials, or a dead mirror URL.
Step 6: Install FlareSolverr for Cloudflare-Protected Indexers
Many popular trackers sit behind Cloudflare's anti-bot challenge. Prowlarr cannot solve JavaScript challenges on its own, so we pair it with FlareSolverr, a proxy server that spins up a headless browser to bypass Cloudflare and returns the real response to Prowlarr.
Install Docker
FlareSolverr is easiest to run as a Docker container:
curl -fsSL https://get.docker.com | sh
sudo systemctl enable --now dockerRun FlareSolverr
sudo docker run -d \
--name=flaresolverr \
--restart=unless-stopped \
-p 127.0.0.1:8191:8191 \
-e LOG_LEVEL=info \
-e TZ=Etc/UTC \
ghcr.io/flaresolverr/flaresolverr:latestBinding to 127.0.0.1 is intentional — FlareSolverr should never be exposed to the public internet.
Verify it is running:
curl http://127.0.0.1:8191/Expected output:
{"msg":"FlareSolverr is ready!","version":"3.3.x","userAgent":"Mozilla/5.0 ..."}Register FlareSolverr in Prowlarr
In the Prowlarr UI:
FlareSolverrhttp://127.0.0.1:8191/60cloudflare (you will use this tag on indexers that need the proxy)Now go back to any indexer that was failing, edit it, and add the cloudflare tag. Prowlarr will route requests for that indexer through FlareSolverr.
Step 7: Connect Prowlarr to Sonarr, Radarr, and Lidarr
This is where Prowlarr pays dividends. Instead of pasting Torznab URLs into every app, you tell Prowlarr about each *arr instance once, and it pushes every indexer to them automatically.
You will need each downstream app's API key. Find it in each app under Settings → General → API Key.
Connect to Sonarr
Sonarr
- Sync Level: Full Sync (recommended — syncs indexers on every change)
- Prowlarr Server: http://127.0.0.1:9696 (or your public URL if Sonarr is remote)
- Sonarr Server: http://127.0.0.1:8989
- API Key: paste Sonarr's API key
Within seconds, open Sonarr's Settings → Indexers and you will see every Prowlarr indexer listed, prefixed with [Prowlarr].
Connect to Radarr
Repeat the process for Radarr:
- Radarr Server:
http://127.0.0.1:7878 - API Key: paste Radarr's API key
Connect to Lidarr
And for Lidarr:
- Lidarr Server:
http://127.0.0.1:8686 - API Key: paste Lidarr's API key
Sync Levels Explained
Prowlarr offers three sync levels per app:
- Disabled — Manually trigger syncs from the app settings. Rarely useful.
- Add and Remove Only — Prowlarr adds new indexers and removes deleted ones, but does not push ongoing settings changes.
- Full Sync — Every indexer change in Prowlarr is pushed immediately, including URL changes, category mappings, and priority. This is the recommended default.
Step 8: Organize with Tags
Once you have five or more indexers, tags become essential for keeping your stack sensible.
Tags in Prowlarr serve two purposes. First, they scope indexers to specific apps — for example, a private tracker that only carries anime should only sync to Sonarr Anime, not Radarr. Second, they scope proxies — you have already seen this with the cloudflare tag in Step 6.
Create Tags
Go to Settings → Tags and click + to add tags. Common patterns:
anime— only anime-carrying trackersprivate— private trackers that should never be exposed to a wider app listusenet— Usenet indexers onlycloudflare— indexers that need FlareSolverr4k-remux— trackers that carry high-quality remux releases
Apply Tags to Indexers
Edit any indexer and add one or more tags in the Tags field.
Filter by Tag in Apps
In Settings → Apps, edit each app and add the tags you want that app to receive. For example, your Sonarr Anime instance might get only the anime tag, while your main Sonarr gets everything except anime.
Step 9: Nginx Reverse Proxy with TLS
Running Prowlarr on port 9696 with basic auth is fine for a home lab. For a production VPS, put it behind Nginx with a Let's Encrypt TLS certificate.
Install Nginx and Certbot
sudo apt install -y nginx certbot python3-certbot-nginxCreate the Nginx Site Configuration
sudo tee /etc/nginx/sites-available/prowlarr > /dev/null <<'EOF' server { listen 80; server_name prowlarr.yourdomain.com; return 301 https://$host$request_uri; }server { listen 443 ssl http2; server_name prowlarr.yourdomain.com;
# Placeholders — Certbot will populate these ssl_certificate /etc/letsencrypt/live/prowlarr.yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/prowlarr.yourdomain.com/privkey.pem;
# Security headers add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; add_header X-Content-Type-Options nosniff; add_header X-Frame-Options SAMEORIGIN; add_header Referrer-Policy no-referrer;
client_max_body_size 10m;
location / { proxy_pass http://127.0.0.1:9696; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $host;
# WebSocket support for the SignalR backend proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";
proxy_redirect off; proxy_read_timeout 300s; }
# Dedicated SignalR endpoint location /signalr { proxy_pass http://127.0.0.1:9696; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_read_timeout 3600s; } } EOF
Enable the Site and Obtain the Certificate
sudo ln -s /etc/nginx/sites-available/prowlarr /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
sudo certbot --nginx -d prowlarr.yourdomain.comCertbot will automatically configure the certificate paths and set up auto-renewal via systemd timer.
Lock Down Direct Access
Now that Nginx is proxying, close direct access to port 9696:
sudo ufw delete allow 9696/tcp
sudo ufw allow 'Nginx Full'
sudo ufw enableThen tell Prowlarr to only listen on localhost. In the UI, go to Settings → General → Host and set Bind Address to 127.0.0.1. Save and restart Prowlarr:
sudo systemctl restart prowlarrYour Prowlarr instance is now accessible only via https://prowlarr.yourdomain.com.
Troubleshooting
| Problem | Cause | Solution |
|---|---|---|
prowlarr.service: Failed with result 'exit-code' | Data directory permission issue | sudo chown -R prowlarr:media /var/lib/prowlarr && sudo systemctl restart prowlarr |
| Indexer test returns "Unable to connect to indexer" | Cloudflare blocking or dead mirror | Add the cloudflare tag (Step 6) or pick a different base URL from the indexer dropdown |
| FlareSolverr returns 500 errors | Headless browser crashed or OOM | sudo docker restart flaresolverr. Upgrade to a larger VPS if it recurs often |
| Sonarr/Radarr not receiving indexers | Wrong API key or network blocked | In Prowlarr, open Settings → Apps, click the app, click Test. Check firewalls if the app is on a different server |
| "502 Bad Gateway" in Nginx | Prowlarr not running or bound to wrong interface | sudo systemctl status prowlarr. If you set Bind Address to 127.0.0.1, restart Prowlarr |
| High CPU from FlareSolverr | Too many concurrent challenge solves | Limit parallel indexer searches in Prowlarr → Settings → Indexers |
| API key leaked/exposed | Anyone with the key can modify Prowlarr | Generate a new key in Settings → General → Security and update every connected app |
Viewing Logs
Stream the Prowlarr service log:
sudo journalctl -u prowlarr -fCheck FlareSolverr logs:
sudo docker logs -f flaresolverrNginx access and error logs:
sudo tail -f /var/log/nginx/access.log /var/log/nginx/error.logFAQ
Is Prowlarr a direct replacement for Jackett?
Yes. Prowlarr is built by members of the same broader Servarr community and is designed to supersede Jackett. The key advantages over Jackett are native two-way sync with Sonarr, Radarr, Lidarr, and Readarr (no more pasting Torznab URLs into each app), unified search across all indexers, statistics and health dashboards, and more active development. If you are currently running Jackett, you can migrate by installing Prowlarr, adding the same indexers, connecting your *arr apps, and then removing the Jackett-imported indexers. Jackett itself will continue to work, but new feature development has slowed.
Do I need FlareSolverr for every indexer?
No. FlareSolverr is only needed for indexers that sit behind Cloudflare's anti-bot challenge (the "Checking your browser" interstitial). Most public trackers and all Usenet indexers work without it. When you click Test on an indexer and it fails with errors mentioning Cloudflare, a 403 response, or a challenge page, that is your signal to route it through FlareSolverr. Apply the cloudflare tag to only the indexers that need it to avoid unnecessary overhead.
Can Prowlarr use VPN or SOCKS5 proxies per indexer?
Yes. In Settings → Indexers → Indexer Proxies you can define HTTP, SOCKS4, or SOCKS5 proxies, including Tor. Then tag specific indexers with the proxy tag to route only those requests through the proxy. This is the correct way to access region-locked trackers or add an extra layer of privacy on top of a public VPN on the host itself. Prowlarr does not manage WireGuard or OpenVPN directly — for full system VPN routing, configure that at the OS level.
How much RAM and CPU does Prowlarr need?
Prowlarr itself is remarkably light. Idle memory usage is typically 100-200 MB, and CPU usage is nearly zero except during searches and the periodic indexer sync. The heaviest component in a typical deployment is FlareSolverr, which runs Chromium in the background and can spike to 500 MB-1 GB during a Cloudflare challenge. A 2 vCPU / 4 GB VPS like the CloudCore Starter runs Prowlarr, FlareSolverr, Sonarr, Radarr, and Lidarr simultaneously without issue.
Does Prowlarr download anything itself?
No. Prowlarr is strictly an indexer manager and search proxy — it does not download torrents or NZBs. When a search returns a result, Prowlarr hands the download URL off to whichever *arr app requested it, and that app passes it to your configured download client (qBittorrent, SABnzbd, Deluge, etc.). This separation of concerns is what makes the Servarr ecosystem flexible.
Can I back up my Prowlarr configuration?
Yes. Prowlarr takes automatic nightly backups stored in /var/lib/prowlarr/Backups. You can also trigger a manual backup from System → Backup → Backup Now. The backup is a single ZIP containing the SQLite database, config XML, and any custom scripts. To migrate or restore, stop Prowlarr, replace the contents of /var/lib/prowlarr with the backup, and start the service. Make sure to also snapshot the Nginx config and certificates if you are rebuilding a server.
Will Prowlarr work with Readarr, Whisparr, or other community apps?
Yes. Prowlarr supports every official *arr app including Readarr (books/audiobooks) and Whisparr (adult content). Add them the same way you added Sonarr in Step 7. For third-party tools that speak Torznab or Newznab — like LazyLibrarian, Mylar3, or custom scripts — Prowlarr exposes each indexer as a Torznab-compatible endpoint that those tools can consume directly, even though they do not support the native sync API.
Next Steps
With Prowlarr running as the hub of your media automation stack, here are natural follow-ups:
- Install the rest of the *arr stack — If you have not already, set up Sonarr for TV, Radarr for movies, and Lidarr for music. With Prowlarr already configured, indexer setup in each new app takes seconds.
- Add a download client — Install qBittorrent or SABnzbd on the same VPS or a separate server. Connect it to each *arr app so the pipeline is end-to-end automated.
- Deploy a media server — Install Jellyfin (open-source) or Plex (commercial) to actually watch the content your *arr stack downloads. A CloudCore VPS with an NVMe SSD can comfortably transcode 1080p streams for a small household.
- Monitor your indexers — Prowlarr's System → Indexer Stats dashboard shows which indexers are healthy and which are failing. Review it weekly and prune dead ones.
- Set up alerts — Configure a notification connection under Settings → Notifications (Discord, Telegram, Email, Gotify, etc.) to get pinged when an indexer fails repeatedly or when FlareSolverr loses contact.
- Read the Wiki — The official Prowlarr Wiki is the definitive reference for every setting, sync behavior, and integration detail. Bookmark it.
Ready to run the full *arr stack?>
The CloudCore Starter plan at EUR 7.99/month runs Prowlarr, Sonarr, Radarr, Lidarr, FlareSolverr, and a download client comfortably on a single box. NVMe storage, unmetered bandwidth, and deploy-in-60-seconds provisioning.>
Deploy Your Starter VPS Now