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.
| Дистрибутив | Тестируется на |
|---|---|
| Ubuntu | 22.04 LTS, 24.04 LTS |
| Debian | 12 (bookworm) |
| RHEL | 9 |
| Rocky Linux | 9 |
| AlmaLinux | 9 |
CentOS 7 не поддерживается — его glibc и systemd слишком стары для bundled Compose-стека и попали в upstream EOL.
Требуемое программное обеспечение
- Docker Engine 24.0 или новее. Более старые релизы не имеют
--platformplumbing'а, на который полагаетсяmake docker-build, и ломаютextra_hosts: host-gateway. - Docker Compose v2 (CLI-плагин
docker compose, не legacydocker-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 | Комфортно | Зачем |
|---|---|---|---|
| CPU | 2 vCPU | 4 vCPU | Manager Go-процесс, Prometheus, Loki, Tempo, Grafana, MySQL — все живут на одном хосте. |
| Память | 4 GB | 8 GB | Prometheus + Loki вместе могут бить 1.5 GB на idle. Headroom держит OOM killer от MySQL. |
| Диск | 20 GB | 100 GB | Retention Prometheus — 90 дней / 20 GB по умолчанию (см. --storage.tsdb.retention.* в compose-файле). Loki + Tempo делят остаток. |
| Сеть | 10 Mbps | 100 Mbps | Телеметрия — это плоскость данных — log-shipping от многих edge'ей может насытить тонкий канал задолго до того, как сам manager. |
20 GB floor предполагает, что вы тестируете только с горсткой edge'ей. Когда вы пересекаете ~25 хостов, отгружающих метрики + логи + трейсы, планируйте 200 GB просто чтобы держать 30 дней Loki вокруг.
Порты
| Порт | Направление | Протокол | Что это |
|---|---|---|---|
| 443 | входящий | HTTPS | nginx — SPA, REST API, log/trace ingest |
| 80 | входящий | HTTP | nginx redirect на 443 |
| 40012 | входящий | TCP (geminio) | Frontier broker — каждый edge дозванивается сюда |
| 3306 | exposed локально | TCP | MySQL — bind на 127.0.0.1 в production |
| 9090 | exposed локально | HTTP | Prometheus — bind на 127.0.0.1 в production |
| 9100 | входящий (опционально) | HTTP | Manager /metrics — для внешнего Prometheus, чтобы скрейпить |
Только 443, 80 и 40012 должны быть достижимы из публичного интернета (или сети вашего edge-флота). Всё остальное остаётся bound к localhost в production — nginx fronts API, и Grafana / Prometheus / Loki / Tempo достигаются по docker-сети.
Что compose-стек запускает
Из deploy/docker-compose.yml:
| Сервис | Image | Роль |
|---|---|---|
mysql | mysql:8.0 | Primary store manager (users, edges, devices, alert rules, sessions). |
ongrid | ongrid:<version> | Manager — Go-бинарь, собранный из cmd/ongrid. |
nginx | ongrid-web:<version> | TLS-терминация, SPA, reverse-proxy /api/*, static /edge/* для install-bundle. |
frontier | singchia/frontier:1.2.5 | Geminio-брокер; edge tunnel endpoint (ADR-007). |
prometheus | prom/prometheus:v2.54.0 | Metric store + remote_write receiver (ADR-009). |
loki | grafana/loki:3.4.0 | Log store (ADR-012). |
tempo | grafana/tempo:2.5.0 | Trace store (ADR-013). |
searxng | searxng/searxng:latest | Self-hosted search backend для скилла web_search. |
grafana | grafana/grafana-oss:11.1.4 | Dashboard 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.
Апгрейд
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 живёт рядом с tarball и делает идемпотентный танец: load нового образа, написать временный docker-compose.override.yml, закрепляющий новый tag, docker compose up -d, prune предыдущего образа после одной healthy-минуты. См. Апгрейд.
Что НЕ работает
- Podman + podman-compose: compose-файл использует Docker-specific shorthand (
extra_hosts: host-gateway,:ZSELinux-семантику), которую podman либо парсит несовместимо, либо игнорирует. Мы это не тестируем. - K3s host-mode networking: работает для manager'а, но edge-installer построен вокруг bare systemd — см. Kubernetes для daemonset-паттерна.
- OpenRC / runit / s6: manager-контейнеру всё равно, но Docker daemon хоста должен подняться при загрузке. Если ваша init-система может это делать, вы в порядке.