Skip to content

Linux (server)

El manager se distribuye como una imagen Docker (ongrid:<version>) y se opera a través de docker compose. Ambos vienen del tarball de release producido por make package — sin apt install ongrid, sin daemon host-side.

Distribuciones soportadas

Corremos el manager día a día en los siguientes hosts. Cualquier cosa que corra Docker Engine 24+ debería funcionar; la lista de abajo es lo que se testea explícitamente por release.

DistribuciónTesteado en
Ubuntu22.04 LTS, 24.04 LTS
Debian12 (bookworm)
RHEL9
Rocky Linux9
AlmaLinux9

CentOS 7 no está soportado — su glibc y systemd son demasiado viejos para el stack Compose bundled y han llegado a EOL upstream.

Software requerido

  • Docker Engine 24.0 o posterior. Las releases más viejas no tienen la plomería --platform en la que confía make docker-build y rompen extra_hosts: host-gateway.
  • Docker Compose v2 (el plugin CLI docker compose, no el binario legacy docker-compose). El archivo compose en deploy/docker-compose.yml deliberadamente omite la key top-level version:, que v1 rechaza.
  • systemd para el host. El propio manager no registra una unit systemd — el script de install deploy/install/server-install.sh solo se apoya en systemd para arrancar Docker — pero auto-restart en reboot necesita docker.service habilitado.
  • iptables / nftables está bien; ambos backends funcionan.

Sin módulos de kernel requeridos más allá de lo que el propio Docker necesita (overlayfs, namespaces, cgroups v1 o v2).

Pisos de recursos

RecursoPisoCómodoPor qué
CPU2 vCPU4 vCPUEl proceso Go del manager, Prometheus, Loki, Tempo, Grafana, MySQL todos viven en el mismo host.
Memoria4 GB8 GBPrometheus + Loki juntos pueden pegar 1.5 GB en idle. El espacio mantiene al OOM killer lejos de MySQL.
Disco20 GB100 GBLa retención de Prometheus es 90 días / 20 GB por defecto (ver --storage.tsdb.retention.* en el archivo compose). Loki + Tempo comparten el resto.
Red10 Mbps100 MbpsLa telemetría es el data plane — el shipping de logs desde muchos edges puede saturar un caño delgado mucho antes que el propio manager.

El piso de 20 GB asume que solo testeas con un puñado de edges. Una vez que cruzas ~25 hosts enviando métricas + logs + trazas, planea 200 GB solo para mantener 30 días de Loki.

Puertos

PuertoDirecciónProtocoloQué es
443entranteHTTPSnginx — SPA, REST API, ingest de log/traza
80entranteHTTPredirect de nginx a 443
40012entranteTCP (geminio)Broker frontier — cada edge marca a esto
3306expuesto localmenteTCPMySQL — bind a 127.0.0.1 en producción
9090expuesto localmenteHTTPPrometheus — bind a 127.0.0.1 en producción
9100entrante (opcional)HTTP/metrics del manager — para un Prometheus externo que scrapee

Solo 443, 80 y 40012 necesitan ser alcanzables desde internet público (o la red de tu flota de edges). Todo lo demás se queda bindeado a localhost en producción — nginx pone la cara al API, y Grafana / Prometheus / Loki / Tempo se alcanzan sobre la red docker.

Qué corre el stack compose

De deploy/docker-compose.yml:

ServicioImagenRol
mysqlmysql:8.0Store primario del manager (usuarios, edges, devices, reglas de alerta, sesiones).
ongridongrid:<version>Manager — binario Go construido desde cmd/ongrid.
nginxongrid-web:<version>Terminación TLS, SPA, reverse proxy /api/*, /edge/* estático para el bundle de install.
frontiersingchia/frontier:1.2.5Broker geminio; endpoint del túnel del edge (ADR-007).
prometheusprom/prometheus:v2.54.0Store de métricas + receptor remote_write (ADR-009).
lokigrafana/loki:3.4.0Store de logs (ADR-012).
tempografana/tempo:2.5.0Store de trazas (ADR-013).
searxngsearxng/searxng:latestBackend de búsqueda self-hosted para el skill web_search.
grafanagrafana/grafana-oss:11.1.4Embed de dashboard para la página Monitor.

El archivo compose es la forma de producción — no hay un segundo archivo "prod". Sobrescribe perillas vía el bloque env (ONGRID_* — ver Variables de entorno) en vez de forkear el YAML.

TLS

nginx termina TLS usando certificados bind-mounted desde deploy/certs/ (cert.pem, key.pem). Para el primer boot el install script genera un cert autofirmado; sustitúyelo por un cert real en cualquier momento y docker compose restart nginx. Let's Encrypt está soportado vía un patrón sidecar documentado en deploy/README.md.

Selinux + AppArmor

Ambos funcionan de fábrica. El archivo compose no monta paths host sensibles read-write; los bind mounts (./edge, ./nginx, ./certs, ./grafana/provisioning) son todos :ro. Si tu política SELinux refuerza labels estrictas en bind mounts, anexa :Z a los strings de mount dentro de docker-compose.override.yml.

Upgradear

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 vive al lado del tarball y hace el baile idempotente: carga la nueva imagen, escribe un docker-compose.override.yml temporal pineando el nuevo tag, docker compose up -d, prune de la imagen previa después de un minuto sano. Ver Upgrade.

Qué NO funciona

  • Podman + podman-compose: el archivo compose usa shorthand Docker-específico (extra_hosts: host-gateway, semántica SELinux :Z) que podman o parsea incompatiblemente o ignora. No testeamos.
  • Networking host-mode de K3s: funciona para el manager, pero el installer de edge está construido alrededor de systemd desnudo — ver Kubernetes para el patrón daemonset.
  • OpenRC / runit / s6: al contenedor del manager no le importa, pero el daemon Docker del host necesita arrancar en boot. Si tu sistema init puede hacer eso, estás bien.