实战 SOP
实战 SOP

block/buzz 自托管部署 SOP:从 Docker 到 agent 入组

block/buzz 自托管部署完整 SOP(与 buzz-hive-mind 热点文成对):本地开发栈(just setup/build/dev)+ 生产单节点(deploy/compose Docker,Postgres/Redis/MinIO)+ 配置(.env:RELAY_URL/BUZZ_RELAY_PRIVATE_KEY/RELAY_OWNER_PUBKEY)+ agent 入组(Nostr keypair NIP-98 签名,buzz-admin 管成员)+ 闭门 relay + 5 FAQ。部署命令全据 README/compose/.env/CLI/ARCHITECTURE,未编造。

发布于 2026年8月6日9 分钟阅读
<!-- buzz-deploy-sop | sop | 自托管 Buzz Relay 实战 SOP:搭一个属于你团队的人机共享工作区 -->

配对的热点文已经把 block/buzz 的定位讲透了:人机共享 workspace,agent 是 member 不是 bot,底层是 Nostr relay,每条消息、反应、工作流、git event 都是签名事件。但看完定位,真正想自己搭一个的人会卡在下一步——仓库是 Rust monorepo,依赖 Postgres/Redis/MinIO 一整套,README 给了三条路径,到底走哪条?

更关键的是,buzz 的 relay 不是聊天服务的一个组件,而是「单一事实来源」--所有读写都过它,事件、搜索、审计、工作流全在一条 log 上。自托管 relay 等于把团队整条人机协作的事件流攥在自己手里,这是 SaaS workspace 给不了的数据主权。

这篇 SOP 接住「定位之后怎么落地」。把 buzz 的自托管部署拆成三条路径(桌面试用 / 本地开发 / 生产单节点),配齐 relay 签名密钥、community 绑定、agent keypair,最后给踩坑和 FAQ。所有命令来自 block/buzz 仓库 README、deploy/compose/README.md 与 .env.example,不编造。


一、部署准备:三条路径,先选对

README 把「上手 buzz」分成三条路径,选错会白费力气:

路径适合谁代价
桌面试用只想体验 app,不关心 relay下载打包构建,零配置,但连的是别人的 relay
Railway 一键托管想要自己的 relay 但不想管服务器点一下部署,月付托管费
源码构建(本 SOP 重点)想完全自托管、要接 agent要装 Rust/Docker,自己跑 Postgres/Redis/MinIO

桌面构建从 releases 页下载:macOS(aarch64/x64 dmg)、Linux(AppImage/deb)、Windows(x64 exe,未签名,SmartScreen 拦截就点 More info → Run anyway)。默认连 ws://localhost:3000,没有 relay 就得自己起。

源码路径的环境依赖(README 原文):Docker + Hermit,或自行备齐 Rust 1.88+、Node 24+、pnpm 10+、just。Hermit 是 buzz 的 pinned toolchain 脚本,激活后工具首次用时自动下载,省去手动对版本。Windows 用户额外装 Git for Windows(提供 Git Bash),或用 BUZZ_SHELL 指向别的 bash 兼容 shell。

为什么需要 Postgres/Redis/MinIO 三件套?这得从架构说起。buzz 的 relay 是 Axum 写的 Rust 服务,也是整个系统的单一事实来源:Postgres 存事件加全文搜索(FTS),Redis 管 pub/sub、presence、typing,MinIO/S3 走 Blossom 协议存媒体。每条动作--消息、reaction、workflow step、git event--都是一条按 kind 整数分发的签名 Nostr 事件。三件套不是凑数,是这条事件流的物理承载。


二、本地开发部署:clone + just dev

这是 README 的 Quick start,开发者与自托管入门路径,起一个本地 relay 加桌面 app。

一次性准备:

bash
git clone https://github.com/block/buzz.git && cd buzz
. ./bin/activate-hermit   # 激活 pinned toolchain,工具首次用自动下载
just setup && just build

just setup 会自动跑 just bootstrap:把 .env.example 复制成 .env、用 Hermit 下齐工具、起 Docker 服务并跑 migration。你不用手动配 Postgres/Redis,Docker 全拉起来。

日常启动:

bash
. ./bin/activate-hermit
just dev   # relay + 桌面 app 一起起

relay 落在 ws://localhost:3000,桌面 app 弹出来就能进。想看 relay 日志和 Vite 输出分开,就两个终端:一个 just relay,一个 just desktop-dev。常用 just 命令速查:

bash
just setup     # Docker、migration、桌面端依赖
just relay     # 只起 relay
just dev       # relay + 桌面端
just build     # 编译 Rust workspace
just check     # fmt + clippy + 桌面端检查
just test-unit # 单测,不需要基础设施
just reset     # ⚠️ 清数据重建,别在生产敲

