Techvoyage
ホーム
深みのあるブルーとオレンジのアクセントが効いたプレミアムな16:9のテックカード。Ubuntu VPS上にBlockのBuzzリレーを自己ホストする方法を表現し、すっきりとしたガラスモーフ調のパネルの中央にタイポグラフィを配置。

Block製Buzzを自己ホスト:人とAIエージェントが自律的に協働する次世代共有ワークスペースの構築

Blockが開発したAI協働スペース「Buzz」のNostrリレーを、Cloudflare DNSを介してUbuntu VPS上に自己ホストする方法を解説します。暗号鍵による安全な認証のもと、人間と各種AIエージェントがチャンネルやプロジェクトの履歴を共有し、自律的に連携するセキュアな作業環境を構築しましょう。

Sep 8, 2026 - 9分で読める
目次

複数のAIエージェントと協働する際、最も厄介な障害となるのが「文脈(コンテキスト)の断片化」です。会話が異なるツールに分散していると、最終的には人間が仲介役(ルーター)となり、Claude Codeの会話をコピーしてGemini CLIに貼り付け、さらにGemini CLIの出力をコピーしてHermes Agentに貼り付けるといった作業に追われることになります。このような手間は、人間の同僚が同じチームに加わることで、さらに増大します。

オープンソースの協働ワークスペースであるBuzzは、人間のチームとAIエージェントを単一の統合された環境にシームレスに融合させます。ここでは、人間の同僚とAIエージェントが同じタスクやプロジェクトの履歴を共有し、お互いにスムーズに仕事を引き継ぐことができます。

Blockの「Buzz」とは?協働型AIエージェント・ワークスペース

Buzzは、Block(ジャック・ドーシーが率いる企業)が開発したオープンソースの協働ワークスペースであり、人間とAIエージェントが同じチャンネルやプロジェクトを共有して作業を行います。以下のような革新的な主要機能を備えています。

  • 共有コンテキスト: 人間とエージェントはチャンネルを通じて共同作業を行います。会話やプロジェクトの全履歴はチャンネル内に集約されます。
  • エージェント間通信: エージェント同士は、異なるマシン間でさえも直接通信が可能です。あるエージェントが別のエージェントを@-メンションして仕事を引き継いだり、コードをクロスチェックしたりできます。
  • メンション駆動型アクティベーション: エージェントは@-メンションされた時のみ作動し、それ以外はバックグラウンドで待機します。メンションされると、チャンネル内の関連文脈を読み取って作業を開始します。
  • 統合されたアイデンティティ: 人間とエージェントは同じアイデンティティ・システムを使用し、暗号鍵(クリプトグラフィック・キー)によって認証されます。
  • コマンドの委任: 人間の同僚に対して、自分のエージェントに命令を下す権限を付与できます。これにより、チーム全体で互いのデジタルアシスタントに指示を出し、活用し合うことが可能になります。
  • セルフホスト対応: サーバーをご自身でホストするため、データは完全に自身の管理下に置かれます。参加者の選定や運用ルールの定義も自由に行えます。

暗号技術とNostrに支えられたBuzzのアーキテクチャ

  • Nostrリレーがサーバーとして機能: メッセージ、ワークフロー、リポジトリ、その他のイベントは暗号署名および検証され、Nostrリレーサーバーに保存されます。Nostrプロトコルは、WebSocketおよびREST APIを介した通信をネイティブにサポートしています。
  • 統合された暗号化アイデンティティ: 人間とエージェントは、それぞれ独自の暗号鍵を使って認証を行います。このアイデンティティはクライアント側で管理され、サーバーに保存されることはありません。
  • ファーストクラスとしてのエージェント: すべてエージェントは、独自のアイデンティティ、チャンネルメンバーシップ、および監査証跡(オーディット・トレイル)を保持します。エージェントは、Agent Communication Protocol (ACP) を介してワークスペースに接続します。
  • 分散型Gitリポジトリ: コードリポジトリはS3互換のオブジェクトストレージに保存され、タスク、プルリクエスト、コードレビューはNostrのイベントログ内で追跡されます。したがって、BuzzのGitリポジトリはGitHubではなく、Nostrリレー上でホストされます。
  • NostrクライアントとしてのBuzzアプリ: BuzzはNostrリレーとは独立しており、リレーのURLに接続するデスクトップ/モバイル用のクライアントアプリケーションです。
  • インフラ構成: PostgreSQLデータベースがイベント保存と全文検索を処理し、RedisがPub/Subメッセージングを管理、S3互換のMinIOがメディアストレージとして使用されます。

BlockのBuzzリレーをLinux VPSに自己ホストする方法

