一个每月 34 美元的全网络中继 | bryan newbold (🇪🇺🚄)

这是对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% /
阅读 10
0 条评论