三、生产单节点部署:deploy/compose

本地 just dev 是开发栈,不能直接上生产。buzz 在 deploy/compose/ 里放了独立的单节点/VPS bundle,和根目录的 docker-compose.yml(仅限本地开发)有意分开。栈是真依赖:Postgres、Redis、MinIO、可选 Caddy/TLS。

bash
cd deploy/compose
cp .env.example .env
$EDITOR .env       # 把每个 CHANGE_ME 替换掉
./run.sh start

公网 VPS 要自动 Let's Encrypt 证书:

bash
cd deploy/compose
BUZZ_COMPOSE_TLS=true ./run.sh start

要求 Docker Compose v2.24.4+;TLS 模式用 Compose 的 !reset 把 relay 直连端口摘掉,由 Caddy 终结 HTTPS。镜像默认跟 ghcr.io/block/buzz:main(早期测试用),生产要 pin 到 ghcr.io/block/buzz:sha-<7> 或 semver tag。几个密钥必须跨重启保持稳定,换了就断:BUZZ_RELAY_PRIVATE_KEYBUZZ_GIT_HOOK_HMAC_SECRET、数据库/Redis、S3 凭据。

新库要先迁移:设 BUZZ_AUTO_MIGRATE=true,或起 relay 前跑 buzz-admin migrate(镜像得带嵌入式 SQLx migration)。上线前自检(deploy/compose/README.md 给的验证流程):

bash
./run.sh config
./run.sh start
curl -fsS "http://127.0.0.1:$(grep -E '^BUZZ_HTTP_PORT=' .env | cut -d= -f2-)/_liveness"
./run.sh status

/_liveness 通了、status 正常,再对外开。


四、配置:relay 签名密钥、community 与 owner pubkey

buzz 的配置全在 .env,本地开发默认值开箱即用,生产才需改。关键字段(来自 .env.example):

变量作用备注
BUZZ_BIND_ADDRrelay 监听地址默认 0.0.0.0:3000
RELAY_URL对外 WebSocket URL参与 NIP-42 认证挑战,生产改成真实域名
DATABASE_URLPostgres 17 连接串事件 + FTS 全文搜索都存这
REDIS_URLRedis 7 连接串pub/sub、presence、typing
BUZZ_S3_*S3/MinIO 媒体存储Blossom 协议,本地 MinIO 默认 path 风格
BUZZ_RELAY_PRIVATE_KEYrelay 签名密钥(32 字节 hex)跨重启必须稳定,换了 REST 创建的帖子里作者对不上

community 是 buzz 的租户边界。ARCHITECTURE.md 讲清了:自托管默认一机一 relay 一隐式 community;多 community 部署时,req.community = resolve_host(connection.host) 在 AUTH 之前就定好,未知 host 直接拒绝,不会 fallback 到默认租户。一句话:URL 即工作区,host 决定 community。即便后端共享同一套 Postgres/Redis/S3,每个 community 的租户可见行、缓存键、搜索文档、工作流状态都按 host 隔离--共享基础设施是实现细节,不是用户可见的全局工作区。

要开「闭门 relay」(只许 owner 信任的人进),设 RELAY_OWNER_PUBKEY 为 64 位 hex Nostr 公钥——注意它没 BUZZ_ 前缀,别跟 relay 签名密钥搞混。人机分桶限流也在配置里:BUZZ_RATE_LIMIT_HUMAN_*BUZZ_RATE_LIMIT_AGENT_* 是两套桶,agent 的标准/提升/平台档消息上限比人高,因为 agent 本就该干得更多。


五、加入 Agent:keypair + buzz-cli + buzz-acp

部署完 relay,下一步是把 agent 当 member 加进来。buzz 的 agent 不走 bot token,走自己的 Nostr keypair。README 列了 agent 进 room 后能干的事:open repos、send patches、review code、run workflows、edit canvases、orchestrate other agents、voice huddles、create channels--和人一样的操作面,只是换一副 keypair。

  1. 装 agent 侧 CLI:
bash
cargo install --path crates/buzz-cli

buzz-cli 是 agent-first 的,JSON 进 JSON 出,专门给 LLM tool call 用。

  1. 给 agent 配身份和 relay 地址:
bash
export BUZZ_PRIVATE_KEY="nsec1..."     # agent 的 Nostr 私钥,hex 或 bech32
export BUZZ_RELAY_URL="https://relay.example.com"
buzz channels list                     # 验证连通

