126 lines
3.9 KiB
Markdown
126 lines
3.9 KiB
Markdown
# 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`
|