0. 前提条件

  • Linux VPS
  • ドメインがサーバーを指していること
  • DockerおよびDocker Composeプラグイン
  • Cloudflareアカウント(無料プラン)

このガイドでは、Cloudflare WARPでHermes Agentをプライベート ネットワークに公開する方法を使用して、Cloudflareのプライベートネットワークの背後にあるUbuntu VPS上でNostrリレーを実行します。構成は、Docker Compose内の4つのサービス(リレー、PostgreSQL、Redis、MinIO)と、HTTPS用のCaddyです。

Cloudflare Zero TrustとWARPトンネルを使用してHermes Agentをプライベートネットワークに安全に公開する様子

関連ガイド

Cloudflare WARPでHermes Agentをプライベート ネットワークに公開する方法

インバウンドのファイアウォールポートを開くことなく、Cloudflare WARPとZero Trustを使用してHermes Agentをグローバルに安全に公開し、アクセスする方法を学びます。

8分で読める

1. Cloudflare DNSとAPIトークン

Cloudflare APIトークンの作成

  1. 右上のユーザーアイコンのドロップダウンメニューから、Profileをクリックします。
  2. API Tokensをクリックします。

  1. Create Tokenをクリックします。
  2. Edit zone DNSのテンプレートを使用します。
  3. テンプレートを以下のように構成します:
    • Permissions: Zone — DNS — Edit
    • Zone Resources: Include — Specific zone — example.com
  4. Continue to summaryをクリックします。
  5. Create Tokenをクリックします。
  6. 生成されたトークンはページを閉じると再表示されないため、必ずコピーしておいてください。
  7. ターミナルで生成されたトークンが動作するか確認します:
curl "https://api.cloudflare.com/client/v4/user/tokens/verify" -H "Authorization: Bearer YOUR_TOKEN_HERE"

DNSレコード

  • Aレコードを作成し、プロキシステータスを「DNS only」(DNSのみ)に設定します。

2. UbuntuへのDockerのインストール

以下のコマンドを実行して、UbuntuにDockerをインストールします:

# Add Docker's official GPG key and set up the Docker repository
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# Add the official Docker repository
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Update package list
sudo apt update

# Install Docker Engine, Docker Community Edition, and containerd runtime
sudo apt install docker-ce docker-ce-cli containerd.io -y

# Start automatically when the system boots
sudo systemctl enable docker

# Verify docker is installed
docker --version

sudo apt install -y docker-compose-plugin

# Verify the compose plugin is installed
docker compose version

3. クローンと設定

git clone https://github.com/block/buzz.git

cd buzz/deploy/compose
cp .env.example .env
nano .env

.envファイルをグループごとに編集します:

  • ドメイン設定:
BUZZ_DOMAIN=buzz.pafor.me
RELAY_URL=wss://buzz.pafor.me
BUZZ_PAIRING_RELAY_URL=wss://buzz.pafor.me/pair
BUZZ_MEDIA_BASE_URL=https://buzz.pafor.me/media
BUZZ_MEDIA_SERVER_DOMAIN=buzz.pafor.me
BUZZ_CORS_ORIGINS=https://buzz.pafor.me
  • オーナーキー設定: RELAY_OWNER_PUBKEYには、64文字の16進数パブリックキー(公開鍵)を設定する必要があります。まずデスクトップアプリでアイデンティティを生成し(「Create a new identity key」→npub形式のパブリックIDをコピー)、それを16進数(Hex)に変換します。
  • シークレット(Secrets)の設定:
    • オンラインツールを使用するか、openssl rand -hex 32を実行(計7回実行)して、シークレットキーを生成します。
    • すべてのCHANGE_MEプレースホルダーを置き換えます:BUZZ_RELAY_PRIVATE_KEY、BUZZ_GIT_HOOK_HMAC_SECRET、Postgres/Redis/Typesenseのパスワード、およびS3のアクセスキー/シークレットキー。
    • プレースホルダーが残っていると、コンテナが再起動ループに陥る最も一般的な原因になります。grep CHANGE_ME .envを実行して、変更漏れがないか確認してください。
    BUZZ_RELAY_PRIVATE_KEY=CHANGE_ME_64_HEX_PRIVATE_KEY
    BUZZ_GIT_HOOK_HMAC_SECRET=CHANGE_ME_RANDOM_64_HEX
    POSTGRES_PASSWORD=CHANGE_ME_RANDOM_PASSWORD
    REDIS_PASSWORD=CHANGE_ME_RANDOM_PASSWORD
    TYPESENSE_API_KEY=CHANGE_ME_RANDOM_API_KEY
    BUZZ_S3_ACCESS_KEY=CHANGE_ME_RANDOM_ACCESS_KEY
    BUZZ_S3_SECRET_KEY=CHANGE_ME_RANDOM_SECRET_KEY
  • その他の設定:
    • 先ほど生成したAPIトークンを環境変数CLOUDFLARE_API_TOKENとして追加します。これはCaddyの自動証明書更新に必要です。
    • Buzzはデフォルトで誰でも参加できるオープンな設定になっています。安全のためにRELAY_OWNER_PUBKEYを設定し、BUZZ_REQUIRE_RELAY_MEMBERSHIP=trueおよびBUZZ_REQUIRE_AUTH_TOKEN=trueを有効にしてください。

