Skip to content

Linux(サーバー)

manager は Docker イメージ(ongrid:<version>)として出荷され、docker compose で運用されます。両者とも make package が生成するリリースタールボールから来ます —— apt install ongrid も、ホスト側デーモンもありません。

サポートディストリビューション

以下のホストで manager を日常的に動かしています。Docker Engine 24+ を動かせるものなら何でも動くはずです。下のリストはリリースごとに明示的にテストされるものです。

ディストリビューションテスト対象
Ubuntu22.04 LTS、24.04 LTS
Debian12(bookworm)
RHEL9
Rocky Linux9
AlmaLinux9

CentOS 7 はサポートされていません —— glibc と systemd が同梱 Compose スタックには古すぎ、上流 EOL にヒットしています。

必須ソフトウェア

  • Docker Engine 24.0 以降。古いリリースは make docker-build が依存する --platform 配管を欠き、extra_hosts: host-gateway を壊します。
  • Docker Compose v2(レガシーの docker-compose バイナリではなく docker compose CLI プラグイン)。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)以外に必須のカーネルモジュールはありません。

リソース最低水準

リソース最低快適なぜ
CPU2 vCPU4 vCPUmanager Go プロセス、Prometheus、Loki、Tempo、Grafana、MySQL すべてが同じホストに住む。
メモリ4 GB8 GBPrometheus + Loki が一緒だとアイドルで 1.5 GB に達する。余裕で MySQL から OOM killer を遠ざける。
ディスク20 GB100 GBPrometheus 保存期間はデフォルト 90 日 / 20 GB(compose ファイルの --storage.tsdb.retention.* 参照)。Loki + Tempo が残りを共有。
ネットワーク10 Mbps100 Mbpsテレメトリがデータプレーン —— 多数 edge からのログ出荷は manager 自身が詰まる前に細いパイプを飽和させうる。

20 GB の最低は edge をひとつかみだけでテストする前提です。〜25 ホストがメトリクス + ログ + トレースを出荷するようになったら、Loki を 30 日保つだけで 200 GB を計画してください。

ポート

ポート方向プロトコル何か
443インバウンドHTTPSnginx —— SPA、REST API、log/trace 取り込み
80インバウンドHTTPnginx で 443 にリダイレクト
40012インバウンドTCP(geminio)Frontier broker —— すべての edge がこれにダイヤル
3306ローカル公開TCPMySQL —— 本番では 127.0.0.1 にバインド
9090ローカル公開HTTPPrometheus —— 本番では 127.0.0.1 にバインド
9100インバウンド(オプション)HTTPmanager /metrics —— 外部 Prometheus がスクレイプするため

公開インターネット(または edge フリートのネットワーク)から到達可能でなければならないのは 443、80、40012 だけ。それ以外は本番では localhost にバインドされたまま —— nginx が API を前段し、Grafana / Prometheus / Loki / Tempo は docker ネットワーク経由で届きます。

compose スタックが走らせるもの

deploy/docker-compose.yml から:

サービスイメージ役割
mysqlmysql:8.0manager のプライマリストア(users、edges、devices、alert rules、sessions)。
ongridongrid:<version>manager —— cmd/ongrid からビルドされた Go バイナリ。
nginxongrid-web:<version>TLS 終端、SPA、/api/* リバースプロキシ、インストールバンドル用 /edge/* 静的。
frontiersingchia/frontier:1.2.5Geminio broker、edge トンネルエンドポイント(ADR-007)。
prometheusprom/prometheus:v2.54.0メトリクスストア + remote_write レシーバー(ADR-009)。
lokigrafana/loki:3.4.0ログストア(ADR-012)。
tempografana/tempo:2.5.0トレースストア(ADR-013)。
searxngsearxng/searxng:latestweb_search スキル用セルフホスト検索バックエンド。
grafanagrafana/grafana-oss:11.1.4Monitor ページ用ダッシュボード埋め込み。

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 を付けてください。

アップグレード

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 はタールボールの隣にあり、冪等なダンスを行います:新しいイメージをロードし、新タグをピン留めする一時的な docker-compose.override.yml を書き、docker compose up -d、1 分間健全なら前のイメージを pruning。アップグレード を参照。

動かないもの

  • Podman + podman-compose:compose ファイルは Docker 固有のショートハンド(extra_hosts: host-gateway:Z SELinux セマンティクス)を使い、podman はそれらを非互換にパースするか無視します。テストしていません。
  • K3s host-mode networking:manager に対しては動きますが、edge インストーラは素の systemd を中心に構築されています —— daemonset パターンは Kubernetes 参照。
  • OpenRC / runit / s6:manager コンテナは気にしませんが、ホストの Docker デーモンは起動時に上がる必要があります。init システムがそれをできるなら問題ありません。