
自建 Block 旗下 Buzz 协作平台:轻松构建人类与 AI 智能体高效协同工作的全新共享工作空间
本教程将手把手带您在 Ubuntu VPS 上部署自托管的 Block 旗下 Nostr 中继服务 Buzz,并配置 Cloudflare DNS 安全网络。我们将帮助您搭建起一个安全性的共享工作空间,让您的团队成员与多个 AI 智能体(如 Claude、Kimi)能够基于加密身份进行高效沟通、共享项目上下文并实现无缝协作。
目录
在与多个 AI 智能体(AI Agent)协同工作时,最让人头疼的障碍莫过于“上下文断片化(Context Fragmentation)”。由于对话分散在不同的工具中,您最终不得不扮演起一个“肉肉路由器”的角色——频繁地从 Claude Code 中复制对话并粘贴到 Gemini CLI,然后再从 Gemini CLI 复制并粘贴 to Hermes Agent 中。而当您身边还有人类团队成员一起协作时,这种繁琐的摩擦感更是成倍增长。

Buzz 是一款开源的协同工作空间,它将人类团队和 AI 智能体凝聚在一个统一的环境中。在这里,人类同事与 AI 智能体能够共享相同的任务和项目历史,并实现天衣无缝的工作交接。
什么是 Block 旗下的 Buzz?人机协同的 AI 智能体共享空间
Buzz 是 Block 公司(由推特创始人杰克·多西创立)推出的开源协作工作空间,它让团队成员和 AI 智能体能够在相同的频道与项目中并肩工作。它具有以下几个核心亮点:
- 共享上下文: 频道是团队成员与智能体开展协作的核心阵地。所有的对话记录和项目历史都完整保留在频道中。
- 智能体间通信: 智能体之间能够跨机器直接进行交流。一个 AI 智能体可以 @ 另一个智能体,从而完成工作的转交或代码的交叉审查。
- 提及驱动激活: AI 智能体仅在被 @ 提及时才会激活,平时则保持静默。被提及时,智能体将读取频道中的相关上下文并开始工作。
- 统一身份系统: 团队成员与 AI 智能体使用同一套身份系统,并通过加密私钥/公钥进行安全认证。
- 委派命令: 您可以向人类同事授予指挥您的智能体的权限,让整个团队都能轻松指派和调用彼此的数字助手。
- 自托管服务器: 因为您是该服务器的托管者,所以您的数据完全由您掌控。您可以自由决定谁能加入,并定义专属的运行规则。
基于 Nostr 的加密级 Buzz 架构解析

- Nostr 中继器充当服务器: 消息、工作流、代码仓库以及其他事件都经过加密签名和验证,并存储在 Nostr 中继服务器(Relay)上。Nostr 协议原生支持通过 WebSockets 和 REST API 进行通信。
- 统一加密身份: 人类和智能体都使用各自的加密密钥进行认证。此身份完全保留在客户端,绝不会存储在服务器上。
- 一等公民级智能体: 每个智能体都拥有独立的身份、频道成员资格和审计跟踪(Audit Trail)。智能体使用智能体通信协议(ACP)连接到工作空间。
- 去中心化 Git 仓库: 代码库存储在兼容 S3 的对象存储中,而任务、拉取请求(PR)和代码审查则在 Nostr 事件日志中进行追踪。因此,Buzz 的 Git 仓库实际上是托管在 Nostr 中继器上,而非 GitHub。
- Buzz 客户端属于 Nostr 客户端: Buzz 应用与 Nostr 中继器是分离的;它是一个桌面或移动端客户端,负责连接到中继器的 URL 节点。
- 基础技术栈: 由 PostgreSQL 数据库处理事件存储与全文检索,Redis 负责管理发布/订阅(Pub/Sub)消息队列,而兼容 S3 的 MinIO 用于存储媒体文件。
如何在 Linux VPS 上部署自托管的 Block 旗下 Buzz
0. Prerequisites
- 一台 Linux VPS
- 域名已指向您的服务器 IP 地址
- Docker 以及 Docker Compose 插件
- Cloudflare 账户(免费服务计划)
在本指南中,我们将把 Nostr 中继器部署在 Ubuntu VPS 上,并通过 教程:使用 Cloudflare WARP 安全地将 Hermes Agent 暴露至私有网络 保护其安全。整个基础技术栈包含 Docker Compose 中的四个服务:中继器(relay)、PostgreSQL、Redis 和 MinIO,并使用 Caddy 来提供 HTTPS 支持。

相关指南
教程:使用 Cloudflare WARP 安全地将 Hermes Agent 暴露至私有网络
了解如何利用 Cloudflare WARP 和 Zero Trust(零信任)在不开放入站防火墙端口的情况下,安全地在全球范围内暴露和访问您的 Hermes Agent。
8 分钟阅读1. Cloudflare DNS 与 API 令牌
创建 Cloudflare API 令牌(Token)
- 点击右上角的个人头像,并在下拉菜单中选择 Profile。
- 点击 API Tokens。

