# PlasmaCloud/PhotonCloud と Nix-NOS の統合分析

## Architecture Decision (2025-12-13)

**決定:** Nix-NOSを汎用ネットワークモジュールとして別リポジトリに分離する。

### Three-Layer Architecture

```
Layer 3: PlasmaCloud Cluster (T061)
  - plasmacloud-cluster.nix
  - cluster-config.json生成
  - Deployer (Rust)
  depends on ↓

Layer 2: PlasmaCloud Network (T061)
  - plasmacloud-network.nix
  - FiberLB BGP連携
  - PrismNET統合
  depends on ↓

Layer 1: Nix-NOS Generic (T062) ← 別リポジトリ
  - BGP (BIRD2/GoBGP)
  - VLAN
  - Network interfaces
  - PlasmaCloudを知らない汎用モジュール
```

### Repository Structure

- **github.com/centra/nix-nos**: Layer 1 (汎用、VyOS/OpenWrt代替)
- **github.com/centra/plasmacloud**: Layers 2+3 (既存リポジトリ)

---

## 1. 既存プロジェクトの概要

PlasmaCloud（PhotonCloud）は、以下のコンポーネントで構成されるクラウド基盤プロジェクト：

### コアサービス
| コンポーネント | 役割 | 技術スタック |
|---------------|------|-------------|
| **ChainFire** | 分散KVストア（etcd互換） | Rust, Raft (openraft) |
| **FlareDB** | SQLデータベース | Rust, KVバックエンド |
| **IAM** | 認証・認可 | Rust, JWT/mTLS |
| **PlasmaVMC** | VM管理 | Rust, KVM/FireCracker |
| **PrismNET** | オーバーレイネットワーク | Rust, OVN連携 |
| **LightningSTOR** | オブジェクトストレージ | Rust, S3互換 |
| **FlashDNS** | DNS | Rust, hickory-dns |
| **FiberLB** | ロードバランサー | Rust, L4/L7, BGP予定 |
| **NightLight** | メトリクス | Rust, Prometheus互換 |
| **k8shost** | コンテナオーケストレーション | Rust, K8s API互換 |

### インフラ層
- **NixOSモジュール**: 各サービス用 (`nix/modules/`)
- **first-boot-automation**: 自動クラスタ参加
- **PXE/Netboot**: ベアメタルプロビジョニング
- **TLS証明書管理**: 開発用証明書生成スクリプト

---

## 2. Nix-NOS との統合ポイント

### 2.1 Baremetal Provisioning → Deployer強化

**既存の実装:**
```
first-boot-automation.nix
├── cluster-config.json による設定注入
├── bootstrap vs join の自動判定
├── マーカーファイルによる冪等性
└── systemd サービス連携
```

**Nix-NOSで追加すべき機能:**

| 既存 | Nix-NOS追加 |
|------|-------------|
| cluster-config.json (手動作成) | topology.nix から自動生成 |
| 単一クラスタ構成 | 複数クラスタ/サイト対応 |
| nixos-anywhere 依存 | Deployer (Phone Home + Push) |
| 固定IP設定 | IPAM連携による動的割当 |

**統合設計:**

```nix
# topology.nix（Nix-NOS）
{
  nix-nos.clusters.plasmacloud = {
    nodes = {
      "node01" = { 
        role = "control-plane";
        ip = "10.0.1.10";
        services = [ "chainfire" "flaredb" "iam" ];
      };
      "node02" = { role = "control-plane"; ip = "10.0.1.11"; };
      "node03" = { role = "worker"; ip = "10.0.1.12"; };
    };
    
    # Nix-NOSが自動生成 → first-boot-automationが読む
    # cluster-config.json の内容をNix評価時に決定
  };
}
```

### 2.2 Network Management → PrismNET + FiberLB + Nix-NOS BGP

**既存の実装:**
```
PrismNET (prismnet/)
├── VPC/Subnet/Port管理
├── Security Groups
├── IPAM
└── OVN連携

FiberLB (fiberlb/)
├── L4/L7ロードバランシング
├── ヘルスチェック
├── VIP管理
└── BGP統合（設計済み、GoBGPサイドカー）
```

**Nix-NOSで追加すべき機能:**

```
Nix-NOS Network Layer
├── BGP設定生成（BIRD2）
│   ├── iBGP/eBGP自動計算
│   ├── Route Reflector対応
│   └── ポリシー抽象化
├── topology.nix → systemd-networkd
├── OpenWrt/Cisco設定生成（将来）
└── FiberLB BGP連携
```

**統合設計:**

