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.
| Distribution | Testée sur |
|---|---|
| Ubuntu | 22.04 LTS, 24.04 LTS |
| Debian | 12 (bookworm) |
| RHEL | 9 |
| Rocky Linux | 9 |
| AlmaLinux | 9 |
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
--platformsur laquellemake docker-builds'appuie et cassentextra_hosts: host-gateway. - Docker Compose v2 (le plugin CLI
docker compose, pas le binaire legacydocker-compose). Le fichier compose àdeploy/docker-compose.ymlomet délibérément la clé top-levelversion:, 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.shne s'appuie que sur systemd pour démarrer Docker — mais l'auto-restart au reboot a besoin quedocker.servicesoit 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
| Ressource | Plancher | Confortable | Pourquoi |
|---|---|---|---|
| CPU | 2 vCPU | 4 vCPU | Le processus Go manager, Prometheus, Loki, Tempo, Grafana, MySQL vivent tous sur le même host. |
| Mémoire | 4 Go | 8 Go | Prometheus + Loki ensemble peuvent atteindre 1.5 Go au repos. La marge garde l'OOM killer loin de MySQL. |
| Disque | 20 Go | 100 Go | La 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éseau | 10 Mbps | 100 Mbps | La 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
| Port | Direction | Protocole | Ce que c'est |
|---|---|---|---|
| 443 | entrant | HTTPS | nginx — SPA, API REST, ingest log/trace |
| 80 | entrant | HTTP | redirection nginx vers 443 |
| 40012 | entrant | TCP (geminio) | Broker frontier — chaque edge compose ceci |
| 3306 | exposé localement | TCP | MySQL — bind à 127.0.0.1 en production |
| 9090 | exposé localement | HTTP | Prometheus — bind à 127.0.0.1 en production |
| 9100 | entrant (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 :
| Service | Image | Rôle |
|---|---|---|
mysql | mysql:8.0 | Store principal du manager (utilisateurs, edges, devices, règles d'alerte, sessions). |
ongrid | ongrid:<version> | Manager — binaire Go construit depuis cmd/ongrid. |
nginx | ongrid-web:<version> | Terminaison TLS, SPA, reverse proxy /api/*, /edge/* statique pour le bundle d'install. |
frontier | singchia/frontier:1.2.5 | Broker geminio ; endpoint de tunnel edge (ADR-007). |
prometheus | prom/prometheus:v2.54.0 | Store de métriques + récepteur remote_write (ADR-009). |
loki | grafana/loki:3.4.0 | Store de logs (ADR-012). |
tempo | grafana/tempo:2.5.0 | Store de traces (ADR-013). |
searxng | searxng/searxng:latest | Backend de recherche self-hosté pour le skill web_search. |
grafana | grafana/grafana-oss:11.1.4 | Embed 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
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.shupgrade.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.