services: # ── Frontend (nginx) ────────────────────────────────────────────────────────── novasonic-frontend: build: . container_name: novasonic-frontend restart: unless-stopped ports: - "8080:80" # change left side to your desired host port labels: - "traefik.enable=true" - "traefik.http.routers.novasonic.rule=Host(`novasonic.yourdomain.com`)" - "traefik.http.routers.novasonic.entrypoints=websecure" - "traefik.http.routers.novasonic.tls.certresolver=letsencrypt" # ── Backend (yt-dlp download server) ───────────────────────────────────────── novasonic-backend: image: node:20-alpine container_name: novasonic-backend restart: unless-stopped working_dir: /app volumes: - ./backend/novasonic-server.js:/app/novasonic-server.js:ro - ${MUSIC_PATH:-/music}:/music # your Navidrome music library ports: - "3700:3700" environment: - PORT=3700 - MUSIC_PATH=/music - AUDIO_FMT=${AUDIO_FMT:-mp3} - AUDIO_QUALITY=${AUDIO_QUALITY:-0} - MAX_PARALLEL=${MAX_PARALLEL:-2} - NAVIDROME_URL=${NAVIDROME_URL:-} - NAVIDROME_USER=${NAVIDROME_USER:-} - NAVIDROME_PASS=${NAVIDROME_PASS:-} command: > sh -c " apk add --no-cache yt-dlp ffmpeg python3 && npm install express cors && node novasonic-server.js " labels: - "traefik.enable=true" - "traefik.http.routers.novasonic-api.rule=Host(`novasonic-api.yourdomain.com`)" - "traefik.http.routers.novasonic-api.entrypoints=websecure" - "traefik.http.routers.novasonic-api.tls.certresolver=letsencrypt"