Reorganize docker-compose stacks for better service grouping
Stack changes: - Renamed media-extended.yml → media-management.yml (better clarity) - Moved Plex from media → alternatives (Jellyfin is primary) - Moved code-server from utilities → infrastructure - Moved Sonarr, Radarr, Prowlarr from media → media-management - Moved Calibre-web from media-management → media New stack organization: - media.yml (3): Jellyfin, Calibre-web, qBittorrent - media-management.yml (13): All *arr apps, transcoders - alternatives.yml (6): Plex, Portainer, Authentik - infrastructure.yml (7): Added code-server - utilities.yml (6): Removed code-server Documentation updated: - README.md: Updated stack descriptions - services-overview.md: Updated service counts and locations - All service docs: Updated file paths media-extended → media-management
This commit is contained in:
@@ -121,13 +121,13 @@ The infrastructure uses Traefik for reverse proxy with automatic SSL, Authelia f
|
|||||||
5. **Deploy additional stacks through Dockge:**
|
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:
|
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** - Jellyfin, Calibre-web, qBittorrent
|
||||||
- **media-extended** - Readarr, Lidarr, Mylar, Calibre
|
- **media-management** - Sonarr, Radarr, Prowlarr, Readarr, Lidarr, Mylar, Bazarr
|
||||||
- **homeassistant** - Home Assistant, Node-RED, Zigbee2MQTT, ESPHome
|
- **homeassistant** - Home Assistant, Node-RED, Zigbee2MQTT, ESPHome
|
||||||
- **productivity** - Nextcloud, Gitea, Bookstack, Outline, Excalidraw
|
- **productivity** - Nextcloud, Gitea, Bookstack, Outline, Excalidraw
|
||||||
- **monitoring** - Grafana, Prometheus, Uptime Kuma, Netdata
|
- **monitoring** - Grafana, Prometheus, Uptime Kuma, Netdata
|
||||||
- **utilities** - Duplicati, Code Server, FreshRSS, Wallabag
|
- **utilities** - Duplicati, FreshRSS, Wallabag
|
||||||
- **alternatives** - Portainer, Authentik (alternative to Dockge/Authelia)
|
- **alternatives** - Plex, Portainer, Authentik
|
||||||
|
|
||||||
Simply click any stack in Dockge and press "Start" to deploy it.
|
Simply click any stack in Dockge and press "Start" to deploy it.
|
||||||
|
|
||||||
|
|||||||
@@ -133,6 +133,54 @@ services:
|
|||||||
timeout: 3s
|
timeout: 3s
|
||||||
retries: 5
|
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:
|
volumes:
|
||||||
portainer-data:
|
portainer-data:
|
||||||
driver: local
|
driver: local
|
||||||
@@ -140,10 +188,14 @@ volumes:
|
|||||||
driver: local
|
driver: local
|
||||||
authentik-redis-data:
|
authentik-redis-data:
|
||||||
driver: local
|
driver: local
|
||||||
|
plex-transcode:
|
||||||
|
driver: local
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
homelab-network:
|
homelab-network:
|
||||||
external: true
|
external: true
|
||||||
traefik-network:
|
traefik-network:
|
||||||
external: true
|
external: true
|
||||||
|
media-network:
|
||||||
|
external: true
|
||||||
|
|
||||||
|
|||||||
@@ -165,8 +165,35 @@ services:
|
|||||||
- "traefik.http.routers.glances.middlewares=authelia@docker"
|
- "traefik.http.routers.glances.middlewares=authelia@docker"
|
||||||
- "traefik.http.services.glances.loadbalancer.server.port=61208"
|
- "traefik.http.services.glances.loadbalancer.server.port=61208"
|
||||||
|
|
||||||
networks:
|
# Code Server - VS Code in browser
|
||||||
traefik-network:
|
# 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
|
external: true
|
||||||
homelab-network:
|
homelab-network:
|
||||||
driver: bridge
|
driver: bridge
|
||||||
|
|||||||
@@ -1,8 +1,93 @@
|
|||||||
# Extended Media Services
|
# Media Management Services
|
||||||
# Additional media management tools
|
# Content automation and library management (*arr apps, transcoders, etc.)
|
||||||
# Place in /opt/stacks/media-extended/docker-compose.yml
|
# Place in /opt/stacks/media-management/docker-compose.yml
|
||||||
|
|
||||||
services:
|
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
|
# Readarr - Ebook and audiobook management
|
||||||
# Access at: https://readarr.${DOMAIN}
|
# Access at: https://readarr.${DOMAIN}
|
||||||
readarr:
|
readarr:
|
||||||
@@ -116,34 +201,6 @@ services:
|
|||||||
- "traefik.http.routers.mylar.middlewares=authelia@docker"
|
- "traefik.http.routers.mylar.middlewares=authelia@docker"
|
||||||
- "traefik.http.services.mylar.loadbalancer.server.port=8090"
|
- "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
|
# Jellyseerr - Request management for Jellyfin/Plex
|
||||||
# Access at: https://jellyseerr.${DOMAIN}
|
# Access at: https://jellyseerr.${DOMAIN}
|
||||||
jellyseerr:
|
jellyseerr:
|
||||||
@@ -4,55 +4,7 @@
|
|||||||
# NOTE: qBittorrent is configured to use Gluetun VPN (see gluetun.yml)
|
# NOTE: qBittorrent is configured to use Gluetun VPN (see gluetun.yml)
|
||||||
|
|
||||||
services:
|
services:
|
||||||
# Plex Media Server - Media streaming platform
|
# Jellyfin - Open-source media streaming server
|
||||||
# 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
|
|
||||||
# Access at: https://jellyfin.yourdomain.duckdns.org
|
# Access at: https://jellyfin.yourdomain.duckdns.org
|
||||||
# NOTE: No Authelia - allows app access from Roku, Fire TV, mobile, etc.
|
# NOTE: No Authelia - allows app access from Roku, Fire TV, mobile, etc.
|
||||||
jellyfin:
|
jellyfin:
|
||||||
@@ -84,90 +36,33 @@ services:
|
|||||||
- "traefik.http.routers.jellyfin.tls.certresolver=letsencrypt"
|
- "traefik.http.routers.jellyfin.tls.certresolver=letsencrypt"
|
||||||
- "traefik.http.services.jellyfin.loadbalancer.server.port=8096"
|
- "traefik.http.services.jellyfin.loadbalancer.server.port=8096"
|
||||||
|
|
||||||
# Sonarr - TV show automation
|
# Calibre-Web - Ebook reader and server
|
||||||
# Access at: https://sonarr.yourdomain.duckdns.org
|
# Access at: https://calibre.${DOMAIN}
|
||||||
sonarr:
|
calibre-web:
|
||||||
image: lscr.io/linuxserver/sonarr:4.0.0
|
image: lscr.io/linuxserver/calibre-web:latest
|
||||||
container_name: sonarr
|
container_name: calibre-web
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
networks:
|
networks:
|
||||||
- media-network
|
- media-network
|
||||||
- homelab-network
|
- homelab-network
|
||||||
- traefik-network
|
- traefik-network
|
||||||
volumes:
|
volumes:
|
||||||
- ./sonarr/config:/config
|
- ./calibre-web/config:/config
|
||||||
- /mnt/media:/media
|
- /mnt/media/books:/books
|
||||||
- /mnt/downloads:/downloads # Large downloads on separate drive
|
|
||||||
environment:
|
environment:
|
||||||
- PUID=${PUID:-1000}
|
- PUID=${PUID:-1000}
|
||||||
- PGID=${PGID:-1000}
|
- PGID=${PGID:-1000}
|
||||||
- TZ=${TZ:-America/New_York}
|
- TZ=${TZ:-America/New_York}
|
||||||
|
- DOCKER_MODS=linuxserver/mods:universal-calibre
|
||||||
labels:
|
labels:
|
||||||
- "homelab.category=media"
|
- "homelab.category=media"
|
||||||
- "homelab.description=TV show management and automation"
|
- "homelab.description=Ebook reader and library management"
|
||||||
# Traefik labels with Authelia
|
|
||||||
- "traefik.enable=true"
|
- "traefik.enable=true"
|
||||||
- "traefik.http.routers.sonarr.rule=Host(`sonarr.${DOMAIN}`)"
|
- "traefik.http.routers.calibre.rule=Host(`calibre.${DOMAIN}`)"
|
||||||
- "traefik.http.routers.sonarr.entrypoints=websecure"
|
- "traefik.http.routers.calibre.entrypoints=websecure"
|
||||||
- "traefik.http.routers.sonarr.tls.certresolver=letsencrypt"
|
- "traefik.http.routers.calibre.tls.certresolver=letsencrypt"
|
||||||
- "traefik.http.routers.sonarr.middlewares=authelia@docker"
|
- "traefik.http.routers.calibre.middlewares=authelia@docker"
|
||||||
- "traefik.http.services.sonarr.loadbalancer.server.port=8989"
|
- "traefik.http.services.calibre.loadbalancer.server.port=8083"
|
||||||
|
|
||||||
# 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"
|
|
||||||
|
|
||||||
# qBittorrent - Torrent client
|
# qBittorrent - Torrent client
|
||||||
# Access at: https://qbit.yourdomain.duckdns.org
|
# 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"
|
# NOTE: This is a placeholder. Configure qBittorrent in gluetun.yml with network_mode: "service:gluetun"
|
||||||
# See gluetun.yml for the actual qBittorrent configuration
|
# See gluetun.yml for the actual qBittorrent configuration
|
||||||
|
|
||||||
volumes:
|
|
||||||
plex-transcode:
|
|
||||||
driver: local
|
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
media-network:
|
media-network:
|
||||||
driver: bridge
|
driver: bridge
|
||||||
|
|||||||
@@ -59,35 +59,6 @@ services:
|
|||||||
- "traefik.http.routers.duplicati.middlewares=authelia@docker"
|
- "traefik.http.routers.duplicati.middlewares=authelia@docker"
|
||||||
- "traefik.http.services.duplicati.loadbalancer.server.port=8200"
|
- "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)
|
# Form.io - Form builder (if needed)
|
||||||
# Access at: https://forms.${DOMAIN}
|
# Access at: https://forms.${DOMAIN}
|
||||||
formio:
|
formio:
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
**Category:** Subtitle Management
|
**Category:** Subtitle Management
|
||||||
**Docker Image:** [linuxserver/bazarr](https://hub.docker.com/r/linuxserver/bazarr)
|
**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`
|
**Web UI:** `https://bazarr.${DOMAIN}` or `http://SERVER_IP:6767`
|
||||||
**Authentication:** Optional (configurable)
|
**Authentication:** Optional (configurable)
|
||||||
**Ports:** 6767
|
**Ports:** 6767
|
||||||
@@ -79,7 +79,7 @@ Subtitle Available in Player
|
|||||||
### Directory Structure
|
### 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/movies/ # Movie library (with subtitles)
|
||||||
/mnt/media/tv/ # TV library (with subtitles)
|
/mnt/media/tv/ # TV library (with subtitles)
|
||||||
|
|
||||||
@@ -151,7 +151,7 @@ bazarr:
|
|||||||
- PGID=1000
|
- PGID=1000
|
||||||
- TZ=America/New_York
|
- TZ=America/New_York
|
||||||
volumes:
|
volumes:
|
||||||
- /opt/stacks/media-extended/bazarr/config:/config
|
- /opt/stacks/media-management/bazarr/config:/config
|
||||||
- /mnt/media/movies:/movies
|
- /mnt/media/movies:/movies
|
||||||
- /mnt/media/tv:/tv
|
- /mnt/media/tv:/tv
|
||||||
labels:
|
labels:
|
||||||
@@ -548,13 +548,13 @@ sudo chown -R 1000:1000 /mnt/media/movies/
|
|||||||
docker stop bazarr
|
docker stop bazarr
|
||||||
|
|
||||||
# Backup database
|
# 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
|
# 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
|
# 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
|
# Restart
|
||||||
docker start bazarr
|
docker start bazarr
|
||||||
@@ -610,8 +610,8 @@ docker start bazarr
|
|||||||
|
|
||||||
**Critical Files:**
|
**Critical Files:**
|
||||||
```bash
|
```bash
|
||||||
/opt/stacks/media-extended/bazarr/config/db/bazarr.db # Database
|
/opt/stacks/media-management/bazarr/config/db/bazarr.db # Database
|
||||||
/opt/stacks/media-extended/bazarr/config/config/config.yaml # Settings
|
/opt/stacks/media-management/bazarr/config/config/config.yaml # Settings
|
||||||
```
|
```
|
||||||
|
|
||||||
**Backup Script:**
|
**Backup Script:**
|
||||||
@@ -622,7 +622,7 @@ BACKUP_DIR=/opt/backups/bazarr
|
|||||||
|
|
||||||
docker stop bazarr
|
docker stop bazarr
|
||||||
tar -czf $BACKUP_DIR/bazarr-$DATE.tar.gz \
|
tar -czf $BACKUP_DIR/bazarr-$DATE.tar.gz \
|
||||||
/opt/stacks/media-extended/bazarr/config/
|
/opt/stacks/media-management/bazarr/config/
|
||||||
docker start bazarr
|
docker start bazarr
|
||||||
|
|
||||||
find $BACKUP_DIR -name "bazarr-*.tar.gz" -mtime +7 -delete
|
find $BACKUP_DIR -name "bazarr-*.tar.gz" -mtime +7 -delete
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ Calibre-Web is a web-based ebook reader and library manager. It provides a clean
|
|||||||
### Directory Structure
|
### Directory Structure
|
||||||
|
|
||||||
```
|
```
|
||||||
/opt/stacks/media-extended/calibre-web/config/ # Config
|
/opt/stacks/media-management/calibre-web/config/ # Config
|
||||||
/mnt/media/books/ # Calibre library
|
/mnt/media/books/ # Calibre library
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -84,7 +84,7 @@ calibre-web:
|
|||||||
- TZ=America/New_York
|
- TZ=America/New_York
|
||||||
- DOCKER_MODS=linuxserver/mods:universal-calibre
|
- DOCKER_MODS=linuxserver/mods:universal-calibre
|
||||||
volumes:
|
volumes:
|
||||||
- /opt/stacks/media-extended/calibre-web/config:/config
|
- /opt/stacks/media-management/calibre-web/config:/config
|
||||||
- /mnt/media/books:/books
|
- /mnt/media/books:/books
|
||||||
labels:
|
labels:
|
||||||
- "traefik.enable=true"
|
- "traefik.enable=true"
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ User Watches Content
|
|||||||
### Directory Structure
|
### Directory Structure
|
||||||
|
|
||||||
```
|
```
|
||||||
/opt/stacks/media-extended/jellyseerr/config/ # Jellyseerr configuration
|
/opt/stacks/media-management/jellyseerr/config/ # Jellyseerr configuration
|
||||||
```
|
```
|
||||||
|
|
||||||
### Environment Variables
|
### Environment Variables
|
||||||
@@ -137,7 +137,7 @@ jellyseerr:
|
|||||||
- LOG_LEVEL=info
|
- LOG_LEVEL=info
|
||||||
- TZ=America/New_York
|
- TZ=America/New_York
|
||||||
volumes:
|
volumes:
|
||||||
- /opt/stacks/media-extended/jellyseerr/config:/app/config
|
- /opt/stacks/media-management/jellyseerr/config:/app/config
|
||||||
labels:
|
labels:
|
||||||
- "traefik.enable=true"
|
- "traefik.enable=true"
|
||||||
- "traefik.http.routers.jellyseerr.rule=Host(`jellyseerr.${DOMAIN}`)"
|
- "traefik.http.routers.jellyseerr.rule=Host(`jellyseerr.${DOMAIN}`)"
|
||||||
@@ -516,7 +516,7 @@ docker logs jellyseerr | grep -i notification
|
|||||||
docker stop jellyseerr
|
docker stop jellyseerr
|
||||||
|
|
||||||
# Vacuum database
|
# 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
|
# Restart
|
||||||
docker start jellyseerr
|
docker start jellyseerr
|
||||||
@@ -549,8 +549,8 @@ docker start jellyseerr
|
|||||||
|
|
||||||
**Critical Files:**
|
**Critical Files:**
|
||||||
```bash
|
```bash
|
||||||
/opt/stacks/media-extended/jellyseerr/config/db/db.sqlite3 # Database
|
/opt/stacks/media-management/jellyseerr/config/db/db.sqlite3 # Database
|
||||||
/opt/stacks/media-extended/jellyseerr/config/settings.json # Settings
|
/opt/stacks/media-management/jellyseerr/config/settings.json # Settings
|
||||||
```
|
```
|
||||||
|
|
||||||
**Backup Script:**
|
**Backup Script:**
|
||||||
@@ -561,7 +561,7 @@ BACKUP_DIR=/opt/backups/jellyseerr
|
|||||||
|
|
||||||
docker stop jellyseerr
|
docker stop jellyseerr
|
||||||
tar -czf $BACKUP_DIR/jellyseerr-$DATE.tar.gz \
|
tar -czf $BACKUP_DIR/jellyseerr-$DATE.tar.gz \
|
||||||
/opt/stacks/media-extended/jellyseerr/config/
|
/opt/stacks/media-management/jellyseerr/config/
|
||||||
docker start jellyseerr
|
docker start jellyseerr
|
||||||
|
|
||||||
find $BACKUP_DIR -name "jellyseerr-*.tar.gz" -mtime +7 -delete
|
find $BACKUP_DIR -name "jellyseerr-*.tar.gz" -mtime +7 -delete
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ Lazy Librarian is an automated book downloader similar to Sonarr/Radarr but for
|
|||||||
### Directory Structure
|
### Directory Structure
|
||||||
|
|
||||||
```
|
```
|
||||||
/opt/stacks/media-extended/lazylibrarian/config/ # Config
|
/opt/stacks/media-management/lazylibrarian/config/ # Config
|
||||||
/mnt/media/books/ # Book library
|
/mnt/media/books/ # Book library
|
||||||
/mnt/downloads/ # Downloads
|
/mnt/downloads/ # Downloads
|
||||||
```
|
```
|
||||||
@@ -82,7 +82,7 @@ lazylibrarian:
|
|||||||
- PGID=1000
|
- PGID=1000
|
||||||
- TZ=America/New_York
|
- TZ=America/New_York
|
||||||
volumes:
|
volumes:
|
||||||
- /opt/stacks/media-extended/lazylibrarian/config:/config
|
- /opt/stacks/media-management/lazylibrarian/config:/config
|
||||||
- /mnt/media/books:/books
|
- /mnt/media/books:/books
|
||||||
- /mnt/downloads:/downloads
|
- /mnt/downloads:/downloads
|
||||||
labels:
|
labels:
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ Plex/Jellyfin/Subsonic Access
|
|||||||
### Directory Structure
|
### 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/downloads/complete/music-lidarr/ # Downloaded music
|
||||||
/mnt/media/music/ # Final music library
|
/mnt/media/music/ # Final music library
|
||||||
|
|
||||||
@@ -149,7 +149,7 @@ lidarr:
|
|||||||
- PGID=1000
|
- PGID=1000
|
||||||
- TZ=America/New_York
|
- TZ=America/New_York
|
||||||
volumes:
|
volumes:
|
||||||
- /opt/stacks/media-extended/lidarr/config:/config
|
- /opt/stacks/media-management/lidarr/config:/config
|
||||||
- /mnt/media/music:/music
|
- /mnt/media/music:/music
|
||||||
- /mnt/downloads:/downloads
|
- /mnt/downloads:/downloads
|
||||||
labels:
|
labels:
|
||||||
@@ -403,7 +403,7 @@ lidarr-lossless:
|
|||||||
ports:
|
ports:
|
||||||
- "8687:8686"
|
- "8687:8686"
|
||||||
volumes:
|
volumes:
|
||||||
- /opt/stacks/media-extended/lidarr-lossless/config:/config
|
- /opt/stacks/media-management/lidarr-lossless/config:/config
|
||||||
- /mnt/media/music-flac:/music
|
- /mnt/media/music-flac:/music
|
||||||
- /mnt/downloads:/downloads
|
- /mnt/downloads:/downloads
|
||||||
```
|
```
|
||||||
@@ -498,10 +498,10 @@ docker exec lidarr exiftool /music/Artist/Album/track.flac
|
|||||||
docker stop lidarr
|
docker stop lidarr
|
||||||
|
|
||||||
# Backup database
|
# 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
|
# 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
|
# Restore from backup if corrupted
|
||||||
docker start lidarr
|
docker start lidarr
|
||||||
@@ -522,7 +522,7 @@ docker start lidarr
|
|||||||
docker stop lidarr
|
docker stop lidarr
|
||||||
|
|
||||||
# Vacuum database
|
# 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
|
# Clear old history
|
||||||
# Settings → General → History Cleanup: 30 days
|
# Settings → General → History Cleanup: 30 days
|
||||||
@@ -558,9 +558,9 @@ docker start lidarr
|
|||||||
|
|
||||||
**Critical Files:**
|
**Critical Files:**
|
||||||
```bash
|
```bash
|
||||||
/opt/stacks/media-extended/lidarr/config/lidarr.db # Database
|
/opt/stacks/media-management/lidarr/config/lidarr.db # Database
|
||||||
/opt/stacks/media-extended/lidarr/config/config.xml # Settings
|
/opt/stacks/media-management/lidarr/config/config.xml # Settings
|
||||||
/opt/stacks/media-extended/lidarr/config/Backup/ # Auto backups
|
/opt/stacks/media-management/lidarr/config/Backup/ # Auto backups
|
||||||
```
|
```
|
||||||
|
|
||||||
**Backup Script:**
|
**Backup Script:**
|
||||||
@@ -569,7 +569,7 @@ docker start lidarr
|
|||||||
DATE=$(date +%Y%m%d)
|
DATE=$(date +%Y%m%d)
|
||||||
BACKUP_DIR=/opt/backups/lidarr
|
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
|
find $BACKUP_DIR -name "lidarr-*.db" -mtime +7 -delete
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
**Category:** Comic Book Management
|
**Category:** Comic Book Management
|
||||||
**Docker Image:** [linuxserver/mylar3](https://hub.docker.com/r/linuxserver/mylar3)
|
**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`
|
**Web UI:** `http://SERVER_IP:8090`
|
||||||
**Ports:** 8090
|
**Ports:** 8090
|
||||||
|
|
||||||
@@ -49,7 +49,7 @@ Mylar3 is an automated comic book download manager. It's like Sonarr/Radarr but
|
|||||||
### Directory Structure
|
### Directory Structure
|
||||||
|
|
||||||
```
|
```
|
||||||
/opt/stacks/media-extended/mylar3/config/ # Configuration
|
/opt/stacks/media-management/mylar3/config/ # Configuration
|
||||||
/mnt/media/comics/ # Comic library
|
/mnt/media/comics/ # Comic library
|
||||||
/mnt/downloads/ # Downloads
|
/mnt/downloads/ # Downloads
|
||||||
|
|
||||||
@@ -90,7 +90,7 @@ mylar3:
|
|||||||
- PGID=1000
|
- PGID=1000
|
||||||
- TZ=America/New_York
|
- TZ=America/New_York
|
||||||
volumes:
|
volumes:
|
||||||
- /opt/stacks/media-extended/mylar3/config:/config
|
- /opt/stacks/media-management/mylar3/config:/config
|
||||||
- /mnt/media/comics:/comics
|
- /mnt/media/comics:/comics
|
||||||
- /mnt/downloads:/downloads
|
- /mnt/downloads:/downloads
|
||||||
labels:
|
labels:
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
**Category:** Media Management & Automation
|
**Category:** Media Management & Automation
|
||||||
**Docker Image:** [linuxserver/readarr](https://hub.docker.com/r/linuxserver/readarr)
|
**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`
|
**Web UI:** `https://readarr.${DOMAIN}` or `http://SERVER_IP:8787`
|
||||||
**Authentication:** Optional (configurable)
|
**Authentication:** Optional (configurable)
|
||||||
**Ports:** 8787
|
**Ports:** 8787
|
||||||
@@ -77,7 +77,7 @@ Calibre-Web / Calibre Access
|
|||||||
### Directory Structure
|
### 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/downloads/complete/books-readarr/ # Downloaded books
|
||||||
/mnt/media/books/ # Final book library
|
/mnt/media/books/ # Final book library
|
||||||
|
|
||||||
@@ -148,7 +148,7 @@ readarr:
|
|||||||
- PGID=1000
|
- PGID=1000
|
||||||
- TZ=America/New_York
|
- TZ=America/New_York
|
||||||
volumes:
|
volumes:
|
||||||
- /opt/stacks/media-extended/readarr/config:/config
|
- /opt/stacks/media-management/readarr/config:/config
|
||||||
- /mnt/media/books:/books
|
- /mnt/media/books:/books
|
||||||
- /mnt/downloads:/downloads
|
- /mnt/downloads:/downloads
|
||||||
labels:
|
labels:
|
||||||
@@ -337,7 +337,7 @@ readarr-audio:
|
|||||||
ports:
|
ports:
|
||||||
- "8788:8787"
|
- "8788:8787"
|
||||||
volumes:
|
volumes:
|
||||||
- /opt/stacks/media-extended/readarr-audio/config:/config
|
- /opt/stacks/media-management/readarr-audio/config:/config
|
||||||
- /mnt/media/audiobooks:/books
|
- /mnt/media/audiobooks:/books
|
||||||
- /mnt/downloads:/downloads
|
- /mnt/downloads:/downloads
|
||||||
environment:
|
environment:
|
||||||
@@ -467,10 +467,10 @@ docker logs readarr | grep -i import
|
|||||||
docker stop readarr
|
docker stop readarr
|
||||||
|
|
||||||
# Backup database
|
# 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
|
# 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
|
# Restore from backup if corrupted
|
||||||
docker start readarr
|
docker start readarr
|
||||||
@@ -491,7 +491,7 @@ docker start readarr
|
|||||||
docker stop readarr
|
docker stop readarr
|
||||||
|
|
||||||
# Vacuum database
|
# 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
|
# Clear old history
|
||||||
# Settings → General → History Cleanup: 30 days
|
# Settings → General → History Cleanup: 30 days
|
||||||
@@ -521,9 +521,9 @@ docker start readarr
|
|||||||
|
|
||||||
**Critical Files:**
|
**Critical Files:**
|
||||||
```bash
|
```bash
|
||||||
/opt/stacks/media-extended/readarr/config/readarr.db # Database
|
/opt/stacks/media-management/readarr/config/readarr.db # Database
|
||||||
/opt/stacks/media-extended/readarr/config/config.xml # Settings
|
/opt/stacks/media-management/readarr/config/config.xml # Settings
|
||||||
/opt/stacks/media-extended/readarr/config/Backup/ # Auto backups
|
/opt/stacks/media-management/readarr/config/Backup/ # Auto backups
|
||||||
```
|
```
|
||||||
|
|
||||||
**Backup Script:**
|
**Backup Script:**
|
||||||
@@ -532,7 +532,7 @@ docker start readarr
|
|||||||
DATE=$(date +%Y%m%d)
|
DATE=$(date +%Y%m%d)
|
||||||
BACKUP_DIR=/opt/backups/readarr
|
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
|
find $BACKUP_DIR -name "readarr-*.db" -mtime +7 -delete
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ Library Updated
|
|||||||
### Directory Structure
|
### Directory Structure
|
||||||
|
|
||||||
```
|
```
|
||||||
/opt/stacks/media-extended/tdarr/
|
/opt/stacks/media-management/tdarr/
|
||||||
├── server/ # Tdarr server data
|
├── server/ # Tdarr server data
|
||||||
├── config/ # Configuration
|
├── config/ # Configuration
|
||||||
├── logs/ # Logs
|
├── logs/ # Logs
|
||||||
@@ -175,10 +175,10 @@ tdarr:
|
|||||||
- PGID=1000
|
- PGID=1000
|
||||||
- TZ=America/New_York
|
- TZ=America/New_York
|
||||||
volumes:
|
volumes:
|
||||||
- /opt/stacks/media-extended/tdarr/server:/app/server
|
- /opt/stacks/media-management/tdarr/server:/app/server
|
||||||
- /opt/stacks/media-extended/tdarr/config:/app/configs
|
- /opt/stacks/media-management/tdarr/config:/app/configs
|
||||||
- /opt/stacks/media-extended/tdarr/logs:/app/logs
|
- /opt/stacks/media-management/tdarr/logs:/app/logs
|
||||||
- /opt/stacks/media-extended/tdarr/temp:/temp
|
- /opt/stacks/media-management/tdarr/temp:/temp
|
||||||
- /mnt/media:/media
|
- /mnt/media:/media
|
||||||
devices:
|
devices:
|
||||||
- /dev/dri:/dev/dri # Intel QuickSync
|
- /dev/dri:/dev/dri # Intel QuickSync
|
||||||
@@ -219,9 +219,9 @@ tdarr-node:
|
|||||||
- PUID=1000
|
- PUID=1000
|
||||||
- PGID=1000
|
- PGID=1000
|
||||||
volumes:
|
volumes:
|
||||||
- /opt/stacks/media-extended/tdarr/config:/app/configs
|
- /opt/stacks/media-management/tdarr/config:/app/configs
|
||||||
- /opt/stacks/media-extended/tdarr/logs:/app/logs
|
- /opt/stacks/media-management/tdarr/logs:/app/logs
|
||||||
- /opt/stacks/media-extended/tdarr/temp:/temp
|
- /opt/stacks/media-management/tdarr/temp:/temp
|
||||||
- /mnt/media:/media
|
- /mnt/media:/media
|
||||||
devices:
|
devices:
|
||||||
- /dev/dri:/dev/dri
|
- /dev/dri:/dev/dri
|
||||||
@@ -500,7 +500,7 @@ docker logs tdarr-node
|
|||||||
docker logs tdarr-node | tail -50
|
docker logs tdarr-node | tail -50
|
||||||
|
|
||||||
# Check temp directory space
|
# Check temp directory space
|
||||||
df -h /opt/stacks/media-extended/tdarr/temp/
|
df -h /opt/stacks/media-management/tdarr/temp/
|
||||||
|
|
||||||
# Check FFmpeg
|
# Check FFmpeg
|
||||||
docker exec tdarr-node ffmpeg -version
|
docker exec tdarr-node ffmpeg -version
|
||||||
@@ -557,7 +557,7 @@ docker stats tdarr tdarr-node
|
|||||||
ls -la /mnt/media/
|
ls -la /mnt/media/
|
||||||
|
|
||||||
# Check temp directory
|
# Check temp directory
|
||||||
ls -la /opt/stacks/media-extended/tdarr/temp/
|
ls -la /opt/stacks/media-management/tdarr/temp/
|
||||||
|
|
||||||
# Check logs for errors
|
# Check logs for errors
|
||||||
docker logs tdarr-node | grep -i error
|
docker logs tdarr-node | grep -i error
|
||||||
@@ -626,8 +626,8 @@ volumes:
|
|||||||
|
|
||||||
**Critical Files:**
|
**Critical Files:**
|
||||||
```bash
|
```bash
|
||||||
/opt/stacks/media-extended/tdarr/server/ # Database
|
/opt/stacks/media-management/tdarr/server/ # Database
|
||||||
/opt/stacks/media-extended/tdarr/config/ # Configuration
|
/opt/stacks/media-management/tdarr/config/ # Configuration
|
||||||
```
|
```
|
||||||
|
|
||||||
**Backup Script:**
|
**Backup Script:**
|
||||||
@@ -637,8 +637,8 @@ DATE=$(date +%Y%m%d)
|
|||||||
BACKUP_DIR=/opt/backups/tdarr
|
BACKUP_DIR=/opt/backups/tdarr
|
||||||
|
|
||||||
tar -czf $BACKUP_DIR/tdarr-$DATE.tar.gz \
|
tar -czf $BACKUP_DIR/tdarr-$DATE.tar.gz \
|
||||||
/opt/stacks/media-extended/tdarr/server/ \
|
/opt/stacks/media-management/tdarr/server/ \
|
||||||
/opt/stacks/media-extended/tdarr/config/
|
/opt/stacks/media-management/tdarr/config/
|
||||||
|
|
||||||
find $BACKUP_DIR -name "tdarr-*.tar.gz" -mtime +7 -delete
|
find $BACKUP_DIR -name "tdarr-*.tar.gz" -mtime +7 -delete
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ Library Optimized
|
|||||||
### Directory Structure
|
### Directory Structure
|
||||||
|
|
||||||
```
|
```
|
||||||
/opt/stacks/media-extended/unmanic/config/ # Configuration
|
/opt/stacks/media-management/unmanic/config/ # Configuration
|
||||||
/mnt/media/movies/ # Movie library
|
/mnt/media/movies/ # Movie library
|
||||||
/mnt/media/tv/ # TV library
|
/mnt/media/tv/ # TV library
|
||||||
/tmp/unmanic/ # Temp files
|
/tmp/unmanic/ # Temp files
|
||||||
@@ -135,7 +135,7 @@ unmanic:
|
|||||||
- PGID=1000
|
- PGID=1000
|
||||||
- TZ=America/New_York
|
- TZ=America/New_York
|
||||||
volumes:
|
volumes:
|
||||||
- /opt/stacks/media-extended/unmanic/config:/config
|
- /opt/stacks/media-management/unmanic/config:/config
|
||||||
- /mnt/media:/library
|
- /mnt/media:/library
|
||||||
- /tmp/unmanic:/tmp/unmanic
|
- /tmp/unmanic:/tmp/unmanic
|
||||||
devices:
|
devices:
|
||||||
|
|||||||
@@ -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} |
|
| ├─ [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} |
|
| ├─ [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 |
|
| └─ [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} |
|
| ├─ [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} |
|
| ├─ [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} |
|
| ├─ [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} |
|
| ├─ [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 |
|
| └─ [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} |
|
| ├─ Portainer | Container management | ✓ | /opt/stacks/alternatives | portainer.${DOMAIN} |
|
||||||
| ├─ Authentik Server | SSO with web UI | ✓ | /opt/stacks/alternatives | authentik.${DOMAIN} |
|
| ├─ Authentik Server | SSO with web UI | ✓ | /opt/stacks/alternatives | authentik.${DOMAIN} |
|
||||||
| │ ├─ authentik-worker | Background tasks | - | /opt/stacks/alternatives | No UI |
|
| │ ├─ 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) | | | | |
|
| **📊 [dashboards.yaml](../docker-compose/dashboards.yml)** (2) | | | | |
|
||||||
| ├─ Homepage | App dashboard (AI cfg) | ✓ | /opt/stacks/dashboards | home.${DOMAIN} |
|
| ├─ Homepage | App dashboard (AI cfg) | ✓ | /opt/stacks/dashboards | home.${DOMAIN} |
|
||||||
| └─ Homarr | Modern dashboard | ✓ | /opt/stacks/dashboards | homarr.${DOMAIN} |
|
| └─ Homarr | Modern dashboard | ✓ | /opt/stacks/dashboards | homarr.${DOMAIN} |
|
||||||
| **🎬 [media.yml](../docker-compose/media.yml)** (6) | | | | |
|
| **🎬 [media.yml](../docker-compose/media.yml)** (3) | | | | |
|
||||||
| ├─ Plex | Media server | ✗ | /mnt/media, /mnt/transcode | plex.${DOMAIN} |
|
|
||||||
| ├─ Jellyfin | Media server (OSS) | ✗ | /mnt/media, /mnt/transcode | jellyfin.${DOMAIN} |
|
| ├─ Jellyfin | Media server (OSS) | ✗ | /mnt/media, /mnt/transcode | jellyfin.${DOMAIN} |
|
||||||
| ├─ Sonarr | TV automation | ✓ | /opt/stacks/media, /mnt/media | sonarr.${DOMAIN} |
|
| ├─ Calibre-Web | Ebook reader | ✓ | /opt/stacks/media, /mnt/media | calibre.${DOMAIN} |
|
||||||
| ├─ Radarr | Movie automation | ✓ | /opt/stacks/media, /mnt/media | radarr.${DOMAIN} |
|
|
||||||
| ├─ Prowlarr | Indexer manager | ✓ | /opt/stacks/media | prowlarr.${DOMAIN} |
|
|
||||||
| └─ qBittorrent | Torrent (via VPN) | ✓ | /mnt/downloads | qbit.${DOMAIN} |
|
| └─ qBittorrent | Torrent (via VPN) | ✓ | /mnt/downloads | qbit.${DOMAIN} |
|
||||||
| **📚 [media-extended.yaml](../docker-compose/media-extended.yml)** (10) | | | | |
|
| **📚 [media-management.yml](../docker-compose/media-management.yml)** (10) | | | | |
|
||||||
| ├─ Readarr | Ebooks/Audiobooks | ✓ | /opt/stacks/media-ext, /mnt/media | readarr.${DOMAIN} |
|
| ├─ Sonarr | TV automation | ✓ | /opt/stacks/media-mgmt, /mnt/media | sonarr.${DOMAIN} |
|
||||||
| ├─ Lidarr | Music manager | ✓ | /opt/stacks/media-ext, /mnt/media | lidarr.${DOMAIN} |
|
| ├─ Radarr | Movie automation | ✓ | /opt/stacks/media-mgmt, /mnt/media | radarr.${DOMAIN} |
|
||||||
| ├─ Lazy Librarian | Book automation | ✓ | /opt/stacks/media-ext, /mnt/media | lazylibrarian.${DOMAIN} |
|
| ├─ Prowlarr | Indexer manager | ✓ | /opt/stacks/media-mgmt | prowlarr.${DOMAIN} |
|
||||||
| ├─ Mylar3 | Comic manager | ✓ | /opt/stacks/media-ext, /mnt/media | mylar.${DOMAIN} |
|
| ├─ Readarr | Ebooks/Audiobooks | ✓ | /opt/stacks/media-mgmt, /mnt/media | readarr.${DOMAIN} |
|
||||||
| ├─ Calibre-Web | Ebook reader | ✓ | /opt/stacks/media-ext, /mnt/media | calibre.${DOMAIN} |
|
| ├─ Lidarr | Music manager | ✓ | /opt/stacks/media-mgmt, /mnt/media | lidarr.${DOMAIN} |
|
||||||
| ├─ Jellyseerr | Media requests | ✓ | /opt/stacks/media-ext | jellyseerr.${DOMAIN} |
|
| ├─ Lazy Librarian | Book automation | ✓ | /opt/stacks/media-mgmt, /mnt/media | lazylibrarian.${DOMAIN} |
|
||||||
| ├─ FlareSolverr | Cloudflare bypass | - | /opt/stacks/media-ext | No UI |
|
| ├─ Mylar3 | Comic manager | ✓ | /opt/stacks/media-mgmt, /mnt/media | mylar.${DOMAIN} |
|
||||||
| ├─ Tdarr Server | Transcoding server | ✓ | /opt/stacks/media-ext, /mnt/transcode | tdarr.${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 |
|
| ├─ 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) | | | | |
|
| **🏠 [homeassistant.yaml](../docker-compose/homeassistant.yml)** (7) | | | | |
|
||||||
| ├─ Home Assistant | HA platform | ✗ | /opt/stacks/homeassistant | ha.${DOMAIN} |
|
| ├─ Home Assistant | HA platform | ✗ | /opt/stacks/homeassistant | ha.${DOMAIN} |
|
||||||
| ├─ ESPHome | ESP firmware mgr | ✓ | /opt/stacks/homeassistant | esphome.${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 |
|
| │ └─ mediawiki-db | MariaDB | - | /opt/stacks/productivity | No UI |
|
||||||
| └─ Form.io | Form builder | ✓ | /opt/stacks/productivity | forms.${DOMAIN} |
|
| └─ Form.io | Form builder | ✓ | /opt/stacks/productivity | forms.${DOMAIN} |
|
||||||
| └─ formio-mongo | MongoDB | - | /opt/stacks/productivity | No UI |
|
| └─ 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} |
|
| ├─ Vaultwarden | Password manager | ✗ | /opt/stacks/utilities | bitwarden.${DOMAIN} |
|
||||||
| ├─ Backrest | Backup (restic) | ✓ | /opt/stacks/utilities, /mnt/backups | backrest.${DOMAIN} |
|
| ├─ Backrest | Backup (restic) | ✓ | /opt/stacks/utilities, /mnt/backups | backrest.${DOMAIN} |
|
||||||
| ├─ Duplicati | Encrypted backups | ✓ | /opt/stacks/utilities, /mnt/backups | duplicati.${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} |
|
| ├─ Form.io | Form platform | ✓ | /opt/stacks/utilities | forms.${DOMAIN} |
|
||||||
| │ └─ formio-mongo | MongoDB | - | /opt/stacks/utilities | No UI |
|
| │ └─ formio-mongo | MongoDB | - | /opt/stacks/utilities | No UI |
|
||||||
| └─ Authelia-Redis | Session storage | - | /opt/stacks/utilities | No UI |
|
| └─ Authelia-Redis | Session storage | - | /opt/stacks/utilities | No UI |
|
||||||
|
|||||||
12
tasks.txt
12
tasks.txt
@@ -1,3 +1,9 @@
|
|||||||
getting-started.md
|
reorganize the media stack
|
||||||
Getting Started Checklist
|
move plex to alternatives
|
||||||
include clone repository as first step
|
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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user