# Navidrome web client (the client only). # # Defaults to DIRECT MODE: leave NAVIDROME_URL empty and each user enters their # own Navidrome URL at login. Good for hosting one public client for many people. # # For no-CORS proxying to a single server, set NAVIDROME_URL. # For admin uploads, ALSO set MUSIC_DIR and mount the matching music volume # (see the commented lines below). Uploads stay OFF until you do both. # # Full walkthrough for every scenario: ./DEPLOYMENT.md # All-in-one stack that also runs Navidrome: ./docker-compose.full.yml services: tonearm: build: context: . args: # Set automatically by `bun run compose:up`; when invoking Compose # directly use COMMIT_HASH=$(git rev-parse HEAD) docker compose up. COMMIT_HASH: ${COMMIT_HASH:-} image: tonearm:latest container_name: tonearm ports: - "8680:8080" environment: # Empty = direct mode (users type their own server URL). # Set to proxy to one server (no CORS), e.g.: # http://host.docker.internal:4533 (same host, Docker Desktop) # http://navidrome:4533 (same compose network) NAVIDROME_URL: ${NAVIDROME_URL:-} # --- Uploads (optional, admin-only) --- # To enable: set NAVIDROME_URL above, set MUSIC_DIR here, AND mount the # SAME folder your Navidrome scans at that path (uncomment the volume). # Leave empty to keep uploads off. MUSIC_DIR: ${MUSIC_DIR:-} # --- Link previews (optional) --- # Rich OpenGraph/Twitter/Bluesky cards (cover + title) for shared links, # rendered server-side for crawlers. Needs NAVIDROME_URL set above plus a # *read-only* Navidrome account used to fetch covers/titles for anonymous # crawlers. Humans still hit the login screen. Empty = previews off. NAVIDROME_OG_USER: ${NAVIDROME_OG_USER:-} NAVIDROME_OG_PASS: ${NAVIDROME_OG_PASS:-} # --- One-click updates (optional, admin-only) --- # Admins can always *check* for updates from Settings with no config. To # let them install one from there too, set this to 1 AND uncomment both # update volumes below. Mounting the Docker socket gives this container # root-equivalent control of the Docker host — that is the cost of it # rebuilding itself, and why this is off by default. SELF_UPDATE: ${SELF_UPDATE:-} # Only needed when Jellyfin is your backend: used to confirm the caller is # a Jellyfin administrator before running anything. JELLYFIN_URL: ${JELLYFIN_URL:-} # volumes: # - ${MUSIC_HOST_DIR:-./music}:/music # host music library : MUSIC_DIR # # --- required by SELF_UPDATE --- # - .:/repo # this checkout, including .git # - /var/run/docker.sock:/var/run/docker.sock # so it can rebuild itself restart: unless-stopped