Linux(サーバー)
manager は Docker イメージ(ongrid:<version>)として出荷され、docker compose で運用されます。両者とも make package が生成するリリースタールボールから来ます —— apt install ongrid も、ホスト側デーモンもありません。
サポートディストリビューション
以下のホストで manager を日常的に動かしています。Docker Engine 24+ を動かせるものなら何でも動くはずです。下のリストはリリースごとに明示的にテストされるものです。
| ディストリビューション | テスト対象 |
|---|---|
| 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-composeバイナリではなくdocker composeCLI プラグイン)。deploy/docker-compose.ymlの compose ファイルは v1 が拒否するトップレベルversion:キーを意図的に省きます。 - ホスト用の systemd。manager 自身は systemd unit を登録しません —— インストールスクリプト
deploy/install/server-install.shは Docker を起動するのに systemd に依存するだけです —— が、再起動時の自動再起動にはdocker.serviceの有効化が必要です。 - iptables / nftables はどちらも OK。両バックエンドが動きます。
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 に達する。余裕で MySQL から OOM killer を遠ざける。 |
| ディスク | 20 GB | 100 GB | Prometheus 保存期間はデフォルト 90 日 / 20 GB(compose ファイルの --storage.tsdb.retention.* 参照)。Loki + Tempo が残りを共有。 |
| ネットワーク | 10 Mbps | 100 Mbps | テレメトリがデータプレーン —— 多数 edge からのログ出荷は manager 自身が詰まる前に細いパイプを飽和させうる。 |
20 GB の最低は edge をひとつかみだけでテストする前提です。〜25 ホストがメトリクス + ログ + トレースを出荷するようになったら、Loki を 30 日保つだけで 200 GB を計画してください。
ポート
| ポート | 方向 | プロトコル | 何か |
|---|---|---|---|
| 443 | インバウンド | HTTPS | nginx —— SPA、REST API、log/trace 取り込み |
| 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 がスクレイプするため |
公開インターネット(または edge フリートのネットワーク)から到達可能でなければならないのは 443、80、40012 だけ。それ以外は本番では localhost にバインドされたまま —— nginx が API を前段し、Grafana / Prometheus / Loki / Tempo は docker ネットワーク経由で届きます。
compose スタックが走らせるもの
deploy/docker-compose.yml から:
| サービス | イメージ | 役割 |
|---|---|---|
mysql | mysql:8.0 | manager のプライマリストア(users、edges、devices、alert rules、sessions)。 |
ongrid | ongrid:<version> | manager —— cmd/ongrid からビルドされた Go バイナリ。 |
nginx | ongrid-web:<version> | TLS 終端、SPA、/api/* リバースプロキシ、インストールバンドル用 /edge/* 静的。 |
frontier | singchia/frontier:1.2.5 | Geminio broker、edge トンネルエンドポイント(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 ページ用ダッシュボード埋め込み。 |
compose ファイルが本番の形 —— 別途「prod」ファイルはありません。YAML をフォークする代わりに env ブロック(ONGRID_* —— 環境変数 参照)でつまみをオーバーライドしてください。
TLS
nginx は deploy/certs/(cert.pem、key.pem)からバインドマウントされた証明書で TLS 終端します。初回起動でインストールスクリプトは自己署名証明書を生成します。いつでも実証明書に置き換えて docker compose restart nginx してください。Let's Encrypt は deploy/README.md でドキュメント化された sidecar パターンでサポートされます。
SELinux + AppArmor
両方が箱から出した状態で動きます。compose ファイルはセンシティブなホストパスを read-write でマウントしません。バインドマウント(./edge、./nginx、./certs、./grafana/provisioning)はすべて :ro です。SELinux ポリシーがバインドマウント上で厳格なラベルを強制するなら、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 はタールボールの隣にあり、冪等なダンスを行います:新しいイメージをロードし、新タグをピン留めする一時的な docker-compose.override.yml を書き、docker compose up -d、1 分間健全なら前のイメージを pruning。アップグレード を参照。
動かないもの
- Podman + podman-compose:compose ファイルは Docker 固有のショートハンド(
extra_hosts: host-gateway、:ZSELinux セマンティクス)を使い、podman はそれらを非互換にパースするか無視します。テストしていません。 - K3s host-mode networking:manager に対しては動きますが、edge インストーラは素の systemd を中心に構築されています —— daemonset パターンは Kubernetes 参照。
- OpenRC / runit / s6:manager コンテナは気にしませんが、ホストの Docker デーモンは起動時に上がる必要があります。init システムがそれをできるなら問題ありません。