2026年8月30日日曜日

【AI×GitOps】Docker Composeから始めるRaspberry Pi 5 Kubernetesクラスタへの自動デプロイ設計

現在構築を進めている動画管理システム開発において、いきなりKubernetes(K8s)に展開するのではなく、Docker Composeを中間地点に挟んで段階的にK8s+Argo CD(GitOps)へ移行するアーキテクチャ設計をまとめました。


Bionic(AIアシスタント)とGemini自動レビューを組み込み
「AIにコードを書かせ、レビューさせ、GitOpsで実機クラスタへ反映する」パイプラインの全体像です。


1. 全体開発ロードマップ

堅牢なシステムを築くため、ローカル開発環境から本番K8sクラスタまで
以下の4段階ステップで進めます。

Bionic(AI実装)
  ↓
ローカルAI / クラウドAI
  ↓
GitHub(Topic Branch / Gemini自動レビュー)
  ↓
① Docker Compose(ローカル開発・動作検証)
  ↓
② サービス分離・コンテナ最適化
  ↓
③ Kubernetes化(マニフェスト定義)
  ↓
④ Raspberry Pi 5 クラスタデプロイ(Argo CD)

2. フェーズ1:Docker Compose によるベース構築

まずはローカルPC上の Docker Compose で基本の構成を立ち上げます。

サービス構成案 (docker-compose.yml)

動画処理・検索機能を踏まえ、以下の4コンテナ構成からスタートします。

                  ┌───────┐
                  │  Web                │
                  └───┬───┘
                                │
                  ┌───▼───┐
                  │  API                 │
                  └───┬───┘
              ┌────┴────┐
              ▼                                 ▼
          PostgreSQL                  Worker
                               │
                            ffmpeg


K8s化を見据えた Compose 設計のポイント

Compose 段階から以下のルールを徹底しておくことで、スムーズに K8s マニフェストへ移行できます。

  • 責務の分離: 1コンテナ1プロセスを徹底する。

  • 環境変数の切り出し: 設定値や秘密情報は .env や環境変数に逃がす。

  • 永続化データの分離: DBや動画ストレージはコンテナ外部(Volume)へ切り離す。

  • パスの動的化: ファイルパスをコード内にハードコードしない。

  • サービス名による通信: DB等の接続先指定は localhost ではなく Compose のサービス名を使用する。

  • ステートレス設計: アプリケーション本体は極力状態を持たせない。

  • 可視性と監視: ログはすべて stdout / stderr へ出し、ヘルスチェックエンドポイントを用意する。


3. フェーズ2:Kubernetes マニフェストへの置き換え

Compose で動作確認が取れたコンテナ群を、K8s のリソースオブジェクトへ落とし込みます。

Docker ComposeKubernetes Resource
web / api / workerDeployment / Job
ポート公開 / 内部通信Service / Ingress
.env / 接続情報ConfigMap / Secret
Volume 永続化PersistentVolumeClaim (PVC)


4. 最終形:AI + Argo CD による GitOps パイプライン

最終的なプロダクション環境(Raspberry Pi 5 クラスタ)では、Argo CD を投入して「GitHubの状態を唯一の正(Single Source of Truth)」とする GitOps を運用します。

全体アーキテクチャ図

                                           Bionic
                                               │
        ┌──────────┴──────────┐
        │                                                                           │
    ローカルAI                                                         クラウドAI
        │                                                                           │
        └──────────┬──────────┘
                                                ▼
                                        topic branch
                                               │
                                           commit
                                              │
                                              ▼
                                           GitHub
                                              │
                                       Gemini Review
                                              │
                                              ▼
                                           merge
                                              │
                                              ▼
          ┌─────────────────┐
          │    GitHub                                              │
          │  manifests                                            │
          └────────┬────────┘
                                          │
                        Argo CD (Pull型同期)
                                         │
                                          ▼
        ┌─────────────────────┐
        │ Raspberry Pi K8s                                               │
        │                                                                            │
        │ Web / API                                                           │
        │ Worker (ffmpeg)                                                 │
        │ PostgreSQL / Search                                         │
        └─────────────────────┘


