ghcr.io/9001/copyparty:latest does not exist — ghcr answers 403 on the token request for nonexistent repos, which is why the bring-up failed at pull. The upstream publishes ghcr.io/9001/copyparty-ac (ac = full edition) and serves whatever is mounted at /w, so the compose mounts the LUKS array there; config persists in /opt/copyparty/cfg per upstream layout.
274 lines
8.3 KiB
YAML
274 lines
8.3 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-ac:latest
|
|
container_name: copyparty
|
|
restart: unless-stopped
|
|
environment:
|
|
COPAY_PASS: "${COPAY_PASS}"
|
|
COPAY_MODE: rw
|
|
ports:
|
|
- "3923:3923"
|
|
volumes:
|
|
- /mnt/entropy:/w
|
|
- /opt/copyparty/cfg:/cfg
|
|
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
|
|
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/entropy/Movies:/data/movies:ro
|
|
- /mnt/entropy/TVShows:/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/Los_Angeles
|
|
- UMASK_SET=022
|
|
volumes:
|
|
- /mnt/entropy/downloads:/downloads:ro
|
|
- /opt/prowlarr/config:/config
|
|
networks: [appnet]
|
|
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/Los_Angeles
|
|
- UMASK_SET=022
|
|
volumes:
|
|
- /opt/qbittorrent/config:/config
|
|
- /mnt/entropy/downloads:/downloads
|
|
- /mnt/entropy/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/Los_Angeles
|
|
- UMASK_SET=022
|
|
volumes:
|
|
- /opt/radarr/config:/config
|
|
- /mnt/entropy/Movies:/movies
|
|
- /mnt/entropy/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/Los_Angeles
|
|
- UMASK_SET=022
|
|
volumes:
|
|
- /opt/sonarr/config:/config
|
|
- /mnt/entropy/TVShows:/tv
|
|
- /mnt/entropy/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/Los_Angeles
|
|
- UMASK_SET=022
|
|
volumes:
|
|
- /opt/lidarr/config:/config
|
|
- /mnt/entropy/Music:/music
|
|
- /mnt/entropy/downloads:/downloads
|
|
ports:
|
|
- "8686:8686"
|
|
networks: [appnet]
|
|
|
|
readarr:
|
|
image: lscr.io/linuxserver/readarr:amd64-1.0.980
|
|
container_name: readarr
|
|
restart: unless-stopped
|
|
environment:
|
|
- PUID=1000
|
|
- PGID=1000
|
|
- TZ=America/Los_Angeles
|
|
- UMASK_SET=022
|
|
volumes:
|
|
- /opt/readarr/config:/config
|
|
- /mnt/entropy/eBooks:/books
|
|
- /mnt/entropy/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
|