跳到正文
Hacker News· pkulak·· 7 天前AI 评分62

Barnaby 发布自托管 Matrix 房间智能体,一条命令部署

Barnaby: Self-hosted Matrix agent that reads the room

AI 导读

Barnaby 发布自托管 Matrix 智能体方案 Barnaby Home,用一条命令把闲置电脑或 VPS 变成完整 Matrix 服务器,包含 Element 聊天、加密房间和音视频通话,智能体常驻主房间。

正文 · AI 翻译

一个供你的家人或朋友使用的私密群聊,里面有一个融入其中的 AI 智能体。一个脚本就能把一台闲置电脑或 VPS 变成完整的 Matrix 服务器:Element 聊天、加密房间、语音和视频通话。一个 Barnaby 智能体住在主房间里。

智能体。大多数聊天机器人希望被 @ 提及或进行一对一对话。Barnaby 会阅读整个房间的内容,一个微型决策模型会挑出针对它的消息,所以人们可以正常交谈,当有人跟它说话时它就会插话。它会记住过去的对话,而且只需 OpenRouter 密钥,它就能画图、读取语音消息、跟进游戏,并在有人要求时为自己编写新技能。

聊天服务器。自托管 Matrix 通常意味着要配置一个 homeserver、一个 Web 客户端、多个子域的证书、用于通话的 TURN 和 LiveKit,以及某种处理邀请的方式。Barnaby Home 只需一个域名、一个 SSH 密钥和一个 OpenRouter 密钥就能完成所有这些。你需要在电脑上安装 Docker,而不需要 Nix 经验。

全新安装后的样子

Barnaby Screenshot

你将获得

  • 技术栈:tuwunel 作为服务器,Element 位于 chat.<domain>,LiveKit 用于通话,以及 Let's Encrypt 证书。
  • 仅限邀请:注册需要令牌。每个人都会进入一个与智能体一起的加密 General 房间,其他 Matrix 服务器无法加入。
  • 沙盒化的智能体:它运行在自己的 NixOS 容器中,而不是主机上。
  • 按需增加更多技能:网络搜索、天气和日历,每项都用自己的 API 密钥开启。
  • 可审计的自写技能:它们保存在 git 中,所以你可以查看并撤销它们。
  • 默认隐私:它使用的每个模型都有零数据保留(ZDR)端点。
  • 一条命令即可部署或更新,所有内容都在你的电脑上构建。

要求

  • 一台 x86_64 机器,至少 2 GB 内存(仅安装 nixos-anywhere 就需要 1.5 GB)和 20 GB 磁盘。家里的闲置 PC 或迷你 PC 可以,VPS 也可以。它需要运行 Linux,任何类型都行,并且你需要能够以 root 或具有 sudo 权限的用户身份通过 SSH 登录。在家里,用 U 盘上的 NixOS 安装程序启动它即可。安装会擦除磁盘。到目前为止,它只在 AWS EC2 t3.small 上测试过。所有内容运行约占 450 MB,构建发生在你的电脑上,所以在 VPS 上安装后你大概可以缩减到 1 GB。
  • 一个公网 IP 地址。VPS 自带一个。在家里,你的互联网连接需要有自己的 IPv4 地址(不是通过 CGNAT 共享的),并且你的路由器需要将这些端口转发到该机器。
  • 一个域名,或者你已有域名的一个子域名。
  • Docker 安装在你自己的电脑上,并为其准备约 10 GB 磁盘空间。在 Apple Silicon 的 Mac 上,它通过 Rosetta(Docker Desktop 的“Use Rosetta”设置)运行 x86_64 容器,速度较慢。
  • 一个 SSH 密钥。如果你没有,ssh-keygen -t ed25519 可以生成一个。
  • 一个 OpenRouter API 密钥。同时打开 OpenRouter 隐私设置中的“Zero Data Retention”;这是唯一能阻止请求发送到会保留数据的提供商的办法(见隐私)。

安装

1. 将 DNS 指向该机器

添加两条 A 记录(如果机器有 IPv6,再加 AAAA),都指向它的公网 IP:

barn.example.com      A  203.0.113.10
*.barn.example.com    A  203.0.113.10

通配符覆盖 chat. 和 call.。Let's Encrypt 在安装期间会检查这些名称,所以请先设置好它们。IP 也必须保持不变:在 AWS 上,使用弹性 IP。在家里,从 ISP 获取静态 IP,或者通过 DNS 提供商的动态 DNS 保持记录更新。

2. 打开端口

NixOS 运行自己的防火墙,但机器前面通常还有另一个:AWS 上的安全组,或家里的路由器。在那里打开这些端口,在家里还要将它们转发到机器:

端口 协议 用途
22 TCP SSH
80, 443 TCP Web、Matrix 和证书
7881 TCP 当 UDP 被阻止时的通话
50000–51000 UDP 通话
3478 UDP 通过 TURN 的通话,适用于处于严格 NAT 后的人
5349 TCP 通过 TURN over TLS 的通话,适用于阻止 UDP 的网络

