HowTo: Node-Sonos-HTTP-API Installation als Docker Container

Advertisements

Ergänzend zur Installationsanleitung der Node-Sonos-HTTP-API unter Raspbian nativ auf einem Raspberry Pi hier ein HowTo zur Einrichtung der API als Docker Container.

Sonos Installation API Docker

Sonos Installation API Docker

Was ist Docker?

Vereinfacht ausgedrückt bringt Docker das Prinzip von Apps auf Deinen Server. Ein Docker Container enthält eine Anwendung und für die Laufzeit benötigten Ressourcen. Mit Docker lassen sich einfach und schnell Anwendungen betreiben. Und das auch noch isoliert vom restlichen System. Quasi eine virtuelle Umgebung ohne den Overhead eines eigenen Betriebssystems.

Ist Docker die richtige Variante für Dich?

Du kennst Docker und hast schon mal ein Image oder einen Container erstellt?

Ja – Dann ist Docker die richtige Installationsvariante der Node-Sonos-HTTP-API.

Nein, aber Du bist neugierig – Dann bleibe hier und lerne neben der API auch Docker kennen.

Doch Nein – Dann solltest Du die native Installation aus diesem Artikel durchführen. Sie ist zwar aufwändiger, führt aber zum selben Ziel und ist im Betrieb einfacher zu warten.

Meine Empfehlung:  Lies beide Artikel und entscheide dann, welche Variante für Dich geeignet ist.

Auswahl des Hosts

Docker ist für viele unterschiedliche Betriebssysteme verfügbar. In diesem HowTo gehe ich davon aus, dass Du die API unter Raspbian auf einem Raspberry Pi betreiben möchtest.

Installation Raspbian auf dem Raspberry PI

Im Artikel zur nativen Installation der API auf dem Raspberry PI sind die notwendigen Schritte sehr ausführlich beschrieben. Führe die Schritte bis vor den Punkt Installation NODE.js aus und kehre dann hierher zurück.

Docker-CE installieren

Dein Raspbian ist nun soweit, dass Du mit der Docker-CE Installation beginnen kannst. CE steht für Community Edition und ist kostenfrei verfügbar.

Um keine veraltete Version von Docker verwenden deinstallierst Du diese diese mit dem nachfolgenden Befehl.

sudo apt-get remove docker docker-engine docker.io containerd runc

Nachdem das System von den Altlasten befreit ist, aktualisierst Du Deinen apt-Cache und installierst einige Tools die für Docker benötigt werden.

sudo apt-get update
sudo apt-get install \
     apt-transport-https \
     ca-certificates \
     curl \
     gnupg2 \
     software-properties-common

Um das Docker apt-Repository verwenden zu können musst Du einen gpg Schlüssel hinzufügen und die Adresse in Deine Sourcen aufnehmen.

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
echo "deb [arch=armhf] https://download.docker.com/linux/debian \
     $(lsb_release -cs) stable" | \
    sudo tee /etc/apt/sources.list.d/docker.list

Nun aktualisierst Du Deinen Cache und startest die Docker-CE Installation.

sudo apt-get update
sudo apt-get install docker-ce

Der Docker Deamon startet automatisch, so dass Du Dich nun um das Image für die API kümmern kannst.

User für Docker einrichten

Um Docker als Non-Root User zu betreiben musst Du den Benutzer mit dem Du Docker betreibst für die Nutzung einrichten.

Dafür erstellst Du eine Usergroup Names Docker.

sudo groupadd docker

Und fügst den aktuellen Benutzer zu dieser Gruppe hinzu.

sudo usermod -aG docker $USER

Die Gruppenzugehörigkeit wird wirksam indem Du Dich einmal ab- und wieder anmeldest.

Um Docker zu testen lädst Du nun das Testimage hello-world herunter.

docker run hello-world

Wenn hier keine Fehlermeldung erscheint ist alles in Ordnung und Du kannst zum nächsten Schritt gehen.

Docker Image

Die Basis eines jeden Docker Containers sind Images. Diese Images beinhalten die installierte Anwendung und alle Komponenten die zur Laufzeit der Anwendung benötigt werden. Der Docker Hub stellt Dir unzählige dieser Images zur Verfügung.

