mirror of
https://github.com/SoPat712/allstarr.git
synced 2026-02-09 23:55:10 -05:00
Major update since basic Spotify playlist injection: Added web UI for admin dashboard with playlist management, track matching, and manual mapping controls. Lyrics system with prefetching, caching, and manual ID mapping. Manual track mapping for missing tracks with persistent storage. Memory leak fixes and performance improvements. Security hardening with admin endpoints on internal port. Scrobbling fixes and session cleanup. HiFi API integration with automatic failover. Playlist cache pre-building for instant loading. Three-color progress bars showing local/external/missing track counts.
124 lines
5.0 KiB
YAML
124 lines
5.0 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
|
|
|
|
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
|
|
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}
|
|
|
|
# ===== 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
|