services: redis: image: redis:7-alpine container_name: allstarr-redis restart: unless-stopped # Redis is only accessible internally - no external port exposure expose: - "6379" command: redis-server --maxmemory 1gb --maxmemory-policy allkeys-lru --save 60 1 --appendonly yes healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 3s retries: 3 volumes: - ${REDIS_DATA_PATH:-./redis-data}:/data networks: - allstarr-network spotify-lyrics: image: akashrchandran/spotify-lyrics-api:latest container_name: allstarr-spotify-lyrics restart: unless-stopped ports: - "8080:8080" environment: - SP_DC=${SPOTIFY_API_SESSION_COOKIE:-} networks: - allstarr-network healthcheck: test: ["CMD", "wget", "--spider", "-q", "http://localhost:8080/"] interval: 30s timeout: 5s retries: 3 allstarr: # Use pre-built image from GitHub Container Registry # For latest stable: ghcr.io/sopat712/allstarr:latest # For beta/testing: ghcr.io/sopat712/allstarr:beta # To build locally instead, uncomment the build section below image: ghcr.io/sopat712/allstarr:latest # Uncomment to build locally instead of using GHCR image: # build: # context: . # dockerfile: Dockerfile # image: allstarr:local container_name: allstarr restart: unless-stopped ports: - "5274:8080" # Admin UI on port 5275 - for local/Tailscale access only # DO NOT expose through reverse proxy - contains sensitive config - "5275:5275" depends_on: redis: condition: service_healthy spotify-lyrics: condition: service_started healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s networks: - allstarr-network environment: - ASPNETCORE_ENVIRONMENT=Production # Backend type: Subsonic or Jellyfin (default: Subsonic) - Backend__Type=${BACKEND_TYPE:-Subsonic} # ===== REDIS CACHE ===== - Redis__ConnectionString=redis:6379 - Redis__Enabled=${REDIS_ENABLED:-true} # ===== SUBSONIC BACKEND ===== - Subsonic__Url=${SUBSONIC_URL:-http://localhost:4533} - Subsonic__ExplicitFilter=${EXPLICIT_FILTER:-ExplicitOnly} - Subsonic__DownloadMode=${DOWNLOAD_MODE:-Track} - Subsonic__MusicService=${MUSIC_SERVICE:-SquidWTF} - Subsonic__StorageMode=${STORAGE_MODE:-Permanent} - Subsonic__CacheDurationHours=${CACHE_DURATION_HOURS:-1} - Subsonic__EnableExternalPlaylists=${ENABLE_EXTERNAL_PLAYLISTS:-true} # ===== JELLYFIN BACKEND ===== - Jellyfin__Url=${JELLYFIN_URL:-http://localhost:8096} - Jellyfin__ApiKey=${JELLYFIN_API_KEY:-} - Jellyfin__UserId=${JELLYFIN_USER_ID:-} - Jellyfin__LibraryId=${JELLYFIN_LIBRARY_ID:-} - Jellyfin__ClientUsername=${JELLYFIN_CLIENT_USERNAME:-} - Jellyfin__ExplicitFilter=${EXPLICIT_FILTER:-ExplicitOnly} - Jellyfin__DownloadMode=${DOWNLOAD_MODE:-Track} - Jellyfin__MusicService=${MUSIC_SERVICE:-SquidWTF} - Jellyfin__StorageMode=${STORAGE_MODE:-Permanent} - Jellyfin__CacheDurationHours=${CACHE_DURATION_HOURS:-1} - Jellyfin__EnableExternalPlaylists=${ENABLE_EXTERNAL_PLAYLISTS:-true} # ===== SPOTIFY PLAYLIST INJECTION (JELLYFIN ONLY) ===== - SpotifyImport__Enabled=${SPOTIFY_IMPORT_ENABLED:-false} - SpotifyImport__SyncStartHour=${SPOTIFY_IMPORT_SYNC_START_HOUR:-16} - SpotifyImport__SyncStartMinute=${SPOTIFY_IMPORT_SYNC_START_MINUTE:-15} - SpotifyImport__SyncWindowHours=${SPOTIFY_IMPORT_SYNC_WINDOW_HOURS:-2} - SpotifyImport__Playlists=${SPOTIFY_IMPORT_PLAYLISTS:-} - SpotifyImport__PlaylistIds=${SPOTIFY_IMPORT_PLAYLIST_IDS:-} - SpotifyImport__PlaylistNames=${SPOTIFY_IMPORT_PLAYLIST_NAMES:-} - SpotifyImport__PlaylistLocalTracksPositions=${SPOTIFY_IMPORT_PLAYLIST_LOCAL_TRACKS_POSITIONS:-} # ===== SPOTIFY DIRECT API (for lyrics, ISRC matching, track ordering) ===== - SpotifyApi__Enabled=${SPOTIFY_API_ENABLED:-false} - SpotifyApi__ClientId=${SPOTIFY_API_CLIENT_ID:-} - SpotifyApi__ClientSecret=${SPOTIFY_API_CLIENT_SECRET:-} - SpotifyApi__SessionCookie=${SPOTIFY_API_SESSION_COOKIE:-} - SpotifyApi__SessionCookieSetDate=${SPOTIFY_API_SESSION_COOKIE_SET_DATE:-} - SpotifyApi__CacheDurationMinutes=${SPOTIFY_API_CACHE_DURATION_MINUTES:-60} - SpotifyApi__RateLimitDelayMs=${SPOTIFY_API_RATE_LIMIT_DELAY_MS:-100} - SpotifyApi__PreferIsrcMatching=${SPOTIFY_API_PREFER_ISRC_MATCHING:-true} # Spotify Lyrics API sidecar service URL (internal) - SpotifyApi__LyricsApiUrl=${SPOTIFY_LYRICS_API_URL:-http://spotify-lyrics:8080} # ===== SHARED ===== - Library__DownloadPath=/app/downloads - SquidWTF__Quality=${SQUIDWTF_QUALITY:-FLAC} - Deezer__Arl=${DEEZER_ARL:-} - Deezer__ArlFallback=${DEEZER_ARL_FALLBACK:-} - Deezer__Quality=${DEEZER_QUALITY:-FLAC} - Qobuz__UserAuthToken=${QOBUZ_USER_AUTH_TOKEN:-} - Qobuz__UserId=${QOBUZ_USER_ID:-} - Qobuz__Quality=${QOBUZ_QUALITY:-FLAC} volumes: - ${DOWNLOAD_PATH:-./downloads}:/app/downloads - ${KEPT_PATH:-./kept}:/app/kept - ${CACHE_PATH:-./cache}:/app/cache # Mount .env file for runtime configuration updates from admin UI - ./.env:/app/.env # Docker socket for self-restart capability (admin UI only) - /var/run/docker.sock:/var/run/docker.sock:ro networks: allstarr-network: name: allstarr-network driver: bridge