BUZZ_PRIVATE_KEY 做 NIP-98 Schnorr 签名,标识 agent 在 relay 上的身份。这就是「agent 是 member 不是 bot」的落地:它有自己的 key,不是挂在人账号下的 token。

  1. 把 agent 加进 channel,当 teammate 用:
bash
buzz channels create --name "release-plan" --type stream --visibility open
buzz channels join --channel <uuid>
buzz messages send --channel <uuid> --content "我来跑首轮 review"
buzz messages search --query "性能 patch"     # 带 receipts 的检索

buzz-cli 覆盖面和人类队友一样:messages、channels、canvas、workflows、dms、repos(NIP-34 git,patches/repo announcements/status)、mem(NIP-AE agent 记忆,可 set/get/patch)。git 事件走 NIP-34,所以 patch、CI 结果、review、merge 能全落在一个 channel 里,代码和讨论不分两处。agent 发的事件过的是和人同一条管线--认证、验签、成员校验、入库、fan-out、索引、审计、触发工作流--痕迹自然落在同一条 log。

  1. 想让 AI 模型自动响应 @mention,用 buzz-acp harness,桥接 relay 事件到 Goose/Codex/Claude Code:
bash
BUZZ_PRIVATE_KEY=<hex> BUZZ_RELAY_URL=ws://localhost:3000 buzz-acp

ACP 配置(.env.example 的 ACP 段):BUZZ_ACP_AGENT_COMMAND(goose / codex-acp / claude-code)、BUZZ_ACP_AGENT_ARGSBUZZ_ACP_AGENTS(并行子进程数 1–32)、BUZZ_ACP_MODELBUZZ_ACP_TURN_TIMEOUT(默认 320 秒)。长跑 agent 建议 BUZZ_ACP_HEARTBEAT_INTERVAL=60 防 session 超时。密钥生成走 buzz-admin(operator CLI,管 relay 成员 + 生成 keypair)。


六、踩坑记录

坑一:拿根目录 docker-compose.yml 上生产。 那个是本地开发栈。生产必须用 deploy/compose/,两者分开是有意的。

坑二:换 relay 私钥导致作者错乱。 BUZZ_RELAY_PRIVATE_KEY 跨重启必须稳定。换了,REST 创建的 forum 帖会对不上原作者。密钥和 DB/Redis/S3 凭据一起进 secrets 管理,别提交到 git。

坑三:新库不跑 migration。 全新数据库要么 BUZZ_AUTO_MIGRATE=true,要么手动 buzz-admin migrate,否则 relay 起不来。镜像得带嵌入式 SQLx migration。

坑四:RELAY_OWNER_PUBKEY 填错格式。 闭门模式要 64 位 hex Nostr 公钥,且没 BUZZ_ 前缀。填成 nsec 或加了前缀,closed relay 模式不开。

坑五:Windows 没 bash。 agent 的 shell 工具在 bash 下跑。Windows 不装 Git for Windows,agent 执行命令直接挂;要换 shell 就设 BUZZ_SHELL 指向 bash.exe 路径。

坑六:MinIO 地址风格错。 Compose 栈把 relay 的 S3 endpoint 固定成 http://minio:9000 加 path 风格,Docker DNS 解析 minio、不解析 <bucket>.minio。换外部 S3(如 virtual 风格的 bucket 子域)要改 Helm 或自定义 Compose,.env 改不动。


FAQ

Q1:不会 Rust 能部署 buzz 吗? A:能。生产用 deploy/compose/ 的 Docker 镜像(ghcr.io/block/buzz:*),不需要自己 cargo build。只有想从源码跑本地开发栈或改代码,才需要 Rust 1.88+。最省事是 Railway 一键托管 relay,桌面端下打包构建连上即可。

Q2:buzz 的 relay 必须配 Postgres/Redis/MinIO 三件套吗? A:本地 just dev 用 Docker 全拉起来,你不用单独装。生产栈也依赖这三样,因为它们是 buzz 当前的真实依赖——事件存 Postgres、pub/sub 走 Redis、媒体走 MinIO/S3。README 提到未来 Minimal 模式会简化,今天还没有。

Q3:agent 怎么认证?和 bot token 有什么不同? A:agent 用自己的 Nostr keypair,通过 BUZZ_PRIVATE_KEY 做 NIP-98 Schnorr 签名。它不是挂在人账号下的 bot token,是 relay 上的独立 member,有自己的 channel membership 和 audit trail。这就是「agent 是 teammate」的落地。

Q4:一个 relay 能服务多个团队吗? A:能。多 community 模式下,community 由请求 host 决定(resolve_host),在 AUTH 之前绑定。每个 community 保持独立的租户边界,即使后端共享 Postgres/Redis/S3。自托管默认一机一 community,要多团队就按域名或子域分。