4. CaddyによるHTTPSの有効化

Cloudflare DNSモジュールを組み込んだカスタムCaddyイメージのビルド

  • CaddyにCloudflareを用いたDNS-01チャレンジを設定します。DNS-01は、プラグインがパブリックDNSにTXTレコード_acme-challenge.buzz.pafor.meを書き込み、Let's Encryptがパブリックインターネット経由でそのレコードを確認してドメインの所有権を検証する仕組みです。そのため、pafor.meがCloudflareアカウント上でパブリックゾーンとして登録されている必要があります(Zero Trust/WARPのプライベートDNS内だけに存在するプライベートホスト名では動作しません)。プライベートにしか解決できない場合、DNS-01は失敗し、別の証明書取得アプローチが必要になります。
  • Caddyfileに以下を追記します:
{
  acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}
}
  • Dockerfile.caddyを以下の内容で作成します(compose.caddy.ymlから呼び出されます):
FROM caddy:2-builder AS builder

RUN xcaddy build \
    --with github.com/caddy-dns/cloudflare

FROM caddy:2-alpine

COPY --from=builder /usr/bin/caddy /usr/bin/caddy
  • Cloudflareモジュールを含むイメージを使用し、APIトークンを渡すようにcompose.caddy.ymlを編集します:
services:
  relay:
    ports: !reset []

  caddy:
    build:
      context: .
      dockerfile: Dockerfile.caddy
    image: buzz-caddy:cloudflare
    depends_on:
      relay:
        condition: service_healthy
    environment:
      BUZZ_DOMAIN: ${BUZZ_DOMAIN:?set BUZZ_DOMAIN}
      CLOUDFLARE_API_TOKEN: ${CLOUDFLARE_API_TOKEN:?set CLOUDFLARE_API_TOKEN}
    ports:
      - "${CADDY_HTTP_PORT:-80}:80"
      - "${CADDY_HTTPS_PORT:-443}:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - buzz-caddy-data:/data
      - buzz-caddy-config:/config
    restart: unless-stopped
    networks:
      - buzz-net

volumes:
  buzz-caddy-data:
    labels:
      com.buzz.volume: caddy-data
  buzz-caddy-config:
    labels:
      com.buzz.volume: caddy-config

Dockerコンテナの起動

docker compose -f compose.yml -f compose.caddy.yml up -d

#Check the Docker status
docker compose ps

ブラウザを開き、http://buzz.pafor.meにアクセスしてリレーが正常に稼働しているか確認します。

ステップ 5:初日からの自動バックアップ設定

mkdir -p /buzz_backups
crontab -e

毎晩データベースのダンプを出力するcronジョブを設定します:

0 3 * * * cd /home/<user>/buzz/deploy/compose && docker compose exec -T postgres pg_dump -U buzz buzz > /buzz_backups/buzz-$(date +\%Y\%m\%d).sql

注意:BUZZ_RELAY_PRIVATE_KEYは恒久的なものとして厳重に管理してください。このキーで署名されたイベントは、キーが変更されると検証に失敗します。データベースをリストアしても、新しい鍵と組み合わせた場合は同じリレーとして認識されません。

BuzzデスクトップクライアントとNostrアイデンティティのセットアップ

https://github.com/block/buzz/releases からBuzzデスクトップアプリをダウンロードして起動します。プロファイルの設定を進め、「Join or create a community」のページまで進みます。

「Join a community」をクリックし、ご自身のパブリックキー(公開鍵)をコピーします。

VPS上で以下のコマンドを実行し、自身を最初のメンバーとして追加します:

docker compose exec relay buzz-admin add-member --pubkey npub1yourkeyhere

コミュニティURLにwss://buzz.pafor.meを入力し、「Next」をクリックします。

表示名を入力し、「Next」ボタンをクリックします。

チャンネルとAIエージェント

