AI・機械学習
自己ホスト型のAIソフトウェアファクトリ
A self hosted AI software factory (blog.jakesaunders.dev)
要約
この記事は、単一のプロンプトからリポジトリの作成、アプリケーションとテストの記述、CIのグリーン化、データベースのプロビジョニング、HTTPSでのデプロイまで、ソフトウェア開発ライフサイクル全体を自律的に実行できる、自己ホスト型のAIソフトウェアファクトリの構築について説明しています。著者は、LLMに完全なルートアクセスを与えることへの懸念から、構造的にLLMを隔離しつつ、ホームサーバー上でクラウドインフラストラクチャの追加コストなしにこれを実現する方法を探求しました。
全文翻訳
tl;dr: 成功しました!1つのプロンプトからリポジトリを作成し、アプリケーションとテストを記述し、CIをグリーン化し、Postgresをプロビジョニングし、完了したアプリケーションをHTTPSでデプロイしました。私からの追加のメッセージは一切ありませんでした。結果だけを見たい場合は、一番下のデモビデオをご覧ください。
LLMが再び楽しくなりました!おそらく、常にそうだったのですが、私は幻滅の谷に迷い込んでいただけかもしれません。最近では、ちょっとしたツールが必要になると、自分で作っています。
先日ジムで、ウェイトトラッカーが欲しくなりました。私が考えていたアプリは、CRUDの塊のようなものでしたが、アプリストアのバージョンは月額12ポンドもかかったので、Claudeで一撃で作成しました。とても楽しかったですが、自動モードでLLMに私のマシンのルートアクセスを与えるのは、やはりまだしっくりきません。
そこで、課題です。LLMを構造的に隔離し、単に信頼するのではなく、完全にリモートなエージェント型開発環境をどのように作成できるでしょうか?指示を与え、それがSDLC全体を自律的に進むようにしたいのです。
使用する適切なスタックとパッケージを調査する。
コードとテストを計画し、記述する。
Gitにコミットし、CIパイプラインをビルドして実行する。
データベース、オブザーバビリティ、SSL付きのドメインを備えた「本番」サーバーに作業をデプロイする。
すべて私のホームサーバー上で、追加のクラウドインフラストラクチャ料金なしで。この実験に固有の継続的なコストは、20ポンドのCodexサブスクリプションのみです。
サーバー(群)
それらがすべてここにあります。一番下のものは、5年間ホームラボとして稼働させている2014年製のデュアルコアi3です。このブログと、Pi-holeから完全なPrometheus / Loki / Grafanaスタックまで、約45個の他のDockerコンテナを valiant にホストしています。また、ルーターからポート443へのフォワーディングも行っています。LLMがこれを壊したら腹が立つので、今日はこれを使用しません。一番上のものは、eBayで新品で購入した、何も載っていない2021年製の第10世代i7(32GB RAM)です。完璧です。
スタック
コア開発スタックはCoolifyを通じて自己ホストされています。推論と、Tailscale、Telegram、DNS、ACMEなどの統合は、まだボックスに残っています。推論もホストできますが、私にはそのハードウェアがなく、むしろOpenAIに私の実験を補助してもらいたいと思っています。
コンポーネント
Notes
Pi-hole
ローカルDNSルール。広告の表示が減るという副次的効果もあります。
Tailscale
私のホームネットワークをどこへでも持ち運べるようにします。
Coolify
Docker上に構築された、Herokuスタイルの自己ホストPaaS。
Forgejo (ランナー付き)
自己ホストGitとCI。
Hermes (WebUI付き)
Codexを推論に使用する、OpenClawスタイルの仮想アシスタント。
Telegram
トイレからでもどこからでもエージェントと話せます。
Firecrawl (自己ホスト)
エージェントとWeb間のスクレイピング/翻訳レイヤー。
Porkbun (レジストラ) & Let's Encrypt
ドメインとオンザフライのSSL証明書。
その他
Postgres、Redis、アプリに必要なもの。結局のところ、Dockerの下にありますよね?
ソース
これは完全なハウツーガイドではありません。セットアップのためのAnsibleのワンショットスクリプトを書くこともできるかもしれません。もし必要なら、下のGitHubリポジトリにIssueを残してください。ここまで読んだ方なら、おそらく自分でわかるでしょう。
ソースノート
Coolify Setup Blog
私のCoolify-on-Hetznerセットアップガイド。
Coolify Dockerfiles
Coolifyで実際に動作するプロダクションDockerファイル。環境変数を追加するだけです。
Forgejo Hermes Skill
Forgejo CLI用のHermesスキル。キーを提供するだけです。
ネットワーキング
最初のガードレールは明白です。それは独自のメタル上にあります。Hermesは rm -rf / を実行でき、最悪の場合でも再構築に数時間かかるだけです。
次の爆弾除けのレイヤーはネットワークです。私の古いサーバーはルーターからポート443へのフォワーディングがありますが、このサーバーにはありません。外部からのインバウンド接続はなく、攻撃対象領域と、私が設定したすべてのDNS Aレコードに対して speculatively に /wp-admin をプローブするインターネットのバックグラウンド放射線をすべて排除しています。
しかし、インバウンド接続がない場合、どうすればよいでしょうか?
私の電話ですべてのクールな新しいアプリにアクセスするには?
vanity URL のSSL証明書を生成して、 https://cool-new-app.internal.jakeshomelab.me にアクセスできるようにするには?
私はTailscaleを古いサーバーを出口ノードとして設定しています。自宅から離れているときは、それを選択すると、トラフィックがそのサーバーとPi-holeを経由してルーティングされます。Pi-holeでは、次のようなdnsmasqルールを追加できます。
address=/internal.jakeshomelab.me/192.168.1.201
*.internal.jakeshomelab.me を要求するものはすべて、私の新しいサーバーに解決されるようになり、そこでCoolifyのリバースプロキシがそれを拾い上げ、私のピカピカの新しいサービスを提供します。
SSL証明書
CaddyまたはTraefikとDockerラベルを使用すると、コンテナXのポート3000を https://my-service.internal.jakeshomelab.me から提供できます。Aレコードをサーバーに向け、Let's Encryptに連絡し、ACMEチャレンジを完了してSSL証明書を取得します。これを3年前に学びましたが、今でも魔法のように思えます。
問題はAレコードです。サービスにアクセスできるかどうかに関わらず、my-service.internal.jakeshomelab.me を私のIPに公開で関連付けたくありません。ゴーストサービス用のSSL証明書が欲しいのです。
この問題を解決するために、DNS-01に目を向けました。正直に言うと、これは私には新しいですが、仕組みは次のとおりです。
ドメインを購入します(この場合はPorkbunから)。
Porkbun APIキーを生成し、Coolifyの環境に書き込みアクセス権とともに追加します。
CoolifyのDocker Composeファイルを変更して、legoとPorkbun APIを使用します。
- '--certificatesresolvers.letsencrypt.acme.dnschallenge=true'
- '--certificatesresolvers.letsencrypt.acme.dnschallenge.provider=porkbun'
- '--log.level=INFO'
次に、新しいURLを登録するとき、Traefik / Coolifyは次のことを行います。
Porkbun APIを使用して、 _acme-challenge.my-service.internal.jakeshomelab.me に新しいTXTレコードを作成します。
Let's Encrypt がチャレンジを検証し、有効なSSL証明書を発行します。
Traefik がそれを削除します。
これで完了です!公開のAまたはAAAAレコードがサービスを指すことなく、Tailnet内で到達可能な有効なHTTPS URLが得られます。ホスト名は公開証明書透明性ログに表示される可能性がありますが、サービスはTailnetからのみ到達可能です。
最も良い点は、Coolifyがこれをオンザフライで行うことです。私たちのエージェントは任意のサブドメインでサービスを作成でき、それは✨魔法のように✨すべてを処理します。
したがって、これらすべてをまとめると、次のようになります。
同じセットアップがツールにも対応しており、Coolify、Hermes、Forgejo、Firecrawlはすべて独自のローカルサブドメインに存在します。
開発スタックとMCP
これで(ある程度)隔離されたボックスができたので、ツールに進みましょう。ツールはよく知られており、それらを結びつけるのが楽しい部分です。
Forgejo
コードを永続的に保存し、CIを実行する場所が必要です。GitHubを使用しないことにしました。
ボックスにGitHubトークンを与えることは、隔離を損なうことになります。また、自己ホストではありません。
そのAPIとCIの分制限は、私たちの新しいソフトウェアファクトリの規模では機能しません。
最近、ほとんどの場合ダウンしています。
Forgejoは優れた自己ホスト型代替手段です。上記のDocker ComposeファイルはForgejoとそのランナーを設定します。あなた自身とランナーを登録するには、もう少し作業が必要ですが、よく文書化されています。
GitHubへのプロジェクトの同期のためのComposeファイルも含まれています。それは環境にGHトークンを置きますが、トレードオフはあなた次第です。
上記のForgejo Hermesスキルは、エージェントにインスタンスの完全な制御を与えます。
Hermes
Hermesは、エージェント機能を持つOpenClawスタイルのパーソナルアシスタントです。私はOpenClawの流行に乗れませんでしたが、比較はできませんが、Hermesには私が便利だと感じた機能がいくつかあります。
Web UI: ラップトップから作業し、スキルを管理するための標準的なChatGPT風インターフェース。
共有ファイルシステム: Dockerホストからワークスペースをマウントし、Samba経由で共有しました。エージェントと私は、Markdownやコードをコピー&ペーストするのではなく、同じファイルを使用できます。
Telegram統合: 携帯電話からエージェントとチャットできます。セットアップは2分で完了し、ログイン詳細は不要でした。これはサンドボックスアプローチに適していました。
自己構築スキル: Hermesは独自のスキルを作成して登録できます。私は良いCoolifyのものを見つけられなかったので、ドキュメントを読み、MCPを見て、それを構築しました。
Firecrawl: 自己ホスト型Firecrawlは、エージェントにSERPデータや大規模なWebスクレイピングへのより良いアクセスを提供します。
HermesとFirecrawlを適切な場所に適切なキーでセットアップするのは、非常に面倒な作業です。上記のリポジトリにCoolifyフレンドリーなDocker Composeファイルを追加しました。
Coolify
Coolifyは、これをまとめる接着剤です。