# Bordanlage – Boat Onboard System A complete multiroom audio + navigation dashboard system for boats. Runs on any Docker-capable computer – fully simulated in dev mode (no hardware needed). --- ## Prerequisites - [Docker Desktop](https://www.docker.com/products/docker-desktop/) (or Docker Engine + Compose) - `make` - For Spotify Connect: a Spotify Premium account --- ## Quick Start ```bash cd bordanlage make dev ``` Dashboard: **http://localhost:8080** --- ## Service URLs | Service | URL | Description | |---------------|------------------------------|------------------------------| | Dashboard | http://localhost:8080 | Main touch UI | | SignalK | http://localhost:3000 | Navigation data + chart viewer | | Mopidy/Iris | http://localhost:6680/iris/ | Music player UI | | Snapcast Web | http://localhost:1780 | Multiroom audio control | | Jellyfin | http://localhost:8096 | Media library | | Portainer | http://localhost:9000 | Docker management | --- ## Spotify Connect 1. Run `make dev` (or `make boot` on the boat) 2. Open Spotify on your phone/computer 3. Tap the device icon (bottom right) → look for **"Bordanlage"** 4. If it doesn't appear automatically: Go to **Connect to a Device** → enter the IP of the host machine manually > On Linux (boat): set `network_mode: host` for the `librespot` service in `docker-compose.yml` for reliable mDNS discovery. --- ## AirPlay 1. Ensure the `shairport` container is running 2. On your iPhone/Mac: open Control Center → tap AirPlay → select **"Bordanlage AirPlay"** > On Mac: AirPlay works natively via Bonjour. > On Windows WSL2: the `avahi` container in `docker-compose.dev.yml` handles mDNS. --- ## Adding Music Drop audio files into `./music/`. Mopidy and Jellyfin both mount this directory. Trigger a Mopidy library scan: ```bash curl -s http://localhost:6680/mopidy/rpc -d '{"jsonrpc":"2.0","id":1,"method":"local.scan"}' \ -H "Content-Type: application/json" ``` For Jellyfin: open http://localhost:8096 → Settings → Libraries → Scan. --- ## Connecting Real NMEA Hardware Edit `docker-compose.yml` and uncomment the `signalk` device section: ```yaml signalk: devices: - /dev/ttyUSB0:/dev/ttyUSB0 # NMEA 0183 via USB-Serial ``` Then configure the NMEA connection in SignalK at http://localhost:3000 → Server → Connections. For NMEA 2000: use a Yacht Devices YDNU-02 or similar USB gateway. --- ## Migration to Real Boat Changes needed in `docker-compose.yml`: 1. **Audio output per zone**: add `--soundcard hw:N,0` to each `zone-*` command and uncomment `/dev/snd` 2. **Spotify/AirPlay discovery**: set `network_mode: host` for `librespot` and `shairport` 3. **Hardware video decoding** (optional): uncomment `/dev/dri` in `jellyfin` 4. **NMEA hardware**: uncomment `/dev/ttyUSB0` in `signalk` 5. Set `DEV=false` in `.env` Run `make boot` instead of `make dev`. --- ## Troubleshooting **Spotify device not showing up on Mac:** - Ensure port 57621 (UDP+TCP) is accessible. Docker Desktop on Mac sometimes blocks UDP. - Try connecting manually: Spotify → "Connect to a Device" → "Connect to [IP]" **AirPlay not visible on Windows:** - The `avahi` container requires D-Bus. Run Docker Desktop with host networking or use WSL2. **Snapcast zones show as offline:** - Audio pipes must exist before snapserver starts. Run `make pipes` or `bash scripts/init-pipes.sh` **Mopidy won't start:** - Check `docker compose logs mopidy`. The custom Dockerfile installs plugins on first build; rebuild with `make rebuild` **Dashboard shows "No signal":** - In dev mode this is normal until mock data initializes (1–2 seconds) - In production: check that SignalK is running and the WebSocket URL is correct in `.env` **Port conflicts:** - Edit the port mappings in `docker-compose.yml` or `docker-compose.dev.yml`