services: louis: image: stuartromanek/louis:latest # Equivalent: ghcr.io/stuartromanek/louis:latest build: context: . args: # Change on rebuild to pull latest yt-dlp nightly (CI sets this automatically). YTDLP_CACHE_BUST: ${YTDLP_CACHE_BUST:-} # Bridge networking keeps this file working with Coolify and Docker Desktop. # On a Linux NAS/homelab, prefer deploy/portainer/docker-compose.yml, which # uses host networking so yt-dlp can reach YouTube over IPv6 (see docs/HOSTING.md). ports: - "4000:4000" environment: NODE_ENV: production HOST: 0.0.0.0 PORT: 4000 LOUIS_AUDIO_WORK_DIR: /data/audio # Image default is false (LAN HTTP). Set true behind HTTPS. LOUIS_COOKIE_SECURE: ${LOUIS_COOKIE_SECURE:-false} LOUIS_YOTO_CLIENT_ID: ${LOUIS_YOTO_CLIENT_ID:-} LOUIS_YOUTUBE_API_KEY: ${LOUIS_YOUTUBE_API_KEY:-} # Optional pin. Unset = OAuth callback uses the Host the browser actually used. LOUIS_YOTO_REDIRECT_URI: ${LOUIS_YOTO_REDIRECT_URI:-} LOUIS_YOTO_CLIENT_SECRET: ${LOUIS_YOTO_CLIENT_SECRET:-} volumes: - louis-audio:/data/audio restart: unless-stopped healthcheck: test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:4000/api/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"] interval: 30s timeout: 10s retries: 3 start_period: 40s volumes: louis-audio: