Skip to content

Linux (Server)

Der Manager wird als Docker-Image (ongrid:<version>) ausgeliefert und wird über docker compose bedient. Beide kommen aus dem Release-Tarball, das durch make package produziert wird — kein apt install ongrid, kein hostseitiger Daemon.

Unterstützte Distributionen

Wir betreiben den Manager Tag für Tag auf den folgenden Hosts. Alles, was Docker Engine 24+ läuft, sollte funktionieren; die untenstehende Liste ist das, was explizites Testen pro Release bekommt.

DistributionGetestet auf
Ubuntu22.04 LTS, 24.04 LTS
Debian12 (bookworm)
RHEL9
Rocky Linux9
AlmaLinux9

CentOS 7 wird nicht unterstützt — seine glibc und systemd sind zu alt für den gebündelten Compose-Stack und haben Upstream-EOL erreicht.

Erforderliche Software

  • Docker Engine 24.0 oder später. Ältere Releases vermissen --platform-Verklemmungen, auf die sich make docker-build stützt, und brechen extra_hosts: host-gateway.
  • Docker Compose v2 (das docker compose-CLI-Plugin, nicht das Legacy-docker-compose-Binary). Die Compose-Datei unter deploy/docker-compose.yml lässt absichtlich den Top-Level-version:-Key weg, was v1 ablehnt.
  • systemd für den Host. Der Manager selbst registriert keine systemd-Unit — das Install-Skript deploy/install/server-install.sh stützt sich nur auf systemd, um Docker zu starten — aber Auto-Restart bei Reboot braucht aktiviertes docker.service.
  • iptables / nftables ist in Ordnung; beide Backends funktionieren.

Keine erforderlichen Kernel-Module über das hinaus, was Docker selbst braucht (overlayfs, Namespaces, cgroups v1 oder v2).

Ressourcen-Untergrenzen

RessourceUntergrenzeKomfortabelWarum
CPU2 vCPU4 vCPUDer Manager-Go-Prozess, Prometheus, Loki, Tempo, Grafana, MySQL leben alle auf demselben Host.
Speicher4 GB8 GBPrometheus + Loki zusammen können im Leerlauf 1,5 GB treffen. Headroom hält den OOM-Killer von MySQL fern.
Disk20 GB100 GBPrometheus-Retention ist 90 Tage / 20 GB standardmäßig (siehe --storage.tsdb.retention.* in der Compose-Datei). Loki + Tempo teilen den Rest.
Netzwerk10 Mbps100 MbpsTelemetrie ist die Datenebene — Log-Shipping von vielen Edges kann eine dünne Pipe lange vor dem Manager selbst sättigen.

Die 20-GB-Untergrenze nimmt an, dass Sie nur mit einer Handvoll Edges testen. Sobald Sie ~25 Hosts überschreiten, die Metriken + Logs + Traces liefern, planen Sie 200 GB nur ein, um 30 Tage Loki zu behalten.

Ports

PortRichtungProtokollWas es ist
443eingehendHTTPSnginx — SPA, REST API, Log-/Trace-Ingest
80eingehendHTTPnginx-Redirect auf 443
40012eingehendTCP (geminio)Frontier-Broker — jede Edge wählt das
3306lokal exponiertTCPMySQL — in Produktion an 127.0.0.1 binden
9090lokal exponiertHTTPPrometheus — in Produktion an 127.0.0.1 binden
9100eingehend (optional)HTTPManager /metrics — für externen Prometheus zum Scrapen

Nur 443, 80 und 40012 müssen vom öffentlichen Internet (oder dem Netzwerk Ihrer Edge-Flotte) erreichbar sein. Alles andere bleibt in Produktion an localhost gebunden — nginx fronted die API, und Grafana / Prometheus / Loki / Tempo werden über das Docker-Netzwerk erreicht.

Was der Compose-Stack läuft

Aus deploy/docker-compose.yml:

ServiceImageRolle
mysqlmysql:8.0Primärer Store des Managers (Benutzer, Edges, Devices, Alarmregeln, Sessions).
ongridongrid:<version>Manager — Go-Binary aus cmd/ongrid gebaut.
nginxongrid-web:<version>TLS-Terminierung, SPA, /api/* Reverse-Proxy, /edge/* statisch für das Install-Bundle.
frontiersingchia/frontier:1.2.5Geminio-Broker; Edge-Tunnel-Endpunkt (ADR-007).
prometheusprom/prometheus:v2.54.0Metrik-Store + remote_write-Receiver (ADR-009).
lokigrafana/loki:3.4.0Log-Store (ADR-012).
tempografana/tempo:2.5.0Trace-Store (ADR-013).
searxngsearxng/searxng:latestSelbstgehostetes Such-Backend für das web_search-Skill.
grafanagrafana/grafana-oss:11.1.4Dashboard-Embed für die Monitor-Seite.

Die Compose-Datei ist die Produktions-Form — es gibt keine zweite „Prod"-Datei. Knöpfe überschreiben über den env-Block (ONGRID_* — siehe Umgebungsvariablen) statt das YAML zu forken.

TLS

nginx terminiert TLS unter Verwendung von Zertifikaten, die aus deploy/certs/ (cert.pem, key.pem) bind-gemountet werden. Für den ersten Boot generiert das Install-Skript ein selbstsigniertes Zertifikat; ersetzen Sie es jederzeit durch ein echtes und docker compose restart nginx. Let's Encrypt wird via ein Sidecar-Muster unterstützt, dokumentiert in deploy/README.md.

SELinux + AppArmor

Beide funktionieren out of the Box. Die Compose-Datei mountet keine sensiblen Host-Pfade read-write; die Bind-Mounts (./edge, ./nginx, ./certs, ./grafana/provisioning) sind alle :ro. Wenn Ihre SELinux-Policy strikte Labels auf Bind-Mounts erzwingt, hängen Sie :Z an die Mount-Strings innerhalb docker-compose.override.yml an.

Upgraden

sh
make package           # produces dist/out/ongrid-vX.Y.Z-linux-amd64.tar.xz
scp dist/out/ongrid-vX.Y.Z-linux-amd64.tar.xz host:/tmp/
ssh host /tmp/upgrade.sh

upgrade.sh lebt neben dem Tarball und macht den idempotenten Tanz: das neue Image laden, eine temporäre docker-compose.override.yml schreiben, die den neuen Tag pinnt, docker compose up -d, das vorherige Image nach einer gesunden Minute prunen. Siehe Upgrade.

Was NICHT funktioniert

  • Podman + podman-compose: die Compose-Datei verwendet Docker-spezifische Kurzschreibweise (extra_hosts: host-gateway, :Z-SELinux-Semantik), die podman entweder inkompatibel parst oder ignoriert. Wir testen es nicht.
  • K3s-Host-Modus-Networking: funktioniert für den Manager, aber der Edge-Installer ist um bare systemd gebaut — siehe Kubernetes für das DaemonSet-Muster.
  • OpenRC / runit / s6: der Manager-Container kümmert sich nicht, aber der Docker-Daemon des Hosts muss beim Boot hochkommen. Wenn Ihr Init-System das kann, sind Sie in Ordnung.