Initial implementation: Bordanlage boat onboard system
Complete multiroom audio + navigation dashboard: - Docker stack: SignalK, Snapcast (4 zones), librespot, shairport-sync, Mopidy, Jellyfin, Portainer - React 18 + Vite dashboard with nautical dark theme - Full mock system (SignalK NMEA simulation, Snapcast zones, Mopidy player) - Real API clients for all services with reconnect logic - SVG instruments: Compass, WindRose, Gauge, DepthSounder, SpeedLog - Pages: Overview, Navigation, Audio (zones/radio/library), Systems - Dev mode runs fully without hardware (make dev) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
204
bordanlage/docker-compose.yml
Normal file
204
bordanlage/docker-compose.yml
Normal file
@@ -0,0 +1,204 @@
|
||||
version: "3.9"
|
||||
|
||||
# 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:
|
||||
image: ghcr.io/librespot-org/librespot:latest
|
||||
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"
|
||||
environment:
|
||||
- SPOTIFY_NAME=${SPOTIFY_NAME:-Bordanlage}
|
||||
- SPOTIFY_BITRATE=${SPOTIFY_BITRATE:-320}
|
||||
command: >
|
||||
--name "${SPOTIFY_NAME:-Bordanlage}"
|
||||
--bitrate ${SPOTIFY_BITRATE:-320}
|
||||
--backend pipe
|
||||
--device /tmp/audio/spotify.pcm
|
||||
--zeroconf-port 57621
|
||||
--cache-size-limit ${SPOTIFY_CACHE_SIZE:-1024}
|
||||
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:
|
||||
image: ghcr.io/badaix/snapcast:latest
|
||||
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:
|
||||
image: ghcr.io/badaix/snapcast:latest
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
- snapserver
|
||||
# On boat: add --soundcard hw:0,0 and device /dev/snd
|
||||
# devices:
|
||||
# - /dev/snd:/dev/snd
|
||||
command: snapclient --host snapserver --hostID zone-salon --player null
|
||||
networks:
|
||||
- bordanlage
|
||||
|
||||
zone-cockpit:
|
||||
image: ghcr.io/badaix/snapcast:latest
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
- snapserver
|
||||
command: snapclient --host snapserver --hostID zone-cockpit --player null
|
||||
networks:
|
||||
- bordanlage
|
||||
|
||||
zone-bug:
|
||||
image: ghcr.io/badaix/snapcast:latest
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
- snapserver
|
||||
command: snapclient --host snapserver --hostID zone-bug --player null
|
||||
networks:
|
||||
- bordanlage
|
||||
|
||||
zone-heck:
|
||||
image: ghcr.io/badaix/snapcast:latest
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
- snapserver
|
||||
command: snapclient --host snapserver --hostID zone-heck --player null
|
||||
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
|
||||
Reference in New Issue
Block a user