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:
2026-01-14 01:32:20 -05:00
parent e6c8f25275
commit aa3f927b2c
17 changed files with 276 additions and 271 deletions

View File

@@ -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.

View File

@@ -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

View File

@@ -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

View File

@@ -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:

View File

@@ -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

View File

@@ -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:

View File

@@ -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

View File

@@ -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"

View File

@@ -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

View File

@@ -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:

View File

@@ -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
```

View File

@@ -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:

View File

@@ -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
```

View File

@@ -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
```

View File

@@ -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:

View File

@@ -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 |

View File

@@ -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