部署到 Fly.io

用现成模板在几分钟内将 nostrfy 部署到 Fly.io — 卷、机器、TLS 终止和简单更新。

仓库中提供的内容

文件用途
Dockerfile容器镜像 — 从 GitHub 发布资产下载预编译的发布二进制 (x86_64 / aarch64,按构建架构选择)并验证其 sha256 校验和。Fly 上不发生编译
fly.tomlFly 应用配置: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 deploy

Fly 构建镜像(几分钟 — 二进制下载很快,镜像很小),创建 机器并对 /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 烘焙而来。两种自定义方式:

  1. 在仓库中编辑 deploy/nostrfy.container.toml 并重新部署 (最简单)
  2. 挂载你自己的配置:构建一个镜像分支,将你的配置文件 复制到 /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)
TLS 由 Fly 终止
中继本身在 8080 端口提供普通 WebSocket。