Skip to content

Linux (serveur)

Le manager est livré comme image Docker (ongrid:<version>) et est opéré via docker compose. Les deux viennent du tarball de release produit par make package — pas d'apt install ongrid, pas de daemon côté host.

Distributions supportées

Nous exécutons le manager au quotidien sur les hosts suivants. Tout ce qui exécute Docker Engine 24+ devrait marcher ; la liste ci-dessous est ce qui reçoit un test explicite par release.

DistributionTestée sur
Ubuntu22.04 LTS, 24.04 LTS
Debian12 (bookworm)
RHEL9
Rocky Linux9
AlmaLinux9

CentOS 7 n'est pas supporté — sa glibc et son systemd sont trop vieux pour la stack Compose embarquée et ont touché l'EOL upstream.

Logiciels requis

  • Docker Engine 24.0 ou plus récent. Les releases plus anciennes manquent de plomberie --platform sur laquelle make docker-build s'appuie et cassent extra_hosts: host-gateway.
  • Docker Compose v2 (le plugin CLI docker compose, pas le binaire legacy docker-compose). Le fichier compose à deploy/docker-compose.yml omet délibérément la clé top-level version:, que v1 rejette.
  • systemd pour l'host. Le manager lui-même n'enregistre pas d'unit systemd — le script d'install deploy/install/server-install.sh ne s'appuie que sur systemd pour démarrer Docker — mais l'auto-restart au reboot a besoin que docker.service soit activé.
  • iptables / nftables vont bien ; les deux backends fonctionnent.

Pas de modules kernel requis au-delà de ce que Docker lui-même nécessite (overlayfs, namespaces, cgroups v1 ou v2).

Planchers de ressources

RessourcePlancherConfortablePourquoi
CPU2 vCPU4 vCPULe processus Go manager, Prometheus, Loki, Tempo, Grafana, MySQL vivent tous sur le même host.
Mémoire4 Go8 GoPrometheus + Loki ensemble peuvent atteindre 1.5 Go au repos. La marge garde l'OOM killer loin de MySQL.
Disque20 Go100 GoLa rétention Prometheus est 90 jours / 20 Go par défaut (voir --storage.tsdb.retention.* dans le fichier compose). Loki + Tempo se partagent le reste.
Réseau10 Mbps100 MbpsLa télémétrie est le plan de données — l'expédition de logs depuis de nombreux edges peut saturer un pipe mince longtemps avant que le manager lui-même ne le fasse.

Le plancher de 20 Go suppose que vous testez seulement avec une poignée d'edges. Une fois que vous croisez ~25 hosts livrant métriques + logs + traces, planifiez 200 Go juste pour garder 30 jours de Loki.

Ports

PortDirectionProtocoleCe que c'est
443entrantHTTPSnginx — SPA, API REST, ingest log/trace
80entrantHTTPredirection nginx vers 443
40012entrantTCP (geminio)Broker frontier — chaque edge compose ceci
3306exposé localementTCPMySQL — bind à 127.0.0.1 en production
9090exposé localementHTTPPrometheus — bind à 127.0.0.1 en production
9100entrant (optionnel)HTTP/metrics du manager — pour qu'un Prometheus externe scrape

Seuls 443, 80 et 40012 ont besoin d'être joignables depuis l'internet public (ou le réseau de votre flotte d'edges). Tout le reste reste bindé à localhost en production — nginx fronte l'API, et Grafana / Prometheus / Loki / Tempo sont joints sur le réseau docker.

Ce que la stack compose exécute

Depuis deploy/docker-compose.yml :

ServiceImageRôle
mysqlmysql:8.0Store principal du manager (utilisateurs, edges, devices, règles d'alerte, sessions).
ongridongrid:<version>Manager — binaire Go construit depuis cmd/ongrid.
nginxongrid-web:<version>Terminaison TLS, SPA, reverse proxy /api/*, /edge/* statique pour le bundle d'install.
frontiersingchia/frontier:1.2.5Broker geminio ; endpoint de tunnel edge (ADR-007).
prometheusprom/prometheus:v2.54.0Store de métriques + récepteur remote_write (ADR-009).
lokigrafana/loki:3.4.0Store de logs (ADR-012).
tempografana/tempo:2.5.0Store de traces (ADR-013).
searxngsearxng/searxng:latestBackend de recherche self-hosté pour le skill web_search.
grafanagrafana/grafana-oss:11.1.4Embed de dashboard pour la page Monitor.

Le fichier compose est la forme production — il n'y a pas de second fichier « prod ». Surchargez les boutons via le bloc env (ONGRID_* — voir Variables d'environnement) plutôt que de forker le YAML.

TLS

nginx termine TLS en utilisant des certificats bind-mountés depuis deploy/certs/ (cert.pem, key.pem). Pour le premier boot, le script d'install génère un cert auto-signé ; remplacez-le par un vrai cert à tout moment et docker compose restart nginx. Let's Encrypt est supporté via un pattern sidecar documenté dans deploy/README.md.

Selinux + AppArmor

Les deux marchent out of the box. Le fichier compose ne monte pas de chemins host sensibles en lecture-écriture ; les bind mounts (./edge, ./nginx, ./certs, ./grafana/provisioning) sont tous :ro. Si votre politique SELinux impose des labels stricts sur les bind mounts, ajoutez :Z aux chaînes de mount à l'intérieur de docker-compose.override.yml.

Upgrader

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 vit à côté du tarball et fait la danse idempotente : charger la nouvelle image, écrire un docker-compose.override.yml temporaire épinglant le nouveau tag, docker compose up -d, élaguer l'image précédente après une minute saine. Voir Upgrade.

Ce qui NE marche PAS

  • Podman + podman-compose : le fichier compose utilise des raccourcis spécifiques à Docker (extra_hosts: host-gateway, sémantique SELinux :Z) que podman parse soit incompatiblement soit ignore. Nous ne le testons pas.
  • Réseau mode host K3s : marche pour le manager, mais l'installer edge est construit autour de bare systemd — voir Kubernetes pour le pattern daemonset.
  • OpenRC / runit / s6 : le conteneur manager s'en moque, mais le daemon Docker de l'host doit se lever au boot. Si votre init system peut faire ça, vous êtes OK.