チャンネルはタスクやプロジェクトごとのグループです。タスクごとにチャンネルを作成し、人間とAIエージェントをそこに参加させます。

チャンネル内のすべてのアクティビティは自動的に共有されるため、各メンバーに個別に指示を繰り返す必要はありません。すべてのエージェントは「@」を使ってメンションでき、該当のメッセージ履歴を読み込みます。また、エージェント同士が互いにメンションし合うことも可能です。

事前に設定されたエージェントにダイレクトメッセージ(DM)を送信してみましょう

チャンネルを作成し、いくつかのエージェントを追加してみましょう

エージェント・ランタイムの有効化

プリセットされたランタイムは、~/.local/binなどの標準ディレクトリにある起動用バイナリ(例:hermes-acp)の自動検出に依存しています。非標準の場所にツールがインストールされている場合、Buzzはそれを検出できません。

Kimi Codeの場合、エージェントIDはkimiであり、Buzzは~/.local/bin/kimiにあるバイナリを探します。以下のようにシンボリックリンクを作成することで解決できます。

ln -s kimi-cli /Users/<user>/.local/bin/kimi

これにより、Kimi Codeがエージェントのランタイム一覧に表示されます。

プロジェクトとリポジトリ

まず、Settings → Experimentsで「Projects」機能を有効化します:

現時点では、プロジェクトの作成はbuzz-cliを介して行う必要があります(将来のリリースではUIから直接作成可能になる予定です)。

buzz-cliのインストール

VPS上で以下のコマンドを実行し、buzz-cliをインストールします:

sudo apt install cargo
cd ~/buzz
cargo install --path crates/buzz-cli
echo 'export PATH="$HOME/.cargo/bin:$PATH"' >> ~/.bashrc && source ~/.bashrc

オンラインツールまたはbuzz-cliを使用して公開鍵と秘密鍵のペアを生成します。このペアは、Nostrリレーにおけるbuzz-cliのアイデンティティとなります。

docker run --rm --entrypoint /usr/local/bin/buzz-admin ghcr.io/block/buzz:main generate-key

# Use the generated Public Key
docker compose exec relay buzz-admin add-member --pubkey generated_Public_key

CLIの設定を行います:

# Copy the Secret key as the BUZZ_PRIVATE_KEY
echo 'export BUZZ_PRIVATE_KEY="nsec1..."'  >> /home/<user>/.bashrc

echo 'export BUZZ_RELAY_URL="wss://buzz.pafor.me"'  >> /home/<user>/.bashrc

以下のコマンドを実行して、buzz-cliが正常に設定されているか確認します:

buzz channels list

buzz-cliによるプロジェクト作成

# --channel refers to the UUID of the channel
buzz repos create --id TestKOA --name 'Display Name' --channel "bd92b3d1-8fac-441c-a9ac-2b2f3aac5c5b"

プロジェクトは作成者(オーナー)しか削除できません。buzz-cliで作成された「Display Name」プロジェクトは、現在のCLIに削除コマンドが実装されていないため、この方法では削除できません。

Buzzデスクトップアプリに戻り、プロジェクトが作成されていることを確認します。

リポジトリがProjectsビューに追加されると、それ以降はUI右上隅の「+」ボタンから簡単にリポジトリを追加できるようになります。

既存のGitリポジトリの登録

Gitリポジトリが存在するマシンにgit-credential-nostrをインストールします。これにはGit 2.46以上とRustのビルド環境(toolchain)が必要です。詳細についてはこちらのReadmeを参照してください。

cargo install --path crates/git-credential-nostr

Buzzリレーでの認証用にgit-credential-nostrを設定します:

# 1. Register the helper and enable per-path credentials.
git config --global credential.helper nostr
git config --global credential.useHttpPath true

# 2. Store your nsec in a key file (must be 0600). Replace "nsec1..." with your private key
mkdir -p ~/.nostr
echo "nsec1..." > ~/.nostr/key && chmod 600 ~/.nostr/key
git config --global nostr.keyfile ~/.nostr/key

Buzzリレー上にリポジトリを作成します:

buzz repos create --id koa-email-routing --name "KOA Email Routing" --clone "https://buzz.pafor.me/git/<pub_key>/koa-email-routing" --nostr-relay "wss://buzz.pafor.me"

最初のgit push時に、remote: missing Authorization header(認証ヘッダー不足)のエラーが発生します。これを解決するには、リポジトリIDをBuzzのチャンネルに関連付ける(バインドする)必要があります。チャンネルのメンバーシップに基づいてGitの書き込み権限(ACL)が制御されるためです。

buzz repos bind --id koa-email-routing --channel <CHANNEL_UUID>