Q5:闭门 relay 怎么开,只让 owner 信任的人进? A:设 RELAY_OWNER_PUBKEY 为 64 位 hex Nostr 公钥(无 BUZZ_ 前缀),启用 closed relay 模式,未知 pubkey 进不来。agent 的 keypair 也要 owner 加进成员才能用,buzz-admin 管 relay 成员和 key 生成。


看法

buzz 的部署门槛比一般「AI 工具」高,但高的部分是诚实的:它不是套个聊天壳,而是把工作区拢成一条可审计的 Nostr 事件流,Postgres/Redis/MinIO 是这条流的物理承载。deploy/compose/ 把生产栈封成一条 ./run.sh start,比手搓三件套省心;真嫌重,Railway 一键托管 relay 加桌面端连上,是最快尝鲜路径。

自托管 buzz 的真正价值不在「我也有个 relay」,在于 agent 有了独立 keypair 和 audit trail 后,它能干 teammate 该干的事——开 repo、发 patch、跑 workflow、改 canvas——痕迹全和人在同一条 log 里。这是 Slack bot 模式给不了的。如果你团队已经在人机协作上撞到「bot 永远是二等公民」的墙,搭一个自己的 buzz relay 值得。


参考来源

  • block/buzz 仓库:https://github.com/block/buzz (star 据 GitHub API 2026-08-06 核实 23,490)
  • README「Quick start」与「Getting started」章节(部署命令来源)
  • deploy/compose/README.md(生产单节点部署与验证流程来源)
  • .env.example(relay/ACP 配置字段来源)
  • crates/buzz-cli/README.md(agent CLI 命令来源)
  • ARCHITECTURE.md(community 绑定与事件管线来源)
  • Block 工程博客「Run your own Buzz relay」:https://engineering.block.xyz/blog/run-your-own-buzz-relay

本文由 AI 辅助生成,经人工审核编辑。最后更新:2026-08-06

常见问题

不会 Rust 能部署 buzz 吗?
生产用 deploy/compose/ 的 Docker 镜像(ghcr.io/block/buzz:*),不需要 cargo build。源码跑本地开发栈或改代码才需 Rust 1.88+。最省事是 Railway 一键托管 relay + 桌面端连上。
relay 必须配 Postgres/Redis/MinIO 三件套吗?
本地 just dev 用 Docker 全拉起;生产栈也依赖它们,是 buzz 当前真实依赖(事件存 Postgres、pub/sub 走 Redis、媒体走 MinIO/S3)。README 提未来 Minimal 模式,今天没有。
agent 怎么认证?和 bot token 有何不同?
agent 用自己的 Nostr keypair,BUZZ_PRIVATE_KEY 做 NIP-98 Schnorr 签名,是 relay 上的独立 member(有 channel membership + audit trail),不是挂人账号下的 token。
一个 relay 能服务多个团队吗?
能。多 community 模式下 community 由请求 host 决定(resolve_host),AUTH 前绑定;后端共享 Postgres/Redis/S3 时租户可见数据仍按 host 隔离。默认一机一 community,多团队按域名/子域分。
闭门 relay 怎么开?
设 RELAY_OWNER_PUBKEY 为 64 位 hex Nostr 公钥(无 BUZZ_ 前缀)启用 closed relay 模式;agent keypair 也要 owner 加成员,buzz-admin 管成员和 key 生成。

相关文章

实战 SOP

n8n 搭建 AI agent 工作流实战 SOP:部署与避坑

在 n8n 画布里搭一个能自主调用工具的 AI agent 工作流的完整 SOP:Docker 自托管一条命令部署、AI Agent 节点四件套解剖(Language Model+Memory+Tools+System Prompt)、分步搭建(选触发器->配节点->加工具->输出->测试发布)、五个避坑(Memory 失忆/API Key 硬编码/过度设计/上下文漂移/数据格式不匹配)+5 FAQ。节点参数以 n8n 官方文档为准,给配置逻辑不伪造完整 JSON。

2026年8月6日9 分钟阅读
实战 SOP

AI 数字人制作实战 SOP:从脚本到成品的可复制流程

把 AI 数字人制作拆成六步可复制流程:明确用途选工具(HeyGen/D-ID/Synthesia/Colossyan/DeepBrain 及国内腾讯智影/硅基智能)、写口播脚本(附 prompt 模板)、选或定制形象、先定音色再生成口型、字幕剪辑与合规后处理、平台适配发布。附 5 个避坑(形象授权/口型对不齐/多语言音色/长视频成本/合规标识)和 5 条 FAQ。代表性流程,非单一工具实测,功能以官网为准。

2026年8月7日8 分钟阅读