diff --git a/README.md b/README.md index 13f8e43..8fbfdbd 100644 --- a/README.md +++ b/README.md @@ -121,13 +121,13 @@ The infrastructure uses Traefik for reverse proxy with automatic SSL, Authelia f 5. **Deploy additional stacks through Dockge:** Log in to Dockge at `https://dockge.yourdomain.duckdns.org` - all stacks are already loaded and ready to deploy: - - **media** - Plex, Jellyfin, Sonarr, Radarr, Prowlarr, qBittorrent - - **media-extended** - Readarr, Lidarr, Mylar, Calibre + - **media** - Jellyfin, Calibre-web, qBittorrent + - **media-management** - Sonarr, Radarr, Prowlarr, Readarr, Lidarr, Mylar, Bazarr - **homeassistant** - Home Assistant, Node-RED, Zigbee2MQTT, ESPHome - **productivity** - Nextcloud, Gitea, Bookstack, Outline, Excalidraw - **monitoring** - Grafana, Prometheus, Uptime Kuma, Netdata - - **utilities** - Duplicati, Code Server, FreshRSS, Wallabag - - **alternatives** - Portainer, Authentik (alternative to Dockge/Authelia) + - **utilities** - Duplicati, FreshRSS, Wallabag + - **alternatives** - Plex, Portainer, Authentik Simply click any stack in Dockge and press "Start" to deploy it. diff --git a/docker-compose/alternatives.yml b/docker-compose/alternatives.yml index d118ea1..b041099 100644 --- a/docker-compose/alternatives.yml +++ b/docker-compose/alternatives.yml @@ -133,6 +133,54 @@ services: timeout: 3s retries: 5 + # Plex Media Server - Alternative to Jellyfin + # Access at: https://plex.yourdomain.duckdns.org + # NOTE: No Authelia - allows app access from Roku, Fire TV, mobile, etc. + plex: + image: plexinc/pms-docker:1.40.0.7998-f68041501 + container_name: plex + restart: unless-stopped + networks: + - media-network + - homelab-network + - traefik-network + volumes: + - ./plex/config:/config + - /mnt/media:/media:ro # Large media files on separate drive + - plex-transcode:/transcode + environment: + - PUID=${PUID:-1000} + - PGID=${PGID:-1000} + - TZ=${TZ:-America/New_York} + - PLEX_CLAIM=${PLEX_CLAIM} + # Hardware transcoding support + # Uncomment ONE of the following options: + + # Option 1: Intel QuickSync (most common) + # devices: + # - /dev/dri:/dev/dri + + # Option 2: NVIDIA GPU (requires nvidia-container-toolkit installed) + # runtime: nvidia + # devices: + # - /dev/nvidia0:/dev/nvidia0 + # - /dev/nvidiactl:/dev/nvidiactl + # - /dev/nvidia-modeset:/dev/nvidia-modeset + # - /dev/nvidia-uvm:/dev/nvidia-uvm + # - /dev/nvidia-uvm-tools:/dev/nvidia-uvm-tools + # environment: + # - NVIDIA_VISIBLE_DEVICES=all + # - NVIDIA_DRIVER_CAPABILITIES=compute,video,utility + labels: + - "homelab.category=alternatives" + - "homelab.description=Alternative media streaming server to Jellyfin" + # Traefik labels - NO Authelia for app access + - "traefik.enable=true" + - "traefik.http.routers.plex.rule=Host(`plex.${DOMAIN}`)" + - "traefik.http.routers.plex.entrypoints=websecure" + - "traefik.http.routers.plex.tls.certresolver=letsencrypt" + - "traefik.http.services.plex.loadbalancer.server.port=32400" + volumes: portainer-data: driver: local @@ -140,10 +188,14 @@ volumes: driver: local authentik-redis-data: driver: local + plex-transcode: + driver: local networks: homelab-network: external: true traefik-network: external: true + media-network: + external: true diff --git a/docker-compose/infrastructure.yml b/docker-compose/infrastructure.yml index d84e29d..29d1cf5 100644 --- a/docker-compose/infrastructure.yml +++ b/docker-compose/infrastructure.yml @@ -165,8 +165,35 @@ services: - "traefik.http.routers.glances.middlewares=authelia@docker" - "traefik.http.services.glances.loadbalancer.server.port=61208" -networks: - traefik-network: + # Code Server - VS Code in browser + # Access at: https://code.${DOMAIN} + code-server: + image: lscr.io/linuxserver/code-server:latest + container_name: code-server + restart: unless-stopped + networks: + - homelab-network + - traefik-network + volumes: + - ./code-server/config:/config + - /opt/stacks:/opt/stacks # Access to all stacks + - /mnt:/mnt:ro # Read-only access to data + environment: + - PUID=${PUID:-1000} + - PGID=${PGID:-1000} + - TZ=${TZ} + - PASSWORD=${CODE_SERVER_PASSWORD} + - SUDO_PASSWORD=${CODE_SERVER_SUDO_PASSWORD} + labels: + - "homelab.category=infrastructure" + - "homelab.description=VS Code in browser" + - "traefik.enable=true" + - "traefik.http.routers.code-server.rule=Host(`code.${DOMAIN}`)" + - "traefik.http.routers.code-server.entrypoints=websecure" + - "traefik.http.routers.code-server.tls.certresolver=letsencrypt" + - "traefik.http.routers.code-server.middlewares=authelia@docker" + - "traefik.http.services.code-server.loadbalancer.server.port=8443" + external: true homelab-network: driver: bridge diff --git a/docker-compose/media-extended.yml b/docker-compose/media-management.yml similarity index 74% rename from docker-compose/media-extended.yml rename to docker-compose/media-management.yml index 4fa288f..55c7d4a 100644 --- a/docker-compose/media-extended.yml +++ b/docker-compose/media-management.yml @@ -1,8 +1,93 @@ -# Extended Media Services -# Additional media management tools -# Place in /opt/stacks/media-extended/docker-compose.yml +# Media Management Services +# Content automation and library management (*arr apps, transcoders, etc.) +# Place in /opt/stacks/media-management/docker-compose.yml services: + # Sonarr - TV show automation + # Access at: https://sonarr.yourdomain.duckdns.org + sonarr: + image: lscr.io/linuxserver/sonarr:4.0.0 + container_name: sonarr + restart: unless-stopped + networks: + - media-network + - homelab-network + - traefik-network + volumes: + - ./sonarr/config:/config + - /mnt/media:/media + - /mnt/downloads:/downloads # Large downloads on separate drive + environment: + - PUID=${PUID:-1000} + - PGID=${PGID:-1000} + - TZ=${TZ:-America/New_York} + labels: + - "homelab.category=media" + - "homelab.description=TV show management and automation" + # Traefik labels with Authelia + - "traefik.enable=true" + - "traefik.http.routers.sonarr.rule=Host(`sonarr.${DOMAIN}`)" + - "traefik.http.routers.sonarr.entrypoints=websecure" + - "traefik.http.routers.sonarr.tls.certresolver=letsencrypt" + - "traefik.http.routers.sonarr.middlewares=authelia@docker" + - "traefik.http.services.sonarr.loadbalancer.server.port=8989" + + # Radarr - Movie automation + # Access at: https://radarr.yourdomain.duckdns.org + radarr: + image: lscr.io/linuxserver/radarr:5.2.6 + container_name: radarr + restart: unless-stopped + networks: + - media-network + - homelab-network + - traefik-network + volumes: + - ./radarr/config:/config + - /mnt/media:/media + - /mnt/downloads:/downloads # Large downloads on separate drive + environment: + - PUID=${PUID:-1000} + - PGID=${PGID:-1000} + - TZ=${TZ:-America/New_York} + labels: + - "homelab.category=media" + - "homelab.description=Movie management and automation" + # Traefik labels with Authelia + - "traefik.enable=true" + - "traefik.http.routers.radarr.rule=Host(`radarr.${DOMAIN}`)" + - "traefik.http.routers.radarr.entrypoints=websecure" + - "traefik.http.routers.radarr.tls.certresolver=letsencrypt" + - "traefik.http.routers.radarr.middlewares=authelia@docker" + - "traefik.http.services.radarr.loadbalancer.server.port=7878" + + # Prowlarr - Indexer manager + # Access at: https://prowlarr.yourdomain.duckdns.org + prowlarr: + image: lscr.io/linuxserver/prowlarr:1.11.4 + container_name: prowlarr + restart: unless-stopped + networks: + - media-network + - homelab-network + - traefik-network + volumes: + - ./prowlarr/config:/config + environment: + - PUID=${PUID:-1000} + - PGID=${PGID:-1000} + - TZ=${TZ:-America/New_York} + labels: + - "homelab.category=media" + - "homelab.description=Indexer manager for Sonarr/Radarr" + # Traefik labels with Authelia + - "traefik.enable=true" + - "traefik.http.routers.prowlarr.rule=Host(`prowlarr.${DOMAIN}`)" + - "traefik.http.routers.prowlarr.entrypoints=websecure" + - "traefik.http.routers.prowlarr.tls.certresolver=letsencrypt" + - "traefik.http.routers.prowlarr.middlewares=authelia@docker" + - "traefik.http.services.prowlarr.loadbalancer.server.port=9696" + # Readarr - Ebook and audiobook management # Access at: https://readarr.${DOMAIN} readarr: @@ -116,34 +201,6 @@ services: - "traefik.http.routers.mylar.middlewares=authelia@docker" - "traefik.http.services.mylar.loadbalancer.server.port=8090" - # Calibre-Web - Ebook reader and server - # Access at: https://calibre.${DOMAIN} - calibre-web: - image: lscr.io/linuxserver/calibre-web:latest - container_name: calibre-web - restart: unless-stopped - networks: - - media-network - - homelab-network - - traefik-network - volumes: - - ./$(basename $file .yml)/config:/config - - /mnt/media/books:/books - environment: - - PUID=${PUID:-1000} - - PGID=${PGID:-1000} - - TZ=${TZ} - - DOCKER_MODS=linuxserver/mods:universal-calibre - labels: - - "homelab.category=media" - - "homelab.description=Ebook reader and library management" - - "traefik.enable=true" - - "traefik.http.routers.calibre.rule=Host(`calibre.${DOMAIN}`)" - - "traefik.http.routers.calibre.entrypoints=websecure" - - "traefik.http.routers.calibre.tls.certresolver=letsencrypt" - - "traefik.http.routers.calibre.middlewares=authelia@docker" - - "traefik.http.services.calibre.loadbalancer.server.port=8083" - # Jellyseerr - Request management for Jellyfin/Plex # Access at: https://jellyseerr.${DOMAIN} jellyseerr: diff --git a/docker-compose/media.yml b/docker-compose/media.yml index da5e320..41fbe2e 100644 --- a/docker-compose/media.yml +++ b/docker-compose/media.yml @@ -4,55 +4,7 @@ # NOTE: qBittorrent is configured to use Gluetun VPN (see gluetun.yml) services: - # Plex Media Server - Media streaming platform - # Access at: https://plex.yourdomain.duckdns.org - # NOTE: No Authelia - allows app access from Roku, Fire TV, mobile, etc. - plex: - image: plexinc/pms-docker:1.40.0.7998-f68041501 - container_name: plex - restart: unless-stopped - networks: - - media-network - - homelab-network - - traefik-network - volumes: - - ./plex/config:/config - - /mnt/media:/media:ro # Large media files on separate drive - - plex-transcode:/transcode - environment: - - PUID=${PUID:-1000} - - PGID=${PGID:-1000} - - TZ=${TZ:-America/New_York} - - PLEX_CLAIM=${PLEX_CLAIM} - # Hardware transcoding support - # Uncomment ONE of the following options: - - # Option 1: Intel QuickSync (most common) - # devices: - # - /dev/dri:/dev/dri - - # Option 2: NVIDIA GPU (requires nvidia-container-toolkit installed) - # runtime: nvidia - # devices: - # - /dev/nvidia0:/dev/nvidia0 - # - /dev/nvidiactl:/dev/nvidiactl - # - /dev/nvidia-modeset:/dev/nvidia-modeset - # - /dev/nvidia-uvm:/dev/nvidia-uvm - # - /dev/nvidia-uvm-tools:/dev/nvidia-uvm-tools - # environment: - # - NVIDIA_VISIBLE_DEVICES=all - # - NVIDIA_DRIVER_CAPABILITIES=compute,video,utility - labels: - - "homelab.category=media" - - "homelab.description=Plex media streaming server" - # Traefik labels - NO Authelia for app access - - "traefik.enable=true" - - "traefik.http.routers.plex.rule=Host(`plex.${DOMAIN}`)" - - "traefik.http.routers.plex.entrypoints=websecure" - - "traefik.http.routers.plex.tls.certresolver=letsencrypt" - - "traefik.http.services.plex.loadbalancer.server.port=32400" - - # Jellyfin - Free alternative to Plex + # Jellyfin - Open-source media streaming server # Access at: https://jellyfin.yourdomain.duckdns.org # NOTE: No Authelia - allows app access from Roku, Fire TV, mobile, etc. jellyfin: @@ -84,90 +36,33 @@ services: - "traefik.http.routers.jellyfin.tls.certresolver=letsencrypt" - "traefik.http.services.jellyfin.loadbalancer.server.port=8096" - # Sonarr - TV show automation - # Access at: https://sonarr.yourdomain.duckdns.org - sonarr: - image: lscr.io/linuxserver/sonarr:4.0.0 - container_name: sonarr + # Calibre-Web - Ebook reader and server + # Access at: https://calibre.${DOMAIN} + calibre-web: + image: lscr.io/linuxserver/calibre-web:latest + container_name: calibre-web restart: unless-stopped networks: - media-network - homelab-network - traefik-network volumes: - - ./sonarr/config:/config - - /mnt/media:/media - - /mnt/downloads:/downloads # Large downloads on separate drive + - ./calibre-web/config:/config + - /mnt/media/books:/books environment: - PUID=${PUID:-1000} - PGID=${PGID:-1000} - TZ=${TZ:-America/New_York} + - DOCKER_MODS=linuxserver/mods:universal-calibre labels: - "homelab.category=media" - - "homelab.description=TV show management and automation" - # Traefik labels with Authelia + - "homelab.description=Ebook reader and library management" - "traefik.enable=true" - - "traefik.http.routers.sonarr.rule=Host(`sonarr.${DOMAIN}`)" - - "traefik.http.routers.sonarr.entrypoints=websecure" - - "traefik.http.routers.sonarr.tls.certresolver=letsencrypt" - - "traefik.http.routers.sonarr.middlewares=authelia@docker" - - "traefik.http.services.sonarr.loadbalancer.server.port=8989" - - # Radarr - Movie automation - # Access at: https://radarr.yourdomain.duckdns.org - radarr: - image: lscr.io/linuxserver/radarr:5.2.6 - container_name: radarr - restart: unless-stopped - networks: - - media-network - - homelab-network - - traefik-network - volumes: - - ./radarr/config:/config - - /mnt/media:/media - - /mnt/downloads:/downloads # Large downloads on separate drive - environment: - - PUID=${PUID:-1000} - - PGID=${PGID:-1000} - - TZ=${TZ:-America/New_York} - labels: - - "homelab.category=media" - - "homelab.description=Movie management and automation" - # Traefik labels with Authelia - - "traefik.enable=true" - - "traefik.http.routers.radarr.rule=Host(`radarr.${DOMAIN}`)" - - "traefik.http.routers.radarr.entrypoints=websecure" - - "traefik.http.routers.radarr.tls.certresolver=letsencrypt" - - "traefik.http.routers.radarr.middlewares=authelia@docker" - - "traefik.http.services.radarr.loadbalancer.server.port=7878" - - # Prowlarr - Indexer manager - # Access at: https://prowlarr.yourdomain.duckdns.org - prowlarr: - image: lscr.io/linuxserver/prowlarr:1.11.4 - container_name: prowlarr - restart: unless-stopped - networks: - - media-network - - homelab-network - - traefik-network - volumes: - - ./prowlarr/config:/config - environment: - - PUID=${PUID:-1000} - - PGID=${PGID:-1000} - - TZ=${TZ:-America/New_York} - labels: - - "homelab.category=media" - - "homelab.description=Indexer manager for Sonarr/Radarr" - # Traefik labels with Authelia - - "traefik.enable=true" - - "traefik.http.routers.prowlarr.rule=Host(`prowlarr.${DOMAIN}`)" - - "traefik.http.routers.prowlarr.entrypoints=websecure" - - "traefik.http.routers.prowlarr.tls.certresolver=letsencrypt" - - "traefik.http.routers.prowlarr.middlewares=authelia@docker" - - "traefik.http.services.prowlarr.loadbalancer.server.port=9696" + - "traefik.http.routers.calibre.rule=Host(`calibre.${DOMAIN}`)" + - "traefik.http.routers.calibre.entrypoints=websecure" + - "traefik.http.routers.calibre.tls.certresolver=letsencrypt" + - "traefik.http.routers.calibre.middlewares=authelia@docker" + - "traefik.http.services.calibre.loadbalancer.server.port=8083" # qBittorrent - Torrent client # Access at: https://qbit.yourdomain.duckdns.org @@ -175,10 +70,6 @@ services: # NOTE: This is a placeholder. Configure qBittorrent in gluetun.yml with network_mode: "service:gluetun" # See gluetun.yml for the actual qBittorrent configuration -volumes: - plex-transcode: - driver: local - networks: media-network: driver: bridge diff --git a/docker-compose/utilities.yml b/docker-compose/utilities.yml index 3086207..dc3bc73 100644 --- a/docker-compose/utilities.yml +++ b/docker-compose/utilities.yml @@ -59,35 +59,6 @@ services: - "traefik.http.routers.duplicati.middlewares=authelia@docker" - "traefik.http.services.duplicati.loadbalancer.server.port=8200" - # Code Server - VS Code in browser - # Access at: https://code.${DOMAIN} - code-server: - image: lscr.io/linuxserver/code-server:latest - container_name: code-server - restart: unless-stopped - networks: - - homelab-network - - traefik-network - volumes: - - ./$(basename $file .yml)/config:/config - - /opt/stacks:/opt/stacks # Access to all stacks - - /mnt:/mnt:ro # Read-only access to data - environment: - - PUID=${PUID:-1000} - - PGID=${PGID:-1000} - - TZ=${TZ} - - PASSWORD=${CODE_SERVER_PASSWORD} - - SUDO_PASSWORD=${CODE_SERVER_SUDO_PASSWORD} - labels: - - "homelab.category=utilities" - - "homelab.description=VS Code in browser" - - "traefik.enable=true" - - "traefik.http.routers.code-server.rule=Host(`code.${DOMAIN}`)" - - "traefik.http.routers.code-server.entrypoints=websecure" - - "traefik.http.routers.code-server.tls.certresolver=letsencrypt" - - "traefik.http.routers.code-server.middlewares=authelia@docker" - - "traefik.http.services.code-server.loadbalancer.server.port=8443" - # Form.io - Form builder (if needed) # Access at: https://forms.${DOMAIN} formio: diff --git a/docs/service-docs/bazarr.md b/docs/service-docs/bazarr.md index d9575b2..75baab2 100644 --- a/docs/service-docs/bazarr.md +++ b/docs/service-docs/bazarr.md @@ -17,7 +17,7 @@ **Category:** Subtitle Management **Docker Image:** [linuxserver/bazarr](https://hub.docker.com/r/linuxserver/bazarr) -**Default Stack:** `media-extended.yml` +**Default Stack:** `media-management.yml` **Web UI:** `https://bazarr.${DOMAIN}` or `http://SERVER_IP:6767` **Authentication:** Optional (configurable) **Ports:** 6767 @@ -79,7 +79,7 @@ Subtitle Available in Player ### Directory Structure ``` -/opt/stacks/media-extended/bazarr/config/ # Bazarr configuration +/opt/stacks/media-management/bazarr/config/ # Bazarr configuration /mnt/media/movies/ # Movie library (with subtitles) /mnt/media/tv/ # TV library (with subtitles) @@ -151,7 +151,7 @@ bazarr: - PGID=1000 - TZ=America/New_York volumes: - - /opt/stacks/media-extended/bazarr/config:/config + - /opt/stacks/media-management/bazarr/config:/config - /mnt/media/movies:/movies - /mnt/media/tv:/tv labels: @@ -548,13 +548,13 @@ sudo chown -R 1000:1000 /mnt/media/movies/ docker stop bazarr # Backup database -cp /opt/stacks/media-extended/bazarr/config/db/bazarr.db /opt/backups/ +cp /opt/stacks/media-management/bazarr/config/db/bazarr.db /opt/backups/ # Check integrity -sqlite3 /opt/stacks/media-extended/bazarr/config/db/bazarr.db "PRAGMA integrity_check;" +sqlite3 /opt/stacks/media-management/bazarr/config/db/bazarr.db "PRAGMA integrity_check;" # Vacuum if needed -sqlite3 /opt/stacks/media-extended/bazarr/config/db/bazarr.db "VACUUM;" +sqlite3 /opt/stacks/media-management/bazarr/config/db/bazarr.db "VACUUM;" # Restart docker start bazarr @@ -610,8 +610,8 @@ docker start bazarr **Critical Files:** ```bash -/opt/stacks/media-extended/bazarr/config/db/bazarr.db # Database -/opt/stacks/media-extended/bazarr/config/config/config.yaml # Settings +/opt/stacks/media-management/bazarr/config/db/bazarr.db # Database +/opt/stacks/media-management/bazarr/config/config/config.yaml # Settings ``` **Backup Script:** @@ -622,7 +622,7 @@ BACKUP_DIR=/opt/backups/bazarr docker stop bazarr tar -czf $BACKUP_DIR/bazarr-$DATE.tar.gz \ - /opt/stacks/media-extended/bazarr/config/ + /opt/stacks/media-management/bazarr/config/ docker start bazarr find $BACKUP_DIR -name "bazarr-*.tar.gz" -mtime +7 -delete diff --git a/docs/service-docs/calibre-web.md b/docs/service-docs/calibre-web.md index a35d525..adbf546 100644 --- a/docs/service-docs/calibre-web.md +++ b/docs/service-docs/calibre-web.md @@ -49,7 +49,7 @@ Calibre-Web is a web-based ebook reader and library manager. It provides a clean ### Directory Structure ``` -/opt/stacks/media-extended/calibre-web/config/ # Config +/opt/stacks/media-management/calibre-web/config/ # Config /mnt/media/books/ # Calibre library ``` @@ -84,7 +84,7 @@ calibre-web: - TZ=America/New_York - DOCKER_MODS=linuxserver/mods:universal-calibre volumes: - - /opt/stacks/media-extended/calibre-web/config:/config + - /opt/stacks/media-management/calibre-web/config:/config - /mnt/media/books:/books labels: - "traefik.enable=true" diff --git a/docs/service-docs/jellyseerr.md b/docs/service-docs/jellyseerr.md index 6ea0bdc..f11151d 100644 --- a/docs/service-docs/jellyseerr.md +++ b/docs/service-docs/jellyseerr.md @@ -79,7 +79,7 @@ User Watches Content ### Directory Structure ``` -/opt/stacks/media-extended/jellyseerr/config/ # Jellyseerr configuration +/opt/stacks/media-management/jellyseerr/config/ # Jellyseerr configuration ``` ### Environment Variables @@ -137,7 +137,7 @@ jellyseerr: - LOG_LEVEL=info - TZ=America/New_York volumes: - - /opt/stacks/media-extended/jellyseerr/config:/app/config + - /opt/stacks/media-management/jellyseerr/config:/app/config labels: - "traefik.enable=true" - "traefik.http.routers.jellyseerr.rule=Host(`jellyseerr.${DOMAIN}`)" @@ -516,7 +516,7 @@ docker logs jellyseerr | grep -i notification docker stop jellyseerr # Vacuum database -sqlite3 /opt/stacks/media-extended/jellyseerr/config/db/db.sqlite3 "VACUUM;" +sqlite3 /opt/stacks/media-management/jellyseerr/config/db/db.sqlite3 "VACUUM;" # Restart docker start jellyseerr @@ -549,8 +549,8 @@ docker start jellyseerr **Critical Files:** ```bash -/opt/stacks/media-extended/jellyseerr/config/db/db.sqlite3 # Database -/opt/stacks/media-extended/jellyseerr/config/settings.json # Settings +/opt/stacks/media-management/jellyseerr/config/db/db.sqlite3 # Database +/opt/stacks/media-management/jellyseerr/config/settings.json # Settings ``` **Backup Script:** @@ -561,7 +561,7 @@ BACKUP_DIR=/opt/backups/jellyseerr docker stop jellyseerr tar -czf $BACKUP_DIR/jellyseerr-$DATE.tar.gz \ - /opt/stacks/media-extended/jellyseerr/config/ + /opt/stacks/media-management/jellyseerr/config/ docker start jellyseerr find $BACKUP_DIR -name "jellyseerr-*.tar.gz" -mtime +7 -delete diff --git a/docs/service-docs/lazylibrarian.md b/docs/service-docs/lazylibrarian.md index e0024e8..2594395 100644 --- a/docs/service-docs/lazylibrarian.md +++ b/docs/service-docs/lazylibrarian.md @@ -47,7 +47,7 @@ Lazy Librarian is an automated book downloader similar to Sonarr/Radarr but for ### Directory Structure ``` -/opt/stacks/media-extended/lazylibrarian/config/ # Config +/opt/stacks/media-management/lazylibrarian/config/ # Config /mnt/media/books/ # Book library /mnt/downloads/ # Downloads ``` @@ -82,7 +82,7 @@ lazylibrarian: - PGID=1000 - TZ=America/New_York volumes: - - /opt/stacks/media-extended/lazylibrarian/config:/config + - /opt/stacks/media-management/lazylibrarian/config:/config - /mnt/media/books:/books - /mnt/downloads:/downloads labels: diff --git a/docs/service-docs/lidarr.md b/docs/service-docs/lidarr.md index 1589e5a..818bd18 100644 --- a/docs/service-docs/lidarr.md +++ b/docs/service-docs/lidarr.md @@ -77,7 +77,7 @@ Plex/Jellyfin/Subsonic Access ### Directory Structure ``` -/opt/stacks/media-extended/lidarr/config/ # Lidarr configuration +/opt/stacks/media-management/lidarr/config/ # Lidarr configuration /mnt/downloads/complete/music-lidarr/ # Downloaded music /mnt/media/music/ # Final music library @@ -149,7 +149,7 @@ lidarr: - PGID=1000 - TZ=America/New_York volumes: - - /opt/stacks/media-extended/lidarr/config:/config + - /opt/stacks/media-management/lidarr/config:/config - /mnt/media/music:/music - /mnt/downloads:/downloads labels: @@ -403,7 +403,7 @@ lidarr-lossless: ports: - "8687:8686" volumes: - - /opt/stacks/media-extended/lidarr-lossless/config:/config + - /opt/stacks/media-management/lidarr-lossless/config:/config - /mnt/media/music-flac:/music - /mnt/downloads:/downloads ``` @@ -498,10 +498,10 @@ docker exec lidarr exiftool /music/Artist/Album/track.flac docker stop lidarr # Backup database -cp /opt/stacks/media-extended/lidarr/config/lidarr.db /opt/backups/ +cp /opt/stacks/media-management/lidarr/config/lidarr.db /opt/backups/ # Check integrity -sqlite3 /opt/stacks/media-extended/lidarr/config/lidarr.db "PRAGMA integrity_check;" +sqlite3 /opt/stacks/media-management/lidarr/config/lidarr.db "PRAGMA integrity_check;" # Restore from backup if corrupted docker start lidarr @@ -522,7 +522,7 @@ docker start lidarr docker stop lidarr # Vacuum database -sqlite3 /opt/stacks/media-extended/lidarr/config/lidarr.db "VACUUM;" +sqlite3 /opt/stacks/media-management/lidarr/config/lidarr.db "VACUUM;" # Clear old history # Settings → General → History Cleanup: 30 days @@ -558,9 +558,9 @@ docker start lidarr **Critical Files:** ```bash -/opt/stacks/media-extended/lidarr/config/lidarr.db # Database -/opt/stacks/media-extended/lidarr/config/config.xml # Settings -/opt/stacks/media-extended/lidarr/config/Backup/ # Auto backups +/opt/stacks/media-management/lidarr/config/lidarr.db # Database +/opt/stacks/media-management/lidarr/config/config.xml # Settings +/opt/stacks/media-management/lidarr/config/Backup/ # Auto backups ``` **Backup Script:** @@ -569,7 +569,7 @@ docker start lidarr DATE=$(date +%Y%m%d) BACKUP_DIR=/opt/backups/lidarr -cp /opt/stacks/media-extended/lidarr/config/lidarr.db $BACKUP_DIR/lidarr-$DATE.db +cp /opt/stacks/media-management/lidarr/config/lidarr.db $BACKUP_DIR/lidarr-$DATE.db find $BACKUP_DIR -name "lidarr-*.db" -mtime +7 -delete ``` diff --git a/docs/service-docs/mylar3.md b/docs/service-docs/mylar3.md index 36d1eed..f2bf2a4 100644 --- a/docs/service-docs/mylar3.md +++ b/docs/service-docs/mylar3.md @@ -13,7 +13,7 @@ **Category:** Comic Book Management **Docker Image:** [linuxserver/mylar3](https://hub.docker.com/r/linuxserver/mylar3) -**Default Stack:** `media-extended.yml` +**Default Stack:** `media-management.yml` **Web UI:** `http://SERVER_IP:8090` **Ports:** 8090 @@ -49,7 +49,7 @@ Mylar3 is an automated comic book download manager. It's like Sonarr/Radarr but ### Directory Structure ``` -/opt/stacks/media-extended/mylar3/config/ # Configuration +/opt/stacks/media-management/mylar3/config/ # Configuration /mnt/media/comics/ # Comic library /mnt/downloads/ # Downloads @@ -90,7 +90,7 @@ mylar3: - PGID=1000 - TZ=America/New_York volumes: - - /opt/stacks/media-extended/mylar3/config:/config + - /opt/stacks/media-management/mylar3/config:/config - /mnt/media/comics:/comics - /mnt/downloads:/downloads labels: diff --git a/docs/service-docs/readarr.md b/docs/service-docs/readarr.md index 86ce377..3a97646 100644 --- a/docs/service-docs/readarr.md +++ b/docs/service-docs/readarr.md @@ -17,7 +17,7 @@ **Category:** Media Management & Automation **Docker Image:** [linuxserver/readarr](https://hub.docker.com/r/linuxserver/readarr) -**Default Stack:** `media-extended.yml` +**Default Stack:** `media-management.yml` **Web UI:** `https://readarr.${DOMAIN}` or `http://SERVER_IP:8787` **Authentication:** Optional (configurable) **Ports:** 8787 @@ -77,7 +77,7 @@ Calibre-Web / Calibre Access ### Directory Structure ``` -/opt/stacks/media-extended/readarr/config/ # Readarr configuration +/opt/stacks/media-management/readarr/config/ # Readarr configuration /mnt/downloads/complete/books-readarr/ # Downloaded books /mnt/media/books/ # Final book library @@ -148,7 +148,7 @@ readarr: - PGID=1000 - TZ=America/New_York volumes: - - /opt/stacks/media-extended/readarr/config:/config + - /opt/stacks/media-management/readarr/config:/config - /mnt/media/books:/books - /mnt/downloads:/downloads labels: @@ -337,7 +337,7 @@ readarr-audio: ports: - "8788:8787" volumes: - - /opt/stacks/media-extended/readarr-audio/config:/config + - /opt/stacks/media-management/readarr-audio/config:/config - /mnt/media/audiobooks:/books - /mnt/downloads:/downloads environment: @@ -467,10 +467,10 @@ docker logs readarr | grep -i import docker stop readarr # Backup database -cp /opt/stacks/media-extended/readarr/config/readarr.db /opt/backups/ +cp /opt/stacks/media-management/readarr/config/readarr.db /opt/backups/ # Check integrity -sqlite3 /opt/stacks/media-extended/readarr/config/readarr.db "PRAGMA integrity_check;" +sqlite3 /opt/stacks/media-management/readarr/config/readarr.db "PRAGMA integrity_check;" # Restore from backup if corrupted docker start readarr @@ -491,7 +491,7 @@ docker start readarr docker stop readarr # Vacuum database -sqlite3 /opt/stacks/media-extended/readarr/config/readarr.db "VACUUM;" +sqlite3 /opt/stacks/media-management/readarr/config/readarr.db "VACUUM;" # Clear old history # Settings → General → History Cleanup: 30 days @@ -521,9 +521,9 @@ docker start readarr **Critical Files:** ```bash -/opt/stacks/media-extended/readarr/config/readarr.db # Database -/opt/stacks/media-extended/readarr/config/config.xml # Settings -/opt/stacks/media-extended/readarr/config/Backup/ # Auto backups +/opt/stacks/media-management/readarr/config/readarr.db # Database +/opt/stacks/media-management/readarr/config/config.xml # Settings +/opt/stacks/media-management/readarr/config/Backup/ # Auto backups ``` **Backup Script:** @@ -532,7 +532,7 @@ docker start readarr DATE=$(date +%Y%m%d) BACKUP_DIR=/opt/backups/readarr -cp /opt/stacks/media-extended/readarr/config/readarr.db $BACKUP_DIR/readarr-$DATE.db +cp /opt/stacks/media-management/readarr/config/readarr.db $BACKUP_DIR/readarr-$DATE.db find $BACKUP_DIR -name "readarr-*.db" -mtime +7 -delete ``` diff --git a/docs/service-docs/tdarr.md b/docs/service-docs/tdarr.md index 3000219..ffaf95e 100644 --- a/docs/service-docs/tdarr.md +++ b/docs/service-docs/tdarr.md @@ -93,7 +93,7 @@ Library Updated ### Directory Structure ``` -/opt/stacks/media-extended/tdarr/ +/opt/stacks/media-management/tdarr/ ├── server/ # Tdarr server data ├── config/ # Configuration ├── logs/ # Logs @@ -175,10 +175,10 @@ tdarr: - PGID=1000 - TZ=America/New_York volumes: - - /opt/stacks/media-extended/tdarr/server:/app/server - - /opt/stacks/media-extended/tdarr/config:/app/configs - - /opt/stacks/media-extended/tdarr/logs:/app/logs - - /opt/stacks/media-extended/tdarr/temp:/temp + - /opt/stacks/media-management/tdarr/server:/app/server + - /opt/stacks/media-management/tdarr/config:/app/configs + - /opt/stacks/media-management/tdarr/logs:/app/logs + - /opt/stacks/media-management/tdarr/temp:/temp - /mnt/media:/media devices: - /dev/dri:/dev/dri # Intel QuickSync @@ -219,9 +219,9 @@ tdarr-node: - PUID=1000 - PGID=1000 volumes: - - /opt/stacks/media-extended/tdarr/config:/app/configs - - /opt/stacks/media-extended/tdarr/logs:/app/logs - - /opt/stacks/media-extended/tdarr/temp:/temp + - /opt/stacks/media-management/tdarr/config:/app/configs + - /opt/stacks/media-management/tdarr/logs:/app/logs + - /opt/stacks/media-management/tdarr/temp:/temp - /mnt/media:/media devices: - /dev/dri:/dev/dri @@ -500,7 +500,7 @@ docker logs tdarr-node docker logs tdarr-node | tail -50 # Check temp directory space -df -h /opt/stacks/media-extended/tdarr/temp/ +df -h /opt/stacks/media-management/tdarr/temp/ # Check FFmpeg docker exec tdarr-node ffmpeg -version @@ -557,7 +557,7 @@ docker stats tdarr tdarr-node ls -la /mnt/media/ # Check temp directory -ls -la /opt/stacks/media-extended/tdarr/temp/ +ls -la /opt/stacks/media-management/tdarr/temp/ # Check logs for errors docker logs tdarr-node | grep -i error @@ -626,8 +626,8 @@ volumes: **Critical Files:** ```bash -/opt/stacks/media-extended/tdarr/server/ # Database -/opt/stacks/media-extended/tdarr/config/ # Configuration +/opt/stacks/media-management/tdarr/server/ # Database +/opt/stacks/media-management/tdarr/config/ # Configuration ``` **Backup Script:** @@ -637,8 +637,8 @@ DATE=$(date +%Y%m%d) BACKUP_DIR=/opt/backups/tdarr tar -czf $BACKUP_DIR/tdarr-$DATE.tar.gz \ - /opt/stacks/media-extended/tdarr/server/ \ - /opt/stacks/media-extended/tdarr/config/ + /opt/stacks/media-management/tdarr/server/ \ + /opt/stacks/media-management/tdarr/config/ find $BACKUP_DIR -name "tdarr-*.tar.gz" -mtime +7 -delete ``` diff --git a/docs/service-docs/unmanic.md b/docs/service-docs/unmanic.md index a551b1c..ad5cd23 100644 --- a/docs/service-docs/unmanic.md +++ b/docs/service-docs/unmanic.md @@ -75,7 +75,7 @@ Library Optimized ### Directory Structure ``` -/opt/stacks/media-extended/unmanic/config/ # Configuration +/opt/stacks/media-management/unmanic/config/ # Configuration /mnt/media/movies/ # Movie library /mnt/media/tv/ # TV library /tmp/unmanic/ # Temp files @@ -135,7 +135,7 @@ unmanic: - PGID=1000 - TZ=America/New_York volumes: - - /opt/stacks/media-extended/unmanic/config:/config + - /opt/stacks/media-management/unmanic/config:/config - /mnt/media:/library - /tmp/unmanic:/tmp/unmanic devices: diff --git a/docs/services-overview.md b/docs/services-overview.md index 8de978b..ecda5a1 100644 --- a/docs/services-overview.md +++ b/docs/services-overview.md @@ -11,13 +11,15 @@ This document provides a comprehensive overview of all 60+ pre-configured servic | ├─ [Traefik](service-docs/traefik.md) | Reverse proxy + SSL | ✓ | /opt/stacks/core/traefik | traefik.${DOMAIN} | | ├─ [Authelia](service-docs/authelia.md) | SSO authentication | - | /opt/stacks/core/authelia | auth.${DOMAIN} | | └─ [Gluetun](service-docs/gluetun.md) | VPN (Surfshark) | - | /opt/stacks/core/gluetun | No UI | -| **🔧 [infrastructure.yaml](../docker-compose/infrastructure.yml) (6+5)** | **Deployed: 6** | | | | +| **🔧 [infrastructure.yaml](../docker-compose/infrastructure.yml) (7+5)** | **Deployed: 7** | | | | | ├─ [Dockge](service-docs/dockge.md) | Stack manager (PRIMARY) | ✓ | /opt/stacks/infrastructure | dockge.${DOMAIN} | | ├─ [Pi-hole](service-docs/pihole.md) | DNS + Ad blocking | ✓ | /opt/stacks/infrastructure | pihole.${DOMAIN} | | ├─ [Dozzle](service-docs/dozzle.md) | Docker log viewer | ✓ | /opt/stacks/infrastructure | dozzle.${DOMAIN} | | ├─ [Glances](service-docs/glances.md) | System monitoring | ✓ | /opt/stacks/infrastructure | glances.${DOMAIN} | +| ├─ Code Server | VS Code in browser | ✓ | /opt/stacks/infrastructure | code.${DOMAIN} | | └─ [Docker Proxy](service-docs/docker-proxy.md) | Secure socket access | - | /opt/stacks/infrastructure | No UI | -| **📦 [alternatives.yaml](../docker-compose/alternatives.yml) (5)** | **Not deployed** | | | | +| **📦 [alternatives.yaml](../docker-compose/alternatives.yml) (6)** | **Not deployed** | | | | +| ├─ Plex | Media server (Alt) | ✗ | /mnt/media, /mnt/transcode | plex.${DOMAIN} | | ├─ Portainer | Container management | ✓ | /opt/stacks/alternatives | portainer.${DOMAIN} | | ├─ Authentik Server | SSO with web UI | ✓ | /opt/stacks/alternatives | authentik.${DOMAIN} | | │ ├─ authentik-worker | Background tasks | - | /opt/stacks/alternatives | No UI | @@ -26,24 +28,24 @@ This document provides a comprehensive overview of all 60+ pre-configured servic | **📊 [dashboards.yaml](../docker-compose/dashboards.yml)** (2) | | | | | | ├─ Homepage | App dashboard (AI cfg) | ✓ | /opt/stacks/dashboards | home.${DOMAIN} | | └─ Homarr | Modern dashboard | ✓ | /opt/stacks/dashboards | homarr.${DOMAIN} | -| **🎬 [media.yml](../docker-compose/media.yml)** (6) | | | | | -| ├─ Plex | Media server | ✗ | /mnt/media, /mnt/transcode | plex.${DOMAIN} | +| **🎬 [media.yml](../docker-compose/media.yml)** (3) | | | | | | ├─ Jellyfin | Media server (OSS) | ✗ | /mnt/media, /mnt/transcode | jellyfin.${DOMAIN} | -| ├─ Sonarr | TV automation | ✓ | /opt/stacks/media, /mnt/media | sonarr.${DOMAIN} | -| ├─ Radarr | Movie automation | ✓ | /opt/stacks/media, /mnt/media | radarr.${DOMAIN} | -| ├─ Prowlarr | Indexer manager | ✓ | /opt/stacks/media | prowlarr.${DOMAIN} | +| ├─ Calibre-Web | Ebook reader | ✓ | /opt/stacks/media, /mnt/media | calibre.${DOMAIN} | | └─ qBittorrent | Torrent (via VPN) | ✓ | /mnt/downloads | qbit.${DOMAIN} | -| **📚 [media-extended.yaml](../docker-compose/media-extended.yml)** (10) | | | | | -| ├─ Readarr | Ebooks/Audiobooks | ✓ | /opt/stacks/media-ext, /mnt/media | readarr.${DOMAIN} | -| ├─ Lidarr | Music manager | ✓ | /opt/stacks/media-ext, /mnt/media | lidarr.${DOMAIN} | -| ├─ Lazy Librarian | Book automation | ✓ | /opt/stacks/media-ext, /mnt/media | lazylibrarian.${DOMAIN} | -| ├─ Mylar3 | Comic manager | ✓ | /opt/stacks/media-ext, /mnt/media | mylar.${DOMAIN} | -| ├─ Calibre-Web | Ebook reader | ✓ | /opt/stacks/media-ext, /mnt/media | calibre.${DOMAIN} | -| ├─ Jellyseerr | Media requests | ✓ | /opt/stacks/media-ext | jellyseerr.${DOMAIN} | -| ├─ FlareSolverr | Cloudflare bypass | - | /opt/stacks/media-ext | No UI | -| ├─ Tdarr Server | Transcoding server | ✓ | /opt/stacks/media-ext, /mnt/transcode | tdarr.${DOMAIN} | +| **📚 [media-management.yml](../docker-compose/media-management.yml)** (10) | | | | | +| ├─ Sonarr | TV automation | ✓ | /opt/stacks/media-mgmt, /mnt/media | sonarr.${DOMAIN} | +| ├─ Radarr | Movie automation | ✓ | /opt/stacks/media-mgmt, /mnt/media | radarr.${DOMAIN} | +| ├─ Prowlarr | Indexer manager | ✓ | /opt/stacks/media-mgmt | prowlarr.${DOMAIN} | +| ├─ Readarr | Ebooks/Audiobooks | ✓ | /opt/stacks/media-mgmt, /mnt/media | readarr.${DOMAIN} | +| ├─ Lidarr | Music manager | ✓ | /opt/stacks/media-mgmt, /mnt/media | lidarr.${DOMAIN} | +| ├─ Lazy Librarian | Book automation | ✓ | /opt/stacks/media-mgmt, /mnt/media | lazylibrarian.${DOMAIN} | +| ├─ Mylar3 | Comic manager | ✓ | /opt/stacks/media-mgmt, /mnt/media | mylar.${DOMAIN} | +| ├─ Jellyseerr | Media requests | ✓ | /opt/stacks/media-mgmt | jellyseerr.${DOMAIN} | +| ├─ FlareSolverr | Cloudflare bypass | - | /opt/stacks/media-mgmt | No UI | +| ├─ Tdarr Server | Transcoding server | ✓ | /opt/stacks/media-mgmt, /mnt/transcode | tdarr.${DOMAIN} | | ├─ Tdarr Node | Transcoding worker | - | /mnt/transcode-cache | No UI | -| └─ Unmanic | Library optimizer | ✓ | /opt/stacks/media-ext, /mnt/transcode | unmanic.${DOMAIN} | +| ├─ Unmanic | Library optimizer | ✓ | /opt/stacks/media-mgmt, /mnt/transcode | unmanic.${DOMAIN} | +| └─ Bazarr | Subtitle automation | ✓ | /opt/stacks/media-mgmt, /mnt/media | bazarr.${DOMAIN} | | **🏠 [homeassistant.yaml](../docker-compose/homeassistant.yml)** (7) | | | | | | ├─ Home Assistant | HA platform | ✗ | /opt/stacks/homeassistant | ha.${DOMAIN} | | ├─ ESPHome | ESP firmware mgr | ✓ | /opt/stacks/homeassistant | esphome.${DOMAIN} | @@ -67,11 +69,10 @@ This document provides a comprehensive overview of all 60+ pre-configured servic | │ └─ mediawiki-db | MariaDB | - | /opt/stacks/productivity | No UI | | └─ Form.io | Form builder | ✓ | /opt/stacks/productivity | forms.${DOMAIN} | | └─ formio-mongo | MongoDB | - | /opt/stacks/productivity | No UI | -| **🛠️ [utilities.yaml](../docker-compose/utilities.yml)** (7) | | | | | +| **🛠️ [utilities.yaml](../docker-compose/utilities.yml)** (6) | | | | | | ├─ Vaultwarden | Password manager | ✗ | /opt/stacks/utilities | bitwarden.${DOMAIN} | | ├─ Backrest | Backup (restic) | ✓ | /opt/stacks/utilities, /mnt/backups | backrest.${DOMAIN} | | ├─ Duplicati | Encrypted backups | ✓ | /opt/stacks/utilities, /mnt/backups | duplicati.${DOMAIN} | -| ├─ Code Server | VS Code in browser | ✓ | /opt/stacks/utilities | code.${DOMAIN} | | ├─ Form.io | Form platform | ✓ | /opt/stacks/utilities | forms.${DOMAIN} | | │ └─ formio-mongo | MongoDB | - | /opt/stacks/utilities | No UI | | └─ Authelia-Redis | Session storage | - | /opt/stacks/utilities | No UI | diff --git a/tasks.txt b/tasks.txt index 122103c..a605bfb 100644 --- a/tasks.txt +++ b/tasks.txt @@ -1,3 +1,9 @@ -getting-started.md - Getting Started Checklist - include clone repository as first step +reorganize the media stack + move plex to alternatives + move calibre-web from media-extended + move all the arr apps to the media-extended folder + +rename media-extended stack to media-management + +move code-server to infrastructure +