mirror of
https://github.com/SoPat712/allstarr.git
synced 2026-02-10 16:08:39 -05:00
## Features - Implement automatic MusicBrainz genre enrichment for all external sources - Deezer: Enriches when genre missing - Qobuz: Enriches when genre missing - SquidWTF/Tidal: Always enriches (Tidal doesn't provide genres) - Use ISRC codes for exact matching, fallback to title/artist search - Cache results in Redis (30 days) + file cache for performance - Respect MusicBrainz rate limits (1 req/sec) ## Cleanup - Remove unused Spotify API ClientId and ClientSecret settings - Simplify Spotify API configuration This ensures all external tracks have genre metadata for better organization and filtering in music clients.
140 lines
5.5 KiB
YAML
140 lines
5.5 KiB
YAML
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 API sidecar service
|
|
# Note: This image only supports AMD64. On ARM64 systems, Docker will use emulation.
|
|
spotify-lyrics:
|
|
image: akashrchandran/spotify-lyrics-api:latest
|
|
platform: linux/amd64
|
|
container_name: allstarr-spotify-lyrics
|
|
restart: unless-stopped
|
|
ports:
|
|
- "8365:8080"
|
|
environment:
|
|
- SP_DC=${SPOTIFY_API_SESSION_COOKIE:-}
|
|
networks:
|
|
- allstarr-network
|
|
|
|
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__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
|