- 点击 Create Token 按钮。
- 选择使用模板 Edit zone DNS。
- 配置模版如下:
- Permissions: Zone — DNS — Edit
- Zone Resources: Include — Specific zone —
example.com
- 点击 Continue to summary。
- 点击 Create Token。
- 拷贝生成的 API 令牌,因为页面关闭后它将不再显示。
- 在终端中验证生成的令牌,确保其能正常工作:
curl "https://api.cloudflare.com/client/v4/user/tokens/verify" -H "Authorization: Bearer YOUR_TOKEN_HERE"
DNS 解析记录
- 创建一条 A 记录,并将代理状态设置为 仅限 DNS(DNS only)。

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 进制格式。 - 密钥安全(Secrets):
- 使用该 在线工具 或运行命令
openssl rand -hex 32(运行 7 次)来生成高强度的随机密钥。 - 将所有的
CHANGE_ME占位符替换掉:包括BUZZ_RELAY_PRIVATE_KEY、BUZZ_GIT_HOOK_HMAC_SECRET、Postgres/Redis/Typesense 的密码以及 S3 的 Access/Secret Key。 - 未替换的占位符是导致容器陷入无限重启循环的最常见原因;请通过命令
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
- 其他配置项:
- 将环境变量
CLOUDFLARE_API_TOKEN添加到您的配置中,并赋予先前生成的 API 令牌值。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 挑战(Challenge)。DNS-01 验证的原理是让 Caddy 插件向您的公网 DNS 写入一条 TXT 挑战记录
_acme-challenge.buzz.pafor.me; - 随后 Let's Encrypt 从公共互联网上查询该记录,以确权您的域名。这意味着您的域名必须是 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
- 修改
compose.caddy.yml,以使用我们刚生成的带有 Cloudflare 插件的 Caddy 镜像,并传入 API 令牌参数:
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 Job):
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 视为永久不可失配的密钥。由于中继器中的事件都与此密钥绑定,如果未来变更了私钥,旧事件将无法通过验证;即便您恢复了数据库备份,在新私钥下它也不会被 Nostr 网络视为同一个中继服务。
配置 Buzz 桌面客户端与 Nostr 加密身份
从 https://github.com/block/buzz/releases 下载最新版 Buzz 桌面客户端并运行。依次完善个人资料,直到您来到 “Join or create a community” 界面。

点击 “Join a community” 并拷贝您的公钥(Public Key)。

在 VPS 上运行以下命令行工具,将您自己添加为该平台的首位会员:
docker compose exec relay buzz-admin add-member --pubkey npub1yourkeyhere
在客户端中填入 wss://buzz.pafor.me 作为社区接入 URL,然后点击 “Next”。

起一个帅气的昵称,然后点击 “Next” 按钮。

协作频道与 AI 智能体
频道是围绕特定任务或项目划分的群组。为您手头的每个任务或工程建立独立的频道,并将团队成员与所需的 AI 智能体拉入其中。
频道内的所有消息、代码与文档都会被自动分享,免去了逐一向新成员同步前因后果的烦恼。任何人都可以通过“@”来点名激活特定的 AI 智能体,智能体收到召唤后会读取相关历史消息并立刻着手处理。更妙的是,不同的 AI 智能体之间也能互相 @ 指派任务。
让我们试着给预置的智能体发一条私信(DM)

创建一个新频道并拉几个 AI 智能体进来吧




激活智能体运行时(Agent Runtimes)
平台自带的运行时预设依赖于“自动探测”来查找特定系统目录(例如 ~/.local/bin)下的执行程序(如 hermes-acp)。如果您的智能体软件安装在非标准路径下,Buzz 将无法正确识别。
以 Kimi Code 为例,它的智能体 ID 为 kimi,Buzz 默认会在 ~/.local/bin/kimi 寻找它。通过创建一个软链接(Symbolic Link)即可轻松搞定:
ln -s kimi-cli /Users/<user>/.local/bin/kimi
此时,Kimi Code 就会显示在“Agent runtimes”列表中。

项目与代码仓库管理
请先在 Settings → Experiments 菜单中激活“Projects”实验性功能:

目前,一个项目(Project)必须使用 buzz-cli 命令行工具来创建(虽然在后续版本中会加入 UI 直接创建的支持)。
在 VPS 上安装并部署 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 工具在 Nostr 网络中的数字身份。
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"
项目的所有权极为严格,只有创建者才有权将其删除。由于该“Display Name”项目是由 buzz-cli 发起创建的,而目前的命令行版本尚未内置删除指令,因此该项目无法通过常规方式清空。
再次点开您的桌面客户端,验证该项目是否已显示在工作区中。

一旦项目列表在界面中开启,后续您便可以直接通过右上角的 “+” 按钮随心所欲地添加更多子项目了。

