Controller auf Raspi im Docker Container?

Es gibt 8 Antworten in diesem Thema, welches 5.028 mal aufgerufen wurde. Der letzte Beitrag () ist von hommes.

  • Hallo zusammen,


    hat vielleicht jemand die Controller Software auf einem Raspi im Docker laufen? Ich suche eine gute Anleitung bzw. Antworten auf einige Fragen

    - wie installiert man eigene Zertifikate?

    - wie geht man vor, wenn neue Version der Software installiert werden soll?

    - wie erstellt man Backups? (Ich bekomme immer Fehlermeldung, dass etwas schief gegangen ist - Datei wird zwar erstellt aber die Controller Software sieht sie nicht und kann sie nicht wieder einspielen)

  • Zumindest für den Moment suche ich weiter jemand der es mit Docker realisiert hat und ew. etwas zu den Fragen sagen kann. Ich habe auf dem Raspi noch USB2IP Lösung laufen damit ich meine Haussteuerung was mit RS232 ausgestattet ist umprogrammieren kann.

    Mit der Zeit werde ich für beides andere Lösungen suchen und machen aber für den Moment ist es mir am liebsten mit Docker. Hierzu kommt, dass für Debian was ich immer verwende nicht so ganz ohne ist eine MongoDB Version zu finden die von UniFi unterstützt wird.

    • Offizieller Beitrag

    Dan teile doch deine Ergebnisse mit dem Rest der Welt :smiling_face:

    Gruß

    defcon

  • Nun,


    Vorab - hier nur eine relativ kurze Beschreibung der aktueller Installation (Raspberry PI 3 Model B in 32 Bit Modus armhf mit Unifi Controller laufend im Dokercontainer)

    Kurz, weil ich doch scheinbar gefunden habe, wie man Unifi Software auf der Plattform arm64 Installieren kann. Das werde ich die kommende Tage versuchen und dann bei Interesse auch beschreiben


    Für die Installation/ Aufbau des Containers habe ich dieses Dockerfile genutzt.



    Mein Raspberry läuft mit letzter Debian Version Bullseye, Docker wegen Problemen mit der Software nutzt Pakete aus Buster

    Das lief so weit ohne Probleme. Ich wollte aber meine Zertifikate eingebunden haben damit ich nicht jedes mal wegen unsicherer Verbindung gewarnt werde. Da ich selbst mit Docker bis jetzt keine Erfahrungen hatte musste ich auch suchen wie das

    überhaupt gehen könnte. Diverse Anleitungen die ich im Netz gefunden habe brachten mich aber irgendwie nicht weiter. Das Problem bei dem ganzen ist, dass zuerst ein Zertifikat Request generiert werden muss und dieser dann von einer Zertifizierungsstelle

    bestätigt und von der Software importiert werden muss. Das erzeugen des Requests ist ja einfach und lässt sich ohne Probleme in das Dockerfile einbauen. Die Problematik bestand das bestätigte Zertifikat wieder zu importieren.

    Das stellte sich am Ende als relativ einfach umsetzbar.


    Den Container hatte ich dann mit diesen Parametern gestartet:

    Code
    sudo docker run --name=unifi --restart unless-stopped -d -p 1.2.3.4:8433:8433 -p 1.2.3.4:8080:8080 -v /srv/unifi/data:/var/lib/unifi -v /srv/unifi/logs:/usr/lib//unifi/logs --network=host unifi

    Für den Container nutze ich eine virtuelle IP Adresse, damit es mit der FW abgeriegelt werden kann (dafür steht das 1.2.3.4). Die Angabe von den beiden Ports bedeutet, dass der ankommende Request 1:1 weitergegeben wird. Hinten den "-v" stehen Verzeichnisse wie sie zwischen Host -System und Container gemappt werden. Also alles was ich in das Verzeichnis /srv/unifi/data hineinkopiere "sieht" die Software unter eigenem /var/lib/unifi.


    Zunächst habe ich in dem Dockerfile das erstellen des Requests während der Installation eingebaut.

    Code
    RUN java -jar /usr/lib/unifi/lib/ace.jar new_cert unifiadm.rjap.de "Organisation Name" Stadt Bundesland Land


    Hier wunderte es mich, dass ich zwar sehen konnte, dass entsprechende Dateien erstellt waren aber nach dem starten irgendwie ich darauf nicht zugreifen konnte. Also als ob die nicht da wären.. Das liegt an der Vorgehensweise wie das ganze arbeitet.. Ich hatte schon Dateien in meinem /srv/unifi/data Verzeichnis und die werden gemappt auf das /var/lib/unifi. Alles was im Hostverzeichnis nicht existiert zum Zeitpunkt wo der Container startet wird ausgeblendet. Also quasi "drübergelegt".

    So hatte ich die Startparameter komplett verändert, damit ich meine Backups und Einstellungen nicht verliere


    Code
    docker run --name=unifi --restart unless-stopped -d -p 1.2.3.4:8433:8433 -p 1.2.3.4:8080:8080 -v /srv/unifi/data/backup:/usr/lib/unifi/data/backup -v /srv/unifi/data/db:/usr/lib/unifi/db -v /srv/unifi/data/logs:/usr/lib/unifi/data/logs -v /srv/unifi/data/sites:/usr/lib/unifi/data/sites -v /srv/unifi/logs:/usr/lib/unifi/logs -v /srv/unifi/crt:/usr/local/crt -v /srv/unifi/dpkg:/usr/local/dpkg --network=host unifi


    Jetzt konnte ich nach dem ersten Start den Zertifikatrequest aus dem Container kopieren


    Code
    sudo docker cp unifi:usr/lib/data/unifi_certificate.csr.pem /tmp

    Damit konnte ich den Request Signieren lassen. Jetzt ging es darum es irgendwie einzubauen.

    Dazu änderte ich 2 Zeilen im Dockerfile

    Aus:


    Code
    ENTRYPOINT ["/usr/bin/java", "-Xmx512M", "-jar", "/usr/lib/unifi/lib/ace.jar"]
    CMD ["start"]

    ist:

    Code
    CMD ["unifistart.sh"]

    geworden.


    In dem Shellskript habe ich alles untergebracht was ich haben wollte.

    Also wenn der Container startet, dann guckt das Skript ob es ein Debian Paket im angegebenen Verzeichnis liegt. Wenn ja wird es installiert (dieser Teil ist nicht getestet, kann also sein, dass ich noch ein Parameter ändern muss, damit keine Nachfragen o.ä kommen)

    Dann wird geschaut ob ein Zertifikat vorliegt, wenn ja, dann werden sowohl das Server wie auch CA Zertifikate importiert und anschließend die Software gestartet.


    Das Dockerfile in Endvariante sieht so aus:



    Also das große Geheimnis - zumindest für mich war die Starzeilen durch ein Shellscript zu ersetzen. Wenn man weiß, das so etwas möglich ist, dann ist alles "einfach" :winking_face:


    Jetzt will ich das ganze aber mit 64 Bit laufen haben. Das bringt u.a den Vorteil, dass die MongoDB ein Journal hat und so robuster wird als die 32 Bit version.



    Sollte jemand Fragen haben - beantworte ich gerne aber bitte hier und nicht als PN.

  • Moin,


    ich habe mich die Tage gesetzt und geguckt wie man die Software auf einem Rasperry Pi 3 Model B und/ oder Raspberry Pi 4 (habe die 8GB Version) ans laufen bekommt.


    Inzwischen läuft ja auch alles bestens. Vielleicht wird es für den einen oder anderen interessant.


    Als Grundlage dienten die Debian Images


    Debian 11 Raspberry Pi 4

    Debian 11 Raspberry Pi3 B


    Ich mag Debian, weil man da nur Grundlage bekommt auf die man aufbauen kann.

    Nach dem die SD Karte fertig war habe ich folgende Pakete noch installiert:


    Code
    console-data console-setup locales keyboard-configuration
    wget vim gnupg screen net-tools nfs-common rsync xinetd
    docker-ce docker-ce-cli

    Die Docker Pakete habe ich von

    Code
    deb https://download.docker.com/linux/debian bullseye stable

    man muss also erst das Archiv in eigene sources.list einbinden


    Damit war das so weit alles fertig und ich konnte mit der Unifi Software anfangen.

    Hier musste ich doch etwas experimentieren. Ein gewissen Problem ist wohl Java Version.. Nativ also ohne Docker funktionier die Unifi-Software auch mit

    Code
    openjdk-17-jre-headless

    Es werden zwar einige Warnings und auch Errors angezeigt aber laufen tut es trotzdem. Im Docker aber nicht (Pi 3), oder sehr instabil (Pi 4)

    So habe ich also zum

    Code
    openjdk-11-jre-headless

    gegriffen. Es läuft sehr stabil und gut. Wünschenswert wäre es aber auf lange Sicht schon, dass UI das Paket in einer neuerer Umgebung baut.


    Mir ging es in erster Linie darum MonoDB in 64 Bit zu haben, damit auch Journal vorhanden ist. Und das ist mir doch auch gelungen.


    So sieht das Dockerfile aus

    Liste der Pakete die in ersten und zweiten Step installiert werden:



    Docker build


    Code
    docker run --name=unifi --hostname ServerName -e TZ=Europe/Berlin --restart unless-stopped -d -p 1.2.3.4:8433:8433 -p 1.2.3.4:8080:8080 -v /srv/unifi/data/backup:/usr/lib/unifi/data/backup -v /srv/unifi/data/db:/usr/lib/unifi/db -v /srv/unifi/data/logs:/usr/lib/unifi/data/logs -v /srv/unifi/data/sites:/usr/lib/unifi/data/sites -v /srv/unifi/logs:/usr/lib/unifi/logs -v /srv/unifi/crt:/usr/local/crt -v /srv/unifi/dpkg:/usr/local/dpkg --network=host unifi


    Das "unifistart.sh" Skript habe ich nicht verändert. Hier warte ich erst auf eine neue Version der Software und werde dann ggf. Anpassungen machen.


    So das sollte alles zu dem Thema sein.

    • Offizieller Beitrag

    Moin und danke für deinen Hinweis, ich würde es noch ein paar Tage geöffnet lassen und dann, wenn keiner mehr eine Frage dazu hat schließen.


    Gruß hommes

    Umfrage G3 Instant Preisgestaltung

    Umfrage Ubiquiti Setup, Danke

    Umfrage Versandkosten EU-Store


    Mein Heimnetz