部署到 Fly.io
用现成模板在几分钟内将 nostrfy 部署到 Fly.io — 卷、机器、TLS 终止和简单更新。
仓库中提供的内容
| 文件 | 用途 |
|---|---|
Dockerfile | 容器镜像 — 从 GitHub 发布资产下载预编译的发布二进制 (x86_64 / aarch64,按构建架构选择)并验证其 sha256 校验和。Fly 上不发生编译 |
fly.toml | Fly 应用配置:8080 端口的 HTTP 服务、健康检查、 /data 卷挂载、常开机器 |
deploy/nostrfy.container.toml | 烘焙到镜像中 /etc/nostrfy/nostrfy.toml 的中继配置 |
前置条件
- 一个 Fly.io 账户
- flyctl CLI(
fly version) - 已登录:
fly auth login
四步部署
1. 启动应用(暂不部署)
sh
cd /path/to/nostrfy
fly launch --no-deploy --name <your-app-name> --region <region><your-app-name>在 Fly 上必须唯一(它成为中继 URL 的一部分:wss://<your-app-name>.fly.dev)<region>:例如nrt(东京)、fra、iad、sjc— 选择离你的用户最近的区域- 这可能会覆盖模板的
fly.toml值(应用名、区域)— 没问题
2. 创建持久卷
LMDB 数据库位于挂载到 /data 的 Fly 卷上:
sh
fly volumes create data --size 1 --region <region>1 GB 起步足够(数据库随使用增长)。之后可以调整大小,或一开始就创建更大的 卷。
3. 配置中继
部署前编辑 deploy/nostrfy.container.toml:
toml
[relay]
name = "My Relay" # 通过 NIP-11 向客户端显示
description = "A friendly relay for everyone"
private_key = "..." # NIP-29 群组需要
public_url = "wss://<your-app-name>.fly.dev" # NIP-42/62/98 需要private_key:在本地用nostrfy genkey(针对临时配置)生成并粘贴密钥,或用任何 Nostr 工具生成public_url必须与你的应用名匹配 — 没有它,NIP-42 AUTH、 NIP-62 消除和 NIP-86 管理 API 将无法工作- 其他一切保持默认即可
4. 部署
sh
fly deployFly 构建镜像(几分钟 — 二进制下载很快,镜像很小),创建
机器并对 /health 运行健康检查。
验证
sh
# 日志行:"relay listening on ws://0.0.0.0:8080"
fly logs
# 通过公开地址获取 NIP-11 信息文档
curl https://<your-app-name>.fly.dev/
# 将你的 Nostr 客户端指向 wss://<your-app-name>.fly.dev扩缩容与更新
- 更新中继:编辑
deploy/nostrfy.container.toml并 再次fly deploy— 镜像总是下载最新的 GitHub 发布二进制,因此更新只是简单的重新部署 - 固定版本:
docker build --build-arg NOSTRFY_VERSION=v0.1.16 ...或更改 Dockerfile 中的ARG - 扩容:中继默认是单台机器。
fly machines clone <id>创建第二台机器;两者共享卷(Fly 卷支持同一区域的多台机器) - 指标:Fly 采集
/metrics端点(见fly.toml中的[metrics])并在 Fly 仪表盘的 Metrics 下显示
自定义配置
镜像读取 /etc/nostrfy/nostrfy.toml,它由 deploy/nostrfy.container.toml 烘焙而来。两种自定义方式:
- 在仓库中编辑
deploy/nostrfy.container.toml并重新部署 (最简单) - 挂载你自己的配置:构建一个镜像分支,将你的配置文件
复制到
/etc/nostrfy/nostrfy.toml
每个选项都记录在配置参考中。
说明
- 设计为常开:
fly.toml中的auto_stop_machines = false— 中继绝不应在空闲期间被停止 - 容器以前台模式运行中继
(
nostrfy start --foreground);日志写入 stdout/stderr 并由 Fly 收集 - TLS 由 Fly 终止;中继本身在 8080 端口提供普通 WebSocket
- Blossom 媒体主机:要同时提供 Blossom 服务器,请在配置中设置
blossom.host = "media.example.com",将media.example.com添加为同一 Fly 应用的附加主机名 (fly.toml [[services]] http_options.allowed_http_hostnames或fly hostnames),并在 Fly 仪表盘中添加media.TLS 证书 — 中继在内部拆分主机(类似server.api_host)