```nix
# Nix-NOSのBGPモジュール → FiberLBのGoBGP設定に統合
{
  nix-nos.network.bgp = {
    autonomousSystems = {
      "65000" = {
        members = [ "node01" "node02" "node03" ];
        ibgp.strategy = "route-reflector";
        ibgp.reflectors = [ "node01" ];
      };
    };
    
    # FiberLBのVIPをBGPで広報
    vipAdvertisements = {
      "fiberlb" = {
        vips = [ "10.0.100.1" "10.0.100.2" ];
        nextHop = "self";
        communities = [ "65000:100" ];
      };
    };
  };
  
  # FiberLBモジュールとの連携
  services.fiberlb.bgp = {
    enable = true;
    # Nix-NOSが生成するGoBGP設定を参照
    configFile = config.nix-nos.network.bgp.gobgpConfig;
  };
}
```

### 2.3 K8sパチモン → k8shost + Pure NixOS Alternative

**既存の実装:**
```
k8shost (k8shost/)
├── Pod管理（gRPC API）
├── Service管理（ClusterIP/NodePort）
├── Node管理
├── CNI連携
├── CSI連携
└── FiberLB/FlashDNS連携
```

**Nix-NOSの役割:**

k8shostはすでにKubernetesのパチモンとして機能している。Nix-NOSは：

1. **k8shostを使う場合**: k8shostクラスタ自体のデプロイをNix-NOSで管理
2. **Pure NixOS（K8sなし）**: より軽量な選択肢として、Systemd + Nix-NOSでサービス管理

```
┌─────────────────────────────────────────────────────────────┐
│                  Orchestration Options                       │
├─────────────────────────────────────────────────────────────┤
│  Option A: k8shost (K8s-like)                               │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  Nix-NOS manages: cluster topology, network, certs  │   │
│  │  k8shost manages: pods, services, scaling           │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  Option B: Pure NixOS (K8s-free)                           │
│  ┌─────────────────────────────────────────────────────┐   │
│  │  Nix-NOS manages: everything                        │   │
│  │  systemd + containers, static service discovery     │   │
│  │  Use case: クラウド基盤自体の管理                    │   │
│  └─────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘
```

**重要な洞察:**

> 「クラウドの基盤そのものを作るのにKubernetesは使いたくない」

これは正しいアプローチ。PlasmaCloudのコアサービス（ChainFire, FlareDB, IAM等）は：
- K8sの上で動くのではなく、K8sを提供する側
- Pure NixOS + Systemdで管理されるべき
- Nix-NOSはこのレイヤーを担当

---

## 3. 具体的な統合計画

### Phase 1: Baremetal Provisioning統合

**目標:** first-boot-automationをNix-NOSのtopology.nixと連携

```nix
# nix/modules/first-boot-automation.nix への追加
{ config, lib, ... }:
let
  # Nix-NOSのトポロジーから設定を生成
  clusterConfig = 
    if config.nix-nos.cluster != null then
      config.nix-nos.cluster.generateClusterConfig {
        hostname = config.networking.hostName;
      }
    else
      # 従来のcluster-config.json読み込み
      builtins.fromJSON (builtins.readFile /etc/nixos/secrets/cluster-config.json);
in {
  # 既存のfirst-boot-automationロジックはそのまま
  # ただし設定ソースをNix-NOSに切り替え可能に
}
```

### Phase 2: BGP/Network統合

**目標:** FiberLBのBGP連携（T055.S3）をNix-NOSで宣言的に管理

```nix
# nix/modules/fiberlb-bgp-nixnos.nix
{ config, lib, pkgs, ... }:
let
  fiberlbCfg = config.services.fiberlb;
  nixnosBgp = config.nix-nos.network.bgp;
in {
  config = lib.mkIf (fiberlbCfg.enable && nixnosBgp.enable) {
    # GoBGP設定をNix-NOSから生成
    services.gobgpd = {
      enable = true;
      configFile = pkgs.writeText "gobgp.yaml" (
        nixnosBgp.generateGobgpConfig {
          localAs = nixnosBgp.getLocalAs config.networking.hostName;
          routerId = nixnosBgp.getRouterId config.networking.hostName;
          neighbors = nixnosBgp.getPeers config.networking.hostName;
        }
      );
    };
    
    # FiberLBにGoBGPアドレスを注入
    services.fiberlb.bgp = {
      gobgpAddress = "127.0.0.1:50051";
    };
  };
}
```

### Phase 3: Deployer実装

**目標:** Phone Home + Push型デプロイメントコントローラー

```
plasmacloud/
├── deployer/                      # 新規追加
│   ├── src/
│   │   ├── api.rs                # Phone Home API
│   │   ├── orchestrator.rs       # デプロイワークフロー
│   │   ├── state.rs              # ノード状態管理（ChainFire連携）
│   │   └── iso_generator.rs      # ISO自動生成
│   └── Cargo.toml
└── nix/
    └── modules/
        └── deployer.nix          # NixOSモジュール
```