リポジトリ構成案

アプリコードと K8s マニフェストを同一または適切なディレクトリ階層で管理します。

## Bash ####
project-root/
├── app/                  # アプリケーションソース
│   ├── src/
│   └── Dockerfile
└── k8s/                  # Kubernetes 定義
    ├── namespace.yaml
    ├── deployment.yaml
    ├── service.yaml
    ├── ingress.yaml
    └── pvc.yaml

実機クラスタ基盤 (Raspberry Pi 5)

既に構築・稼働している以下のネットワーク・ストレージ基盤上に展開します。

  • CNI: Cilium

  • Load Balancer: MetalLB

  • Storage: local-path-storage

  • CD Engine: Argo CD



まとめ:AI + GitOps 開発工場の確立

この構成が完成すると、日々の開発フローは以下のようになります。

  1. Bionic に機能追加や修正を依頼する。

  2. AIがトピックブランチを作成し、コードを実装して GitHub へ Push。

  3. Gemini が自動でコードレビューを実施。

  4. 問題がなければ Main ブランチへ Merge。

  5. Argo CD が変更を検知し、Raspberry Pi 5 クラスタへ自動同期・デプロイ。

単に「動画管理システムを作る」にとどまらず、「AIにコードを書かせ、AIにレビューさせ、GitOpsでコンテナクラスタへ自動デプロイする仕組みそのものを育てる」 というエキサイティングなプロジェクトになりました。ローカル Compose で検証しつつ、段階的に進めていきます。

【LM Studio / Bionic】Gemini を MCP サーバー化して自動コードレビュー環境を構築する(Workspace Trust エラー回避策つき)

LM Studio や Bionic でコード生成を行う際、毎回プロンプトで「Gemini を呼び出してレビューして」と打つのは手間がかかります。

そこで今回は、Gemini CLI / SDK を MCP (Model Context Protocol) サーバーとして統合し、スキル設定経由で勝手にコードレビューを実行させる環境を構築しました。途中で発生した Workspace Trust (信頼設定) エラーの回避方法も含めて解説します。


1. 開発環境・ディレクトリ構成

  • OS: macOS

  • 環境: LM Studio / Bionic, Python 3.14 (venv)

  • 役割: Gemini CLI をバックグラウンドで起動し、stdio (標準入出力) で LM Studio と通信する MCP サーバー

Bash
/Users/hidenari/mcp/gemini-review/
├── .venv/       # Python 3.14 仮想環境
├── server.py    # MCP サーバー本体コード
└── start.sh     # LM Studio から呼び出される起動スクリプト


2. MCP サーバーの実装 (server.py)

mcp ライブラリを使用して、gemini CLI コマンドを MCP ツールとして登録します。subprocess で CLI を非対話モード(-p)で呼び出し、標準出力をそのまま返却するシンプルな実装です。

Python
from mcp.server.mcpserver import MCPServer
import subprocess

mcp = MCPServer("Gemini Reviewer")

GEMINI = "/Users/hidenari/.local/bin/gemini"


@mcp.tool()
def gemini_review(prompt: str) -> str:
    """Geminiにコードや設計のレビューを依頼する。"""

    try:
        result = subprocess.run(
            [
                GEMINI,
                "-p",
                prompt
            ],
            capture_output=True,
            text=True,
            timeout=300
        )

        if result.returncode != 0:
            return f"Gemini error:\n{result.stderr}"

        return result.stdout

    except subprocess.TimeoutExpired:
        return "Gemini review timed out after 300 seconds."

    except Exception as e:
        return f"Failed to execute Gemini: {e}"


if __name__ == "__main__":
    mcp.run()


3. 起動スクリプト (start.sh) の作成

最重要ポイントは Gemini CLI の Workspace Trust (ディレクトリ信頼チェック) を環境変数で回避すること です。これを設定しないと、非対話モードでの呼び出し時に信頼エラーで停止してしまいます。

