Barnaby 发布自托管 Matrix 房间智能体,一条命令部署
Barnaby: Self-hosted Matrix agent that reads the room
Barnaby 发布自托管 Matrix 智能体方案 Barnaby Home,用一条命令把闲置电脑或 VPS 变成完整 Matrix 服务器,包含 Element 聊天、加密房间和音视频通话,智能体常驻主房间。
一个供你的家人或朋友使用的私密群聊,里面有一个融入其中的 AI 智能体。一个脚本就能把一台闲置电脑或 VPS 变成完整的 Matrix 服务器:Element 聊天、加密房间、语音和视频通话。一个 Barnaby 智能体住在主房间里。
智能体。大多数聊天机器人希望被 @ 提及或进行一对一对话。Barnaby 会阅读整个房间的内容,一个微型决策模型会挑出针对它的消息,所以人们可以正常交谈,当有人跟它说话时它就会插话。它会记住过去的对话,而且只需 OpenRouter 密钥,它就能画图、读取语音消息、跟进游戏,并在有人要求时为自己编写新技能。
聊天服务器。自托管 Matrix 通常意味着要配置一个 homeserver、一个 Web 客户端、多个子域的证书、用于通话的 TURN 和 LiveKit,以及某种处理邀请的方式。Barnaby Home 只需一个域名、一个 SSH 密钥和一个 OpenRouter 密钥就能完成所有这些。你需要在电脑上安装 Docker,而不需要 Nix 经验。
全新安装后的样子
你将获得
- 技术栈: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