mkshb/sonoshttpapi @ Docker Hub

Im Docker Hub habe ich ein fertiges Image für den Betrieb der API zur Verfügung gestellt: Link

Das Image liegt für arm (z.B. Raspberry PI) und amd64 (NAS und andere 64 Bit Linux Systeme) vor.

Verzeichnisse und Dateien anlegen

Container unter Docker sind flüchtig. Änderungen an Systemen und Dateien werden beim Beenden des Containers verworfen. Um Deine Einstellungen für die API auch nach einem Neustart des Containers oder Hosts hinaus zu behalten, ist der Container auf das speichern dieser Daten ausserhalb des Containers vborbereitet. Das betrifft in erster Linie die Konfigurationsdateien für die Node-Sonos-HTTP-API, aber auch MP3s die abgespielt werden sollen. Die dafür benötigten Verzeichniss sowie die Grundkonfiguration der API muss Du vor dem Herunterladen des Images anlegen.

Bei der Installation auf einem Raspberry PI oder einem anderen Linux-System empfehle ich Dir diese unter /opt anzulegen. Verwendest Du ein NAS wie QNAP oder Synology für den Betrieb sind die Verzeichnisse anderweitig vorgegeben um später darauf zugreifen zu können. Unter Synology ist das zum Beispiel: /volume1.

In diesem Artikel gehe ich von einer Installation auf einem Raspberry unter dem Benutzer pi aus.

Zum Anlegen der Dateien und Verzeichnisse unter /opt/sonosapi benötigst Du folgende Befehle

sudo mkdir /opt/sonoshttpapi && \
sudo chown pi:pi /opt/sonoshttpapi && \
cd /opt/sonoshttpapi && \
mkdir clips && \
mkdir settings && \
mkdir cache && \
mkdir presets && \
curl https://raw.githubusercontent.com/jishi/node-sonos-http-api/master/presets/example.json > presets/example.json && \
echo {} > settings/settings.json

Image vom Docker Hub herunterladen

Nun wechselst Du in das Verzeichnis /opt/sonoshttpapi

cd /opt/sonoshttpapi

und lädst das Image herunterladen

docker pull mkshb/sonoshttpapi

Nach dem Download lässt Du Dir die Liste der lokal verfügbaren Images anzeigen um sicherzustellen, dass der Download funktioniert hat

$ docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
mkshb/sonoshttpapi   latest              cd78cca2649f        1 minutes ago      119MB

Container starten

Wenn das soweit geklappt hat, startest Du das Image mit dem run Befehl und den Parametern.

docker run \
  --net=host \
  --name sonoshttpapi \
  --restart=always \
  -d \
  -v `pwd`/settings:/app/settings \
  -v `pwd`/clips:/app/static/clips \
  -v `pwd`/cache:/app/cache \
  -v `pwd`/presets:/app/presets \
  mkshb/sonoshttpapi

Warte einen kleinen Moment und lasse Dir dann die Liste der laufenden Container auf Deinem Rechner anzeigen.

$ docker container ls
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS                            PORTS               NAMES
c619733a2557        mkshb/sonoshttpapi   "/bin/sh -c 'npm sta…"   8 seconds ago       Up 5 seconds (health: starting)                       sonoshttpapi

Wiederhole den Befehl bis in der Liste unter Status healthy steht

$ docker container ls
CONTAINER ID        IMAGE                COMMAND                  CREATED              STATUS                        PORTS               NAMES
c619733a2557        mkshb/sonoshttpapi   "/bin/sh -c 'npm sta…"   About a minute ago   Up About a minute (healthy)                       sonoshttpapi

Funktionstest

Nachdem der Container erfolgreich gestartet wurde, kannst Du die API testen indem Du mit Deinem Browser die URL http://IP_DES_SYSTEMS:5005 aufrufst.

Node Sonos HTTP API

Node Sonos HTTP API

Herzlichen Glückwunsch, Du hast Deinen ersten Docker Container erstellt und gestartet.

Konfiguration der API