拉入现有的 Git 代码仓库
在您的本地开发机器上安装 git-credential-nostr 凭证辅助工具。这需要您的系统已安装 Git 2.46+ 版本并配有 Rust 构建环境。详情可参考此项目的 Readme 描述:
cargo install --path crates/git-credential-nostr
对 git-credential-nostr 进行配置,使其获得 Buzz 中继器的授权权限:
# 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 中继上开辟出该 Git 库的存储节点:
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。这是由于 Git 写入控制(ACL)是由频道成员资格决定的,您必须先将该仓库 ID 与一个具体的 Buzz 频道进行绑定,从而授权合规写入:
buzz repos bind --id koa-email-routing --channel <CHANNEL_UUID>
# push the code again
git push
在某些情况下,在 Buzz 桌面版中查阅项目进度时会遇到类似下方的 Git 模块拉取失败提示。这是由于该桌面应用要求系统必须搭载 Git 2.46+ 版本,而应用直接启动时可能默认寻址到了系统中的旧版 Git 引擎:

请在您的 shell 配置文件中通过执行 launchctl setenv PATH "/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin" 声明新版 Git 所在的 PATH,并直接在终端中拉起 Buzz 应用。对此可参考该 Issue 的详细排查记录。
open -a Buzz
重新进入客户端中的 Projects 标签页,您会惊喜地发现代码库的所有提交与详情已经完美加载出来了。

利用二维码将 AI 助手同步至手机端 Buzz App
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_PAIRING_RELAY_URL=wss://buzz.pafor.me/pair
BUZZ_PAIR_RELAY_PORT=5000
点击桌面端应用中的 Settings, 进入 “Mobile” 配对项:

点击 “Start pairing” —— 界面会生成专属的绑定二维码;打开手机端 App 扫一扫,接着在桌面端点击 “Code Match” 确认无误,双端便立即完成信任绑定。

注意:手机端应用中的智能体之所以能随叫随到,是基于您的桌面端应用在后台持续维系运行。只有保障桌面机处于在线状态,手机端派发的智能体指令才能被顺利分发与执行。

结语
不可否认,作为一个还处于发展初期的技术方案,Buzz 在面对大规模生产环境时依然稍显稚嫩,伴随着一些偶发的系统 Bug 与界面交互上的限制。但对于小型团队或单兵作战的独立开发者而言,这无疑是一场令人血脉偾张的前沿探索。它为我们揭开了一幅波澜壮阔的人机无缝协奏画卷,让我们提前触碰到了“AI 智能体成为工作伙伴”的未来工作模式。
参考资源
相关文章

AI 与智能体
为 DeepSeek Harness 接入 Buzz 协作平台:构建自托管 Nostr 消息网关的完整实践
深入解析如何通过 Nostr 协议将 DeepSeek Harness 接入 Block Buzz 协作平台:手把手配置 NIP-42 鉴权认证、基于 40003 事件的原位流式编辑输出、频道独立会话管理与本地工作区指令联动,为开发团队构建起安全可控、开箱即用的人机协同智能体开发环境与全新工作流程。
13 分钟阅读
旅行
使用Docker与TREK自托管您的个性化智能旅行日程:一站式深度规划并轻松管理预订、财务和行李清单
本文详细介绍如何使用Docker部署开源旅行规划系统TREK。我们将带您配置Caddy反向代理和Cloudflare R2对象存储,实现数据的安全备份与图片的高效加载。此外,还将演示如何利用MCP(模型上下文协议)连接Claude等AI智能体,通过自然语言对话一键生成您的专属旅行日程,开启完美旅程。
22 分钟阅读
AI 与智能体
从传统初始化模板脚本到智能体:AI Agent 技能如何优雅地取代 Nuxt 应用程序脚手架构建脚本
轻松在 Cloudflare Workers 上快速构建 Nuxt 应用程序脚手架。深入剖析并学习我们如何使用功能强大、极其灵活、支持自我修复且拥有决策能力的 AI 智能体技能来彻底取代脆弱的传统 Shell 脚本,并详细演示如何通过官方 the npx skills 命令行工具将其无缝安装到您的开发工作流中。
2 分钟阅读
上一篇
使用Docker与TREK自托管您的个性化智能旅行日程:一站式深度规划并轻松管理预订、财务和行李清单
本文详细介绍如何使用Docker部署开源旅行规划系统TREK。我们将带您配置Caddy反向代理和Cloudflare R2对象存储,实现数据的安全备份与图片的高效加载。此外,还将演示如何利用MCP(模型上下文协议)连接Claude等AI智能体,通过自然语言对话一键生成您的专属旅行日程,开启完美旅程。

下一篇
如何在多台设备之间安全地同步 Obsidian 本地知识库
本文详细介绍如何利用开源工具 Synch 与 Ignis 在您的 VPS 上搭建私有同步服务器,从而在多台电脑、手机以及平板设备之间安全地同步您的 Obsidian 知识库。我们还将所有服务全部部署在 Cloudflare Zero Trust 私有网络中,从而完全阻断来自公网的恶意扫描与未授权访问,保障数据隐私安全。