docs: fix on-device multi-speaker claim in deployment overview

'Each speaker needs its own install' is only true when the firmware
binds port 8000 to loopback (older devices, issue #196). Devices that
expose the port on the LAN can run one on-device AfterTouch and point
other LAN speakers at it — same as a Raspberry Pi. Qualify the cell
accordingly.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Tobias Gesellchen
2026-05-24 11:31:16 +02:00
co-authored by Claude Sonnet 4.6
parent b05043e6ad
commit f1f2f260b9
4 changed files with 61 additions and 61 deletions
+18 -18
View File
@@ -7,7 +7,7 @@ This scenario is useful when you don't have an always-on machine at home but
you already have a cloud server (Hetzner, DigitalOcean, Coolify, etc.).
For local deployments (Raspberry Pi, NAS, home server) see
[EXTERNAL-HOST-WALKTHROUGH.md](EXTERNAL-HOST-WALKTHROUGH.md).
[EXTERNAL-HOST-WALKTHROUGH.md](EXTERNAL-HOST-WALKTHROUGH.md).
For a comparison of all deployment options see
[DEPLOYMENT-OVERVIEW.md](DEPLOYMENT-OVERVIEW.md).
@@ -15,12 +15,12 @@ For a comparison of all deployment options see
## How cloud deployment differs from a local host
| | Local host | Cloud host |
|--|-----------|-----------|
| Speaker discovery | Automatic (mDNS on the LAN) | **Disabled** — cloud can't reach your LAN |
| Speaker migration | Via the AfterTouch web UI | **Via `soundtouch-cli` on your local machine** |
| URL scheme | `http://` is fine on a LAN | **HTTPS required** — speakers validate the certificate |
| Audio routing | Stays on the LAN (AfterTouch only proxies metadata) | Stays on the LAN — audio never transits the cloud server |
| | Local host | Cloud host |
|-------------------|-----------------------------------------------------|----------------------------------------------------------|
| Speaker discovery | Automatic (mDNS on the LAN) | **Disabled** — cloud can't reach your LAN |
| Speaker migration | Via the AfterTouch web UI | **Via `soundtouch-cli` on your local machine** |
| URL scheme | `http://` is fine on a LAN | **HTTPS required** — speakers validate the certificate |
| Audio routing | Stays on the LAN (AfterTouch only proxies metadata) | Stays on the LAN — audio never transits the cloud server |
> **Audio does not flow through AfterTouch.** The cloud server only handles
> authentication tokens and URL discovery. Music data goes directly between
@@ -172,10 +172,10 @@ The speaker should appear in the list.
2. Run or refresh the health checks.
3. Apply any QuickFixes shown, especially:
| Warning | Action |
|---------|--------|
| Warning | Action |
|-------------------------------------------------|---------------------------------------------|
| *Speaker reports an empty `<margeAccountUUID>`* | Click **Pair account** / **Apply QuickFix** |
| *INTERNET_RADIO source is a stale stub* | Click **Remove INTERNET_RADIO source** |
| *INTERNET_RADIO source is a stale stub* | Click **Remove INTERNET_RADIO source** |
4. Reboot the speaker after any QuickFix that requires it, then re-run health checks.
@@ -260,14 +260,14 @@ To minimise downtime, use your cloud provider's restart policy
## Troubleshooting
| Symptom | First check |
|---------|------------|
| Speaker shows certificate error | HTTPS certificate is not trusted — ensure your reverse proxy serves a valid Let's Encrypt cert |
| Migration fails with "connection refused" | Speaker can't reach `soundtouch.example.com:443` — check your server's firewall |
| Source TuneIn 1005 error | TuneIn not in speaker's source list — follow Step 6 |
| AfterTouch logs "discovery timeout" every 5 min | Set `DISCOVERY_ENABLED=false` |
| Devices tab empty after migration | Add the speaker manually by IP (Step 4) |
| `margeAccountUUID` still empty after QuickFix | Re-run Health QuickFix and reboot again |
| Symptom | First check |
|-------------------------------------------------|------------------------------------------------------------------------------------------------|
| Speaker shows certificate error | HTTPS certificate is not trusted — ensure your reverse proxy serves a valid Let's Encrypt cert |
| Migration fails with "connection refused" | Speaker can't reach `soundtouch.example.com:443` — check your server's firewall |
| Source TuneIn 1005 error | TuneIn not in speaker's source list — follow Step 6 |
| AfterTouch logs "discovery timeout" every 5 min | Set `DISCOVERY_ENABLED=false` |
| Devices tab empty after migration | Add the speaker manually by IP (Step 4) |
| `margeAccountUUID` still empty after QuickFix | Re-run Health QuickFix and reboot again |
For more detail see [TROUBLESHOOTING.md](TROUBLESHOOTING.md) and
[MIGRATION-GUIDE.md](MIGRATION-GUIDE.md).
+22 -22
View File
@@ -7,15 +7,15 @@ three ways to run it — pick the one that fits your situation.
## Which deployment is right for me?
| | Local external host | Cloud / VPS | On-device |
|--------------------------|---------------------|-------------|-----------|
| **What it means** | AfterTouch runs on a Raspberry Pi, NAS, or PC on your home LAN. | AfterTouch runs on a remote server you own (Hetzner, DigitalOcean, Coolify, …). | AfterTouch runs directly on the SoundTouch speaker itself. |
| **Extra hardware** | Yes — an always-on machine at home | No — uses a server you already have | No |
| **Multiple speakers** | Easy — one instance for all LAN speakers | Yes — one instance, managed remotely | Each speaker needs its own install |
| **Speaker migration** | Via the AfterTouch web UI | Via `soundtouch-cli` on your local machine | Via SSH into the speaker |
| **HTTPS needed** | No — HTTP on the LAN is fine | **Yes** — speakers require a valid certificate | No |
| **Updates** | Update the host once | Update the server once | SSH into each speaker |
| **Good for** | Most households; want a central dashboard | No always-on home machine; already have a VPS | Single-speaker; no extra hardware at all |
| | Local external host | Cloud / VPS | On-device |
|-----------------------|-----------------------------------------------------------------|---------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------|
| **What it means** | AfterTouch runs on a Raspberry Pi, NAS, or PC on your home LAN. | AfterTouch runs on a remote server you own (Hetzner, DigitalOcean, Coolify, …). | AfterTouch runs directly on the SoundTouch speaker itself. |
| **Extra hardware** | Yes — an always-on machine at home | No — uses a server you already have | No |
| **Multiple speakers** | Easy — one instance for all LAN speakers | Yes — one instance, managed remotely | One install may serve multiple speakers if port 8000 is LAN-accessible (firmware-dependent; older devices may bind loopback only) |
| **Speaker migration** | Via the AfterTouch web UI | Via `soundtouch-cli` on your local machine | Via SSH into the speaker |
| **HTTPS needed** | No — HTTP on the LAN is fine | **Yes** — speakers require a valid certificate | No |
| **Updates** | Update the host once | Update the server once | SSH into each speaker |
| **Good for** | Most households; want a central dashboard | No always-on home machine; already have a VPS | Single-speaker; no extra hardware at all |
---
@@ -24,11 +24,11 @@ three ways to run it — pick the one that fits your situation.
Run AfterTouch on a machine already on your home network. The speaker is pointed at it
via a simple URL change — nothing else on the speaker is modified.
| | Link |
|--|------|
| **User-friendly walkthrough** | [External Host Walkthrough](EXTERNAL-HOST-WALKTHROUGH.md) — install → discover → migrate → presets |
| **Raspberry Pi quick-install** | [Raspberry Pi Guide](RASPBERRY-PI.md) — one-command installer, systemd integration |
| **Technical reference** | [Deployment Guide](DEPLOYMENT.md) — Docker, Kubernetes, systemd unit, configuration |
| | Link |
|--------------------------------|----------------------------------------------------------------------------------------------------|
| **User-friendly walkthrough** | [External Host Walkthrough](EXTERNAL-HOST-WALKTHROUGH.md) — install → discover → migrate → presets |
| **Raspberry Pi quick-install** | [Raspberry Pi Guide](RASPBERRY-PI.md) — one-command installer, systemd integration |
| **Technical reference** | [Deployment Guide](DEPLOYMENT.md) — Docker, Kubernetes, systemd unit, configuration |
---
@@ -39,11 +39,11 @@ speaker migration is done with `soundtouch-cli` from your local machine, and HTT
a real certificate is required. Read the security notes in the walkthrough before
exposing AfterTouch to the internet.
| | Link |
|--|------|
| **User-friendly walkthrough** | [Cloud Deploy Walkthrough](CLOUD-DEPLOY-WALKTHROUGH.md) — VPS setup, CLI migration, TuneIn gotcha |
| **Technical reference** | [Deployment Guide](DEPLOYMENT.md) — Docker Compose, environment variables, reverse proxy |
| **Community field report** | [discussion #295](https://github.com/gesellix/Bose-SoundTouch/discussions/295) — Hetzner + Coolify setup by wimdeblauwe |
| | Link |
|-------------------------------|-------------------------------------------------------------------------------------------------------------------------|
| **User-friendly walkthrough** | [Cloud Deploy Walkthrough](CLOUD-DEPLOY-WALKTHROUGH.md) — VPS setup, CLI migration, TuneIn gotcha |
| **Technical reference** | [Deployment Guide](DEPLOYMENT.md) — Docker Compose, environment variables, reverse proxy |
| **Community field report** | [discussion #295](https://github.com/gesellix/Bose-SoundTouch/discussions/295) — Hetzner + Coolify setup by wimdeblauwe |
---
@@ -53,10 +53,10 @@ AfterTouch runs on the SoundTouch speaker itself. Requires one SSH session to in
after that, the speaker self-hosts its own AfterTouch. Delivers the **complete AfterTouch
feature set** without any extra hardware.
| | Link |
|--|------|
| | Link |
|-------------------------------|---------------------------------------------------------------------------------------------------------------------------|
| **User-friendly walkthrough** | [On-Device Install Walkthrough](ON-DEVICE-INSTALL-WALKTHROUGH.md) — SSH connection through verified radio preset playback |
| **Installer reference** | [On-Device Installer README](../../scripts/on-device-install/README.md) — flags, paths, VERSION override, update/rollback |
| **Installer reference** | [On-Device Installer README](../../scripts/on-device-install/README.md) — flags, paths, VERSION override, update/rollback |
---
+13 -13
View File
@@ -130,11 +130,11 @@ turn green in the Devices tab.
2. Click **Run health checks** (or wait for them to run automatically).
3. Look for any warnings. The most common after a fresh migration:
| Warning | QuickFix action |
|---------|----------------|
| *Speaker reports an empty `<margeAccountUUID>`* | Click **Pair account** / **Apply QuickFix** and confirm. The speaker will reboot. |
| *INTERNET_RADIO source is a stale stub* | Click **Remove INTERNET_RADIO source**. |
| *TuneIn / Radio Browser missing from sources* | These appear automatically once the speaker has paired; if still missing after a QuickFix reboot, trigger discovery again. |
| Warning | QuickFix action |
|-------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------|
| *Speaker reports an empty `<margeAccountUUID>`* | Click **Pair account** / **Apply QuickFix** and confirm. The speaker will reboot. |
| *INTERNET_RADIO source is a stale stub* | Click **Remove INTERNET_RADIO source**. |
| *TuneIn / Radio Browser missing from sources* | These appear automatically once the speaker has paired; if still missing after a QuickFix reboot, trigger discovery again. |
4. After any QuickFix that reboots the speaker, re-run the health checks to
confirm the warning is gone.
@@ -232,14 +232,14 @@ curl -s http://<host-ip>:8000/health | grep version
## Troubleshooting
| Symptom | First check |
|---------|------------|
| Speaker not appearing in Devices | Click **Trigger Discovery**; try adding the IP manually |
| Migration fails | Confirm the speaker can reach `http://<host-ip>:8000` — try `curl http://<host-ip>:8000` from the speaker's SSH shell |
| `margeAccountUUID` still empty after QuickFix + reboot | Re-run Health QuickFix, reboot again |
| Radio source error 1005 | `margeAccountUUID` is empty — complete Step 5 first |
| Speaker reverts to Bose cloud after router restart | Your router's DNS is overriding AfterTouch's server URL — see [MIGRATION-GUIDE.md](MIGRATION-GUIDE.md) for DNS-interception setup |
| Admin UI not reachable | Check `systemctl status soundtouch-service` and firewall rules for port 8000 |
| Symptom | First check |
|--------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------|
| Speaker not appearing in Devices | Click **Trigger Discovery**; try adding the IP manually |
| Migration fails | Confirm the speaker can reach `http://<host-ip>:8000` — try `curl http://<host-ip>:8000` from the speaker's SSH shell |
| `margeAccountUUID` still empty after QuickFix + reboot | Re-run Health QuickFix, reboot again |
| Radio source error 1005 | `margeAccountUUID` is empty — complete Step 5 first |
| Speaker reverts to Bose cloud after router restart | Your router's DNS is overriding AfterTouch's server URL — see [MIGRATION-GUIDE.md](MIGRATION-GUIDE.md) for DNS-interception setup |
| Admin UI not reachable | Check `systemctl status soundtouch-service` and firewall rules for port 8000 |
For more detail see [TROUBLESHOOTING.md](TROUBLESHOOTING.md) and
[MIGRATION-GUIDE.md](MIGRATION-GUIDE.md).
+8 -8
View File
@@ -282,14 +282,14 @@ should start playing the corresponding stream.
## Troubleshooting
| Symptom | First check |
|---------|------------|
| SSH "no matching host key type" | Add `-oHostKeyAlgorithms=+ssh-rsa` |
| Port 8000 not reachable from LAN | Use the SSH tunnel (Step 5) |
| `margeAccountUUID` still empty after reboot | Re-run Health QuickFix, reboot again |
| Radio source error 1005 | `margeAccountUUID` is empty — complete Step 6 first |
| `http://localhost:8000` not responding after install | `logread \| grep aftertouch \| tail -20` |
| No space left on device during install | Run the cleanup in Step 2; check `df -h /mnt/nv` |
| Symptom | First check |
|------------------------------------------------------|-----------------------------------------------------|
| SSH "no matching host key type" | Add `-oHostKeyAlgorithms=+ssh-rsa` |
| Port 8000 not reachable from LAN | Use the SSH tunnel (Step 5) |
| `margeAccountUUID` still empty after reboot | Re-run Health QuickFix, reboot again |
| Radio source error 1005 | `margeAccountUUID` is empty — complete Step 6 first |
| `http://localhost:8000` not responding after install | `logread \| grep aftertouch \| tail -20` |
| No space left on device during install | Run the cleanup in Step 2; check `df -h /mnt/nv` |
For more detail on any of these, see
[TROUBLESHOOTING.md](./TROUBLESHOOTING.md) and the