Als Bose die Cloud für die SoundTouch-Lautsprecher abgeschaltet hat, standen bei meiner Mutter Lautsprecher herum, die zwar noch top klingen, aber Presets und Internetradio verloren hatten. Statt sie zu entsorgen, habe ich sie mit OpenCloudTouch (OCT) auf einem Raspberry Pi wiederbelebt. In diesem Beitrag zeige ich Schritt für Schritt, wie ich das umgesetzt habe – inklusive Fernwartung per Tailscale.

Wie funktioniert OpenCloudTouch?
Die SoundTouch-Geräte haben früher für Presets, Radiostreams und Kontoverwaltung bei Bose-Servern nachgefragt. OpenCloudTouch ist ein Open-Source-Projekt, das genau diese Endpunkte lokal nachbildet. Es läuft als ein einzelner Docker-Container (FastAPI-Backend + React-Weboberfläche) und bringt mit:
- Internetradio mit Belegung der Preset-Tasten 1–6
- Weboberfläche für Desktop und Smartphone
- automatische Geräteerkennung per SSDP/UPnP, alternativ feste IPs
- Multiroom-Zonen
- Radiosuche über RadioBrowser, TuneIn als Stream-Auflöser für bestehende Presets
⚠️ Achtung: OCT verändert die Konfiguration der Lautsprecher. Die Nutzung erfolgt auf eigene Gefahr – das Projekt weist selbst ausdrücklich darauf hin.
Meine Hardware
| Komponente | Details |
|---|---|
| Lautsprecher | Bose SoundTouch 10 und SoundTouch 20 |
| Server | Raspberry Pi 3B (armhf/arm64) |
| Betriebssystem | Raspberry Pi OS |
| Software | Docker + Docker Compose |
| Netzwerk | Standard-Kabelrouter vom Provider (keine Fritz!Box) |
| Fernzugriff | Tailscale auf dem Pi |
Schritt 1: Docker auf dem Pi installieren
sudo apt update && sudo apt full-upgrade -y
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker pi
# einmal ab- und wieder anmelden, dann testen:
docker version
docker compose version
Schritt 2: docker-compose.yml anlegen
Ich habe für OCT einen eigenen Ordner im Home-Verzeichnis angelegt:
mkdir -p ~/opencloudtouch && cd ~/opencloudtouch
nano docker-compose.yml
services:
opencloudtouch:
image: ghcr.io/opencloudtouch/opencloudtouch:stable
container_name: opencloudtouch
restart: unless-stopped
network_mode: host
volumes:
- oct-data:/data
environment:
- OCT_DISCOVERY_ENABLED=true
- OCT_LOG_LEVEL=INFO
# Fallback, falls die Lautsprecher nicht automatisch gefunden werden:
# - OCT_MANUAL_DEVICE_IPS=<IP-Lautsprecher-1>,<IP-Lautsprecher-2>
volumes:
oct-data:
💡 Tipp: network_mode: host ist wichtig. Ohne Host-Netzwerk funktioniert die Geräteerkennung per SSDP/UPnP nicht, weil die Broadcast-Pakete den Container nicht erreichen.
Schritt 3: Container starten
docker compose pull
docker compose up -d
docker compose logs -f
Danach ist die Weboberfläche unter http://<IP-des-Pi>:7777 erreichbar. Der Standard-Login lautet oct / opencloudtouch – das Passwort sollte man direkt ändern.
Schritt 4: Die Lautsprecher vorbereiten – SSH per USB-Stick
Damit die Lautsprecher künftig mit dem Pi statt mit der Bose-Cloud sprechen, muss ihre Konfiguration angepasst werden. Dafür braucht man einen Zugang zum Linux-System im Lautsprecher, also SSH. Ab Werk ist das abgeschaltet. Bose hat aber einen Service-Mechanismus eingebaut: Ein USB-Stick mit einer bestimmten Datei schaltet den Fernzugang frei.
Was man braucht
| Teil | Hinweis |
|---|---|
| USB-Stick | klein und alt reicht völlig, wird komplett formatiert |
| USB-OTG-Adapter | Die SoundTouch-Lautsprecher haben hinten eine Micro-USB-Service-Buchse. Ein normaler Stick passt da nicht direkt rein, man braucht einen Adapter von Micro-USB (Stecker) auf USB-A (Buchse), einen sogenannten OTG-Adapter. |
| Rechner mit Terminal | Mac, Linux oder Windows mit eingebautem OpenSSH |
Bei meiner Mutter stehen eine Bose SoundTouch 10 und eine Bose SoundTouch 20. Beide haben hinten eine Micro-USB-Service-Buchse und lassen sich auf diesem Weg vorbereiten.
USB-Stick vorbereiten
- Stick mit FAT32 formatieren
- Im Hauptverzeichnis eine leere Datei namens
remote_servicesanlegen – ganz ohne Dateiendung - Stick sicher auswerfen
Am Mac geht das komplett im Terminal (Laufwerksnummer vorher mit diskutil list prüfen!):
diskutil list
# Achtung: diskX durch die richtige Nummer des USB-Sticks ersetzen!
diskutil eraseDisk FAT32 BOSE MBRFormat /dev/diskX
touch /Volumes/BOSE/remote_services
ls -la /Volumes/BOSE/
diskutil eject /dev/diskX
⚠️ Achtung: Beim Formatieren unbedingt die richtige Disk-Nummer erwischen. Eine falsche Nummer löscht im schlimmsten Fall eine andere Festplatte.
💡 Tipp: macOS legt gern versteckte Dateien wie .Spotlight-V100 oder ._remote_services auf Sticks ab. Das stört normalerweise nicht. Wenn der Lautsprecher den Stick partout nicht annimmt, hilft dot_clean /Volumes/BOSE vor dem Auswerfen. Manche Geräte verlangen außerdem, dass die Partition als „bootfähig“ markiert ist.
Stick einstecken und SSH freischalten

