这是对2024 年夏季博客文章的更新。当时,atproto 中继需要在本地磁盘缓存整个网络以验证数据结构。随着Sync v1.1更新,中继不再需要所有磁盘 I/O。这对托管设置和运营成本有何影响?
事实证明,开发社区抢先一步,像@futur.blue和@bad-example这样的人几个月来一直在 Raspberry Pi 和每月 19 美元的欧洲司法管辖区 VPS 服务器上这样做。
但我仍然对事情变得多么简单感到非常兴奋,所以我设置了自己每月 34 美元的 VPS 演示实例,这就是撰写的内容。
这里描述的中继运行在:https://relay-vps.demo.bsky.dev
让我们去购物
我们需要什么样的服务器?截至 2025 年 4 月,atproto 网络的消防水带吞吐量在随机一天达到约 600 个事件/秒的峰值。过去我们看到持续的速率为 2000 个事件/秒,有一些余量是很好的。
在我们(大型)生产服务器上,中继在几个 CPU 核心使用的情况下运行稳定状态,最多使用约 12GB 的 RAM。内存使用量开始较低并逐渐增加;主要被身份缓存消耗,可以进行配置降低。
我们看到消防水带 WebSocket 的持续带宽约为 30Mbps。在摄取端,这是所有 PDS 连接的总和;在输出端,它是单个统一套接字(每个消费者一个)。一些开销是好的,无论是对于流量还是从停机中恢复,所以我建议寻找一个具有 200Mbps 无计量的服务器。
磁盘曾经是主要考虑因素,但现在不是了。“回填窗口”或“重放窗口”使用最多的存储,但可以配置以减小大小(例如,1 小时或 12 小时而不是默认的 72 小时)。磁盘利用率不会无限制增长,它只是根据过去几个小时或几天的网络流量进行缩放。仍然有一个快速磁盘是很好的,但今天几百 GB 就足够了。
我检查了几个流行提供商的价格,在美国找到了一个 VPS 实例的好交易。它每月费用为 30 美元,没有设置费;加上税约为每月 34 美元。它有 8 个 vCPU、16GB RAM、160GB 磁盘和一个无计量的 1Gbps 网络连接。这甚至不是一个基本的提供商,在许多地区和司法管辖区都有类似的选项。这个实例应该有足够的资源来度过流量峰值或网络增长的几次翻倍,然后才会真正开始运行紧张。
配置和设置
我使用 Ubuntu 24.04 进行了基本安装,设置了 SSH 密钥和sudo
,并配置了 DNS。
运行的一些命令:
apt update
apt upgrade
apt install ripgrep fd-find dstat htop iotop iftop pg-activity httpie caddy golang postgresql yarnpkg build-essential
# 设置 yarn 命令;也可以使用 nvm
ln -s /usr/bin/yarnpkg /usr/bin/yarn
# 设置主机名
hostnamectl hostname relay-example.demo.bsky.dev
# 在默认防火墙中打开 HTTP/S 端口
ufw allow 80/tcp
ufw allow 443/tcp
# 创建数据目录
mkdir -p /data/relay
mkdir -p /data/relay/persist
chown ubuntu:ubuntu /data/relay/
chown ubuntu:ubuntu /data/relay/persist
可以使用 OpenSSL 创建随机密码:openssl rand -base64 24
接下来我设置了 PostgreSQL(在使用sudo -u postgres psql
连接后运行这些命令)。
CREATE USER relay WITH PASSWORD 'CHANGEME';
CREATE DATABASE relay;
GRANT ALL PRIVILEGES ON DATABASE relay TO relay;
# 这些是新版本 PostgreSQL 所需的
\c relay postgres
GRANT ALL ON SCHEMA public TO relay;
我没有费心进行任何其他 PostgreSQL 或系统调整,只是保留了所有默认设置。
Caddy 是一个很好的简单反向代理。它默认自动处理 TLS 证书和 WebSockets。你也可以使用 certbot 和 haproxy 或 nginx 来实现这一点。
在/etc/caddy/Caddyfile
创建一个系统范围的 Caddy 配置,替换任何现有文件。替换你的主机名:
relay-example.demo.bsky.dev {
reverse_proxy 127.0.0.1:2470
}
然后,在ubuntu
用户的主目录中克隆并构建项目:
# 拉取源代码并构建。如果有补丁或工作分支,在此处修改
git clone https://github.com/bluesky-social/indigo
cd indigo
make build-relay-admin-ui build
现代 Go 的一个巧妙之处是它会在需要时自动下载更新的工具链,所以你不需要费心安装特定版本。
对于演示,我只是在screen
会话中直接运行这个东西,不过你也可以在 git 仓库中查找 Dockerfile。
配置和引导
你可以使用./relay -h
和./relay serve -h
查看可用的配置变量。我建议创建一个.env
文件来存储配置。
这是我放在.env
中的内容(显然根据需要更改密码):
RELAY_ADMIN_PASSWORD=CHANGEME
DATABASE_URL=postgres://relay:CHANGEME@localhost:5432/relay
RELAY_PERSIST_DIR=/data/relay/persist
RELAY_TRUSTED_DOMAINS=*.host.bsky.network
ENVIRONMENT=demo
# 配置一个短的 2 小时回填/重放窗口
RELAY_REPLAY_WINDOW=2h
# 在 Sync v1.1 协议过渡期间保持此为'true',然后删除(例如,2025 年夏末)
RELAY_LENIENT_SYNC_VALIDATION=true
# 这一行是用于'goat'
ATP_RELAY_HOST=http://localhost:2470
Indigo 带有goat
命令行工具,对于管理和查看很有帮助。只要从与中继相同的目录运行,它就可以共享.env
文件。
此时,事情应该准备好运行了!你可以尝试以下任何一个:
# 从构建的可执行文件
./relay serve
# 每次运行时重新构建
go run./cmd/relay serve
默认情况下,中继不知道任何主机!你可能需要从现有中继引导它。关闭中继(如果正在运行),并拉入一组主机(这可能需要几分钟):
./relay pull-hosts --relay-host https://relay1.us-west.bsky.network
有了完整的主机集,每次重启后中继可能需要几分钟才能启动。目前主要原因是身份查找:从网络获取 DID 文档。很快应该可以设置一个本地 redis 实例来使重启更顺畅,但对于这样的演示来说并不是真正需要的。
就是这样!中继将从所有主机(PDS 实例)的当前游标偏移量开始消费,它不会进行任何回填。输出消防水带应该很快就可以使用。
探索和管理
中继带有一个 Web UI,你可以在https://<hostname>/dash
访问(你需要输入管理员密码)。
你也可以使用goat relay admin
命令进行账户和主机删除、禁止整个域名后缀、调整限制和配额等操作。
以下是一些用于查看的示例命令:
goat relay host diff https://relay1.us-west.bsky.network https://relay-example.demo.bsky.dev
goat firehose
goat relay host add pds.example.com
goat relay admin host list
goat firehose | pv -l -i10 > /dev/null
goat firehose --verify-basic --verify-sig --verify-mst -q
中继在一个单独的端口上导出 Prometheus 指标:
http get :2471/metrics
资源使用
我的演示中继没有使用太多 CPU:
# 运行时间
03:10:30 up 8 days, 21:39, 2 users, load average: 1.17, 1.11, 1.07
# dstat
----total-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai stl| read writ| recv send| in out | int csw
5 2 92 0 0| 0 3510k|1323k 53k| 0 0 |8480 13k
5 1 91 1 0| 0 3989k|1723k 66k| 0 0 |9132 14k
6 2 90 0 0| 0 3048k|1958k 53k| 0 0 | 10k 16k
15 3 79 1 0| 0 8927k|4516k 92k| 0 0 | 17k 26k
7 2 89 1 0| 0 4392k|1973k 57k| 0 0 | 11k 18k
8 2 88 1 0| 0 5193k|2376k 65k| 0 0 | 13k 21k
7 1 89 1 0| 0 4199k|2113k 60k| 0 0 | 12k 19k
6 2 89 1 0| 0 4688k|1943k 61k| 0 0 | 12k 19k
7 2 90 1 0| 0 3968k|1932k 55k| 0 0 | 11k 17k
6 2 89 1 0| 0 4702k|2047k 61k| 0 0 | 11k 18k
7 2 88 1 0| 0 4552k|1987k 93k| 0 0 | 13k 20k
# pg_activity
PostgreSQL 16.8 - relay-vps.demo.bsky.dev - postgres@/var/run/postgresql:5432/postgres - Ref.: 2s -
* Global: 7 days, 19 hours and 19 minutes uptime, 1.73G dbs size - 0B/s growth, 95.18% cache hit ratio
Sessions: 41/100 total, 1 active, 40 idle, 0 idle in txn, 0 idle in txn abrt, 0 waiting
Activity: 766 tps, 0 insert/s, 536 update/s, 0 delete/s, 1316 tuples returned/s, 0 temp files, 0B tem
* Worker processes: 0/8 total, 0/4 logical workers, 0/8 parallel workers
Other processes & info: 0/3 autovacuum workers, 0/10 wal senders, 0 wal receivers, 0/10 repl. slots
* Mem.: 15.25G total, 323.92M (2.07%) free, 2.06G (13.48%) used, 12.88G (84.44%) buff+cached
Swap: 0B total, 0B (-) free, 0B (-) used
IO: 0/s max iops, 0B/s - 0/s read, 0B/s - 0/s write
Load average: 1.31 1.12 1.08
# sudo du -sh /data/relay /var/log /var/lib/postgresql/
21G /data/relay
114M /var/log
2.4G /var/lib/postgresql/
# df -h /
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 154G 30G 125G 19% /
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。