如果你设置了 calls.enable = false,请省略除 22、80 和 443 之外的所有内容。

3. 设置

curl -fsSLO https://raw.githubusercontent.com/pkulak/barnaby-home/main/template/barnaby-home
bash barnaby-home setup barn
cd barn

这会创建一个 barn 目录,其中包含一个 git 仓库、配置和脚本的副本。此后的一切都从那里运行。首次运行需要几分钟,期间 Docker 下载 Nix,Nix 下载其他所有内容。

4. 配置

./barnaby-home configure

它会询问域名、用于登录的 SSH 密钥(默认 ~/.ssh/id_ed25519)、你目前如何 SSH 进入机器(例如 ssh nixos@192.168.1.50,或在 AWS 上为 ssh -i ~/keys/aws.pem ubuntu@203.0.113.10)、你在聊天中的用户名、时区、代理的名称、任何额外技能以及 OpenRouter 密钥。它会登录机器以找到要安装到的磁盘。

答案会写入 configuration.nix 和 secrets.env(git 会忽略它们,因此密钥永远不会进入仓库或 Nix store),从现在起你可以手动编辑两者;参见 Configuration。你也可以再次运行 configure,但它会重新开始 configuration.nix,所以如果你更改了任何内容,它会先询问。

代理在不知道任何使用者信息的情况下也能正常工作,但如果知道的话会好得多。编辑 soul.md(谁是谁、你住在哪里、你关注哪些团队),并在 configuration.nix 中取消注释 soul = ./soul.md;。你也可以稍后再做;它会在下次部署时生效。

5. 安装

./barnaby-home install

这会擦除机器的磁盘,所以它会先让你输入域名。然后它运行 nixos-anywhere,在你的计算机上构建系统,将其复制过去,并重启机器进入 NixOS(如果你是从 USB 启动的,请拔出 USB 盘)。它会写入两个你应该提交的文件:facter.json,描述机器的硬件;以及 known_hosts,其新的 SSH 主机密钥。

6. 注册

最后,install 会打印设置令牌。打开 https://chat.barn.example.com,选择“Create account”,然后使用你的用户名和该令牌注册。不到一分钟,你就成为服务器管理员,并且 Element 中会出现一个管理员房间(在“System Alerts”下)。你还会和代理一起在 General 房间中。

如果你丢失了令牌,它在服务器上:

ssh root@barn.example.com cat /var/lib/barnaby-home/registration-token

7. 邀请其他所有人

通过在管理员房间中发送以下内容来创建一个一次性邀请令牌:

!admin token issue --once --max-age 7d

将令牌和 https://chat.<domain> 链接发送给他们。一旦他们注册,他们也会进入 General 房间。

设置令牌会一直有效,所以请自己保管好。

更新

更改 configuration.nix、soul.md 或 secrets.env 后:

./barnaby-home deploy

它会在你的计算机上构建,切换服务器,如果 secrets.env 发生变化,则将其复制上去并重启代理。这会替换服务器上的副本,所以请在这里进行密钥更改,而不是在那里。如果某个技能所需的密钥缺失,服务器上的 journalctl -u barnaby-home-setup 会说明。

要更新 Barnaby Home、Barnaby 和 NixOS,然后部署:

./barnaby-home update

Docker 将 Nix store 保存在一个卷中,因此这些不会再次下载所有内容。它只会增长;docker volume rm barnaby-home-nix 会回收空间,下次运行会重新开始。

配置

一切都在 configuration.nix 中的 barnabyHome 下:

选项 默认值 作用
domain Matrix 服务器名称,以及 chat. 和 call. 的基础
disk 要安装到的磁盘
admins [ ] 注册后成为服务器管理员的用户名
location null "latitude,longitude",天气技能的默认位置
secretsFile /var/lib/barnaby-home/secrets.env 密钥所在的位置。如果你使用 agenix 或 sops 密钥,请将其指向那里。
calls.enable true 语音和视频通话
agent.name "Barnaby" 代理的显示名称
agent.username name,小写 它的 Matrix 用户名。它在首次启动时设置,所以之后更改它不会有任何效果。
agent.soul Barnaby 的,其中 name 已填入 一个包含代理个性和指令的文件,其中 @name@ 变为 name
agent.model deepseek/deepseek-v4.1-flash 它用来聊天的 OpenRouter 模型
agent.skills 见下文 要开启或关闭的技能

它是一个 Nix 文件,但你只需要这里显示的内容:true 或 false、带引号的文本、用 [ ] 表示的列表,以及每个设置后面的 ;。

代理还使用系统的 time.timeZone。

技能

技能 它的作用 需要 默认
image 绘制和编辑图像 OPENROUTER_API_KEY 开启
transcribe 读取语音消息 OPENROUTER_API_KEY 开启
sports-scores 比分、赛程和排名 OPENROUTER_API_KEY 开启
sports-monitor 观看比赛并发送一条提醒 无需其他 开启
weather 预报和天气状况 TOMORROWIO_API_KEY 关闭
web-search 使用 Kagi 搜索网络 KAGI_KEY 关闭
calendar 读取和编辑 CalDAV 日历 CALDAV_URL、CALDAV_USERNAME、CALDAV_PASSWORD 关闭
skill-writer 让代理编写自己的技能 无需其他 开启

