How to Install Bazarr on Ubuntu 24.04 — Automated Subtitle Management for Sonarr and Radarr
Bazarr is the missing piece of the self-hosted media stack. You have Sonarr grabbing new TV episodes, Radarr pulling movies, and Jellyfin or Plex streaming them to every device in the house — but subtitles are still a manual chore. Bazarr automates that chore entirely: it connects to Sonarr and Radarr, reads your library, and downloads subtitles in the languages you want, from the providers you trust, on the schedule you define.
This tutorial walks through a production-grade Bazarr install on Ubuntu 24.04: Python 3.12 inside a virtualenv, a dedicated system user, a hardened systemd unit, an Nginx reverse proxy, and a free TLS certificate from Let's Encrypt. By the end you will have Bazarr syncing subtitles automatically, protected behind HTTPS, and surviving reboots without intervention.
Not running Sonarr and Radarr yet? Check the Sonarr install guide and the Radarr install guide first — Bazarr needs at least one of them to do useful work.
Table of Contents
What is Bazarr?
Bazarr is an open-source companion application to Sonarr and Radarr that manages and downloads subtitles based on your requirements. It sits quietly in the background, watches your library for new media, and fetches subtitle files in the languages and formats you configure. Where Sonarr and Radarr handle video files, Bazarr handles the .srt, .ass, .vtt, and .sub files that accompany them.
Under the hood, Bazarr is a Python application built on Flask with a React-based UI. It uses a SQLite database (upgradeable to PostgreSQL) to track every episode and movie in your library, which subtitles exist on disk, which ones have been attempted, and what still needs to be fetched. It talks to more than 30 subtitle providers through a plugin architecture borrowed from the Subliminal library, scoring each result by release-name match, hash match, and user ratings so that the subtitle you actually get is likely to be in sync with your video file.
Typical features you will use daily:
- Provider aggregation across OpenSubtitles, Addic7ed, Subscene, Podnapisi, TVSubtitles, and dozens more
- Language profiles — for example, "English primary, Spanish secondary for kids content"
- Automatic subtitle sync using ffsubsync to shift out-of-sync subtitles to match the video's audio
- Manual search when the automatic pick is wrong, with a preview of each candidate
- Upgrade logic that replaces lower-scored subtitles when a better match appears later
- Per-series and per-movie overrides so documentaries can require forced subtitles while sitcoms do not
Why Self-Host Subtitle Automation?
If your media server is self-hosted, your subtitle workflow probably should be too. The alternatives — manually downloading .srt files from web scrapers, relying on Plex's limited built-in subtitle search, or living with out-of-sync subtitles — all break down at scale. As soon as your library crosses a few hundred items, Bazarr saves you hours every month.
The concrete advantages of running Bazarr on your own VPS are:
- Works with your existing stack — Bazarr integrates natively with Sonarr, Radarr, Jellyfin, Plex, and Emby. It writes subtitles next to the video file using the naming conventions those applications expect.
- Multi-language households — Configure one profile per family member or region. English audio + Spanish subs for one partner, German subs for visiting in-laws, Japanese subs for an anime-watching teenager.
- Quality control — Bazarr scores providers and picks the best match. If a release-name-matched subtitle appears weeks later, Bazarr automatically upgrades the file.
- Predictable operating cost — A single Starter VPS runs Bazarr alongside Sonarr, Radarr, and Prowlarr comfortably for a flat monthly fee. No provider charges your credit card per subtitle.
- Data sovereignty — Your watch history, library contents, and language preferences never leak to a third-party "smart subtitle" service.
- Runs everywhere your media server runs — Because Bazarr is pure Python, it runs on the same Ubuntu 24.04 host as the rest of the *arr stack without any hardware acceleration or extra dependencies.
Prerequisites
Before you begin, make sure you have:
- A VPS running Ubuntu 24.04 LTS with root or sudo access
- SSH access (built-in terminal on macOS/Linux, PuTTY or Windows Terminal on Windows)
- Sonarr and/or Radarr already installed on the same server or reachable over the network
- A domain name pointed at the server (for TLS in the final step) — optional but recommended
- At least 1 GB of free RAM and 2 GB of free disk space
Recommended Plan: CloudCore Starter>
Bazarr is lightweight. You only need a small VPS — and if you are already running Sonarr, Radarr, and Prowlarr, Bazarr slides onto the same box without a noticeable impact. The CloudCore Starter plan gives you plenty of headroom for the full *arr suite plus Bazarr:>
- 4 vCPU cores
- 6 GB RAM
- 100 GB NVMe SSD
- Unmetered bandwidth
- EUR 7.99/month>
Running Jellyfin or Plex on the same host? Look at the Professional tier for extra CPU headroom during transcoding.
Connect via SSH to begin:
ssh root@your-server-ipStep 1: Update System Packages
Start with a clean, up-to-date base so package resolution and Python wheels install without conflict.
sudo apt update && sudo apt upgrade -yIf the kernel was upgraded, reboot before continuing:
sudo rebootStep 2: Install Python 3.12 and Dependencies
Ubuntu 24.04 ships Python 3.12 by default, which is exactly the version Bazarr supports in its current releases. Install Python itself, the venv module, pip, git, and a handful of native libraries Bazarr's dependencies compile against.
sudo apt install -y python3 python3-venv python3-pip python3-dev \
git build-essential unrar-free ffmpeg \
libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-devVerify Python:
python3 --versionExpected output:
Python 3.12.3ffmpeg is required for Bazarr's subtitle sync feature (ffsubsync uses it to read the audio track). unrar-free handles the rare subtitle packs that ship as RAR archives.
Step 3: Create a Dedicated Bazarr User
Running Bazarr as root is a bad idea — it would write subtitle files into your media tree with root ownership, clashing with Sonarr/Radarr's permissions model. Create a dedicated system user instead:
sudo useradd -r -m -U -d /opt/bazarr -s /bin/bash bazarrIf Sonarr and Radarr use a shared media group (commonly media), add bazarr to it so the new subtitles are readable by everyone in the stack:
sudo usermod -aG media bazarrSkip this line if you do not already have a shared media group — we will use file ACLs later if needed.
Step 4: Clone the Bazarr Repository
Clone the official repository into /opt/bazarr. We use the master branch, which tracks tagged stable releases.
sudo -u bazarr git clone https://github.com/morpheus65535/bazarr.git /opt/bazarrCheck out the latest release tag rather than an unstable development commit:
cd /opt/bazarr
sudo -u bazarr git fetch --tags
LATEST=$(sudo -u bazarr git tag --list 'v*' --sort=-v:refname | head -n 1)
sudo -u bazarr git checkout "$LATEST"
echo "Checked out $LATEST"Expected output:
Checked out v1.4.5Step 5: Create a Virtualenv and Install Requirements
Bazarr requires around 80 Python packages. Installing them globally with pip would conflict with Ubuntu's system Python and could break apt. Always use a virtualenv.
Create the virtualenv and install Bazarr's dependencies:
sudo -u bazarr python3 -m venv /opt/bazarr/venv
sudo -u bazarr /opt/bazarr/venv/bin/pip install --upgrade pip wheel setuptools
sudo -u bazarr /opt/bazarr/venv/bin/pip install -r /opt/bazarr/requirements.txtThe dependency install takes 2-5 minutes depending on your CPU. Ignore the yellow "deprecation" warnings — they come from upstream packages and do not affect runtime.
Verify Bazarr launches by running it manually for a few seconds:
sudo -u bazarr /opt/bazarr/venv/bin/python /opt/bazarr/bazarr.py --no-updateYou should see startup log lines ending with:
INFO Bazarr is started and waiting for request on http://0.0.0.0:6767Press Ctrl+C to stop — the systemd unit will take over from here.
Step 6: Create the systemd Service
A systemd unit ensures Bazarr starts on boot, restarts on failure, and runs under the dedicated user with reasonable sandboxing. Create the unit file:
sudo tee /etc/systemd/system/bazarr.service > /dev/null <<'EOF' [Unit] Description=Bazarr Daemon After=network.target sonarr.service radarr.service[Service] Type=simple User=bazarr Group=bazarr UMask=0002 WorkingDirectory=/opt/bazarr ExecStart=/opt/bazarr/venv/bin/python /opt/bazarr/bazarr.py --no-update Restart=on-failure RestartSec=5 TimeoutStopSec=20 KillMode=process
Sandbox hardening
NoNewPrivileges=true ProtectSystem=full ProtectHome=read-only PrivateTmp=true
[Install] WantedBy=multi-user.target EOF
The --no-update flag prevents Bazarr from trying to git pull itself at launch — we manage updates manually (see Next Steps). The sandbox directives restrict what Bazarr can touch on the filesystem; adjust ProtectHome if your media lives inside /home.
Enable and start the service:
sudo systemctl daemon-reload
sudo systemctl enable --now bazarr
sudo systemctl status bazarrExpected output:
● bazarr.service - Bazarr Daemon
Loaded: loaded (/etc/systemd/system/bazarr.service; enabled)
Active: active (running) since Thu 2026-04-16 10:15:22 UTC; 4s ago
Main PID: 4821 (python)
Tasks: 18
Memory: 182.4MTail the logs to confirm Bazarr is serving HTTP:
sudo journalctl -u bazarr -fPress Ctrl+C when you see the "waiting for request" line.
Step 7: First Login and Initial Setup
Bazarr listens on port 6767 by default. Open a browser to http://your-server-ip:6767 and you will land on the welcome wizard.
On first launch you configure:
master for stable releases)./bazarr.Save and Bazarr will reload with the new configuration.
Step 8: Connect Bazarr to Sonarr and Radarr
This is where Bazarr becomes useful. Until you connect it to Sonarr and Radarr, the library is empty.
Grab the API keys first:
- Sonarr —
Settings → General → Security → API Key - Radarr —
Settings → General → Security → API Key
127.0.0.1 with their default ports.Connect Sonarr
In Bazarr, go to Settings → Sonarr:
- Use Sonarr: toggle on
- Hostname or IP Address:
127.0.0.1 - Port:
8989 - Base URL: leave blank (or match your Sonarr
UrlBasesetting) - SSL: off for local connections
- API Key: paste the Sonarr API key
- Download only monitored: on (skips unmonitored episodes)
- Excluded tags: leave empty initially
Connect Radarr
Go to Settings → Radarr:
- Use Radarr: toggle on
- Hostname or IP Address:
127.0.0.1 - Port:
7878 - API Key: paste the Radarr API key
- Download only monitored: on
You can verify the imports landed on the Series and Movies pages. Every row shows which language profile applies and the current subtitle status.
Step 9: Add Subtitle Providers
Out of the box Bazarr has no providers configured, so no subtitle will ever download. Add them under Settings → Providers → Add.
OpenSubtitles.com (recommended primary)
The modern OpenSubtitles API requires a free account at opensubtitles.com (the .com site, not the legacy .org). In Bazarr, pick OpenSubtitles.com from the provider dropdown:
- Username: your opensubtitles.com username
- Password: the password for that account
- Use VIP server: off (unless you have a paid subscription)
- Use Hash: on — matches subtitles by file hash for perfect sync
Addic7ed (TV shows)
Addic7ed is the best source for English TV subtitles, especially for same-day releases:
- Username and Password: create a free account at addic7ed.com
- Use random user-agent: on (reduces the chance of rate-limiting)
Subscene and Other Community Providers
Subscene, Podnapisi, TVSubtitles, and Supersubtitles each cover gaps the bigger providers miss. Most do not require an account. Add two or three as fallbacks, but avoid enabling all 30+ providers — Bazarr will query every enabled one on every search, and rate-limiting becomes painful.
Provider priority tip: drag providers in the list to order them. Bazarr queries top-to-bottom and keeps the first high-scoring result, so put hash-matching providers (OpenSubtitles.com, Podnapisi) above text-matching ones.
Step 10: Configure Language Profiles
Language profiles tell Bazarr which languages to fetch, in what order of preference, and whether forced or hearing-impaired variants are required.
Navigate to Settings → Languages:
eng (English) and spa (Spanish).Finally, assign the profile to your library. Go to Series → Mass Edit (or Movies → Mass Edit), select all rows, and set the language profile. New content grabbed by Sonarr and Radarr inherits this profile automatically going forward.
Step 11: Tune Sync and Scheduler Settings
Bazarr's defaults are conservative. Adjust them under Settings → Subtitles and Settings → Scheduler:
Subtitles tab:
- Subtitles Folder: "Alongside Media File" — this is what Jellyfin, Plex, and Emby expect.
- Upgrade previously downloaded subtitles: on. Bazarr rechecks older downloads against newer, higher-scored candidates.
- Upgrade frequency: every 12 hours is a reasonable default.
- Automatic subtitle synchronization: on. Uses ffsubsync to align timing with the audio track.
- Use Original Format: off unless you specifically want to keep subtitles in their provider-native format.
- Update Series list from Sonarr: every 1 hour
- Update Movie list from Radarr: every 1 hour
- Search for missing Series subtitles: every 6 hours
- Search for missing Movies subtitles: every 6 hours
- Upgrade previously downloaded subtitles: every 12 hours
Step 12: Nginx Reverse Proxy and TLS
Exposing port 6767 directly to the internet is risky. Front it with Nginx and Let's Encrypt so you reach Bazarr over HTTPS, at a friendly subdomain like bazarr.yourdomain.com.
Point an A record for bazarr.yourdomain.com at your server's IP, then install Nginx and Certbot:
sudo apt install -y nginx certbot python3-certbot-nginxCreate the site configuration:
sudo tee /etc/nginx/sites-available/bazarr > /dev/null <<'EOF' server { listen 80; server_name bazarr.yourdomain.com;location / { proxy_pass http://127.0.0.1:6767; 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;
# WebSocket upgrade (Bazarr UI uses socket.io) proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";
proxy_read_timeout 600s; proxy_send_timeout 600s; client_max_body_size 100m; } } EOF
sudo ln -s /etc/nginx/sites-available/bazarr /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl reload nginx
Obtain a Let's Encrypt certificate — Certbot edits the config in place to add TLS:
sudo certbot --nginx -d bazarr.yourdomain.comCertbot asks for an email, agreement to terms, and whether to redirect HTTP to HTTPS. Choose "Redirect".
Finally, bind Bazarr to localhost-only so port 6767 is no longer reachable from the outside. In Settings → General → Host, set Address to 127.0.0.1 and restart:
sudo systemctl restart bazarrVisit https://bazarr.yourdomain.com — you should see the Bazarr UI served over HTTPS with the padlock icon. Combined with the form login you configured in Step 7, Bazarr is now production-ready.
Troubleshooting
| Problem | Cause | Solution |
|---|---|---|
Service fails with ModuleNotFoundError | Virtualenv missing packages | Re-run sudo -u bazarr /opt/bazarr/venv/bin/pip install -r /opt/bazarr/requirements.txt |
| "Test Successful" but no series imported | Base URL mismatch between Sonarr and Bazarr | Leave Base URL blank in both unless you explicitly set UrlBase in Sonarr |
| Subtitles download to wrong folder | "Subtitles Folder" setting misconfigured | Set it to "Alongside Media File" for Jellyfin/Plex compatibility |
| OpenSubtitles returns 429 Too Many Requests | Free-tier rate limit (5/day) | Wait 24 hours, upgrade to VIP, or add more fallback providers |
| ffsubsync errors in log | ffmpeg missing or media path not readable by bazarr user | Verify ffmpeg -version works and bazarr is in the media group |
| Web UI hangs behind Nginx | WebSocket upgrade headers missing | Confirm the proxy_set_header Upgrade and Connection "upgrade" lines are present in the Nginx config |
| Permission denied writing subtitles | bazarr user lacks write access to media | Add bazarr to the media group and run sudo chmod -R g+w /path/to/media |
Viewing Logs
sudo journalctl -u bazarr -fThe in-app log viewer at System → Logs is often easier to read and lets you filter by severity.
FAQ
Do I need both Sonarr and Radarr to use Bazarr?
No. Bazarr works with either application alone, or both together. If you only watch TV, connect only Sonarr. If you only collect movies, connect only Radarr. You can also add the second application later — Bazarr re-imports the library on first sync.
How does Bazarr compare to Plex's built-in subtitle search or Jellyfin's OpenSubtitles plugin?
Plex and Jellyfin both offer basic subtitle search, but they only run on-demand when a user opens a file without subtitles. Bazarr runs continuously, scoring providers, upgrading earlier downloads, syncing timings with ffsubsync, and applying per-show language profiles. For a small library watched casually, the built-in options are fine. For a curated library with multi-language households, Bazarr's automation is a significant upgrade.
Can Bazarr download subtitles for media Sonarr and Radarr do not manage?
No. Bazarr deliberately relies on Sonarr and Radarr as its library source so it can match episodes and movies to TVDB, TMDB, and IMDb IDs. If you want to subtitle manually-added files, import them into Sonarr or Radarr first. There is no "scan an arbitrary folder" mode.
How much bandwidth does Bazarr use?
Very little — subtitle files are tiny (typically 20-100 KB each). A library of 10,000 episodes with English + Spanish subtitles consumes under 2 GB of subtitle data total. The main rate limit is the provider's API, not your bandwidth.
What's the difference between OpenSubtitles.com and OpenSubtitles.org in Bazarr?
OpenSubtitles.com is the modern REST API with tighter rate limits and a proper search ranking. OpenSubtitles.org is the legacy XML-RPC API that still works but is deprecated and less reliable. Use the .com provider unless you have a specific reason otherwise — and note that an account on one site does not work on the other.
Can I run Bazarr in Docker instead?
Yes. The linuxserver/bazarr image is well-maintained and is the easier path if you already have a Docker-based media stack. This guide uses a native Python install because it integrates cleanly with host-installed Sonarr/Radarr/Prowlarr, shares the same user/group filesystem permissions, and is lighter on RAM. Either approach is valid — pick the one that matches the rest of your stack.
How do I update Bazarr to a new version?
With the --no-update flag in the systemd unit, you control updates manually:
sudo systemctl stop bazarr
cd /opt/bazarr
sudo -u bazarr git fetch --tags
LATEST=$(sudo -u bazarr git tag --list 'v*' --sort=-v:refname | head -n 1)
sudo -u bazarr git checkout "$LATEST"
sudo -u bazarr /opt/bazarr/venv/bin/pip install -r requirements.txt
sudo systemctl start bazarrAlways read the release notes at github.com/morpheus65535/bazarr/releases before upgrading in case breaking changes require a manual config migration.
Next Steps
Bazarr is the final piece of a complete media automation stack. Round out your setup with the applications that feed it:
- Install Sonarr on Ubuntu 24.04 — the TV-series automation engine Bazarr pairs with.
- Install Radarr on Ubuntu 24.04 — the movie counterpart to Sonarr.
- Install Prowlarr on Ubuntu 24.04 — centralises indexer management across Sonarr, Radarr, and other *arr apps.
- Install Jellyfin on Ubuntu 24.04 — the open-source media server that reads Bazarr's subtitles natively.
- Install Plex on Ubuntu 24.04 — the commercial alternative, also fully compatible with Bazarr's subtitle file layout.
- Bazarr wiki — the official documentation at wiki.bazarr.media goes deeper on provider-specific quirks, advanced scoring, and the REST API.
Run Your Entire Media Stack on One VPS>
The CloudCore Starter plan comfortably hosts Sonarr, Radarr, Prowlarr, Bazarr, and Jellyfin side by side — with room to spare for Overseerr, Tautulli, and a VPN client.>
- 4 vCPU cores and 6 GB RAM
- 100 GB NVMe SSD
- Unmetered bandwidth with DDoS protection
- Full root access on Ubuntu 24.04
- EUR 7.99/month>
Launch your Starter VPS and follow this guide end to end.