Skip to content

Linux (servidor) ​

O manager é distribuído como uma imagem Docker (ongrid:<version>) e é operado através de docker compose. Ambos vêm do tarball de release produzido por make package — sem apt install ongrid, sem daemon host-side.

Distribuições suportadas ​

Rodamos o manager no dia-a-dia nos seguintes hosts. Qualquer coisa que rode Docker Engine 24+ deve funcionar; a lista abaixo é o que recebe teste explícito por release.

DistribuiçãoTestado em
Ubuntu22.04 LTS, 24.04 LTS
Debian12 (bookworm)
RHEL9
Rocky Linux9
AlmaLinux9

CentOS 7 não é suportado — seu glibc e systemd são antigos demais para a stack Compose bundled e atingiram EOL upstream.

Software requerido ​

  • Docker Engine 24.0 ou posterior. Releases mais antigas faltam plumbing de --platform que make docker-build depende e quebram extra_hosts: host-gateway.
  • Docker Compose v2 (o plugin CLI docker compose, não o binário legado docker-compose). O compose file em deploy/docker-compose.yml deliberadamente omite a chave top-level version:, que v1 rejeita.
  • systemd para o host. O próprio manager não registra uma unit systemd — o script de instalação deploy/install/server-install.sh só depende do systemd para iniciar o Docker — mas auto-restart em reboot precisa de docker.service habilitado.
  • iptables / nftables está OK; ambos os backends funcionam.

Sem módulos de kernel requeridos além do que o próprio Docker precisa (overlayfs, namespaces, cgroups v1 ou v2).

Floors de recursos ​

RecursoFloorConfortávelPor quê
CPU2 vCPU4 vCPUO processo Go do manager, Prometheus, Loki, Tempo, Grafana, MySQL todos vivem no mesmo host.
Memória4 GB8 GBPrometheus + Loki juntos podem bater 1.5 GB em idle. Headroom mantém o OOM killer longe do MySQL.
Disco20 GB100 GBRetenção do Prometheus é 90 dias / 20 GB por padrão (veja --storage.tsdb.retention.* no compose file). Loki + Tempo compartilham o resto.
Rede10 Mbps100 MbpsTelemetria é o data plane — shipping de log de muitos edges pode saturar um pipe fino bem antes do próprio manager.

O floor de 20 GB assume que você só testa com um punhado de edges. Uma vez que você atravessa ~25 hosts enviando metrics + logs + traces, planeje 200 GB só para manter 30 dias de Loki.

Portas ​

PortaDireçãoProtocoloO que é
443inboundHTTPSnginx — SPA, REST API, ingest de log/trace
80inboundHTTPredirect do nginx para 443
40012inboundTCP (geminio)Broker Frontier — cada edge disca isso
3306exposto localmenteTCPMySQL — bind em 127.0.0.1 em produção
9090exposto localmenteHTTPPrometheus — bind em 127.0.0.1 em produção
9100inbound (opcional)HTTP/metrics do manager — para um Prometheus externo raspar

Apenas 443, 80, e 40012 precisam ser alcançáveis da internet pública (ou da rede da sua frota de edges). Tudo mais fica vinculado ao localhost em produção — nginx frenteia a API, e Grafana / Prometheus / Loki / Tempo são alcançados pela rede docker.

O que a stack compose roda ​

De deploy/docker-compose.yml:

ServiçoImagemPapel
mysqlmysql:8.0Store primário do manager (users, edges, devices, alert rules, sessions).
ongridongrid:<version>Manager — binário Go buildado de cmd/ongrid.
nginxongrid-web:<version>Terminação TLS, SPA, reverse proxy /api/*, estático /edge/* para o bundle de install.
frontiersingchia/frontier:1.2.5Broker geminio; endpoint de tunnel do edge (ADR-007).
prometheusprom/prometheus:v2.54.0Store de métrica + receiver remote_write (ADR-009).
lokigrafana/loki:3.4.0Store de log (ADR-012).
tempografana/tempo:2.5.0Store de trace (ADR-013).
searxngsearxng/searxng:latestBackend de busca self-hosted para a skill web_search.
grafanagrafana/grafana-oss:11.1.4Embed de dashboard para a página Monitor.

O compose file é o formato de produção — não há um segundo arquivo "prod". Sobrescreva knobs via o bloco env (ONGRID_* — veja Variáveis de ambiente) em vez de forkar o YAML.

TLS ​

O nginx termina TLS usando certificados bind-mounted de deploy/certs/ (cert.pem, key.pem). Para o primeiro boot o script de instalação gera um cert self-signed; substitua por um cert real a qualquer momento e docker compose restart nginx. Let's Encrypt é suportado via um padrão sidecar documentado em deploy/README.md.

Selinux + AppArmor ​

Ambos funcionam de fábrica. O compose file não monta paths sensíveis do host read-write; os bind mounts (./edge, ./nginx, ./certs, ./grafana/provisioning) são todos :ro. Se sua política SELinux impõe labels estritas em bind mounts, anexe :Z às strings de mount dentro de docker-compose.override.yml.

Fazendo upgrade ​

sh
make package           # produz 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 ao lado do tarball e faz a dança idempotente: carrega a imagem nova, escreve um docker-compose.override.yml temporário fixando a tag nova, docker compose up -d, prune da imagem anterior depois de um minuto saudável. Veja Upgrade.

O que NÃO funciona ​

  • Podman + podman-compose: o compose file usa atalho Docker-específico (extra_hosts: host-gateway, semântica SELinux :Z) que o podman ou parseia de forma incompatível ou ignora. Não testamos.
  • K3s host-mode networking: funciona para o manager, mas o instalador do edge é construído em torno de systemd bare — veja Kubernetes para o padrão daemonset.
  • OpenRC / runit / s6: o container do manager não se importa, mas o daemon Docker do host precisa subir no boot. Se seu init system consegue fazer isso, você está OK.