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.