# 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 # read-only since 2026-08-31: copyparty perms are per-field "letters[,user]" # with no user = every unauthenticated request. Anonymous gets r (browse + # download; the guarded files.franksdank.cloud chain reaches copyparty # unauthenticated after authentik). dank gets ra (admin panel). No w/m/d # anywhere: uploads, moves, deletes rejected server-side. Interface: `--help-accounts` in-image. command: ["-a", "dank:${COPAY_PASS}", "-v", "/w::r:ra,dank"] 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=0 - PGID=0 - 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=0 - PGID=0 - 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=0 - PGID=0 - 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=0 - PGID=0 - 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=0 - PGID=0 - 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=0 - PGID=0 - 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