使いたい時に使いたいだけ外部GPUを使用できるシステムを作った

## 目的

友人がGPUを使用するソフトを使用しながらcomfyUIを使用していて、それだとGPUをかなり食い合って画像生成が遅かったりhoudiniが重くなったりすると聞いたので、使いたい時だけcomfyUIの処理を外部に安価で投げられる機構を作った。
昨今GPUを使用するサービスやアプリも増えているので、そのアプリでlocalのcomfyUIに投げているurlを変更するだけで処理を外部に分散できる。

## 利点

決まったワークフローを繰り返し行うような時に最大限効果を発揮する。（例えば、houdiniのnodeで生成AIに処理を投げるものなど）
需要がニッチすぎておそらく企業はこんなサービス作らなさそう。
セットアップはansibleで自動化しているので使用するGPUを好きに選んで変更できる。
なによりもお金が全然かからない(L4で使用時に45円/hぐらい、サーバー維持費426円/月ぐらい）。

## 使用技術スタック

プログラミング言語: Python, JavaScript
インフラ: XserverVPS, Cloudflare, nginx
ツール: Ansible, Discord Bot, comfyUI
ライブラリ: discord.js

個別の技術詳細については別で記事にしているのでそちらで
・tensordock -> https://qiita.com/nani/items/033d3a2b1ad989a0db0c
・discordbot -> https://qiita.com/nani/items/2a054fb9c600585f80e0
・comfyUI -> https://qiita.com/nani/items/e791ea3f581cae313803
追加予定

## 全体アーキテクチャ
```mermaid
flowchart TD
    subgraph Client["クライアント層"]
        DC[Discord Client]
        Browser[Web Browser]
        Houdini[Houdini/Other Apps]
    end

    subgraph Network["ネットワーク層"]
        CF[Cloudflare]
        Domain[Domain]
    end

    subgraph Control["制御層(VPS)"]
        Bot[Discord Bot]
        Nginx[Nginx]
    end

    subgraph Processing["処理層"]
        GPU[GPU Server]
        ComfyUI
    end

    subgraph Setup["セットアップ"]
        Ansible
    end

    %% 全てのクライアントアクセスはCloudflareを経由
    DC -->|コマンド送信| Bot
    Browser -->|GUI アクセス| Domain
    Houdini -->|API リクエスト| Domain

    %% Cloudflare → VPS → Domain の共通フロー
    CF -->|HTTPS| Nginx
    Nginx --> |プロキシ|GPU

    %% Discord Bot の処理フロー
    Bot -->|起動命令| GPU

    %% Domain → GPU の解決
    Domain -->CF
    GPU --- ComfyUI

    %% セットアップフロー
    Ansible -.->|自動セットアップ| GPU

    %% スタイリング
    classDef primary fill:#e1f5fe,stroke:#01579b
    classDef network fill:#e8f5e9,stroke:#2e7d32
    classDef processing fill:#fff3e0,stroke:#e65100
    classDef setup fill:#f3e5f5,stroke:#7b1fa2
    classDef apps fill:#fce4ec,stroke:#c2185b

    class DC,Bot,VPS,Browser primary
    class CF,Domain network
    class GPU,ComfyUI processing
    class Ansible setup
    class Houdini apps
```
## 使用手順
domainは事前に取得し、discordbotの環境変数に登録済み
vpsにdiscordbotはデプロイ済み。
サーバーを増やす場合の手順。
1. サーバーデプロイ（tensordock）
    1. ipアドレス、port取得
1. ip,portを指定しansibleを流す
1. cloudflareでAレコードにipアドレス登録
1. discordbotでコマンド起動（urlが返ってくる）
1. そのurlを自分が使用するソフトやサービスに登録する


## スケール対応
自動でサーバーをセットアップできるようにしたのがもったいないので、個人で使用する分には絶対に必要ないが、スケールアップもできるようにした。
GPUサーバーを増やせば下記のような構造になる。

```mermaid
flowchart TD
    subgraph Client["クライアント層"]
        DC[Discord Client]
        Browser[Web Browser]
        Houdini[Houdini/Other Apps]
    end
    subgraph Network["ネットワーク層"]
        Domain[Domain]
        CF[Cloudflare]
    end
    subgraph Control["制御層"]
        VPS[XServer]
        Nginx[Nginx]
        CFLB[cloudflareでLoadBlance]
        Bot[Discord Bot]
    end
    subgraph Processing["処理層"]
        subgraph BackendA["バックエンドA"]
            DomainA[domain-a]
            GPUA[GPU Server A]
            ComfyUIA[ComfyUI A]
        end
        subgraph BackendB["バックエンドB"]
            DomainB[domain-b]
            GPUB[GPU Server B]
            ComfyUIB[ComfyUI B]
        end
        subgraph BackendC["バックエンドC"]
            DomainC[domain-c]
            GPUC[GPU Server C]
            ComfyUIC[ComfyUI C]
        end
    end
    subgraph Setup["セットアップ"]
        Ansible
    end
    %% クライアントからのアクセスフロー
    Browser -->|GUI アクセス| Domain
    Houdini -->|API リクエスト| Domain
    %% Domain → Cloudflare → VPS の共通フロー
    CF --> Nginx
    DC --> Bot
    Domain --> CF
    %% Nginxによるロードバランシング
    Nginx --> CFLB
    CFLB -->|ロードバランシング| DomainA
    CFLB -->|ロードバランシング| DomainB
    CFLB -->|ロードバランシング| DomainC
    %% Discord Bot の処理フロー
    Bot -->|起動命令| GPUA
    Bot -->|起動命令| GPUB
    Bot -->|起動命令| GPUC
    %% バックエンド内の接続
    DomainA --> GPUA
    GPUA --- ComfyUIA
    DomainB --> GPUB
    GPUB --- ComfyUIB
    DomainC --> GPUC
    GPUC --- ComfyUIC
    %% セットアップフロー
    Ansible -.->|自動セットアップ| GPUA
    Ansible -.->|自動セットアップ| GPUB
    Ansible -.->|自動セットアップ| GPUC
    %% スタイリング
    classDef primary fill:#e1f5fe,stroke:#01579b
    classDef network fill:#e8f5e9,stroke:#2e7d32
    classDef processing fill:#fff3e0,stroke:#e65100
    classDef setup fill:#f3e5f5,stroke:#7b1fa2
    classDef apps fill:#fce4ec,stroke:#c2185b
    classDef lb fill:#fff8e1,stroke:#ff6f00
    class DC,Bot,VPS,Browser primary
    class CF,Domain network
    class DomainA,DomainB,DomainC,GPUA,GPUB,GPUC,ComfyUIA,ComfyUIB,ComfyUIC processing
    class Ansible setup
    class Houdini apps
    class Nginx lb
```


## 最後に
せっかく作ったから誰かに使ってほしいがなかなかサービスとしては展開しづらいので記事にして供養。
使いたいって方や自分用に作ってほしいっていうお仕事依頼あったらください。