Files
docudjeex/content/3.serveex/5.media/3.servarr.md
2025-07-20 17:58:30 +00:00

508 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
navigation: true
title: Automation
main:
fluid: false
---
:ellipsis{left=0px width=40rem top=10rem blur=140px}
# Servarr
::alert{type="info"}
🎯 __Goals:__
- Automate movie and TV show downloads using Radarr, Sonarr, Bazarr, Prowlarr, and Overseerr.
::
[Servarr](https://wiki.servarr.com/) is a suite of applications developed to automate the downloading, updating, and management of media. Here, we'll focus on movies and TV shows with the goal of:
- Selecting a movie from a catalog through a web interface.
- Sitting back and enjoying it on Plex a few minutes later.
Simple.
![arr](/img/serveex/arr.svg)
Well start by deploying the stack and then proceed to configure each app and understand how they work.
## Install the Apps
---
### Docker Compose
Folder structure:
```console
root
├── docker
│ ├── plex
│ │ ├── compose.yml
│ │ ├── config
│ │ └── transcode
│ ├── tautulli
│ │ └── config
│ ├── sonarr
│ │ └── config
│ ├── radarr
│ │ └── config
│ ├── bazarr
│ │ └── config
│ ├── prowlarr
│ │ └── config
│ └── overseerr
│ └── config
└── media
├── downloads
├── tvseries
├── movies
└── library
```
::alert{type="warning"}
:::list{type="warning"}
- __Warning:__ Make sure to follow this file structure carefully, especially the `media` folder. This folder must be mounted **exactly the same way** in both the _Qbittorrent_ compose file (`/your/path/media:/media`) and the _arr_ applications.
If not, the _arr_ apps may not recognize the path provided by Qbittorrent and will fail to create _hardlinks_.
Without hardlinks, the _arr_ apps will copy the files instead—**doubling the space used** on your storage.
:::
::
Open Docker and your `plex` stack. Modify the compose file as follows:
```yaml
---
services:
linuxserver_plex:
image: ghcr.io/linuxserver/plex:latest
container_name: plex
network_mode: host
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=Europe/Paris
- VERSION=docker
- PLEX_CLAIM= #optional
volumes:
- /docker/plex/config:/config
- /docker/plex/transcode:/transcode #optional
- ${MEDIA_PATH}:/media
labels:
- com.centurylinklabs.watchtower.enable=true
restart: unless-stopped
mem_limit: 4096m
mem_reservation: 2048m
devices:
- /dev/dri:/dev/dri
tautulli:
image: lscr.io/linuxserver/tautulli:latest
container_name: tautulli
environment:
- TZ=Europe/Paris
volumes:
- /docker/tautulli/config:/config
ports:
- 8181:8181
restart: unless-stopped
sonarr:
image: lscr.io/linuxserver/sonarr:latest
container_name: sonarr
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=Europe/Paris
volumes:
- /docker/sonarr/config:/config
- ${MEDIA_PATH}:/media
ports:
- 8989:8989
restart: unless-stopped
radarr:
image: lscr.io/linuxserver/radarr:latest
container_name: radarr
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=Europe/Paris
volumes:
- /docker/radarr/config:/config
- ${MEDIA_PATH}:/media
ports:
- 7878:7878
restart: unless-stopped
prowlarr:
image: lscr.io/linuxserver/prowlarr:latest
container_name: prowlarr
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=Europe/Paris
volumes:
- /docker/prowlarr/data:/config
ports:
- 9696:9696
restart: unless-stopped
overseerr:
image: lscr.io/linuxserver/overseerr:latest
container_name: overseerr
dns:
- 1.1.1.1
- 8.8.8.8
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=Europe/Paris
volumes:
- /docker/overseerr/config:/config
ports:
- 5055:5055
restart: unless-stopped
bazarr:
image: lscr.io/linuxserver/bazarr:latest
container_name: bazarr
environment: null
restart: unless-stopped - PUID=1000 - PGID=1000 - TZ=Europe/Paris
volumes:
- /docker/bazarr/config:/config
- ${MEDIA_PATH}:/media
ports:
- 6767:6767
```
::alert{type="success"}
✨ Add the Watchtower label to each container to automate updates
```yaml
services:
plex:
#...
labels:
- com.centurylinklabs.watchtower.enable=true
tautulli:
#...
labels:
- com.centurylinklabs.watchtower.enable=true
```
::
Set your `.env` file with the variables below:
```properties
PUID=
GUID=
MEDIA_PATH=
```
| Variable | Description | Example |
|----------------|-------------------------------------------------------------------------------------------------|-------------|
| `PUID` | Set using your user info (check with `id yourusername`) | `1000` |
| `GUID` | Same as above | `1000` |
| `MEDIA_PATH` | Path to your media folder, here: `/media`. It must match the one used by Qbittorrent. | `/media` |
Deploy the stack.
### Configure Radarr
---
Radarr queries your torrent sources and lets you define the type of releases to prioritize. It can also upgrade your movies if a better version is available.
Once deployed, visit `http://yourserverip:7878`.
::alert{type="danger"}
:::list{type="danger"}
- __If it fails:__ check your firewall rules.
:::
::
Create an account and choose *forms login*.
##### Add a *root folder*
- Go to *Settings > Media Management*.
- Add a root folder and select `/media/movies`.
::alert{type="warning"}
:::list{type="warning"}
- __Warning:__ If you already have movies in `movies` from Qbittorrent, do not let Radarr add them. Radarr might modify them, which could stop seeding in Qbittorrent.
:::
::
##### Configure Profiles
Go to *Settings > Profiles*. These are your default quality profiles. When you make a request, you're selecting one of these. For example, configure the “any” profile by unchecking everything except what is shown in the image and ordering them accordingly. This makes Radarr search for 4K REMUX first, then go down the list if unavailable.
![profiles_radarr](/img/serveex/radarr1.png)
##### Add Qbittorrent
In *Settings > Download Clients*, add Qbittorrent.
- Use your server IP as *Host* and port `5695` if following this guide.
- Provide your Qbittorrent *Username* and *Password*.
- Click *Test*.
- If successful, click *Save*.
##### Connect to Plex
Go to *Settings > Connect*, add a new connection and choose *Plex Media Server*.
- Use `plex` or your server IP for *Host*.
- Port: `32400`
- Click the blue "authenticate with Plex.tv" button and log into Plex.
- Press *Test*, then *Save* if successful.
##### Get API Key for Prowlarr and Overseerr
- Go to *Settings > General* and copy your *API Key* for later use.
### Configure Sonarr
---
Sonarr queries torrent sources and defines what kind of TV series releases to prioritize. It also upgrades series when better versions are available.
- Visit `http://yourserverip:8989`.
- Follow the same steps as for Radarr, but use `/media/tvseries` as the root folder.
::alert{type="danger"}
:::list{type="danger"}
- __If it fails:__ check your firewall rules.
:::
::
### Configure Prowlarr
---
Prowlarr acts as a proxy to manage your torrent indexers and link them to Radarr and Sonarr.
Go to `http://yourserverip:9696` and create an account, using *forms login*.
::alert{type="danger"}
:::list{type="danger"}
- __If it fails:__ check your firewall rules.
:::
::
##### Add an Indexer
- Go to the *Indexers* section and add your torrent indexer.
##### Add Radarr and Sonarr
In *Settings > Apps*, add Radarr and Sonarr with the following details:
- Prowlarr Server: `http://prowlarr:9696` (or use server IP)
- Sonarr / Radarr Server: `http://sonarr:8989` or `http://radarr:7878`
- API Key: use the one copied from Radarr and Sonarr.
- Click *Test*, then *Save* if all goes well.
### Configuring Bazarr
---
Bazarr is an app that automatically searches for the correct subtitles in your preferred languages for all the movies and TV shows added by Radarr and Sonarr.
Go to `http://yourserverip:9696`.
::alert{type="danger"}
:::list{type="danger"}
- __If it fails:__ check your firewall rules.
:::
::
Go to *Settings > General* and create a username and password using *forms login*.
#### Add a Language Profile
- In *Settings > Languages*, click the pink *Add new profile* button and name it.
- Click the pink *Add Languages* button and add your preferred languages, e.g., *French* and *English*.
- Save and exit.
- At the bottom of the screen under *Default Language For Newly Added Show*, check both boxes and select the profile you just created.
![Bazarr](/img/serveex/bazarr2.png)
- Save using the button at the top of the screen.
#### Add Subtitle Providers
- In *Settings > Providers*, add your preferred providers, for example:
![Bazarr](/img/serveex/bazarr.png)
- Save using the button at the top of the screen.
#### Add Radarr and Sonarr
- Go to *Settings > Sonarr*
- In *Address*, enter `sonarr` or your server's IP address.
- In *Port*, enter `8989`.
- In *API Key*, enter Sonarrs API key.
- Click *Test*.
- Save using the button at the top of the screen.
Repeat the same steps for Radarr.
### Configuring Overseerr
---
[Overseerr](https://overseerr.dev/) is an app that lets you browse a movie catalog and send requests to Sonarr and Radarr. Just browse movies or series, click *Request*, and the media will automatically be downloaded according to your Radarr or Sonarr settings. If the title hasnt been released yet, it will be downloaded automatically when available. This way, episodes of a series appear in Plex without any manual intervention.
![Overseerr](/img/serveex/overseerr.webp)
Go to `http://yourserverip:5055` and log in with your Plex account.
::alert{type="danger"}
:::list{type="danger"}
- __If it fails:__ check your firewall rules.
:::
::
#### Add Radarr and Sonarr
When prompted, add a Radarr server:
- Check *Default server*.
- __Server name:__ Radarr
- __Hostname or IP address:__ `radarr` or your server's IP
- __Port:__ `7878`
- __API Key:__ Radarrs API key
- Click *Test* at the bottom.
If the test succeeds, continue filling in the fields:
- __Quality Profile:__ the one you configured (e.g., `any`)
- __Root Folder:__ the Plex folder. In our examples: `/media/movies`
- __Minimum Availability:__ `Announced`. This allows requesting unreleased content and downloads it upon release.
- Check all 3 boxes at the bottom.
- Save and continue.
Now do the same for Sonarr:
- Check *Default server*.
- __Server name:__ Sonarr
- __Hostname or IP address:__ `sonarr` or your server's IP
- __Port:__ `8989`
- __API Key:__ Sonarrs API key
- Click *Test* at the bottom.
If the test succeeds, continue filling in the fields:
- __Quality Profile:__ the one you configured (e.g., `any`)
- __Root Folder:__ the Plex folder. In our examples: `/media/tvseries`
- __Language Profile:__ `Deprecated`
- Check all 4 boxes at the bottom.
- Save and continue.
And thats it! Just request a movie or series, then check in qBittorrent or Radarr/Sonarr. Within a few minutes, your media will be available on Plex!
## Exposing Overseerr with SWAG
---
It can be useful to expose Overseerr if you want to send requests from outside your network without a VPN, or if you've shared your Plex library with others and want them to have Overseerr access.
::alert{type="info"}
:::list{type="info"}
- We assume you have the subdomain `films.mydomain.com` with a `CNAME` pointing to `films.fr` in your [DNS zone](/general/networking/dns). And that [unless youre using Cloudflare Zero Trust](/serveex/security/cloudflare), port `443` on your router is forwarded to port `443` on your server via [NAT rules](/general/networking/nat).
:::
::
Go to Dockge, edit the SWAG compose file, and add the Overseerr network, which is the same as Plex (since its in the Plex stack):
```yaml
services:
swag:
container_name: # ...
# ...
networks: # Connects the container to a custom network
# ...
- plex # Name of the network declared in the stack
networks: # Defines the custom network
# ...
plex: # Name of the declared network
name: plex_default # Actual name of the external network
external: true # Indicates its an external network
```
Restart the stack by clicking “Deploy” and wait until SWAG is fully operational.
::alert{type="info"}
:::list{type="info"}
- Here we assume the Tautulli network is named `plex_default`. You can verify the connection works by visiting the SWAG dashboard at `http://yourserverip:81`.
:::
::
Create and edit the file `films.subdomain.conf`:
::alert{type="success"}
__Tip:__ you can use [File Browser](/serveex/files/file-browser) to browse and edit files instead of using terminal commands.
::
```shell
sudo vi /docker/swag/config/nginx/proxy-confs/films.subdomain.conf
```
Enter insert mode by pressing `i`:
```nginx
## Version 2024/07/16
# make sure that your overseerr container is named overseerr
# make sure that your dns has a cname set for overseerr
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name films.*;
include /config/nginx/ssl.conf;
client_max_body_size 0;
# enable for ldap auth (requires ldap-location.conf in the location block)
#include /config/nginx/ldap-server.conf;
# enable for Authelia (requires authelia-location.conf in the location block)
#include /config/nginx/authelia-server.conf;
# enable for Authentik (requires authentik-location.conf in the location block)
#include /config/nginx/authentik-server.conf;
location / {
# enable the next two lines for http auth
#auth_basic "Restricted";
#auth_basic_user_file /config/nginx/.htpasswd;
# enable for ldap auth (requires ldap-server.conf in the server block)
#include /config/nginx/ldap-location.conf;
# enable for Authelia (requires authelia-server.conf in the server block)
#include /config/nginx/authelia-location.conf;
# enable for Authentik (requires authentik-server.conf in the server block)
#include /config/nginx/authentik-location.conf;
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app overseerr;
set $upstream_port 5055;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
location ~ (/overseerr)?/api {
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app overseerr;
set $upstream_port 5055;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
}
}
```
Press `Escape`, then type `:x` and press `Enter` to save and exit.
Wait a few minutes, then visit `http://films.mydomain.com` in your browser.
::alert{type="danger"}
:::list{type="danger"}
- __If it fails:__ check your firewall rules.
:::
::
And there you go, Overseerr is now publicly accessible!