Automatischer Build des Raspberry Pi OS-Images

@VonOx Ich erstelle ein Thema, um über die Entwicklung zu sprechen!

Sollen wir uns einen leichten nginx-Proxy machen, um anzuzeigen, dass das Bild gerade installiert wird? :slight_smile:

Die Seite (eigentlich die App) sollte den Docker-Teil überprüfen können, deshalb ist es in Go für HA, denke ich (um nicht 200 MB npm-Pakete zu installieren).

Die Idee ist, eine Landing Page auf demselben Port wie Gladys zu senden, mit allen damit verbundenen Problemen (wenn Port 80 verwendet wird, startet Gladys nicht). Ich habe nicht wirklich darüber nachgedacht, ich weiß nicht, ob du schon etwas im Kopf hast :slight_smile:

Ich verstehe die Idee!

Man könnte auch ein kleines Backend in Go machen, das sollte nicht so kompliziert sein :slight_smile:

Also, was ich sehe:

  • Ein Container, der eine einfache HTML-Seite ausliefert, die sagt « Gladys wird konfiguriert. Wir laden die neueste Version von Gladys aus dem Internet herunter, je nach Ihrer Internetverbindung kann dies einige Minuten bis zu einer Stunde dauern »

  • Ideal wäre eine Fortschrittsleiste, die den Download-Fortschritt anzeigt und Fehler im Fehlerfall.

Tatsächlich kann der First-Install-Prozess nur Folgendes tun:

  1. Pull + Starte den « Warte »-Container, der die Warteseite auf Port 80 anzeigt (schnell, wenn man einen kleinen Container hat, der in wenigen MB verfügbar ist)
  2. Pull Gladys
  3. Stoppe + rm den Warte-Container
  4. Starte Gladys + Watchtower

Kein Port-Problem hier :slight_smile:

Ich hatte einen kleinen Dienst erstellt, der sich um die Erstellung der Container kümmert, ich muss nur noch den Wartedocker verwalten. Ein Image, das eine statische Seite oder auch nicht, aber ultra-leicht bedient. Das macht das Betriebssystem

Übrigens habe ich gerade festgestellt, dass er nicht auf dem neuesten Stand ist
https://github.com/VonOx/gladys-pi-gen/blob/gladys/gladys/02-init-gladys/files/init-containers.sh

Aber jetzt die Frage: Geht es um docker load oder docker pull? :slight_smile:

Wenn wir eine Warteseite machen, wäre docker pull dann okay, oder?

Oui oui docker pull, ich muss die Skripte aktualisieren, da keine Docker-Images mehr im OS enthalten sein müssen.

Das ergibt dann das hier

Erstellung des Landing-Containers
Pull des Rests
Bevor ich den Gladys-Container erstelle, stoppe und lösche ich den Landing-Container

#!/bin/sh

TIMEZONE=$(cat /etc/timezone)

docker_images_watchtower=$(docker images -q containrrr/watchtower)
docker_images_gladys=$(docker images -q gladysassistant/gladys)
docker_images_gladyslanding=$(docker images -q gladysassistant/gladyslanding)

# Erster Start, wir müssen sicherstellen, dass das Landing-Image / der Container existiert
if [ -n "$docker_images_gladyslanding" ]; then
  logger -t "gladys-init" "Gladys Landing-Image existiert, Cool...."
else
  logger -t "gladys-init" "Gladys Landing-Image fehlt, erstelle sie...."
  docker run -d \
    --name gladys-landing \
    TODODODODODODODOD
fi

if [ -n "$docker_images_watchtower" ]; then
  logger -t "gladys-init" "Watchtower-Container existiert, Cool...."
else
  logger -t "gladys-init" "Watchtower-Container fehlt, erstelle sie...."
  docker run -d \
    --name watchtower \
    --restart=always \
    -v /var/run/docker.sock:/var/run/docker.sock \
    containrrr/watchtower \
    --cleanup
fi

if [ -n "$docker_images_gladys" ]; then
  logger -t "gladys-init" "Gladys-Container existiert, Cool...."
else
  logger -t "gladys-init" "Gladys-Image fehlt, hole sie...."
  docker pull gladysassistant/gladys:v4
  logger -t "gladys-init" "Gladys-Image wurde geholt, lösche Landing-Container"
  docker stop gladys-landing && docker rm gladys-landing
  logger -t "gladys-init" "Gladys-Container fehlt, erstelle sie...."
  docker run -d \
    --restart=always \
    --privileged \
    --network=host \
    --log-opt max-size=10m \
    --name gladys \
    -e NODE_ENV=production \
    -e SERVER_PORT=80 \
    -e TZ=${TIMEZONE} \
    -e SQLITE_FILE_PATH=/var/lib/gladysassistant/gladys-production.db \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /var/lib/gladysassistant:/var/lib/gladysassistant \
    -v /dev:/dev \
    -v /run/udev:/run/udev:ro \
    gladysassistant/gladys:v4