- Lautsprecher einschalten und warten, bis er vollständig hochgefahren ist
- Stick über den OTG-Adapter in die Micro-USB-Buchse stecken
- Lautsprecher kurz vom Strom trennen und neu starten (Stick bleibt stecken)
- Nach dem Neustart ist SSH als
rootohne Passwort erreichbar
Die IP-Adresse des Lautsprechers findet man in der Fritz!Box bzw. im Router unter den verbundenen Geräten. Ein schneller Test, ob der Lautsprecher antwortet und welche Firmware er hat:
curl -s http://<IP-Lautsprecher>:8090/info
Per SSH verbinden
Die Lautsprecher verwenden noch alte RSA-Schlüssel, die aktuelle SSH-Versionen standardmäßig ablehnen. Deshalb muss man den alten Algorithmus beim Verbinden ausdrücklich erlauben:
ssh -o HostKeyAlgorithms=+ssh-rsa \
-o PubkeyAcceptedAlgorithms=+ssh-rsa \
root@<IP-Lautsprecher>
Damit man das nicht jedes Mal tippen muss, kommt ein Eintrag in die ~/.ssh/config:
Host soundtouch-*
User root
HostKeyAlgorithms +ssh-rsa
PubkeyAcceptedAlgorithms +ssh-rsa
Host soundtouch-kueche
HostName <IP-Lautsprecher>
ssh soundtouch-kueche
Einmal eingeloggt, kann man sich auf dem Gerät umschauen, z. B.:
uname -a
cat /etc/hosts
df -h
⚠️ Achtung: Auf dem Lautsprecher ist man root. Hier nichts von Hand löschen oder „aufräumen“. Ein falscher Befehl kann den Lautsprecher unbrauchbar machen.
Schritt 5: Einrichtung über den OCT-Assistenten
Das eigentliche Umbiegen der Lautsprecher übernimmt der Einrichtungsassistent von OpenCloudTouch in der Weboberfläche. Er verbindet sich per SSH mit dem Lautsprecher und erledigt die nötigen Schritte automatisch:
- Sicherung der bestehenden Konfiguration
- Umleitung der früheren Bose-Server-Adressen auf den Pi
- Grundkonfiguration der Quellen (Sources.xml)
- auf Wunsch dauerhafte Aktivierung des Fernzugangs, damit der Stick danach nicht mehr stecken muss
Nach einem Neustart des Lautsprechers meldet er sich am Pi statt bei Bose. Danach kann der USB-Stick abgezogen werden.
💡 Tipp: Manche Modelle bzw. Firmware-Stände nehmen die USB-Freischaltung nicht an. Für einige Geräte gibt es einen Ausweg über die Diagnose-Schnittstelle auf TCP-Port 17000 – Details stehen im Wiki und in den Discussions des Projekts auf GitHub.
Schritt 6: Presets belegen
Sobald die Lautsprecher umgestellt sind, tauchen sie in der Oberfläche auf. Dort lassen sich Radiosender suchen und auf die sechs Preset-Tasten legen. Ein Druck auf die Taste am Lautsprecher spielt den Sender danach wieder ganz normal ab – genau wie früher.
✏️ Hat die Einrichtung der Geräte auf Anhieb geklappt? Gab es Stolpersteine beim USB-Stick?
Schritt 7: Fernwartung mit Tailscale
Da der Pi nicht bei mir steht, wollte ich Updates aus der Ferne einspielen, ohne Ports am Router freizugeben. Tailscale baut dafür ein verschlüsseltes VPN zwischen meinen Geräten auf:
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
# danach den angezeigten Link öffnen und den Pi im Tailscale-Konto freigeben
tailscale ip -4
Ab dann erreiche ich den Pi von überall per SSH über seine Tailscale-IP:
ssh pi@<tailscale-ip>
Updates einspielen
Im November 2026 habe ich die Installation bei meiner Mutter von einer alten 1.2.x-Version auf das aktuelle stable-Image gehoben. Der Ablauf ist kurz:
cd ~/opencloudtouch
docker compose pull
docker compose up -d
# alte Images aufräumen
docker image prune -f
Die Daten (Presets, Geräte) liegen im Volume oct-data und bleiben beim Update erhalten.
Fehlersuche
| Problem | Lösung |
|---|---|
| Container startet nicht | docker compose logs opencloudtouch prüfen |
| Lautsprecher werden nicht gefunden | network_mode: host setzen, gleiches Netz/WLAN prüfen, ggf. OCT_MANUAL_DEVICE_IPS verwenden |
| Port 7777 belegt | Port über OCT_PORT ändern |
| Gesundheitscheck | docker ps zeigt den Status healthy |
Fazit
Mit einem Raspberry Pi für ein paar Euro und einer halben Stunde Arbeit laufen Lautsprecher wieder, die der Hersteller aufgegeben hat. Durch Docker sind Updates eine Sache von Sekunden, und mit Tailscale muss ich dafür nicht einmal vorbeifahren.
✏️ Dein persönliches Fazit: Was funktioniert wieder, was fehlt dir noch?