Linux(服务端)
manager 以 Docker 镜像(ongrid:<version>)发,通过 docker compose 运维。两样都来自 make package 出的 release tarball —— 没有 apt install ongrid, 没有主机侧守护进程。
支持的发行版
我们每天在以下主机上跑 manager。任何能跑 Docker Engine 24+ 的应该都行;下 表是每 release 显式测试的那些。
| 发行版 | 测过 |
|---|---|
| Ubuntu | 22.04 LTS、24.04 LTS |
| Debian | 12(bookworm) |
| RHEL | 9 |
| Rocky Linux | 9 |
| AlmaLinux | 9 |
CentOS 7 不支持 —— 它的 glibc 和 systemd 对内置 Compose 栈来说太老,并且 已经上游 EOL。
必需软件
- Docker Engine 24.0 或更新。更老的版本缺
make docker-build依赖的--platform接线、并且会破extra_hosts: host-gateway。 - Docker Compose v2(
docker composeCLI 插件,不是遗留的docker-compose二进制)。deploy/docker-compose.yml里的 compose 文件 故意省去顶层version:key,v1 拒它。 - systemd(主机的)。manager 自己不注册 systemd unit —— install 脚本
deploy/install/server-install.sh只依赖 systemd 启 Docker —— 但重启自 动恢复需要docker.service开机启动。 - iptables / nftables 都行;两种后端都能用。
除 Docker 自己要的(overlayfs、namespaces、cgroups v1 或 v2)之外不需要别 的内核模块。
资源下限
| 资源 | 下限 | 舒适 | 为什么 |
|---|---|---|---|
| CPU | 2 vCPU | 4 vCPU | manager Go 进程、Prometheus、Loki、Tempo、Grafana、MySQL 都住同一台机。 |
| 内存 | 4 GB | 8 GB | Prometheus + Loki 一起空闲就能吃 1.5 GB。留头让 OOM killer 不打 MySQL。 |
| 磁盘 | 20 GB | 100 GB | Prometheus 保留期默认 90 天 / 20 GB(见 compose 文件里的 --storage.tsdb.retention.*)。Loki + Tempo 分剩下的。 |
| 网络 | 10 Mbps | 100 Mbps | 遥测是数据面 —— 多个 edge 发日志能把细管早早打满,远在 manager 自己之前。 |
20 GB 下限假设你只用几台 edge 测试。一旦跨过 ~25 host 发指标 + 日志 + 链路, 规划 200 GB 才存得下 30 天 Loki。
端口
| 端口 | 方向 | 协议 | 是什么 |
|---|---|---|---|
| 443 | 入站 | HTTPS | nginx —— SPA、REST API、日志/链路摄入 |
| 80 | 入站 | HTTP | nginx 跳到 443 |
| 40012 | 入站 | TCP(geminio) | Frontier broker —— 每个 edge 拨这个 |
| 3306 | 仅本机暴露 | TCP | MySQL —— 生产绑 127.0.0.1 |
| 9090 | 仅本机暴露 | HTTP | Prometheus —— 生产绑 127.0.0.1 |
| 9100 | 入站(可选) | HTTP | manager /metrics —— 给外部 Prometheus 抓 |
只有 443、80、40012 需要从公网(或你的 edge 队网络)可达。其他生产里 都绑 localhost —— nginx 顶在 API 前,Grafana / Prometheus / Loki / Tempo 通过 docker 网络访问。
compose 栈跑什么
来自 deploy/docker-compose.yml:
| 服务 | 镜像 | 角色 |
|---|---|---|
mysql | mysql:8.0 | manager 主存(用户、edge、设备、告警规则、会话)。 |
ongrid | ongrid:<version> | manager —— 用 cmd/ongrid 构出的 Go 二进制。 |
nginx | ongrid-web:<version> | TLS 终止、SPA、/api/* 反代、/edge/* 静态给 install bundle。 |
frontier | singchia/frontier:1.2.5 | Geminio broker;edge tunnel 端点(ADR-007)。 |
prometheus | prom/prometheus:v2.54.0 | 指标存 + remote_write 接收器(ADR-009)。 |
loki | grafana/loki:3.4.0 | 日志存(ADR-012)。 |
tempo | grafana/tempo:2.5.0 | 链路存(ADR-013)。 |
searxng | searxng/searxng:latest | web_search 技能用的自托管搜索后端。 |
grafana | grafana/grafana-oss:11.1.4 | Monitor 页的 dashboard 嵌入。 |
compose 文件是生产形状 —— 没有第二个 "prod" 文件。在 env 块里调旋钮 (ONGRID_* —— 见 环境变量),别 fork YAML。
TLS
nginx 用从 deploy/certs/(cert.pem、key.pem)bind-mount 的证书终止 TLS。 首次启动 install 脚本生成自签证书;任何时候换成真证书并 docker compose restart nginx。deploy/README.md 里记录了通过 sidecar 模 式支持 Let's Encrypt。
SELinux + AppArmor
开箱都能用。compose 文件不读写挂敏感主机路径;bind mount(./edge、 ./nginx、./certs、./grafana/provisioning)都是 :ro。如果你的 SELinux 策略对 bind mount 强制严格 label,在 docker-compose.override.yml 里给挂载串后面追加 :Z。
升级
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 放一起,做幂等动作:加载新镜像、写一个临时 docker-compose.override.yml 钉新 tag、docker compose up -d、健康一分钟 后 prune 上一个镜像。见 升级。
什么不行
- Podman + podman-compose:compose 文件用 Docker 专属简写 (
extra_hosts: host-gateway、:ZSELinux 语义),podman 要么解析不 兼容要么忽略。我们不测试。 - K3s host-mode 网络:manager 能用,但 edge 安装器围绕裸 systemd 建 —— daemonset 模式见 Kubernetes。
- OpenRC / runit / s6:manager 容器不关心,但主机 Docker 守护进程得 开机起来。你 init 系统能干这事就行。