用 agent.skills.weather = true; 开启一个,或用 false 关闭。关闭 sports-scores 也会关闭 sports-monitor。指向包含 SKILL.md 的目录的路径会添加你自己的技能;参见 Barnaby 的 技能文档。

代理自己的技能

开启 skill-writer 后,任何人都可以要求代理学习新东西(“每周日检查本周到期的事项”),然后它会为自己编写一个技能。它不能更改内置技能、它的灵魂或你配置中的任何其他内容。

  • 它的技能存放在 /var/lib/barnaby/.agents/skills 中,这是一个 git 仓库,它会提交每一次更改。要查看它做了什么,或撤销某些操作,请通过 SSH 登录并在那里使用 git log 和 git revert。
  • 每当它添加、更改或删除技能时,它都会在 General 房间中说明,即使有人是在私信中要求的。
  • 如果某个技能需要 API 密钥,它会在私信中索要,将其保存到 /var/lib/barnaby/.agents/secrets.env,并建议删除该消息。
  • 它拥有常用的命令行工具(git、ripgrep、jq、ffmpeg、ImageMagick、pandoc、Python、Node 等),并且可以 nix shell 任何其他内容。每周的垃圾回收会再次清理这些内容。

隐私

聊天服务器属于你:消息、账户和文件都留在上面。当然,代理必须将它读取的内容发送给模型。以下是它的去向:

  • 聊天:agent.model,通过 OpenRouter。默认的 DeepSeek V4.1 Flash 是一个开放模型,在 20 多家提供商处拥有 ZDR 端点。
  • 每条群组消息:Jev,一个小型 ZDR 模型,会收到每条消息以及该房间最近 20 条消息,并判断它是否是发给代理的。代理仍然会收到每条消息作为上下文,但只有发给它的消息才会开启一轮对话(并调用 agent.model)。私信会跳过 Jev,始终直接发给代理。
  • 记忆:每天晚上,agent.model 还会读取已安静 3 天的对话,并将它们写成笔记,代理之后可以搜索这些笔记。笔记保留在服务器上的 /var/lib/barnaby/memory 中。
  • 图像和语音消息:Azure 上的 Microsoft MAI 模型,通过 OpenRouter,两者均为 ZDR。
  • 天气、搜索和日历:Tomorrow.io、Kagi 和你的 CalDAV 服务器,但仅在你开启它们时。
  • 代理自己的技能:它们使用的任何服务。

代理在所有房间和私信中拥有同一个对话,所以它在 General 房间交谈时知道私信中说过什么。它被要求不要重复私信中的私密内容,但那只是一条指令,不是一堵墙。API 密钥也是如此:在私信中发送的密钥仍然存在于代理的上下文中,也存在于服务器上的会话文件中,即使消息已被删除。

Barnaby Home 目前还没有强制 OpenRouter 使用 ZDR 端点。OpenRouter 的账户设置可以做到:开启后,对没有 ZDR 端点的模型的请求会失败,而不是悄悄转到别处。

局限性

  • 还没有备份。所有东西都存放在 /var/lib 中,包括 agent 自己的技能和密钥,机器一丢就全没了。
  • General 房间是 agent 创建的,所以它是该房间的管理员。目前还没有任何机制能把这个权限交给某个人。
  • 手机应用尚未测试。浏览器中的 Element 可以正常工作,包括通话。

不使用脚本安装

如果你已经有带 flakes 的 Nix,可以跳过 Docker。该脚本运行的就是这些相同的命令。

mkdir barn && cd barn
nix flake init -t github:pkulak/barnaby-home
git init && git add .
cp secrets.env.example secrets.env && chmod 600 secrets.env

编辑 configuration.nix(至少包括域名、磁盘、管理员、时区和 SSH 密钥)以及 secrets.env。然后把 secrets.env 放到服务器期望的位置,并安装:

mkdir -p extra/var/lib/barnaby-home
chmod 755 extra extra/var extra/var/lib
chmod 700 extra/var/lib/barnaby-home
cp secrets.env extra/var/lib/barnaby-home/

nix run github:nix-community/nixos-anywhere -- \
  --flake .#home \
  --generate-hardware-config nixos-facter ./facter.json \
  --extra-files ./extra \
  --target-host root@203.0.113.10

rm -r extra
git add facter.json

要部署更改(在 Mac 上添加 --build-host root@barn.example.com):

nix run nixpkgs#nixos-rebuild -- switch --flake .#home --target-host root@barn.example.com

之后密钥存放在服务器的 /var/lib/barnaby-home/secrets.env 中;更改后请用 systemctl restart container@barnaby 重启 agent。

来源:Hacker News · github.com