Bash
#!/bin/bash

# Gemini CLI の信頼チェックを回避する環境変数をセット
export GEMINI_SKIP_TRUST=1
export GEMINI_ALLOW_UNTRUSTED=true

# 仮想環境の Python で server.py を起動
exec /Users/hidenari/mcp/gemini-review/.venv/bin/python \
  /Users/hidenari/mcp/gemini-review/server.py

作成後、実行権限を付与しておきます。 chmod +x /Users/hidenari/mcp/gemini-review/start.sh


4. LM Studio (Bionic) での設定

LM Studio の MCP 設定画面(または ~/.lmstudio/mcp.json)にて、起動コマンドを指定します。

![LM Studio MCP Configuration]

















  • Name: gemini-review(※画像内では My MCP

  • Command: /Users/hidenari/mcp/gemini-review/start.sh


設定保存後、ステータスが Connected · 1 tool ready と緑色に点灯すれば、背景プロセスとして正しく接続完了です。


5. プロセスの起動確認

ターミナルで ps コマンドを実行し、バックグラウンド待機状態になっているか確認します。

Bash
ps aux | grep gemini-review

TTY が ?? かつ STAT が S (Sleep) で待機している PID があれば、LM Studio と stdio 経由で正常接続されています。


6. Bionic Skill に自動呼び出しルールを仕込む

毎回「Gemini を使って」と書かずに済むよう、Bionic の Skill 設定(dev-doc-rules)に自動実行トリガーを埋め込みます。

Bionic Skill 登録用テキスト:

Markdown
コーディング完了時の引き継ぎドキュメント (Markdown) とGit用README更新案の作成ルール、およびコードレビュー時のMCP自動呼び出しルール

出力してください。

1. 引き継ぎドキュメント ( docs/ 配下等に保存する Markdown用)

```markdown
# 引き継ぎメモ: [機能名 / タスク名] (YYYY-MM-DD)

## 1. 今回実装した内容
- **対象ファイル**: `src/path/to/file.ext`
- **概要**: 実装・修正した処理の概要

## 2. 影響範囲・注意事項
- 他のモジュールへの影響や、依存している設定 (環境変数など)
- パフォーマンスやセキュリティ上の留意点

## 3. 保留・未対応事項 (Issues)
- 今回あえて対応しなかった仕様や、仮実装 (ハードコード等) で留めた箇所

## 4. 残タスク・ネクストアクション
- [ ] 次に実装・対応すべき項目
- [ ] テストコードの作成・拡充
  1. コードレビューおよび修正時のMCP自動実行ルール

  • ユーザーからコードのレビュー、リファクタリング、バグ修正、またはコード品質の検証を求められた場合は、明示的な指示がなくても、必ず gemini-review MCP ツールを自発的に呼び出して検証結果を取得してください。

  • 自身の知識だけで回答せず、gemini-review の出力内容を最優先で盛り込んだ回答を生成してください。


---

## 7. 動作確認

設定完了後、「テストとしてGeminiにレビュー出来るのか疎通確認したい」と頼むだけで、裏で勝手に Gemini CLI が `--skip-trust` つきで起動し、以下のような精緻なレビューを自動出力してくれるようになりました。

* **状態同期/UX**: `commitRename` での `setEditingTitle(false)` 欠落指摘
* **アクセシビリティ**: `tabIndex={-1}` が設定された header のキーボードフォーカス不可
* **セキュリティ**: パス横断対策の検証結果

手動で外部 API や CLI を叩く手間が一切なくなり、ローカル LLM 開発の効率が劇的に向上しました。

【AI×GitOps】Docker Composeから始めるRaspberry Pi 5 Kubernetesクラスタへの自動デプロイ設計

現在構築を進めている動画管理システム開発において、いきなりKubernetes(K8s)に展開するのではなく、 Docker Composeを中間地点に挟んで段階的にK8s+Argo CD(GitOps)へ移行するアーキテクチャ設計 をまとめました。 Bionic(AIアシスタン...