services: # Jellyfin - Media streaming server jellyfin: image: ${MEDIA_JELLYFIN_IMAGE:-jellyfin/jellyfin:latest} container_name: ${MEDIA_COMPOSE_PROJECT_NAME}_jellyfin restart: unless-stopped volumes: - jellyfin_config:/config - jellyfin_cache:/cache - /mnt/hidrive/users/valknar/Pictures:/media/pictures:ro - /mnt/hidrive/users/valknar/Videos:/media/videos:ro environment: TZ: ${TIMEZONE:-Europe/Berlin} networks: - compose_network labels: - 'traefik.enable=${MEDIA_TRAEFIK_ENABLED}' # HTTP to HTTPS redirect - 'traefik.http.middlewares.${MEDIA_COMPOSE_PROJECT_NAME}-jellyfin-redirect-web-secure.redirectscheme.scheme=https' - 'traefik.http.routers.${MEDIA_COMPOSE_PROJECT_NAME}-jellyfin-web.middlewares=${MEDIA_COMPOSE_PROJECT_NAME}-jellyfin-redirect-web-secure' - 'traefik.http.routers.${MEDIA_COMPOSE_PROJECT_NAME}-jellyfin-web.rule=Host(`${MEDIA_JELLYFIN_TRAEFIK_HOST}`)' - 'traefik.http.routers.${MEDIA_COMPOSE_PROJECT_NAME}-jellyfin-web.entrypoints=web' # HTTPS router - 'traefik.http.routers.${MEDIA_COMPOSE_PROJECT_NAME}-jellyfin-web-secure.rule=Host(`${MEDIA_JELLYFIN_TRAEFIK_HOST}`)' - 'traefik.http.routers.${MEDIA_COMPOSE_PROJECT_NAME}-jellyfin-web-secure.tls.certresolver=resolver' - 'traefik.http.routers.${MEDIA_COMPOSE_PROJECT_NAME}-jellyfin-web-secure.entrypoints=web-secure' - 'traefik.http.middlewares.${MEDIA_COMPOSE_PROJECT_NAME}-jellyfin-web-secure-compress.compress=true' - 'traefik.http.routers.${MEDIA_COMPOSE_PROJECT_NAME}-jellyfin-web-secure.middlewares=${MEDIA_COMPOSE_PROJECT_NAME}-jellyfin-web-secure-compress,security-headers@file' # Service - 'traefik.http.services.${MEDIA_COMPOSE_PROJECT_NAME}-jellyfin-web-secure.loadbalancer.server.port=8096' - 'traefik.docker.network=${NETWORK_NAME}' # Watchtower - 'com.centurylinklabs.watchtower.enable=${WATCHTOWER_LABEL_ENABLE}' # Filestash - Web-based file manager filestash: image: ${MEDIA_FILESTASH_IMAGE:-machines/filestash:latest} container_name: ${MEDIA_COMPOSE_PROJECT_NAME}_filestash restart: unless-stopped volumes: - filestash_data:/app/data/state/ tmpfs: - /tmp:exec environment: TZ: ${TIMEZONE:-Europe/Berlin} APPLICATION_URL: ${MEDIA_FILESTASH_TRAEFIK_HOST} CANARY: ${MEDIA_FILESTASH_CANARY:-true} networks: - compose_network labels: - 'traefik.enable=${MEDIA_TRAEFIK_ENABLED}' - 'traefik.http.middlewares.${MEDIA_COMPOSE_PROJECT_NAME}-filestash-redirect-web-secure.redirectscheme.scheme=https' - 'traefik.http.routers.${MEDIA_COMPOSE_PROJECT_NAME}-filestash-web.middlewares=${MEDIA_COMPOSE_PROJECT_NAME}-filestash-redirect-web-secure' - 'traefik.http.routers.${MEDIA_COMPOSE_PROJECT_NAME}-filestash-web.rule=Host(`${MEDIA_FILESTASH_TRAEFIK_HOST}`)' - 'traefik.http.routers.${MEDIA_COMPOSE_PROJECT_NAME}-filestash-web.entrypoints=web' - 'traefik.http.routers.${MEDIA_COMPOSE_PROJECT_NAME}-filestash-web-secure.rule=Host(`${MEDIA_FILESTASH_TRAEFIK_HOST}`)' - 'traefik.http.routers.${MEDIA_COMPOSE_PROJECT_NAME}-filestash-web-secure.tls.certresolver=resolver' - 'traefik.http.routers.${MEDIA_COMPOSE_PROJECT_NAME}-filestash-web-secure.entrypoints=web-secure' - 'traefik.http.middlewares.${MEDIA_COMPOSE_PROJECT_NAME}-filestash-web-secure-compress.compress=true' - 'traefik.http.routers.${MEDIA_COMPOSE_PROJECT_NAME}-filestash-web-secure.middlewares=${MEDIA_COMPOSE_PROJECT_NAME}-filestash-web-secure-compress' - 'traefik.http.services.${MEDIA_COMPOSE_PROJECT_NAME}-filestash-web-secure.loadbalancer.server.port=8334' - 'traefik.docker.network=${NETWORK_NAME}' - 'com.centurylinklabs.watchtower.enable=${WATCHTOWER_LABEL_ENABLE}' # Koel - Music streaming server koel: image: ${MEDIA_KOEL_IMAGE:-phanan/koel:latest} container_name: ${MEDIA_COMPOSE_PROJECT_NAME}_koel restart: unless-stopped depends_on: - koel_init volumes: - koel_covers:/var/www/html/public/img/covers - koel_search_index:/var/www/html/storage/search-indexes - /mnt/hidrive/users/valknar/Music:/music:ro environment: TZ: ${TIMEZONE:-Europe/Berlin} APP_NAME: Koel APP_ENV: production APP_DEBUG: ${MEDIA_KOEL_DEBUG:-false} APP_URL: https://${MEDIA_KOEL_TRAEFIK_HOST} APP_KEY: ${MEDIA_KOEL_APP_KEY} LOG_CHANNEL: stderr DB_CONNECTION: pgsql DB_HOST: ${CORE_DB_HOST} DB_PORT: ${CORE_DB_PORT} DB_DATABASE: ${MEDIA_KOEL_DB_NAME} DB_USERNAME: ${DB_USER} DB_PASSWORD: ${DB_PASSWORD} MEMORY_LIMIT: ${MEDIA_KOEL_MEMORY_LIMIT:-512M} STREAMING_METHOD: ${MEDIA_KOEL_STREAMING_METHOD:-x-sendfile} # Media and storage configuration MEDIA_PATH: /music STORAGE_DRIVER: local # Proxy configuration TRUSTED_PROXIES: '*' FORCE_HTTPS: 'true' networks: - compose_network labels: - 'traefik.enable=${MEDIA_TRAEFIK_ENABLED}' # HTTP to HTTPS redirect - 'traefik.http.middlewares.${MEDIA_COMPOSE_PROJECT_NAME}-koel-redirect-web-secure.redirectscheme.scheme=https' - 'traefik.http.routers.${MEDIA_COMPOSE_PROJECT_NAME}-koel-web.middlewares=${MEDIA_COMPOSE_PROJECT_NAME}-koel-redirect-web-secure' - 'traefik.http.routers.${MEDIA_COMPOSE_PROJECT_NAME}-koel-web.rule=Host(`${MEDIA_KOEL_TRAEFIK_HOST}`)' - 'traefik.http.routers.${MEDIA_COMPOSE_PROJECT_NAME}-koel-web.entrypoints=web' # HTTPS router - 'traefik.http.routers.${MEDIA_COMPOSE_PROJECT_NAME}-koel-web-secure.rule=Host(`${MEDIA_KOEL_TRAEFIK_HOST}`)' - 'traefik.http.routers.${MEDIA_COMPOSE_PROJECT_NAME}-koel-web-secure.tls.certresolver=resolver' - 'traefik.http.routers.${MEDIA_COMPOSE_PROJECT_NAME}-koel-web-secure.entrypoints=web-secure' - 'traefik.http.middlewares.${MEDIA_COMPOSE_PROJECT_NAME}-koel-web-secure-compress.compress=true' - 'traefik.http.routers.${MEDIA_COMPOSE_PROJECT_NAME}-koel-web-secure.middlewares=${MEDIA_COMPOSE_PROJECT_NAME}-koel-web-secure-compress,security-headers@file' # Service - 'traefik.http.services.${MEDIA_COMPOSE_PROJECT_NAME}-koel-web-secure.loadbalancer.server.port=80' - 'traefik.docker.network=${NETWORK_NAME}' # Watchtower - 'com.centurylinklabs.watchtower.enable=${WATCHTOWER_LABEL_ENABLE}' # Koel initialization container koel_init: image: ${MEDIA_KOEL_IMAGE:-phanan/koel:latest} container_name: ${MEDIA_COMPOSE_PROJECT_NAME}_koel_init restart: "no" user: "33:33" command: bash -c "php artisan koel:init --no-interaction && php artisan koel:admin --email=${ADMIN_EMAIL} --password=${ADMIN_PASSWORD} --no-interaction" volumes: - koel_covers:/var/www/html/public/img/covers - koel_search_index:/var/www/html/storage/search-indexes environment: TZ: ${TIMEZONE:-Europe/Berlin} APP_NAME: Koel APP_ENV: production APP_DEBUG: ${MEDIA_KOEL_DEBUG:-false} APP_URL: https://${MEDIA_KOEL_TRAEFIK_HOST} APP_KEY: ${MEDIA_KOEL_APP_KEY} LOG_CHANNEL: stderr DB_CONNECTION: pgsql DB_HOST: ${CORE_DB_HOST} DB_PORT: ${CORE_DB_PORT} DB_DATABASE: ${MEDIA_KOEL_DB_NAME} DB_USERNAME: ${DB_USER} DB_PASSWORD: ${DB_PASSWORD} # Media and storage configuration MEDIA_PATH: /music STORAGE_DRIVER: local # Proxy configuration TRUSTED_PROXIES: '*' FORCE_HTTPS: 'true' networks: - compose_network # Ampache - Music streaming server with public sharing ampache: image: ${MEDIA_AMPACHE_IMAGE:-ampache/ampache:latest} container_name: ${MEDIA_COMPOSE_PROJECT_NAME}_ampache restart: unless-stopped volumes: - ampache_config:/var/www/config - ampache_log:/var/log/ampache - /mnt/hidrive/users/valknar/Music:/media:ro environment: TZ: ${TIMEZONE:-Europe/Berlin} DB_HOST: ${CORE_DB_HOST} DB_PORT: ${CORE_DB_PORT} DB_NAME: ${MEDIA_AMPACHE_DB_NAME} DB_USERNAME: ${DB_USER} DB_PASSWORD: ${DB_PASSWORD} AMPACHE_WEB_PATH: https://${MEDIA_AMPACHE_TRAEFIK_HOST} networks: - compose_network labels: - 'traefik.enable=${MEDIA_TRAEFIK_ENABLED}' # HTTP to HTTPS redirect - 'traefik.http.middlewares.${MEDIA_COMPOSE_PROJECT_NAME}-ampache-redirect-web-secure.redirectscheme.scheme=https' - 'traefik.http.routers.${MEDIA_COMPOSE_PROJECT_NAME}-ampache-web.middlewares=${MEDIA_COMPOSE_PROJECT_NAME}-ampache-redirect-web-secure' - 'traefik.http.routers.${MEDIA_COMPOSE_PROJECT_NAME}-ampache-web.rule=Host(`${MEDIA_AMPACHE_TRAEFIK_HOST}`)' - 'traefik.http.routers.${MEDIA_COMPOSE_PROJECT_NAME}-ampache-web.entrypoints=web' # HTTPS router - 'traefik.http.routers.${MEDIA_COMPOSE_PROJECT_NAME}-ampache-web-secure.rule=Host(`${MEDIA_AMPACHE_TRAEFIK_HOST}`)' - 'traefik.http.routers.${MEDIA_COMPOSE_PROJECT_NAME}-ampache-web-secure.tls.certresolver=resolver' - 'traefik.http.routers.${MEDIA_COMPOSE_PROJECT_NAME}-ampache-web-secure.entrypoints=web-secure' - 'traefik.http.middlewares.${MEDIA_COMPOSE_PROJECT_NAME}-ampache-web-secure-compress.compress=true' - 'traefik.http.routers.${MEDIA_COMPOSE_PROJECT_NAME}-ampache-web-secure.middlewares=${MEDIA_COMPOSE_PROJECT_NAME}-ampache-web-secure-compress,security-headers@file' # Service - 'traefik.http.services.${MEDIA_COMPOSE_PROJECT_NAME}-ampache-web-secure.loadbalancer.server.port=80' - 'traefik.docker.network=${NETWORK_NAME}' # Watchtower - 'com.centurylinklabs.watchtower.enable=${WATCHTOWER_LABEL_ENABLE}' volumes: jellyfin_config: name: ${MEDIA_COMPOSE_PROJECT_NAME}_jellyfin_config jellyfin_cache: name: ${MEDIA_COMPOSE_PROJECT_NAME}_jellyfin_cache filestash_data: name: ${MEDIA_COMPOSE_PROJECT_NAME}_filestash_data koel_covers: name: ${MEDIA_COMPOSE_PROJECT_NAME}_koel_covers koel_search_index: name: ${MEDIA_COMPOSE_PROJECT_NAME}_koel_search_index ampache_config: name: ${MEDIA_COMPOSE_PROJECT_NAME}_ampache_config ampache_log: name: ${MEDIA_COMPOSE_PROJECT_NAME}_ampache_log networks: compose_network: name: ${NETWORK_NAME} external: true