diff --git a/.env.example b/.env.example index ff5f0fc..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" @@ -24,10 +26,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/.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 diff --git a/README.md b/README.md index 1543db9..20bb35a 100644 --- a/README.md +++ b/README.md @@ -10,11 +10,11 @@ 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) - * [Table of Content](#table-of-content) + * [Table of Contents](#table-of-contents) * [Applications](#applications) * [Quick Start](#quick-start) * [Environment Variables](#environment-variables) @@ -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) @@ -58,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) | | @@ -89,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 | `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` | @@ -97,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` | @@ -108,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` | @@ -208,6 +213,21 @@ 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 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 While you can use the private IP to access your NAS, how cool would it be for it to be accessible through a subdomain diff --git a/docker-compose.yml b/docker-compose.yml index 968015d..31256a4 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.dnschallenge.resolvers=1.1.1.1:53,8.8.8.8:53 @@ -81,6 +85,71 @@ 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} + volumes: + - ./jellyseerr:/app/config + restart: always + labels: + - traefik.enable=true + - 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=/jellyseerr + - homepage.description=Content Recommendations 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 @@ -144,8 +213,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 diff --git a/jellyseerr/.gitkeep b/jellyseerr/.gitkeep new file mode 100644 index 0000000..e69de29