From dd8948d9088441e81b41108bdc471e79fd18ee64 Mon Sep 17 00:00:00 2001 From: azpsen Date: Mon, 6 Jan 2025 09:54:48 -0600 Subject: [PATCH] reorganize containers --- docker-compose.yml | 654 ++++++++++++++++++++++----------------------- readme.md | 48 ++-- 2 files changed, 351 insertions(+), 351 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 24b1057..0c02eb9 100755 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,146 +3,6 @@ services: #---------------- USER-FACING SERVICES ----------------# - ## Jellyfin (media server) - jellyfin: - image: lscr.io/linuxserver/jellyfin:latest - container_name: jellyfin - environment: - - PUID=1000 - - PGID=1000 - - TZ=America/Chicago - - JELLYFIN_PublishedServerUrl=https://watch.azpsen.com - volumes: - - /docker/jellyfin:/config - - /docker/jellyfin/theme:/usr/share/jellyfin/web/theme - - /media/jellyfin/Movies:/data/movies - - /media/jellyfin/TV Shows:/data/tvshows - - /media/jellyfin/Music:/data/music - - /media/jellyfin/Live TV:/data/livetv - ports: - - 8096:8096 - - 7539:7539/udp - - 1900:1900/udp - devices: - - /dev/dri:/dev/dri - dns: - - 100.111.0.126 - restart: unless-stopped - - ## Miniflux (rss feed reader) - miniflux: - image: miniflux/miniflux:latest - container_name: miniflux - ports: - - 8772:8080 - depends_on: - rss_db: - condition: service_healthy - env_file: - - /docker/env/miniflux.env - healthcheck: - test: ["CMD", "/usr/bin/miniflux", "-healthcheck", "auto"] - dns: - - 100.111.0.126 - restart: unless-stopped - rss_db: - image: postgres:15 - container_name: rss_db - env_file: - - /docker/env/miniflux.env - volumes: - - miniflux-db:/var/lib/postgresql/data - healthcheck: - test: ["CMD", "pg_isready", "-U", "miniflux"] - interval: 10s - start_period: 30s - restart: unless-stopped - - ## Vaultwarden (password manager) - vaultwarden: - image: vaultwarden/server:latest - container_name: vaultwarden - env_file: - - /docker/env/vaultwarden.env - volumes: - - /docker/vaultwarden:/data - ports: - - 8912:80 - dns: - - 100.111.0.126 - restart: unless-stopped - - ## Gitea - gitea: - image: docker.io/gitea/gitea:latest-rootless - container_name: gitea - user: "1001" - volumes: - - /docker/gitea/data:/var/lib/gitea - - /docker/gitea/config:/etc/gitea - - /etc/timezone:/etc/timezone:ro - - /etc/localtime:/etc/localtime:ro - ports: - - 3003:3000 - - 2222:2222 - dns: - - 100.111.0.126 - restart: unless-stopped - - ## Link Stack - linkstack: - image: linkstackorg/linkstack - container_name: linkstack - env_file: - - /docker/env/linkstack.env - ports: - - 4000:80 - dns: - - 100.111.0.126 - volumes: - - linkstack:/htdocs - restart: unless-stopped - - ## Server Dashboard - dashboard: - image: ghcr.io/gethomepage/homepage:latest - container_name: dashboard - environment: - - PUID=1000 - - PGID=1000 - ports: - - 3000:3000 - volumes: - - /docker/dashboard:/app/config - - /docker/dashboard/images:/app/public/images - - /docker/dashboard/fonts:/app/public/fonts - - /media:/media:ro - dns: - - 100.111.0.126 - restart: unless-stopped - docker-proxy: - image: ghcr.io/tecnativa/docker-socket-proxy:latest - container_name: docker-proxy - environment: - - CONTAINERS=1 # Allow access to viewing containers - - POST=0 # Disallow any POST operations (effectively read-only) - ports: - - 2375:2375 - volumes: - - /var/run/docker.sock:/var/run/docker.sock:ro - restart: unless-stopped - - ## Kiwix (offline wiki) - kiwix-serve: - image: ghcr.io/kiwix/kiwix-serve - container_name: kiwix-serve - volumes: - - /media/kiwix:/data - ports: - - 8765:8080 - command: '*.zim' - restart: unless-stopped - ## Actual (budget) actual_server: image: docker.io/actualbudget/actual-server:latest @@ -155,129 +15,6 @@ services: - 100.111.0.126 restart: unless-stopped - ## Paperless (document management) - paperless: - image: ghcr.io/paperless-ngx/paperless-ngx:latest - container_name: paperless - user: 1000:1000 - depends_on: - - paperless_broker - ports: - - 8143:8000 - volumes: - - paperless-data:/usr/src/paperless/data - - paperless-media:/usr/src/paperless/media - - /docker/paperless/export:/usr/src/paperless/export - - /docker/paperless/consume:/usr/src/paperless/consume - env_file: - - /docker/env/paperless.env - restart: unless-stopped - paperless_broker: - image: docker.io/library/redis:7 - container_name: paperless_broker - volumes: - - redis-data:/data - restart: unless-stopped - - ## Immich (photo library management) - immich-server: - container_name: immich_server - image: ghcr.io/immich-app/immich-server:v1.123.0 - volumes: - - /media/immich:/usr/src/app/upload - - /docker/immich_db_dump:/db_dump - env_file: - - /docker/env/immich.env - environment: - - PUID=1000 - - PGID=1000 - ports: - - 2283:2283 - depends_on: - - redis - - database - devices: - - /dev/dri:/dev/dri - dns: - - 100.111.0.126 - restart: unless-stopped - immich-machine-learning: - container_name: immich_machine_learning - image: ghcr.io/immich-app/immich-machine-learning:v1.123.0 - volumes: - - model-cache:/cache - env_file: - - /docker/env/immich.env - restart: unless-stopped - redis: - container_name: immich_redis - image: redis:6.2-alpine@sha256:70a7a5b641117670beae0d80658430853896b5ef269ccf00d1827427e3263fa3 - restart: unless-stopped - database: - container_name: immich_postgres - image: tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0 - env_file: - - /docker/env/immich.env - volumes: - - /docker/immich:/var/lib/postgresql/data - restart: unless-stopped - - ## Grocy (home inventory management) - grocy: - container_name: grocy - image: lscr.io/linuxserver/grocy:latest - environment: - - PUID=1000 - - PGID=1000 - - TZ=America/Chicago - volumes: - - /docker/grocy:/config - ports: - - 9283:80 - restart: unless-stopped - - ## Tandoor (recipe management) - tandoor: - container_name: tandoor - image: vabene1111/recipes - user: 1000:1000 - env_file: - - /docker/env/tandoor.env - volumes: - - tandoor-server-config:/opt/recipes/nginx/conf.d - - /docker/tandoor/static:/opt/recipes/staticfiles - - /docker/tandoor/media:/opt/recipes/mediafiles - depends_on: - - tandoor-db - dns: - - 100.111.0.126 - restart: unless-stopped - tandoor-server: - image: nginx:mainline-alpine - container_name: tandoor-server - ports: - - 8554:80 - env_file: - - /docker/env/tandoor.env - volumes: - - tandoor-server-config:/etc/nginx/conf.d:ro - - /docker/tandoor/static:/static:ro - - /docker/tandoor/media:/media:ro - depends_on: - - tandoor - dns: - - 100.111.0.126 - restart: unless-stopped - tandoor-db: - container_name: tandoor-db - image: postgres:16-alpine - user: 1000:1000 - env_file: - - /docker/env/tandoor.env - volumes: - - /docker/tandoor/postgresql:/var/lib/postgresql/data - restart: unless-stopped - ## AudioBookShelf (audiobook downloading) audiobookshelf: container_name: audiobookshelf @@ -324,6 +61,135 @@ services: - 100.111.0.126 restart: unless-stopped + ## Gitea + gitea: + image: docker.io/gitea/gitea:latest-rootless + container_name: gitea + user: "1001" + volumes: + - /docker/gitea/data:/var/lib/gitea + - /docker/gitea/config:/etc/gitea + - /etc/timezone:/etc/timezone:ro + - /etc/localtime:/etc/localtime:ro + ports: + - 3003:3000 + - 2222:2222 + dns: + - 100.111.0.126 + restart: unless-stopped + + ## Grocy (home inventory management) + grocy: + container_name: grocy + image: lscr.io/linuxserver/grocy:latest + environment: + - PUID=1000 + - PGID=1000 + - TZ=America/Chicago + volumes: + - /docker/grocy:/config + ports: + - 9283:80 + restart: unless-stopped + + ## Homepage (server dashboard) + homepage: + image: ghcr.io/gethomepage/homepage:latest + container_name: dashboard + environment: + - PUID=1000 + - PGID=1000 + ports: + - 3000:3000 + volumes: + - /docker/dashboard:/app/config + - /docker/dashboard/images:/app/public/images + - /docker/dashboard/fonts:/app/public/fonts + - /media:/media:ro + dns: + - 100.111.0.126 + restart: unless-stopped + docker-proxy: + image: ghcr.io/tecnativa/docker-socket-proxy:latest + container_name: docker-proxy + environment: + - CONTAINERS=1 # Allow access to viewing containers + - POST=0 # Disallow any POST operations (effectively read-only) + ports: + - 2375:2375 + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + restart: unless-stopped + + ## Immich (photo library management) + immich-server: + container_name: immich_server + image: ghcr.io/immich-app/immich-server:v1.123.0 + volumes: + - /media/immich:/usr/src/app/upload + - /docker/immich_db_dump:/db_dump + env_file: + - /docker/env/immich.env + environment: + - PUID=1000 + - PGID=1000 + ports: + - 2283:2283 + depends_on: + - redis + - database + devices: + - /dev/dri:/dev/dri + dns: + - 100.111.0.126 + restart: unless-stopped + immich-machine-learning: + container_name: immich_machine_learning + image: ghcr.io/immich-app/immich-machine-learning:v1.123.0 + volumes: + - model-cache:/cache + env_file: + - /docker/env/immich.env + restart: unless-stopped + redis: + container_name: immich_redis + image: redis:6.2-alpine@sha256:70a7a5b641117670beae0d80658430853896b5ef269ccf00d1827427e3263fa3 + restart: unless-stopped + database: + container_name: immich_postgres + image: tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0 + env_file: + - /docker/env/immich.env + volumes: + - /docker/immich:/var/lib/postgresql/data + restart: unless-stopped + + ## Jellyfin (media server) + jellyfin: + image: lscr.io/linuxserver/jellyfin:latest + container_name: jellyfin + environment: + - PUID=1000 + - PGID=1000 + - TZ=America/Chicago + - JELLYFIN_PublishedServerUrl=https://watch.azpsen.com + volumes: + - /docker/jellyfin:/config + - /docker/jellyfin/theme:/usr/share/jellyfin/web/theme + - /media/jellyfin/Movies:/data/movies + - /media/jellyfin/TV Shows:/data/tvshows + - /media/jellyfin/Music:/data/music + - /media/jellyfin/Live TV:/data/livetv + ports: + - 8096:8096 + - 7539:7539/udp + - 1900:1900/udp + devices: + - /dev/dri:/dev/dri + dns: + - 100.111.0.126 + restart: unless-stopped + ## Joplin (notes) joplin: image: joplin/server:latest @@ -350,6 +216,140 @@ services: - POSTGRES_DB=joplin restart: unless-stopped + ## Kiwix (offline wiki) + kiwix-serve: + image: ghcr.io/kiwix/kiwix-serve + container_name: kiwix-serve + volumes: + - /media/kiwix:/data + ports: + - 8765:8080 + command: '*.zim' + restart: unless-stopped + + ## Link Stack + linkstack: + image: linkstackorg/linkstack + container_name: linkstack + env_file: + - /docker/env/linkstack.env + ports: + - 4000:80 + dns: + - 100.111.0.126 + volumes: + - linkstack:/htdocs + restart: unless-stopped + + ## Miniflux (rss feed reader) + miniflux: + image: miniflux/miniflux:latest + container_name: miniflux + ports: + - 8772:8080 + depends_on: + rss_db: + condition: service_healthy + env_file: + - /docker/env/miniflux.env + healthcheck: + test: ["CMD", "/usr/bin/miniflux", "-healthcheck", "auto"] + dns: + - 100.111.0.126 + restart: unless-stopped + rss_db: + image: postgres:15 + container_name: rss_db + env_file: + - /docker/env/miniflux.env + volumes: + - miniflux-db:/var/lib/postgresql/data + healthcheck: + test: ["CMD", "pg_isready", "-U", "miniflux"] + interval: 10s + start_period: 30s + restart: unless-stopped + + ## Paperless (document management) + paperless: + image: ghcr.io/paperless-ngx/paperless-ngx:latest + container_name: paperless + user: 1000:1000 + depends_on: + - paperless_broker + ports: + - 8143:8000 + volumes: + - paperless-data:/usr/src/paperless/data + - paperless-media:/usr/src/paperless/media + - /docker/paperless/export:/usr/src/paperless/export + - /docker/paperless/consume:/usr/src/paperless/consume + env_file: + - /docker/env/paperless.env + restart: unless-stopped + paperless_broker: + image: docker.io/library/redis:7 + container_name: paperless_broker + volumes: + - redis-data:/data + restart: unless-stopped + + ## Tandoor (recipe management) + tandoor: + container_name: tandoor + image: vabene1111/recipes + user: 1000:1000 + env_file: + - /docker/env/tandoor.env + volumes: + - tandoor-server-config:/opt/recipes/nginx/conf.d + - /docker/tandoor/static:/opt/recipes/staticfiles + - /docker/tandoor/media:/opt/recipes/mediafiles + depends_on: + - tandoor-db + dns: + - 100.111.0.126 + restart: unless-stopped + tandoor-server: + image: nginx:mainline-alpine + container_name: tandoor-server + ports: + - 8554:80 + env_file: + - /docker/env/tandoor.env + volumes: + - tandoor-server-config:/etc/nginx/conf.d:ro + - /docker/tandoor/static:/static:ro + - /docker/tandoor/media:/media:ro + depends_on: + - tandoor + dns: + - 100.111.0.126 + restart: unless-stopped + tandoor-db: + container_name: tandoor-db + image: postgres:16-alpine + user: 1000:1000 + env_file: + - /docker/env/tandoor.env + volumes: + - /docker/tandoor/postgresql:/var/lib/postgresql/data + restart: unless-stopped + + ## Vaultwarden (password manager) + vaultwarden: + image: vaultwarden/server:latest + container_name: vaultwarden + env_file: + - /docker/env/vaultwarden.env + volumes: + - /docker/vaultwarden:/data + ports: + - 8912:80 + dns: + - 100.111.0.126 + restart: unless-stopped + #---------------- MONITORING ----------------# @@ -363,6 +363,23 @@ services: - 9999:8080 restart: unless-stopped + ## Glances (system monitor) + glances: + image: nicolargo/glances:latest + container_name: glances + pid: host + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - /:/glances/root:ro + environment: + - "GLANCES_OPT=-w" + ports: + - 61208:61208 + secrets: + - source: glances_password + target: /root/.config/glances/glances.pwd + restart: unless-stopped + ## Scrutiny (disk health monitoring) scrutiny: container_name: scrutiny @@ -398,26 +415,27 @@ services: - 100.111.0.126 restart: unless-stopped - ## Glances (system monitor) - glances: - image: nicolargo/glances:latest - container_name: glances - pid: host - volumes: - - /var/run/docker.sock:/var/run/docker.sock - - /:/glances/root:ro - environment: - - "GLANCES_OPT=-w" - ports: - - 61208:61208 - secrets: - - source: glances_password - target: /root/.config/glances/glances.pwd - restart: unless-stopped - #---------------- NETWORKING ----------------# + ## AdGuard Home (ad-blocking dns provider) + adguard: + image: adguard/adguardhome + container_name: adguard + network_mode: host + ports: + - 53:53/tcp + - 53:53/udp + - 784:784/udp + - 853:853/tcp + - 3000:3000/tcp + - 80:80/tcp + - 443:443/tcp + volumes: + - /docker/adguard/working:/opt/adguardhome/work + - /docker/adguard/conf:/opt/adguardhome/conf + restart: unless-stopped + ## Cloudflared (tunnel service for outside web access) cloudflared: container_name: cloudflared @@ -462,27 +480,38 @@ services: - /docker/env/gluetun.env restart: unless-stopped - ## AdGuard Home (ad-blocking dns provider) - adguard: - image: adguard/adguardhome - container_name: adguard - network_mode: host - ports: - - 53:53/tcp - - 53:53/udp - - 784:784/udp - - 853:853/tcp - - 3000:3000/tcp - - 80:80/tcp - - 443:443/tcp - volumes: - - /docker/adguard/working:/opt/adguardhome/work - - /docker/adguard/conf:/opt/adguardhome/conf - restart: unless-stopped - #---------------- DOWNLOADING ----------------# + ## Bazarr (subtitle downloading) + bazarr: + image: lscr.io/linuxserver/bazarr:latest + container_name: bazarr + environment: + - puid=1000 + - pgid=1000 + - tz=america/chicago + volumes: + - /docker/bazarr:/config + - /media/jellyfin/movies:/movies + - /media/jellyfin/tv shows:/tv + ports: + - 6767:6767 + restart: unless-stopped + + ## Prowlarr (torrent indexer management) + prowlarr: + image: ghcr.io/linuxserver/prowlarr:nightly + container_name: prowlarr + network_mode: "service:gluetun" + environment: + - PUID=1000 + - PGID=1000 + - TZ=America/Chicago + volumes: + - /docker/prowlarr:/config + restart: unless-stopped + ## QBittorrent (torrent client) qbittorrent: image: ghcr.io/linuxserver/qbittorrent:latest @@ -532,35 +561,6 @@ services: - /docker/qbittorrent/downloads:/downloads restart: unless-stopped - ## Prowlarr (torrent indexer management) - prowlarr: - image: ghcr.io/linuxserver/prowlarr:nightly - container_name: prowlarr - network_mode: "service:gluetun" - environment: - - PUID=1000 - - PGID=1000 - - TZ=America/Chicago - volumes: - - /docker/prowlarr:/config - restart: unless-stopped - - ## Bazarr (subtitle downloading) - bazarr: - image: lscr.io/linuxserver/bazarr:latest - container_name: bazarr - environment: - - PUID=1000 - - PGID=1000 - - TZ=America/Chicago - volumes: - - /docker/bazarr:/config - - /media/jellyfin/Movies:/movies - - /media/jellyfin/TV Shows:/tv - ports: - - 6767:6767 - restart: unless-stopped - #---------------- DOCKER ----------------# diff --git a/readme.md b/readme.md index 79cc84a..29bac98 100644 --- a/readme.md +++ b/readme.md @@ -12,60 +12,60 @@ I have a dedicated home server that I run a lot of services on. This repo has my ## Services -These are all the services hosted here, what they are for, and any clients I use with them. +These are all the services hosted, what they are for, and any clients I use with them, in alphabetical order. -### User-Facing +### User-Facing Services +- [Actual Budget](https://actualbudget.org/) - Excellent budgeting app. It can be automatically synced with your bank ([SimpleFIN Bridge](https://beta-bridge.simplefin.org/) for US banks, $15/year), but I have found that to be unstable + - There used to be an official app but it has been discontinued - I added the website to my phone's home screen and it works quite well +- [AudioBookShelf](https://www.audiobookshelf.org/) - Audiobook server + - The official mobile client works great +- [Calibre Web](https://github.com/janeczku/calibre-web) - Ebook management +- [Gitea](https://about.gitea.com/) - Git server - in the process of replacing my GitHub account +- [Grocy](https://github.com/grocy/grocy) - Household management (Am I out of milk? Do I have AAA batteries? What can I make for dinner?) + - [iOS Client](https://apps.apple.com/us/app/grocy-mobile/id1567803209) +- [Homepage](https://gethomepage.dev/) - My default new tab page; has info about all my services plus links +- [Immich](https://immich.app/) - Photo and video management + - Their official mobile apps are quite good - [Jellyfin](https://jellyfin.org) - Media server for movies, TV shows, and music - [Feishin](https://github.com/jeffvli/feishin) - Desktop music client (soon to be replaced by [audioling](https://github.com/audioling/audioling)) - [Finamp](https://github.com/jmshrv/finamp) - Mobile music client - For other devices (desktop, mobile, Roku/Android TV) I use either the web app or the official Jellyfin client +- [Joplin](https://joplinapp.org/) - Notes (Obsidian alternative) +- [Kiwix](https://kiwix.org/en/) - Offline wiki hosting - I have Wikipedia, the Arch Linux wiki, and several others downloaded +- [LinkStack](https://linkstack.org/) - Self-hosted LinkTree alternative - [Miniflux](https://miniflux.app/) - Minimalist RSS feed reader - [NetNewsWire](https://netnewswire.com/) - Wonderful all-purpose iOS RSS client -- [vaultwarden](https://github.com/dani-garcia/vaultwarden) - Password manager - - [Bitwarden clients](https://bitwarden.com/download/) -- [Gitea](https://about.gitea.com/) - Git server - in the process of replacing my GitHub account -- [LinkStack](https://linkstack.org/) - Self-hosted LinkTree alternative -- [Homepage](https://gethomepage.dev/) - My default new tab page; has info about all my services plus links -- [Kiwix](https://kiwix.org/en/) - Offline wiki hosting - I have Wikipedia, the Arch Linux wiki, and several others downloaded -- [Actual Budget](https://actualbudget.org/) - Excellent budgeting app. It can be automatically synced with your bank ([SimpleFIN Bridge](https://beta-bridge.simplefin.org/) for US banks, $15/year), but I have found that to be unstable - - There used to be an official app but it has been discontinued - I added the website to my phone's home screen and it works quite well - [Paperless-ngx](https://docs.paperless-ngx.com/) - Document management system for legal documents, IDs, bank statements, etc. - [Swift Paperless](https://github.com/paulgessinger/swift-paperless) - iOS client -- [Immich](https://immich.app/) - Photo and video management - - Their official mobile apps are quite good -- [Grocy](https://github.com/grocy/grocy) - Household management (Am I out of milk? Do I have AAA batteries? What can I make for dinner?) - - [iOS Client](https://apps.apple.com/us/app/grocy-mobile/id1567803209) - [Tandoor](https://tandoor.dev/) - Recipe management, so I always know which zucchine muffin recipe is the good one - [Untare](https://github.com/phantomate/Untare) - Mobile client (discontinued but it still works for now) -- [AudioBookShelf](https://www.audiobookshelf.org/) - Audiobook server - - The official mobile client works great -- [Calibre Web](https://github.com/janeczku/calibre-web) - Ebook management - [Yomu](https://www.yomu-reader.com/) for iOS is nice and minimal and supports OPDS for use with Calibre Web -- [Joplin](https://joplinapp.org/) - Notes (Obsidian alternative) +- [vaultwarden](https://github.com/dani-garcia/vaultwarden) - Password manager + - [Bitwarden clients](https://bitwarden.com/download/) ### Monitoring - [Dozzle](https://dozzle.dev/) - Docker logs all in one place +- [Glances](https://github.com/nicolargo/glances) - System monitor - I mostly have this for dashboard widgets but it can be useful by itself - [Scrutiny](https://github.com/AnalogJ/scrutiny) - HDD SMART monitoring, so I know when to prepare for a drive failure - [Speedtest Tracker](https://speedtest-tracker.dev/) - Runs scheduled internet speedtests and creates pretty graphs to keep my ISP honest -- [Glances](https://github.com/nicolargo/glances) - System monitor - I mostly have this for dashboard widgets but it can be useful by itself ### Networking +- [AdGuard Home](https://adguard.com/en/adguard-home/overview.html) - DNS filtering - I use this with [tailscale](https://tailscale.com/) to block ads on my phone - [cloudflared](https://github.com/cloudflare/cloudflared) - CloudFlare tunnel client for easy and secure external service access - [gluetun](https://github.com/qdm12/gluetun) - Docker VPN client and kill-switch. Very useful, allows for per-container VPN connectivity. -- [AdGuard Home](https://adguard.com/en/adguard-home/overview.html) - DNS filtering - I use this with [tailscale](https://tailscale.com/) to block ads on my phone Note that I run tailscale on bare metal so it is not listed here, but it is very useful for remote access to services I don't want visible on the open internet as well as SSH access. ### Downloading -- [qBittorrent](https://www.qbittorrent.org/) - The only torrent client I'll ever use -- [Radarr](https://radarr.video/) - Automated movie fetching -- [Sonarr](https://sonarr.tv/) - Automated TV show fetching -- [Prowlarr](https://prowlarr.com/) - Torrent indexer that interfaces with the other *arrs - [Bazarr](https://www.bazarr.media/) - Automated subtitle fetching (I also use the OpenSubtitles plugin within Jellyfin when needed, but this works hands-off most of the time) +- [Prowlarr](https://prowlarr.com/) - Torrent indexer that interfaces with the other *arrs +- [Radarr](https://radarr.video/) - Automated movie fetching +- [qBittorrent](https://www.qbittorrent.org/) - The only torrent client I'll ever use +- [Sonarr](https://sonarr.tv/) - Automated TV show fetching I use [LunaSea](https://www.lunasea.app/) as a mobile client for Radarr and Sonarr.