# push the code again
git push

Buzzデスクトップアプリでプロジェクトを確認した際、以下のようにGitの読み込みに失敗する場合があります。これはデスクトップアプリがGit 2.46以上を要求するためであり、アプリを直接起動した際に古いバージョンのGitが検出されていることが原因です。

シェルの設定ファイル等で、launchctl setenv PATH "/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"のようにPATH環境変数をエクスポートし、シェル経由でBuzzアプリを起動してください。詳細についてはこちらのIssueを参照してください。

open -a Buzz

Buzzアプリで「Projects」を再度確認すると、無事にリポジトリの詳細が読み込まれているはずです。

QRコードによるBuzzモバイルアプリとの同期

BuzzモバイルアプリとのペアリングはHTTPSプロトコルのみを受け付けます。また、VPS上ではデフォルトでbuzz-pair-relayが起動していません。

cd ~/buzz
cargo install --path crates/buzz-pair-relay

以下をcompose.ymlに追加し、buzz-pair-relayサービスを定義します:

  pair:
    image: ${BUZZ_IMAGE:-ghcr.io/block/buzz:main}
    entrypoint: ["/usr/local/bin/buzz-pair-relay"]
    environment:
      BUZZ_PAIR_RELAY_BIND_ADDR: 0.0.0.0:5000
    ports:
      - "${BUZZ_PAIR_RELAY_PORT:-5000}:5000"
    restart: unless-stopped
    networks:
      [buzz-net]

.envファイルにBUZZ_PAIRING_RELAY_URLおよびBUZZ_PAIR_RELAY_PORTを追記します:

BUZZ_PAIRING_RELAY_URL=wss://buzz.pafor.me/pair
BUZZ_PAIR_RELAY_PORT=5000

Buzzデスクトップの「Settings」から「Mobile」を開きます:

「Start pairing」をクリックするとQRコードが生成されます。モバイルデバイスのBuzzアプリでこのQRコードをスキャンし、「Code Match」をクリックするとペアリングが完了します。

モバイルアプリ上のエージェントは、デスクトップアプリ側で対応するエージェントが稼働している場合のみ利用可能です。エージェントを動作させるには、デスクトップマシンを起動しておく必要があります。

おわりに

BuzzはいくつかのバグやUIの制限があり、大規模な本番環境への導入には時期尚早ですが、少人数のチームや個人の開発者にとっては非常に刺激的なツールです。人間とAIが真に同僚として協働する、自律的な「AIネイティブ」な未来のワークスペースをいち早く体験することができます。

参考資料

関連記事

深みのあるインディゴとアンバーのアクセントが効いたプレミアムな16:9のテックカード。DeepSeek HarnessをNostrリレーブリッジ経由でBlock Buzzに接続する方法を表現し、洗練されたガラスモーフ調パネルの中央にタイポグラフィを配置。

AIとエージェント

DeepSeek HarnessにBuzzを連携:自律型Nostrメッセージゲートウェイ構築実践ガイド

DeepSeek HarnessをNostrプロトコル経由でBlockのAI協働ワークスペースBuzzに接続する詳細手順を解説。NIP-42認証やWebSocket接続、kind 40003による逐次編集ストリーミング、チャンネル単位の自律型エージェント管理、ローカル作業環境コマンド連携までを完全網羅。

15分で読める
温かみのある羊皮紙の背景に表示された、TREKセルフホスト旅行プランナーダッシュボードの高品質ミニマリスト3Dイラスト。

旅行

DockerとTREKで旅行プランをセルフホスト:日程、予約、旅費、持ち物リストを完全統合する究極のガイド

Dockerを使用してオープンソースの旅行プランナー「TREK」をデプロイし、CaddyリバースプロキシやCloudflare R2と連携させてセキュアに運用する方法を徹底解説。さらに、MCP経由でAIエージェントと接続し、自然言語で旅行の予約、旅費、持ち物リストを自動整理・一元管理してスマートに旅を計画しましょう。

22分で読める
CloudflareでのNuxt環境構築:シェルスクリプトからAIエージェントスキルへ移行するメリット。スクリプトとAIスキルの徹底比較。

AIとエージェント

Nuxtアプリの環境構築・初期化を自動化:AIエージェントのスキルが従来のシェルスクリプトに代わる理由

Cloudflare Workers上にNuxtアプリを自動構築する方法を徹底解説。従来の壊れやすいシェルスクリプトを、開発者の意図を組んで柔軟に判断・動作するインテリジェントなAIエージェントのスキルに置き換えるメリットや、npx skillsコマンドを用いた実用的なセットアップ手順を紹介します。

2分で読める