From 4aae90c78e10bc8d58792ae26dc6edb2093c1df5 Mon Sep 17 00:00:00 2001 From: Jordan Date: Thu, 25 May 2023 13:13:39 -0400 Subject: [PATCH 1/7] Add support for Jellyseerr --- .env.example | 3 ++- docker-compose.yml | 29 +++++++++++++++++++++++++++++ jellyseerr/.gitkeep | 0 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 jellyseerr/.gitkeep diff --git a/.env.example b/.env.example index ff5f0fc..13a6e8e 100644 --- a/.env.example +++ b/.env.example @@ -24,10 +24,11 @@ SONARR_API_KEY= RADARR_API_KEY= PROWLARR_API_KEY= JELLYFIN_API_KEY= +JELLYSEERR_API_KEY= HOMEPAGE_VAR_TITLE="Docker-Compose NAS" HOMEPAGE_VAR_SEARCH_PROVIDER=google HOMEPAGE_VAR_HEADER_STYLE=boxed HOMEPAGE_VAR_WEATHER_CITY= HOMEPAGE_VAR_WEATHER_LAT= HOMEPAGE_VAR_WEATHER_LONG= -HOMEPAGE_VAR_WEATHER_UNIT=metric \ No newline at end of file +HOMEPAGE_VAR_WEATHER_UNIT=metric diff --git a/docker-compose.yml b/docker-compose.yml index 1188dd5..1041d77 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -80,6 +80,35 @@ services: - homepage.widget.type=radarr - homepage.widget.url=http://radarr:7878/radarr - homepage.widget.key=${RADARR_API_KEY} + jellyseerr: + image: fallenbagel/jellyseerr:latest + container_name: jellyseerr + environment: + - LOG_LEVEL=debug + - TZ=${TIMEZONE} + ports: + - 5055:5055 + volumes: + - ./jellyseerr:/app/config + restart: always + labels: + - traefik.enable=true + ## HTTP Routers + - traefik.http.routers.jellyseerr-rtr.rule=Host(`jellyseerr.${HOSTNAME}`) + - traefik.http.routers.jellyseerr-rtr.tls=true + ## HTTP Services + - traefik.http.routers.jellyseerr-rtr.service=jellyseerr-svc + - traefik.http.routers.jellyseerr.tls.certresolver=myresolver + - traefik.http.services.jellyseerr-svc.loadbalancer.server.port=5055 + - homepage.group=Media + - homepage.name=JellySeerr + - homepage.icon=jellyseerr.png + - homepage.href=jellyseerr.${HOSTNAME} + - homepage.description=Content Reccomendations and Request Management + - homepage.weight=2 + - homepage.widget.type=jellyseerr + - homepage.widget.url=http://jellyseerr:5055 + - homepage.widget.key=${JELLYSEERR_API_KEY} prowlarr: image: lscr.io/linuxserver/prowlarr:latest container_name: prowlarr diff --git a/jellyseerr/.gitkeep b/jellyseerr/.gitkeep new file mode 100644 index 0000000..e69de29 From a93f2a0a9bd751dbad2a0c4a9d9dfa6a21185959 Mon Sep 17 00:00:00 2001 From: J Date: Thu, 25 May 2023 13:39:31 -0400 Subject: [PATCH 2/7] Update README.md Update readme to include jellyseer as well as vpn links --- README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1543db9..4832b41 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ I am running it in Ubuntu Server 22.04; I also tested this setup on a [Synology ![Docker-Compose NAS Homepage](https://github.com/AdrienPoupa/docker-compose-nas/assets/15086425/3492a9f6-3779-49a5-b052-4193844f16f0) -## Table of Content +## Table of Contents * [Docker Compose NAS](#docker-compose-nas) @@ -26,6 +26,7 @@ I am running it in Ubuntu Server 22.04; I also tested this setup on a [Synology * [qBittorrent](#qbittorrent) * [Jellyfin](#jellyfin) * [Homepage](#homepage) + * [Jellyseerr](#jellyseerr) * [Traefik and SSL Certificates](#traefik-and-ssl-certificates) * [Accessing from the outside with Tailscale](#accessing-from-the-outside-with-tailscale) * [Optional Services](#optional-services) @@ -89,7 +90,7 @@ If you want to show Jellyfin information in the homepage, create it in Jellyfin | `TIMEZONE` | TimeZone used by the container. | `America/New_York` | | `DATA_ROOT` | Host location of the data files | `/mnt/data` | | `DOWNLOAD_ROOT` | Host download location for qBittorrent, should be a subfolder of `DATA_ROOT` | `/mnt/data/torrents` | -| `PIA_LOCATION` | Servers to use for PIA | `ca` (Montreal, Canada) | +| `PIA_LOCATION` | Servers to use for PIA. [see list here](https://serverlist.piaservers.net/vpninfo/servers/v6) | `ca` (Montreal, Canada) | | `PIA_USER` | PIA username | | | `PIA_PASS` | PIA password | | | `PIA_LOCAL_NETWORK` | PIA local network | `192.168.0.0/16` | @@ -208,6 +209,10 @@ Due to how the Docker socket is configured for the Docker integration, files mus The files in `/homepage/tpl/*.yaml` only serve as a base to set up the homepage configuration on first run. +## Jellyseerr + +Jellyseer gives you content reccomendations, allows others to make requests to you, and allows logging in with jellyfin credentials. + ## Traefik and SSL Certificates While you can use the private IP to access your NAS, how cool would it be for it to be accessible through a subdomain From fff422d821a2b7f3a7fe841098741702b3ffa730 Mon Sep 17 00:00:00 2001 From: J Date: Thu, 25 May 2023 14:04:09 -0400 Subject: [PATCH 3/7] Update .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index b3d93cd..e59ea94 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,8 @@ docker-compose.override.yml !/letsencrypt/.gitkeep /jellyfin !/jellyfin/.gitkeep +/jellyseerr +!/jellyseerr/.gitkeep /adguardhome/certs /adguardhome/conf !/adguardhome/conf/.gitkeep From 3b27e1ab3e12fe7d0b3ed72d1721c47b36f4b506 Mon Sep 17 00:00:00 2001 From: Jordan Date: Thu, 25 May 2023 15:08:12 -0400 Subject: [PATCH 4/7] PR fixes --- docker-compose.yml | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 1041d77..648bd37 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -86,25 +86,20 @@ services: environment: - LOG_LEVEL=debug - TZ=${TIMEZONE} - ports: - - 5055:5055 volumes: - ./jellyseerr:/app/config restart: always labels: - traefik.enable=true - ## HTTP Routers - - traefik.http.routers.jellyseerr-rtr.rule=Host(`jellyseerr.${HOSTNAME}`) - - traefik.http.routers.jellyseerr-rtr.tls=true - ## HTTP Services - - traefik.http.routers.jellyseerr-rtr.service=jellyseerr-svc + - traefik.http.routers.jellyseerr.rule=Host(`jellyseerr.${HOSTNAME}`) + - traefik.http.routers.jellyseerr.tls=true - traefik.http.routers.jellyseerr.tls.certresolver=myresolver - - traefik.http.services.jellyseerr-svc.loadbalancer.server.port=5055 + - traefik.http.services.jellyseerr.loadbalancer.server.port=5055 - homepage.group=Media - homepage.name=JellySeerr - homepage.icon=jellyseerr.png - - homepage.href=jellyseerr.${HOSTNAME} - - homepage.description=Content Reccomendations and Request Management + - homepage.href=http://jellyseerr.${HOSTNAME} + - homepage.description=Content Recommendations and Request Management - homepage.weight=2 - homepage.widget.type=jellyseerr - homepage.widget.url=http://jellyseerr:5055 From 07f58ccf9ba5c159b304c0bf23b38a75df40a777 Mon Sep 17 00:00:00 2001 From: Jordan Date: Thu, 25 May 2023 16:44:43 -0400 Subject: [PATCH 5/7] Extract qbittorrent creds into env vars --- .env.example | 2 ++ docker-compose.yml | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.env.example b/.env.example index 13a6e8e..81ec322 100644 --- a/.env.example +++ b/.env.example @@ -13,6 +13,8 @@ HOSTNAME=localhost ADGUARD_HOSTNAME= ADGUARD_USERNAME= ADGUARD_PASSWORD= +QBITTORRENT_USERNAME=admin +QBITTORRENT_PASSWORD=adminadmin DNS_CHALLENGE=true DNS_CHALLENGE_PROVIDER=cloudflare LETS_ENCRYPT_CA_SERVER="https://acme-v02.api.letsencrypt.org/directory" diff --git a/docker-compose.yml b/docker-compose.yml index 648bd37..14d3083 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -167,8 +167,8 @@ services: - homepage.weight=5 - homepage.widget.type=qbittorrent - homepage.widget.url=http://vpn:8080 - - homepage.widget.username=admin - - homepage.widget.password=adminadmin + - homepage.widget.username=${QBITTORRENT_USERNAME} + - homepage.widget.password=${QBITTORRENT_PASSWORD} vpn: image: thrnz/docker-wireguard-pia container_name: vpn From 7400616dcd3885d9af26dd6a7e7669686c735f5d Mon Sep 17 00:00:00 2001 From: Adrien Poupa Date: Sun, 28 May 2023 12:14:09 -0400 Subject: [PATCH 6/7] doc: add documentation for Jellyseer --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4832b41..4d05270 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ I am running it in Ubuntu Server 22.04; I also tested this setup on a [Synology * [Docker Compose NAS](#docker-compose-nas) - * [Table of Content](#table-of-content) + * [Table of Contents](#table-of-contents) * [Applications](#applications) * [Quick Start](#quick-start) * [Environment Variables](#environment-variables) @@ -59,6 +59,7 @@ I am running it in Ubuntu Server 22.04; I also tested this setup on a [Synology | [PIA WireGuard VPN](https://github.com/thrnz/docker-wireguard-pia) | Encapsulate qBittorrent traffic in [PIA](https://www.privateinternetaccess.com/) using [WireGuard](https://www.wireguard.com/) with port forwarding. | [thrnz/docker-wireguard-pia](https://hub.docker.com/r/thrnz/docker-wireguard-pia) | | | [qBittorrent](https://www.qbittorrent.org) | Bittorrent client with a complete web UI
Uses VPN network
Using Libtorrent 1.x | [linuxserver/qbittorrent:libtorrentv1](https://hub.docker.com/r/linuxserver/qbittorrent) | /qbittorrent | | [Jellyfin](https://jellyfin.org) | Media server designed to organize, manage, and share digital media files to networked devices | [linuxserver/jellyfin](https://hub.docker.com/r/linuxserver/jellyfin) | /jellyfin | +| [Jellyseer](https://jellyfin.org) | Manages requests for your media library | [fallenbagel/jellyseerr](https://hub.docker.com/r/fallenbagel/jellyseerr) | /jellyseer | | [Homepage](https://gethomepage.dev) | Application dashboard | [benphelps/homepage](https://github.com/benphelps/homepage/pkgs/container/homepage) | / | | [Traefik](https://traefik.io) | Reverse proxy | [traefik](https://hub.docker.com/_/traefik) | | | [Watchtower](https://containrrr.dev/watchtower/) | Automated Docker images update | [containrrr/watchtower](https://hub.docker.com/r/containrrr/watchtower) | | @@ -90,7 +91,7 @@ If you want to show Jellyfin information in the homepage, create it in Jellyfin | `TIMEZONE` | TimeZone used by the container. | `America/New_York` | | `DATA_ROOT` | Host location of the data files | `/mnt/data` | | `DOWNLOAD_ROOT` | Host download location for qBittorrent, should be a subfolder of `DATA_ROOT` | `/mnt/data/torrents` | -| `PIA_LOCATION` | Servers to use for PIA. [see list here](https://serverlist.piaservers.net/vpninfo/servers/v6) | `ca` (Montreal, Canada) | +| `PIA_LOCATION` | Servers to use for PIA. [see list here](https://serverlist.piaservers.net/vpninfo/servers/v6) | `ca` (Montreal, Canada) | | `PIA_USER` | PIA username | | | `PIA_PASS` | PIA password | | | `PIA_LOCAL_NETWORK` | PIA local network | `192.168.0.0/16` | @@ -98,6 +99,8 @@ If you want to show Jellyfin information in the homepage, create it in Jellyfin | `ADGUARD_HOSTNAME` | Optional - AdGuard Home hostname used, if enabled | | | `ADGUARD_USERNAME` | Optional - AdGuard Home username to show details in the homepage, if enabled | | | `ADGUARD_PASSWORD` | Optional - AdGuard Home password to show details in the homepage, if enabled | | +| `QBITTORRENT_USERNAME` | qBittorrent username to access the web UI | `admin` | +| `QBITTORRENT_PASSWORD` | qBittorrent password to access the web UI | `adminadmin` | | `DNS_CHALLENGE` | Enable/Disable DNS01 challenge, set to `false` to disable. | `true` | | `DNS_CHALLENGE_PROVIDER` | Provider for DNS01 challenge, [see list here](https://doc.traefik.io/traefik/https/acme/#providers). | `cloudflare` | | `LETS_ENCRYPT_CA_SERVER` | Let's Encrypt CA Server used to generate certificates, set to production by default.
Set to `https://acme-staging-v02.api.letsencrypt.org/directory` to test your changes with the staging server. | `https://acme-v02.api.letsencrypt.org/directory` | @@ -109,6 +112,7 @@ If you want to show Jellyfin information in the homepage, create it in Jellyfin | `RADARR_API_KEY` | Radarr API key to show information in the homepage | | | `PROWLARR_API_KEY` | Prowlarr API key to show information in the homepage | | | `JELLYFIN_API_KEY` | Jellyfin API key to show information in the homepage | | +| `JELLYSEERR_API_KEY` | Jellyseer API key to show information in the homepage | | | `HOMEPAGE_VAR_TITLE` | Title of the homepage | `Docker-Compose NAS` | | `HOMEPAGE_VAR_SEARCH_PROVIDER` | Homepage search provider, [see list here](https://gethomepage.dev/en/widgets/search/) | `google` | | `HOMEPAGE_VAR_HEADER_STYLE` | Homepage header style, [see list here](https://gethomepage.dev/en/configs/settings/#header-style) | `boxed` | From b1935bdc1eed946ad45929f17e0464801d770aa3 Mon Sep 17 00:00:00 2001 From: Adrien Poupa Date: Thu, 1 Jun 2023 00:20:58 -0400 Subject: [PATCH 7/7] feat: Add subfolder support for Jellyseerr --- README.md | 13 +++++++++++- docker-compose.yml | 49 ++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 59 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4d05270..20bb35a 100644 --- a/README.md +++ b/README.md @@ -215,7 +215,18 @@ The files in `/homepage/tpl/*.yaml` only serve as a base to set up the homepage ## Jellyseerr -Jellyseer gives you content reccomendations, allows others to make requests to you, and allows logging in with jellyfin credentials. +Jellyseer gives you content recommendations, allows others to make requests to you, and allows logging in with Jellyfin credentials. + +To setup, go to https://hostname/jellyseerr/setup, and set the URLs as follows: +- Jellyfin: http://jellyfin:8096/jellyfin +- Radarr: + - Hostname: radarr + - Port: 7878 + - URL Base: /radarr +- Sonarr + - Hostname: sonarr + - Port: 8989 + - URL Base: /sonarr ## Traefik and SSL Certificates diff --git a/docker-compose.yml b/docker-compose.yml index 14d3083..10a1532 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -17,6 +17,10 @@ services: - --entrypoints.web.http.redirections.entryPoint.to=web-secure - --entrypoints.web.http.redirections.entryPoint.scheme=https - --entrypoints.web.http.redirections.entrypoint.permanent=true + - --experimental.plugins.rewrite-body.modulename=github.com/packruler/rewrite-body + - --experimental.plugins.rewrite-body.version=v1.2.0 + - --experimental.plugins.rewriteHeaders.modulename=github.com/XciD/traefik-plugin-rewrite-headers + - --experimental.plugins.rewriteHeaders.version=v0.0.3 - --certificatesresolvers.myresolver.acme.dnschallenge=${DNS_CHALLENGE:-true} - --certificatesresolvers.myresolver.acme.dnschallenge.provider=${DNS_CHALLENGE_PROVIDER:-cloudflare} - --certificatesresolvers.myresolver.acme.caserver=${LETS_ENCRYPT_CA_SERVER:-https://acme-v02.api.letsencrypt.org/directory} @@ -91,14 +95,55 @@ services: restart: always labels: - traefik.enable=true - - traefik.http.routers.jellyseerr.rule=Host(`jellyseerr.${HOSTNAME}`) + - traefik.http.routers.jellyseerr.rule=(Host(`${HOSTNAME}`) && PathPrefix(`/jellyseerr`)) - traefik.http.routers.jellyseerr.tls=true - traefik.http.routers.jellyseerr.tls.certresolver=myresolver - traefik.http.services.jellyseerr.loadbalancer.server.port=5055 + - traefik.http.routers.jellyseerr.middlewares=jellyseerr-stripprefix,jellyseerr-rewrite,jellyseerr-rewriteHeaders + - traefik.http.middlewares.jellyseerr-stripprefix.stripPrefix.prefixes=/jellyseerr + - traefik.http.middlewares.jellyseerr-rewriteHeaders.plugin.rewriteHeaders.rewrites[0].header=location + - traefik.http.middlewares.jellyseerr-rewriteHeaders.plugin.rewriteHeaders.rewrites[0].regex=^/(.+)$ + - traefik.http.middlewares.jellyseerr-rewriteHeaders.plugin.rewriteHeaders.rewrites[0].replacement=/jellyseerr/$1 + - traefik.http.middlewares.jellyseerr-rewriteHeaders.plugin.rewriteHeaders.rewrites[1].header=location + - traefik.http.middlewares.jellyseerr-rewriteHeaders.plugin.rewriteHeaders.rewrites[1].regex=^/$ + - traefik.http.middlewares.jellyseerr-rewriteHeaders.plugin.rewriteHeaders.rewrites[1].replacement=/jellyseerr + - traefik.http.middlewares.jellyseerr-rewrite.plugin.rewrite-body.monitoring.types[0]=text/html + - traefik.http.middlewares.jellyseerr-rewrite.plugin.rewrite-body.monitoring.types[1]=application/javascript + - traefik.http.middlewares.jellyseerr-rewrite.plugin.rewrite-body.monitoring.types[2]=*/* + - traefik.http.middlewares.jellyseerr-rewrite.plugin.rewrite-body.rewrites[1].regex=/_next + - traefik.http.middlewares.jellyseerr-rewrite.plugin.rewrite-body.rewrites[1].replacement=/jellyseerr/_next + - traefik.http.middlewares.jellyseerr-rewrite.plugin.rewrite-body.rewrites[2].regex=\/_next\\/data\\// + - traefik.http.middlewares.jellyseerr-rewrite.plugin.rewrite-body.rewrites[2].replacement=\/jellyseerr\/_next\/data\// + - traefik.http.middlewares.jellyseerr-rewrite.plugin.rewrite-body.rewrites[3].regex=/api/v1 + - traefik.http.middlewares.jellyseerr-rewrite.plugin.rewrite-body.rewrites[3].replacement=/jellyseerr/api/v1 + - traefik.http.middlewares.jellyseerr-rewrite.plugin.rewrite-body.rewrites[4].regex=/login/plex/loading + - traefik.http.middlewares.jellyseerr-rewrite.plugin.rewrite-body.rewrites[4].replacement=/jellyseerr/login/plex/loading + - traefik.http.middlewares.jellyseerr-rewrite.plugin.rewrite-body.rewrites[5].regex=/images/ + - traefik.http.middlewares.jellyseerr-rewrite.plugin.rewrite-body.rewrites[5].replacement=/jellyseerr/images/ + - traefik.http.middlewares.jellyseerr-rewrite.plugin.rewrite-body.rewrites[6].regex=/favicon + - traefik.http.middlewares.jellyseerr-rewrite.plugin.rewrite-body.rewrites[6].replacement=/jellyseerr/favicon + - traefik.http.middlewares.jellyseerr-rewrite.plugin.rewrite-body.rewrites[7].regex=/logo_ + - traefik.http.middlewares.jellyseerr-rewrite.plugin.rewrite-body.rewrites[7].replacement=/jellyseerr/logo_ + - traefik.http.middlewares.jellyseerr-rewrite.plugin.rewrite-body.rewrites[8].regex=/site.webmanifest + - traefik.http.middlewares.jellyseerr-rewrite.plugin.rewrite-body.rewrites[8].replacement=/jellyseerr/site.webmanifest + - traefik.http.middlewares.jellyseerr-rewrite.plugin.rewrite-body.rewrites[9].regex=/sw.js + - traefik.http.middlewares.jellyseerr-rewrite.plugin.rewrite-body.rewrites[9].replacement=/jellyseerr/sw.js + - traefik.http.middlewares.jellyseerr-rewrite.plugin.rewrite-body.rewrites[10].regex=/offline.html + - traefik.http.middlewares.jellyseerr-rewrite.plugin.rewrite-body.rewrites[10].replacement=/jellyseerr/offline.html + - traefik.http.middlewares.jellyseerr-rewrite.plugin.rewrite-body.rewrites[11].regex=src="/os_logo_square.png" + - traefik.http.middlewares.jellyseerr-rewrite.plugin.rewrite-body.rewrites[11].replacement=src="/jellyseerr/os_logo_square.png" + - traefik.http.middlewares.jellyseerr-rewrite.plugin.rewrite-body.rewrites[12].regex=href="/(.*)" + - traefik.http.middlewares.jellyseerr-rewrite.plugin.rewrite-body.rewrites[12].replacement=href="/jellyseerr/$1" + - traefik.http.middlewares.jellyseerr-rewrite.plugin.rewrite-body.rewrites[13].regex=linkUrl:"/(.*)" + - traefik.http.middlewares.jellyseerr-rewrite.plugin.rewrite-body.rewrites[13].replacement=linkUrl:"/jellyseerr/$1" + - traefik.http.middlewares.jellyseerr-rewrite.plugin.rewrite-body.rewrites[14].regex="/([a-z]+)/".concat + - traefik.http.middlewares.jellyseerr-rewrite.plugin.rewrite-body.rewrites[14].replacement="/jellyseerr/$1/".concat + - traefik.http.middlewares.jellyseerr-rewrite.plugin.rewrite-body.rewrites[15].regex=url:"/(.*)" + - traefik.http.middlewares.jellyseerr-rewrite.plugin.rewrite-body.rewrites[15].replacement=url:"/jellyseerr/$1" - homepage.group=Media - homepage.name=JellySeerr - homepage.icon=jellyseerr.png - - homepage.href=http://jellyseerr.${HOSTNAME} + - homepage.href=/jellyseerr - homepage.description=Content Recommendations and Request Management - homepage.weight=2 - homepage.widget.type=jellyseerr