fi

Das klingt gut!

Nur zwei Dinge:

  • Wir müssen einen anderen Namen als „gladys-landing“ finden. Eine Landing Page ist ein Marketing-Begriff, das hat nichts mit dem zu tun, was wir hier machen :slight_smile:
  • Vergiss nicht, die Option --include-restarting zu watchtower hinzuzufügen, damit watchtower auch Container aktualisieren kann, die sich ständig neu starten, und somit ein komplett kaputtes Image reparieren kann :slight_smile: Ich habe sie heute auf der Website hinzugefügt: Installation avec Docker | Gladys Assistant

OK, beim Namen kein Problem, das ist nur ein Entwurf, ich habe nichts gepusht.

Bei Watchtower muss ich auch noch das Scheduling hinzufügen.
Das ist ein Skript, aber es erledigt den Job.

Le scheduling ?

Das ist schon erledigt, 24h ist jetzt der Standard :slight_smile:

Ansonsten weiß ich nicht, in welchem Repo du das gemacht hast, aber meiner Meinung nach solltest du das in einem separaten Repo vom Haupt-Repo von Gladys machen :slight_smile:

Ach okay, das wusste ich nicht, ich dachte, man müsste andere Einstellungen vornehmen

Wovon sprichst du, vom „preparing container“?

gladys-waiting, wie klingt das als Container/Bild?

Ich rede von allem! Der Build, das Skript, usw.

gladys-setup-in-progress, oder? Es ist etwas umständlich, aber ich finde es sehr aussagekräftig :slight_smile:

Okay, wir machen das so, ich habe dazu keine große Meinung, es ist ein bisschen wie Variablennamen… :slight_smile:

Es gibt bereits ein Repo für den OS-Build, ich werde eines für den Setup-in-Progress erstellen.

Ich habe eine statische Seite mit einem Auto-Refresh alle 60 Sekunden erstellt

.

Falls du noch etwas hinzufügen möchtest…

Das Docker-Image ist 23 MB groß

Edit:

Ich wollte das Repo übertragen, aber


Das müssen wir mal anschauen

Toll! Also, man lässt den Go-Bild-Trick einfach fallen? ^^

Mir gefällt das Bild auch mit Nginx, aber dann haben wir keine Fortschrittsleiste.

Genau, das Go war, um das Beispiel HA wieder aufzunehmen, aber ich habe schon Probleme mit JavaScript, also Go (kenn ich überhaupt nicht) :sweat_smile:

Ich bin kein Go-Experte, aber das sieht recht einfach aus :slight_smile:

Beispiel für einen getContainers in Go mit dem Docker-Client:

Siehe: client package - github.com/ph/moby/client - Go Packages

Allerdings stimme ich zu, dass ein Nginx-Container mit einem Bild vielleicht ausreicht. Das Einzige, was mich beunruhigt, ist, dass der Benutzer keine Rückmeldung bei einem Fehler erhält..

Ich habe eine Testversion gebaut, die ich nicht in der Praxis getestet habe

Ich muss mir einen Raspberry Pi kaufen (meine anderen beiden sind bereits in Gebrauch)

https://github.com/VonOx/gladys-pi-gen/releases/download/v1.0.1/gladys-os-rpi-lite.zip

Hallo!
Ich habe es heruntergeladen, extrahiert, « gebrannt » und in einen RPi 2 (headless) eingesetzt und… nichts.
Habe ich etwas falsch gemacht?
Ist es für einen RPi 2 vorgesehen oder muss ich es in den RPi 4 stecken?
Übrigens, der Link, den du mir gegeben hast, verweist auf « https://gladys-os-rpi-lite.zip/ »…

Ich habe den RPi an einen Bildschirm angeschlossen und einen Bootloop. Die letzte Meldung, die ich gesehen habe, war ‹ failed to come online ›.
Ich werde es später noch einmal von vorne versuchen, aber nach mehreren Neustarts hat es sich schließlich stabilisiert. Leider erhalte ich eine ‹ connection refused ›-Meldung, wenn ich versuche, auf die Startseite zuzugreifen.