Skip to content

Linux (сервер)

Manager отгружается как Docker-образ (ongrid:<version>) и оперируется через docker compose. Оба приходят из release-tarball, производимого make package — нет apt install ongrid, нет host-side daemon.

Поддерживаемые дистрибутивы

Мы запускаем manager day-to-day на следующих хостах. Всё, что запускает Docker Engine 24+, должно работать; список ниже — то, что получает явное тестирование per release.

ДистрибутивТестируется на
Ubuntu22.04 LTS, 24.04 LTS
Debian12 (bookworm)
RHEL9
Rocky Linux9
AlmaLinux9

CentOS 7 не поддерживается — его glibc и systemd слишком стары для bundled Compose-стека и попали в upstream EOL.

Требуемое программное обеспечение

  • Docker Engine 24.0 или новее. Более старые релизы не имеют --platform plumbing'а, на который полагается make docker-build, и ломают extra_hosts: host-gateway.
  • Docker Compose v2 (CLI-плагин docker compose, не legacy docker-compose бинарь). Compose-файл в deploy/docker-compose.yml намеренно опускает top-level ключ version:, который v1 отвергает.
  • systemd для хоста. Сам manager не регистрирует systemd-юнит — install-скрипт deploy/install/server-install.sh полагается на systemd только чтобы запустить Docker — но auto-restart при ребуте требует включённого docker.service.
  • iptables / nftables — нормально; оба backend'а работают.

Никакие требуемые kernel-модули кроме того, что Docker сам нуждается (overlayfs, namespaces, cgroups v1 или v2).

Floor'ы ресурсов

РесурсFloorКомфортноЗачем
CPU2 vCPU4 vCPUManager Go-процесс, Prometheus, Loki, Tempo, Grafana, MySQL — все живут на одном хосте.
Память4 GB8 GBPrometheus + Loki вместе могут бить 1.5 GB на idle. Headroom держит OOM killer от MySQL.
Диск20 GB100 GBRetention Prometheus — 90 дней / 20 GB по умолчанию (см. --storage.tsdb.retention.* в compose-файле). Loki + Tempo делят остаток.
Сеть10 Mbps100 MbpsТелеметрия — это плоскость данных — log-shipping от многих edge'ей может насытить тонкий канал задолго до того, как сам manager.

20 GB floor предполагает, что вы тестируете только с горсткой edge'ей. Когда вы пересекаете ~25 хостов, отгружающих метрики + логи + трейсы, планируйте 200 GB просто чтобы держать 30 дней Loki вокруг.

Порты

ПортНаправлениеПротоколЧто это
443входящийHTTPSnginx — SPA, REST API, log/trace ingest
80входящийHTTPnginx redirect на 443
40012входящийTCP (geminio)Frontier broker — каждый edge дозванивается сюда
3306exposed локальноTCPMySQL — bind на 127.0.0.1 в production
9090exposed локальноHTTPPrometheus — bind на 127.0.0.1 в production
9100входящий (опционально)HTTPManager /metrics — для внешнего Prometheus, чтобы скрейпить

Только 443, 80 и 40012 должны быть достижимы из публичного интернета (или сети вашего edge-флота). Всё остальное остаётся bound к localhost в production — nginx fronts API, и Grafana / Prometheus / Loki / Tempo достигаются по docker-сети.

Что compose-стек запускает

Из deploy/docker-compose.yml:

СервисImageРоль
mysqlmysql:8.0Primary store manager (users, edges, devices, alert rules, sessions).
ongridongrid:<version>Manager — Go-бинарь, собранный из cmd/ongrid.
nginxongrid-web:<version>TLS-терминация, SPA, reverse-proxy /api/*, static /edge/* для install-bundle.
frontiersingchia/frontier:1.2.5Geminio-брокер; edge tunnel endpoint (ADR-007).
prometheusprom/prometheus:v2.54.0Metric store + remote_write receiver (ADR-009).
lokigrafana/loki:3.4.0Log store (ADR-012).
tempografana/tempo:2.5.0Trace store (ADR-013).
searxngsearxng/searxng:latestSelf-hosted search backend для скилла web_search.
grafanagrafana/grafana-oss:11.1.4Dashboard embed для страницы Monitor.

Compose-файл — это production-форма — нет второго «prod»-файла. Override-ручки через env-блок (ONGRID_* — см. Переменные окружения) вместо форка YAML.

TLS

nginx терминирует TLS, используя сертификаты, bind-mounted из deploy/certs/ (cert.pem, key.pem). Для первой загрузки install-скрипт генерирует self-signed сертификат; замените его реальным сертификатом в любое время и docker compose restart nginx. Let's Encrypt поддерживается через sidecar-паттерн, задокументированный в deploy/README.md.

Selinux + AppArmor

Оба работают из коробки. Compose-файл не монтирует sensitive host-пути read-write; bind-mount'ы (./edge, ./nginx, ./certs, ./grafana/provisioning) все :ro. Если ваша SELinux-политика форсит строгие labels на bind mount'ах, append'ните :Z к mount-строкам внутри docker-compose.override.yml.

Апгрейд

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 живёт рядом с tarball и делает идемпотентный танец: load нового образа, написать временный docker-compose.override.yml, закрепляющий новый tag, docker compose up -d, prune предыдущего образа после одной healthy-минуты. См. Апгрейд.

Что НЕ работает

  • Podman + podman-compose: compose-файл использует Docker-specific shorthand (extra_hosts: host-gateway, :Z SELinux-семантику), которую podman либо парсит несовместимо, либо игнорирует. Мы это не тестируем.
  • K3s host-mode networking: работает для manager'а, но edge-installer построен вокруг bare systemd — см. Kubernetes для daemonset-паттерна.
  • OpenRC / runit / s6: manager-контейнеру всё равно, но Docker daemon хоста должен подняться при загрузке. Если ваша init-система может это делать, вы в порядке.