Fact-check results: - RomM 5.2.0: MariaDB+Redis now required (was SQLite), auth var renamed, 11 metadata providers - Copyparty v1.20.19: 3 CVEs fixed, WOPI integration, docker editions documented - Calibre-Web 0.6.27-ls397: version pinning, kepubify auto-config, CVE fixes - Calibre 9.9.0: content server security fix noted New documentation: - docs/Dankserver/Jellyfin.md — full media server guide (compose, Caddy, GPU, metadata, clients) - docs/Dankserver/ARR-Stack.md — automated download stack overview - docs/Dankserver/RomM-Scraping.md — metadata providers, naming, cover art, emulator integration - docs/Dankserver/sonarr.md, radarr.md, lidarr.md, readarr.md, prowlarr.md, qbittorrent.md - docs/Dankserver/mariadb.md, redis.md — supporting services for RomM Infrastructure updates: - dankserver/compose.yaml: added mariadb, redis, jellyfin, *arr services - dankserver/Caddyfile: added hostnames for all new services - dankserver/.env.example: added all new environment variables - docs/index.md: linked all new documentation pages Tested: 52/52 tests pass.
273 lines
8.2 KiB
YAML
273 lines
8.2 KiB
YAML
# Dankserver stack — media & library services.
|
|
# Deploy: cd /home/dank/serverAppConfigs && podman-compose -f dankserver/compose.yaml up -d
|
|
# See ../docs/Dankserver/ for service documentation.
|
|
|
|
networks:
|
|
appnet:
|
|
driver: bridge
|
|
|
|
services:
|
|
# ═══════════════════════════════════════════════
|
|
# RomM — retro game manager (requires MariaDB + Redis)
|
|
# ═══════════════════════════════════════════════
|
|
mariadb:
|
|
image: docker.io/mariadb:11
|
|
container_name: romm-mariadb
|
|
restart: unless-stopped
|
|
environment:
|
|
MARIADB_ROOT_PASSWORD: "${MARIADB_ROOT_PASSWORD}"
|
|
MARIADB_DATABASE: romm
|
|
MARIADB_USER: "${ROMM_DB_USER}"
|
|
MARIADB_PASSWORD: "${ROMM_DB_PASSWD}"
|
|
volumes:
|
|
- /opt/romm/mariadb:/var/lib/mysql
|
|
healthcheck:
|
|
test: ["CMD", "mariadb-admin", "ping", "-h", "localhost"]
|
|
interval: 10s
|
|
timeout: 5s
|
|
retries: 3
|
|
|
|
redis:
|
|
image: docker.io/redis:7-alpine
|
|
container_name: romm-redis
|
|
restart: unless-stopped
|
|
volumes:
|
|
- /opt/romm/redis:/data
|
|
healthcheck:
|
|
test: ["CMD", "redis-cli", "ping"]
|
|
interval: 10s
|
|
timeout: 5s
|
|
retries: 3
|
|
|
|
romm:
|
|
image: ghcr.io/rommapp/romm:latest
|
|
container_name: romm
|
|
restart: unless-stopped
|
|
environment:
|
|
ROMM_USERNAME: "${ROMM_USERNAME}"
|
|
ROMM_PASSWORD: "${ROMM_PASSWORD}"
|
|
ROMM_AUTH_SECRET_KEY: "${ROMM_AUTH_SECRET_KEY}"
|
|
DB_HOST: mariadb
|
|
DB_NAME: romm
|
|
DB_USER: "${ROMM_DB_USER}"
|
|
DB_PASSWD: "${ROMM_DB_PASSWD}"
|
|
REDIS_HOST: redis
|
|
HASHEOUS_API_ENABLED: "true"
|
|
ports:
|
|
- "8085:8080"
|
|
volumes:
|
|
- /opt/romm/library:/romm/library
|
|
- /opt/romm/resources:/romm/resources
|
|
- /opt/romm/config:/romm/config
|
|
depends_on:
|
|
mariadb:
|
|
condition: service_healthy
|
|
redis:
|
|
condition: service_healthy
|
|
healthcheck:
|
|
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 3
|
|
|
|
# ═══════════════════════════════════════════════
|
|
# Copyparty — file sharing and streaming
|
|
# ═══════════════════════════════════════════════
|
|
copyparty:
|
|
image: ghcr.io/9001/copyparty:latest
|
|
container_name: copyparty
|
|
restart: unless-stopped
|
|
environment:
|
|
COPAY_PASS: "${COPAY_PASS}"
|
|
COPAY_MODE: rw
|
|
ports:
|
|
- "3923:3923"
|
|
volumes:
|
|
- /opt/copyparty/data:/data
|
|
healthcheck:
|
|
test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:3923/')"]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 3
|
|
|
|
# ═══════════════════════════════════════════════
|
|
# Jellyfin — media server (movies, TV, music)
|
|
# ═══════════════════════════════════════════════
|
|
jellyfin:
|
|
image: jellyfin/jellyfin:latest
|
|
container_name: jellyfin
|
|
restart: unless-stopped
|
|
user: "1000:1000"
|
|
ports:
|
|
- "8096:8096/tcp"
|
|
- "8920:8920/tcp"
|
|
- "7359:7359/udp"
|
|
- "1900:1900/udp"
|
|
environment:
|
|
- JELLYFIN_PublishedServerUrl=http://192.168.0.235:8096
|
|
- DOTNET_SYSTEM_IO_DISABLEFILELOCKING=true
|
|
volumes:
|
|
- /opt/jellyfin/config:/config
|
|
- /opt/jellyfin/cache:/cache
|
|
- /mnt/media/movies:/data/movies:ro
|
|
- /mnt/media/shows:/data/shows:ro
|
|
devices:
|
|
- /dev/dri:/dev/dri
|
|
group_add:
|
|
- "992"
|
|
healthcheck:
|
|
test: ["CMD", "curl", "-f", "http://localhost:8096/health"]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 3
|
|
|
|
# ═══════════════════════════════════════════════
|
|
# Calibre-Web — e-book web frontend
|
|
# ═══════════════════════════════════════════════
|
|
calibre-web:
|
|
image: lscr.io/linuxserver/calibre-web:0.6.27-ls397
|
|
container_name: calibre-web
|
|
restart: unless-stopped
|
|
environment:
|
|
PUID: "1000"
|
|
PGID: "1000"
|
|
TZ: Etc/UTC
|
|
OAUTHLIB_RELAX_TOKEN_SCOPE: "1"
|
|
ports:
|
|
- "8083:8083"
|
|
volumes:
|
|
- /opt/calibre-web/config:/config
|
|
- /opt/calibre-web/books:/books
|
|
healthcheck:
|
|
test: ["CMD", "curl", "-f", "http://localhost:8083/"]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 3
|
|
|
|
# ═══════════════════════════════════════════════
|
|
# *arr Stack — automated media download
|
|
# ═══════════════════════════════════════════════
|
|
prowlarr:
|
|
image: lscr.io/linuxserver/prowlarr:latest
|
|
container_name: prowlarr
|
|
restart: unless-stopped
|
|
environment:
|
|
- PUID=1000
|
|
- PGID=1000
|
|
- TZ=America/New_York
|
|
- UMASK_SET=022
|
|
volumes:
|
|
- /opt/prowlarr/config:/config
|
|
- /mnt/media/downloads:/downloads:ro
|
|
ports:
|
|
- "9696:9696"
|
|
networks: [appnet]
|
|
|
|
qbittorrent:
|
|
image: lscr.io/linuxserver/qbittorrent:latest
|
|
container_name: qbittorrent
|
|
restart: unless-stopped
|
|
environment:
|
|
- PUID=1000
|
|
- PGID=1000
|
|
- TZ=America/New_York
|
|
- UMASK_SET=022
|
|
volumes:
|
|
- /opt/qbittorrent/config:/config
|
|
- /mnt/media/downloads:/downloads
|
|
- /mnt/media/downloads/incomplete:/downloads/incomplete
|
|
ports:
|
|
- "8080:8080"
|
|
networks: [appnet]
|
|
|
|
radarr:
|
|
image: lscr.io/linuxserver/radarr:latest
|
|
container_name: radarr
|
|
restart: unless-stopped
|
|
environment:
|
|
- PUID=1000
|
|
- PGID=1000
|
|
- TZ=America/New_York
|
|
- UMASK_SET=022
|
|
volumes:
|
|
- /opt/radarr/config:/config
|
|
- /mnt/media/movies:/movies
|
|
- /mnt/media/downloads:/downloads
|
|
ports:
|
|
- "7878:7878"
|
|
networks: [appnet]
|
|
|
|
sonarr:
|
|
image: lscr.io/linuxserver/sonarr:latest
|
|
container_name: sonarr
|
|
restart: unless-stopped
|
|
environment:
|
|
- PUID=1000
|
|
- PGID=1000
|
|
- TZ=America/New_York
|
|
- UMASK_SET=022
|
|
volumes:
|
|
- /opt/sonarr/config:/config
|
|
- /mnt/media/tv:/tv
|
|
- /mnt/media/downloads:/downloads
|
|
ports:
|
|
- "8989:8989"
|
|
networks: [appnet]
|
|
|
|
lidarr:
|
|
image: lscr.io/linuxserver/lidarr:latest
|
|
container_name: lidarr
|
|
restart: unless-stopped
|
|
environment:
|
|
- PUID=1000
|
|
- PGID=1000
|
|
- TZ=America/New_York
|
|
- UMASK_SET=022
|
|
volumes:
|
|
- /opt/lidarr/config:/config
|
|
- /mnt/media/music:/music
|
|
- /mnt/media/downloads:/downloads
|
|
ports:
|
|
- "8686:8686"
|
|
networks: [appnet]
|
|
|
|
readarr:
|
|
image: lscr.io/linuxserver/readarr:latest
|
|
container_name: readarr
|
|
restart: unless-stopped
|
|
environment:
|
|
- PUID=1000
|
|
- PGID=1000
|
|
- TZ=America/New_York
|
|
- UMASK_SET=022
|
|
volumes:
|
|
- /opt/readarr/config:/config
|
|
- /mnt/media/books:/books
|
|
- /mnt/media/downloads:/downloads
|
|
ports:
|
|
- "8787:8787"
|
|
networks: [appnet]
|
|
|
|
# ═══════════════════════════════════════════════
|
|
# Node Exporter — host metrics
|
|
# ═══════════════════════════════════════════════
|
|
node-exporter:
|
|
image: prom/node-exporter:latest
|
|
container_name: node-exporter
|
|
restart: unless-stopped
|
|
network_mode: host
|
|
pid: host
|
|
volumes:
|
|
- /proc:/host/proc:ro
|
|
- /sys:/host/sys:ro
|
|
- /:/rootfs:ro
|
|
command:
|
|
- --path.procfs=/host/proc
|
|
- --path.sysfs=/host/sys
|
|
- --path.rootfs=/rootfs
|
|
healthcheck:
|
|
test: ["CMD", "wget", "--spider", "-q", "http://localhost:9100/metrics"]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 3
|