**ChainFireとの連携:**

DeployerはChainFireを状態ストアとして使用：

```rust
// deployer/src/state.rs
struct NodeState {
    hostname: String,
    status: NodeStatus,  // Pending, Provisioning, Active, Failed
    bootstrap_key_hash: Option<String>,
    ssh_pubkey: Option<String>,
    last_seen: DateTime<Utc>,
}

impl DeployerState {
    async fn register_node(&self, node: &NodeState) -> Result<()> {
        // ChainFireに保存
        self.chainfire_client
            .put(format!("deployer/nodes/{}", node.hostname), node.to_json())
            .await
    }
}
```

---

## 4. アーキテクチャ全体図

```
┌─────────────────────────────────────────────────────────────────────┐
│                        Nix-NOS Layer                                │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │  topology.nix                                               │   │
│  │  - ノード定義                                                │   │
│  │  - ネットワークトポロジー                                     │   │
│  │  - サービス配置                                              │   │
│  └─────────────────────────────────────────────────────────────┘   │
│                              │                                      │
│              generates       │                                      │
│                              ▼                                      │
│  ┌──────────────┬──────────────┬──────────────┬──────────────┐    │
│  │ NixOS Config │ BIRD Config  │ GoBGP Config │ cluster-     │    │
│  │ (systemd)    │ (BGP)        │ (FiberLB)    │ config.json  │    │
│  └──────────────┴──────────────┴──────────────┴──────────────┘    │
└─────────────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────────┐
│                     PlasmaCloud Services                            │
│  ┌───────────────────────────────────────────────────────────────┐ │
│  │  Control Plane                                                 │ │
│  │  ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐        │ │
│  │  │ChainFire │ │ FlareDB  │ │   IAM    │ │ Deployer │        │ │
│  │  │(Raft KV) │ │  (SQL)   │ │(AuthN/Z) │ │  (新規)  │        │ │
│  │  └──────────┘ └──────────┘ └──────────┘ └──────────┘        │ │
│  └───────────────────────────────────────────────────────────────┘ │
│                                                                     │
│  ┌───────────────────────────────────────────────────────────────┐ │
│  │  Network Plane                                                 │ │
│  │  ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐        │ │
│  │  │ PrismNET │ │ FiberLB  │ │ FlashDNS │ │  BIRD2   │        │ │
│  │  │  (OVN)   │ │(LB+BGP)  │ │  (DNS)   │ │(Nix-NOS) │        │ │
│  │  └──────────┘ └──────────┘ └──────────┘ └──────────┘        │ │
│  └───────────────────────────────────────────────────────────────┘ │
│                                                                     │
│  ┌───────────────────────────────────────────────────────────────┐ │
│  │  Compute Plane                                                 │ │
│  │  ┌──────────┐ ┌──────────┐ ┌──────────┐                      │ │
│  │  │PlasmaVMC │ │ k8shost  │ │Lightning │                      │ │
│  │  │(VM/FC)   │ │(K8s-like)│ │  STOR    │                      │ │
│  │  └──────────┘ └──────────┘ └──────────┘                      │ │
│  └───────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
```

---

## 5. 優先度と実装順序

| 優先度 | 機能 | 依存関係 | 工数 |
|--------|------|----------|------|
| **P0** | topology.nix → cluster-config.json生成 | なし | 1週間 |
| **P0** | BGPモジュール（BIRD2設定生成） | なし | 2週間 |
| **P1** | FiberLB BGP連携（GoBGP） | T055.S3完了 | 2週間 |
| **P1** | Deployer基本実装 | ChainFire | 3週間 |
| **P2** | OpenWrt設定生成 | BGPモジュール | 2週間 |
| **P2** | ISO自動生成パイプライン | Deployer完了後 | 1週間 |
| **P2** | 各サービスの設定をNixで管理可能なように | なし | 適当 |

---

## 6. 結論

PlasmaCloud/PhotonCloudプロジェクトは、Nix-NOSの構想を実装するための**理想的な基盤**：

1. **すでにNixOSモジュール化されている** → Nix-NOSモジュールとの統合が容易
2. **first-boot-automationが存在** → Deployerの基礎として活用可能
3. **FiberLBにBGP設計がある** → Nix-NOSのBGPモジュールと自然に統合
4. **ChainFireが状態ストア** → Deployer状態管理に利用可能
5. **k8shostが存在するがK8sではない** → 「K8sパチモン」の哲学と一致

**次のアクション:**
1. Nix-NOSモジュールをPlasmaCloudリポジトリに追加
2. topology.nix → cluster-config.json生成の実装
3. BGPモジュール（BIRD2）の実装とFiberLB連携
