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:
2026-03-26 11:47:33 +01:00
commit 946c0a5377
57 changed files with 3450 additions and 0 deletions

View File

@@ -0,0 +1,58 @@
version: "3.9"
# Development override run without any hardware.
# Usage: docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d
services:
signalk:
environment:
- SIGNALK_DEMO=true # Built-in demo NMEA data generator
# Spotify Connect still works over TCP on dev (no host network needed)
librespot:
environment:
- LIBRESPOT_DISABLE_DISCOVERY=false
ports:
- "57621:57621/udp"
- "57621:57621/tcp"
# avahi container for AirPlay mDNS discovery on Mac/Windows
avahi:
image: flungo/avahi
restart: unless-stopped
network_mode: host
volumes:
- /var/run/dbus:/var/run/dbus
# Null-player zones no audio hardware needed
zone-salon:
command: snapclient --host snapserver --hostID zone-salon --player null
zone-cockpit:
command: snapclient --host snapserver --hostID zone-cockpit --player null
zone-bug:
command: snapclient --host snapserver --hostID zone-bug --player null
zone-heck:
command: snapclient --host snapserver --hostID zone-heck --player null
# Vite dev server with HMR instead of built nginx image
dashboard:
build: .
image: node:20-alpine
working_dir: /app
volumes:
- ./dashboard:/app
- /app/node_modules
command: sh -c "npm install && npm run dev -- --host 0.0.0.0 --port 8080"
ports:
- "8080:8080"
environment:
- VITE_SNAPCAST_HOST=localhost
- VITE_SIGNALK_HOST=localhost
- VITE_MOPIDY_HOST=localhost
- VITE_JELLYFIN_HOST=localhost
# Override the build-based image
image: node:20-alpine