Switch the media stack from Plex to Jellyfin and Overseerr to Seerr
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
---
|
||||
title: Automation
|
||||
description: Automate media downloads with the Servarr stack — Radarr, Sonarr, Bazarr, Prowlarr, and Overseerr for movies and TV shows.
|
||||
description: Automate media downloads with the Servarr stack, Radarr, Sonarr, Bazarr, Prowlarr, and Seerr, for movies and TV shows.
|
||||
---
|
||||
|
||||
|
||||
@@ -10,13 +10,13 @@ description: Automate media downloads with the Servarr stack — Radarr, Sonarr,
|
||||
::note
|
||||
🎯 __Goals:__
|
||||
|
||||
Automate movie and TV show downloads using Radarr, Sonarr, Bazarr, Prowlarr, and Overseerr.
|
||||
Automate movie and TV show downloads using Radarr, Sonarr, Bazarr, Prowlarr, and Seerr.
|
||||
::
|
||||
|
||||
[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.
|
||||
- Sitting back and enjoying it on Jellyfin a few minutes later.
|
||||
|
||||
Simple.
|
||||
|
||||
@@ -33,11 +33,8 @@ Folder structure:
|
||||
```text [Directory tree]
|
||||
root
|
||||
├── docker
|
||||
│ ├── plex
|
||||
│ ├── jellyfin
|
||||
│ │ ├── compose.yml
|
||||
│ │ ├── config
|
||||
│ │ └── transcode
|
||||
│ ├── tautulli
|
||||
│ │ └── config
|
||||
│ ├── sonarr
|
||||
│ │ └── config
|
||||
@@ -47,7 +44,7 @@ root
|
||||
│ │ └── config
|
||||
│ ├── prowlarr
|
||||
│ │ └── config
|
||||
│ └── overseerr
|
||||
│ └── seerr
|
||||
│ └── config
|
||||
└── media
|
||||
├── downloads
|
||||
@@ -60,53 +57,33 @@ root
|
||||
|
||||
__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.
|
||||
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:
|
||||
Open Docker and your `jellyfin` stack. Modify the compose file as follows:
|
||||
```yaml [compose.yaml]
|
||||
---
|
||||
services:
|
||||
linuxserver_plex:
|
||||
image: ghcr.io/linuxserver/plex:latest
|
||||
container_name: plex
|
||||
network_mode: host
|
||||
jellyfin:
|
||||
image: lscr.io/linuxserver/jellyfin:latest
|
||||
container_name: jellyfin
|
||||
environment:
|
||||
|
||||
- PUID=${PUID}
|
||||
- PGID=${PGID}
|
||||
- TZ=Europe/Paris
|
||||
- VERSION=docker
|
||||
- PLEX_CLAIM= #optional
|
||||
volumes:
|
||||
|
||||
- /docker/plex/config:/config
|
||||
- /docker/plex/transcode:/transcode #optional
|
||||
- /docker/jellyfin/config:/config
|
||||
- ${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
|
||||
|
||||
- 8096:8096
|
||||
|
||||
sonarr:
|
||||
image: lscr.io/linuxserver/sonarr:latest
|
||||
container_name: sonarr
|
||||
@@ -157,21 +134,16 @@ services:
|
||||
- 9696:9696
|
||||
restart: unless-stopped
|
||||
|
||||
overseerr:
|
||||
image: lscr.io/linuxserver/overseerr:latest
|
||||
container_name: overseerr
|
||||
dns:
|
||||
|
||||
- 1.1.1.1
|
||||
- 8.8.8.8
|
||||
seerr:
|
||||
image: ghcr.io/seerr-team/seerr:latest
|
||||
container_name: seerr
|
||||
environment:
|
||||
|
||||
- PUID=${PUID}
|
||||
- PGID=${PGID}
|
||||
- LOG_LEVEL=info
|
||||
- TZ=Europe/Paris
|
||||
volumes:
|
||||
|
||||
- /docker/overseerr/config:/config
|
||||
- /docker/seerr/config:/app/config
|
||||
ports:
|
||||
|
||||
- 5055:5055
|
||||
@@ -200,13 +172,7 @@ services:
|
||||
|
||||
```yaml [compose.yaml]
|
||||
services:
|
||||
plex:
|
||||
#...
|
||||
labels:
|
||||
|
||||
- com.centurylinklabs.watchtower.enable=true
|
||||
|
||||
tautulli:
|
||||
jellyfin:
|
||||
#...
|
||||
labels:
|
||||
|
||||
@@ -228,6 +194,15 @@ MEDIA_PATH=
|
||||
| `GUID` | Same as above | `1000` |
|
||||
| `MEDIA_PATH` | Path to your media folder, here: `/media`. It must match the one used by Qbittorrent. | `/media` |
|
||||
|
||||
::note
|
||||
|
||||
Unlike the other containers here, Seerr's image doesn't use `PUID`/`PGID`; it always runs as UID `1000`. Make sure `/docker/seerr/config` is owned by that user, or Seerr won't be able to write to it:
|
||||
|
||||
```bash [Terminal]
|
||||
sudo chown -R 1000:1000 /docker/seerr/config
|
||||
```
|
||||
::
|
||||
|
||||
Deploy the stack.
|
||||
|
||||
### Configure Radarr
|
||||
@@ -268,16 +243,18 @@ In *Settings > Download Clients*, add Qbittorrent.
|
||||
- Click *Test*.
|
||||
- If successful, click *Save*.
|
||||
|
||||
##### Connect to Plex
|
||||
##### Connect to Jellyfin
|
||||
|
||||
Go to *Settings > Connect*, add a new connection and choose *Plex Media Server*.
|
||||
First, get an API key from Jellyfin: log in as admin, go to *Dashboard > Advanced > API Keys*, and add a new one.
|
||||
|
||||
- Use `plex` or your server IP for *Host*.
|
||||
- Port: `32400`
|
||||
- Click the blue "authenticate with Plex.tv" button and log into Plex.
|
||||
Then, in Radarr, go to *Settings > Connect*, add a new connection and choose *Jellyfin*.
|
||||
|
||||
- Use `jellyfin` or your server IP for *Host*.
|
||||
- Port: `8096`
|
||||
- Paste the API key you generated.
|
||||
- Press *Test*, then *Save* if successful.
|
||||
|
||||
##### Get API Key for Prowlarr and Overseerr
|
||||
##### Get API Key for Prowlarr and Seerr
|
||||
|
||||
- Go to *Settings > General* and copy your *API Key* for later use.
|
||||
|
||||
@@ -358,13 +335,11 @@ Go to *Settings > General* and create a username and password using *forms login
|
||||
|
||||
Repeat the same steps for Radarr.
|
||||
|
||||
### Configuring Overseerr
|
||||
### Configuring Seerr
|
||||
|
||||
[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 hasn’t been released yet, it will be downloaded automatically when available. This way, episodes of a series appear in Plex without any manual intervention.
|
||||
[Seerr](https://seerr.dev/) (the unified successor of Overseerr and Jellyseerr) 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 hasn’t been released yet, it will be downloaded automatically when available. This way, episodes of a series appear in Jellyfin without any manual intervention.
|
||||
|
||||

|
||||
|
||||
Go to `http://yourserverip:5055` and log in with your Plex account.
|
||||
Go to `http://yourserverip:5055`, select *Jellyfin* as your media server, and sign in with your Jellyfin admin account.
|
||||
|
||||
::caution
|
||||
|
||||
@@ -385,7 +360,7 @@ When prompted, add a Radarr server:
|
||||
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`
|
||||
- __Root Folder:__ the Jellyfin 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.
|
||||
@@ -402,46 +377,51 @@ Now do the same for Sonarr:
|
||||
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`
|
||||
- __Root Folder:__ the Jellyfin folder. In our examples: `/media/tvseries`
|
||||
- __Language Profile:__ `Deprecated`
|
||||
- Check all 4 boxes at the bottom.
|
||||
- Save and continue.
|
||||
|
||||
And that’s 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!
|
||||
And that’s it! Just request a movie or series, then check in qBittorrent or Radarr/Sonarr. Within a few minutes, your media will be available on Jellyfin!
|
||||
|
||||
## Exposing Overseerr with SWAG
|
||||
## Exposing Seerr 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.
|
||||
It can be useful to expose Seerr if you want to send requests from outside your network without a VPN, or if you've shared your Jellyfin library with others and want them to have Seerr access.
|
||||
|
||||
::warning
|
||||
|
||||
Seerr has no built-in two-factor authentication. Only expose it if you're using a secure authentication solution like [TinyAuth](/serveex/security/tinyauth) with [Pocket ID](/serveex/security/pocket-id), or [Authentik](/serveex/advanced/authentik). Otherwise, don't expose it with SWAG, use a VPN like [Wireguard](/serveex/security/wireguard) instead.
|
||||
::
|
||||
|
||||
::note
|
||||
|
||||
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 you’re 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 it’s in the Plex stack):
|
||||
Go to Dockge, edit the SWAG compose file, and add the Seerr network, which is the same as Jellyfin (since it’s in the Jellyfin stack):
|
||||
|
||||
```yaml [compose.yaml]
|
||||
services:
|
||||
swag:
|
||||
container_name: # ...
|
||||
# ...
|
||||
networks: # Connects the container to a custom network
|
||||
networks: # Connects the container to a custom network
|
||||
# ...
|
||||
|
||||
- plex # Name of the network declared in the stack
|
||||
- jellyfin # Name of the network declared in the stack
|
||||
|
||||
networks: # Defines the custom network
|
||||
networks: # Defines the custom network
|
||||
# ...
|
||||
plex: # Name of the declared network
|
||||
name: plex_default # Actual name of the external network
|
||||
external: true # Indicates it’s an external network
|
||||
jellyfin: # Name of the declared network
|
||||
name: jellyfin_default # Actual name of the external network
|
||||
external: true # Indicates it’s an external network
|
||||
```
|
||||
|
||||
Restart the stack by clicking “Deploy” and wait until SWAG is fully operational.
|
||||
|
||||
::note
|
||||
|
||||
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`.
|
||||
Here we assume the Jellyfin network is named `jellyfin_default`. You can verify the connection works by visiting the SWAG dashboard at `http://yourserverip:81`.
|
||||
::
|
||||
|
||||
Create and edit the file `films.subdomain.conf`:
|
||||
@@ -458,8 +438,8 @@ Paste the following:
|
||||
|
||||
```nginx [films.subdomain.conf]
|
||||
## Version 2024/07/16
|
||||
# make sure that your overseerr container is named overseerr
|
||||
# make sure that your dns has a cname set for overseerr
|
||||
# make sure that your seerr container is named seerr
|
||||
# make sure that your dns has a cname set for seerr
|
||||
|
||||
server {
|
||||
listen 443 ssl;
|
||||
@@ -496,17 +476,17 @@ server {
|
||||
|
||||
include /config/nginx/proxy.conf;
|
||||
include /config/nginx/resolver.conf;
|
||||
set $upstream_app overseerr;
|
||||
set $upstream_app seerr;
|
||||
set $upstream_port 5055;
|
||||
set $upstream_proto http;
|
||||
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
|
||||
|
||||
}
|
||||
|
||||
location ~ (/overseerr)?/api {
|
||||
location ~ (/seerr)?/api {
|
||||
include /config/nginx/proxy.conf;
|
||||
include /config/nginx/resolver.conf;
|
||||
set $upstream_app overseerr;
|
||||
set $upstream_app seerr;
|
||||
set $upstream_port 5055;
|
||||
set $upstream_proto http;
|
||||
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
|
||||
@@ -524,4 +504,4 @@ Wait a few minutes, then visit `http://films.mydomain.com` in your browser.
|
||||
__If it fails:__ check your firewall rules.
|
||||
::
|
||||
|
||||
And there you go, Overseerr is now publicly accessible!
|
||||
And there you go, Seerr is now publicly accessible!
|
||||
|
||||
Reference in New Issue
Block a user