# Production docker-compose for boat deployment. # For development use: docker compose -f docker-compose.yml -f docker-compose.dev.yml up volumes: signalk-data: mopidy-data: jellyfin-config: jellyfin-cache: portainer-data: pipes: driver: local driver_opts: type: tmpfs device: tmpfs networks: bordanlage: driver: bridge services: # ─── Navigation ──────────────────────────────────────────────────────────── signalk: image: signalk/signalk-server:latest restart: unless-stopped ports: - "3000:3000" volumes: - signalk-data:/home/node/.signalk environment: - SIGNALK_ADMIN_USERNAME=admin - SIGNALK_ADMIN_PASSWORD=bordanlage # Uncomment for real NMEA hardware on boat: # devices: # - /dev/ttyUSB0:/dev/ttyUSB0 networks: - bordanlage # ─── Audio Sources ───────────────────────────────────────────────────────── librespot: build: ./docker/librespot restart: unless-stopped # On Linux (boat): use host network for mDNS/Spotify discovery # network_mode: host ports: - "57621:57621/udp" # Spotify zeroconf discovery - "57621:57621/tcp" command: > --name "${SPOTIFY_NAME:-Bordanlage}" --bitrate ${SPOTIFY_BITRATE:-320} --backend pipe --device /tmp/audio/spotify.pcm --zeroconf-port 57621 volumes: - pipes:/tmp/audio networks: - bordanlage shairport: image: mikebrady/shairport-sync:latest restart: unless-stopped # On Linux (boat): use host network for mDNS/AirPlay discovery # network_mode: host ports: - "5000:5000/tcp" - "5000:5000/udp" - "6001-6011:6001-6011/udp" volumes: - ./config/shairport.conf:/etc/shairport-sync.conf:ro - pipes:/tmp/audio networks: - bordanlage mopidy: build: ./docker/mopidy restart: unless-stopped ports: - "6680:6680" volumes: - ./config/mopidy.conf:/etc/mopidy/mopidy.conf:ro - mopidy-data:/var/lib/mopidy - ${MUSIC_PATH:-./music}:/music:ro - pipes:/tmp/audio networks: - bordanlage # ─── Media Library ───────────────────────────────────────────────────────── jellyfin: image: jellyfin/jellyfin:latest restart: unless-stopped ports: - "8096:8096" volumes: - jellyfin-config:/config - jellyfin-cache:/cache - ${MUSIC_PATH:-./music}:/music:ro environment: - JELLYFIN_PublishedServerUrl=http://localhost:8096 # Uncomment for hardware video decoding on boat: # devices: # - /dev/dri:/dev/dri networks: - bordanlage # ─── Multiroom Audio ─────────────────────────────────────────────────────── snapserver: build: ./docker/snapserver restart: unless-stopped ports: - "1704:1704" # Snapcast protocol - "1705:1705" # Control API (JSON-RPC) - "1780:1780" # Snapweb UI volumes: - ./config/snapserver.conf:/etc/snapserver.conf:ro - pipes:/tmp/audio depends_on: - librespot - mopidy command: snapserver -c /etc/snapserver.conf networks: - bordanlage zone-salon: build: ./docker/snapclient restart: unless-stopped depends_on: - snapserver # On boat: add --player alsa --soundcard hw:0,0 and device /dev/snd # devices: # - /dev/snd:/dev/snd command: ["--hostID", "zone-salon", "--player", "file:filename=null", "tcp://snapserver"] networks: - bordanlage zone-cockpit: build: ./docker/snapclient restart: unless-stopped depends_on: - snapserver command: ["--hostID", "zone-cockpit", "--player", "file:filename=null", "tcp://snapserver"] networks: - bordanlage zone-bug: build: ./docker/snapclient restart: unless-stopped depends_on: - snapserver command: ["--hostID", "zone-bug", "--player", "file:filename=null", "tcp://snapserver"] networks: - bordanlage zone-heck: build: ./docker/snapclient restart: unless-stopped depends_on: - snapserver command: ["--hostID", "zone-heck", "--player", "file:filename=null", "tcp://snapserver"] networks: - bordanlage # ─── Management ──────────────────────────────────────────────────────────── portainer: image: portainer/portainer-ce:latest restart: unless-stopped ports: - "9000:9000" volumes: - /var/run/docker.sock:/var/run/docker.sock - portainer-data:/data networks: - bordanlage # ─── Dashboard ───────────────────────────────────────────────────────────── dashboard: build: context: ./dashboard dockerfile: Dockerfile restart: unless-stopped ports: - "8080:80" environment: - VITE_SNAPCAST_HOST=${VITE_SNAPCAST_HOST:-localhost} - VITE_SIGNALK_HOST=${VITE_SIGNALK_HOST:-localhost} - VITE_MOPIDY_HOST=${VITE_MOPIDY_HOST:-localhost} - VITE_JELLYFIN_HOST=${VITE_JELLYFIN_HOST:-localhost} depends_on: - snapserver - signalk - mopidy networks: - bordanlage