Nach der Installation folge die Konfiguration. Jetzt ist es sinnvoll, eine WinSCP Verbindung zum Raspberry herzustellen. Konfigurationsdateien lassen sich mit einem Windows/Mac Editor einfacher anpassen als in der SSH Sitzung. Mit WinSCP in das Verzeichnis /opt/sonoshttpapi wechseln.

settings.json

Im Verzeichnis settings findest Du die settings.json. Diese liegt ausserhalb des Containers, daher werden Änderungen in dieser unabhängig vom Container permanent gespeichert. Es lohnt sich ein Blick in die Beschreibung der API im gitHub Repository zu werfen. Dort werden Alternativen zur Sprachausgabe und weitere Optionen (beispielsweise Sonos, Apple Music, etc.) beschrieben die in der settings.json hinterlegt werden müssen. Wenn Du hier nichts einträgst, wird die Stimme von Google für Sprachausgaben verwendet.

Updates

Ich werde das Image von Zeit zu Zeit aktualisieren. Wenn eine neue Version bei Docker Hub verfügbar ist, kannst Du Dein Image mit dem folgenden Befehl aktualisieren.

docker pull mkshb/sonoshttpapi:latest

Wenn eine neue Version verfügbar ist, wird diese heruntergeladen.

Um Deinen Container zu aktualisieren musst Du in das Installationsverzeichnis wechseln.

cd /opt/sonoshttpapi

Deinen aktuellen Container löschen.

docker rm -f sonoshttpapi

Und auf Basis des neuen Images einen neuen Container erstellen.

docker run \
  --net=host \
  --name sonoshttpapi \
  --restart=always \
  -d \
  -v `pwd`/settings:/app/settings \
  -v `pwd`/clips:/app/static/clips \
  -v `pwd`/cache:/app/cache \
  -v `pwd`/presets:/app/presets \
  mkshb/sonoshttpapi

Durch das speichern der Konfiguration ausserhalb des Containers gehen diese nicht verloren und Deine Node-Sonos-HTTP-API läuft mit Deiner Konfiguration in der neuen Version.

Bildquellen

  • Sonos Installation API Docker: Bastian
  • Node Sonos HTTP API: Bastian
Posted in Sonos and tagged , , .

6 Comments

  1. Hallo Bastian, bin natürlich neugierig und habe es gleich ausprobiert, leider lädt mein Terminal die Dockerdatei nicht herunter, es komt folgende Fehlermeldung:

    pi@raspberrypi:/opt/sonoshttpapi $ docker pull mkshb/sonoshttpapi
    Using default tag: latest
    Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.39/images/create?fromImage=mkshb%2Fsonoshttpapi&tag=latest: dial unix /var/run/docker.sock: connect: permission denied

    Was habe ich falsch gemacht?

    Viele Grüße Salve.

    • Moin Salve,

      auf was für einem System bist Du unterwegs?
      Ich habe den Artikel um den Punkt „User für Docker einrichten“ ergänzt. Damit sollte es dann klappen.

      Grüße
      Bastian

  2. Ich habe es auf meinem Raspi probiert, auf einer anderen SD-Karte läuft die Installation, die Du in Deinem anderen Beitrag beschrieben hast schon seit längerer Zeit sehr stabil. Wollte den neuen Weg mit Docker ausprobieren und werde es morgen nochmal versuchen.
    Vielen Dank Salve

    • Viel Erfolg. Ich arbeite schon länger mit Docker. Kann gut sein, dass noch was in der Anleitung fehlt oder unklar ist.

      Grüße
      Bastian

  3. Guten Morgen Bastian,
    allse läuft super, vielen Dank.
    Startet der Docker automatisch nach Strom- oder Netzwerkausfall?
    Viele Grüße Salve.

    • Moin Salve,

      das freut mich und Danke für Dein Feedback.
      Wenn Du Docker automatisch beim Boot starten lässt (sudo systemctl enable docker), dann sorgt der Parameter --restart=always beim Erstellen des Containers dafür, dass dieser bei einem Neustart des Raspberry automatisch gestartet wird.

      Grüße
      Bastian

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Ich akzeptiere