Desplegar en Fly.io
Despliega nostrfy en Fly.io en pocos minutos con la plantilla lista — volúmenes, máquinas, terminación TLS y actualizaciones sencillas.
Qué incluye el repositorio
| Archivo | Propósito |
|---|---|
Dockerfile | Imagen de contenedor — descarga el binario de release precompilado desde los assets de GitHub (x86_64 / aarch64, según la arquitectura de compilación) y verifica su checksum sha256. No se compila nada en Fly |
fly.toml | Configuración de la app Fly: servicio HTTP en el puerto 8080, comprobaciones de estado, montaje del volumen /data, máquinas siempre activas |
deploy/nostrfy.container.toml | La configuración del relé incluida en la imagen en /etc/nostrfy/nostrfy.toml |
Requisitos previos
- Una cuenta de Fly.io
- La CLI flyctl (
fly version) - Sesión iniciada:
fly auth login
Despliegue en cuatro pasos
1. Crea la app (sin desplegar todavía)
sh
cd /path/to/nostrfy
fly launch --no-deploy --name <your-app-name> --region <region><your-app-name>debe ser único en Fly (forma parte de la URL del relé:wss://<your-app-name>.fly.dev)<region>: p. ej.nrt(Tokio),fra,iad,sjc— elige la región más cercana a tus usuarios- Esto puede sobrescribir los valores
fly.tomlde la plantilla (nombre de app, región) — no pasa nada
2. Crea el volumen persistente
La base de datos LMDB vive en un volumen Fly montado en /data:
sh
fly volumes create data --size 1 --region <region>1 GB es suficiente para empezar (la base crece con el uso). Puedes redimensionar más tarde o crear desde el inicio un volumen mayor.
3. Configura el relé
Edita deploy/nostrfy.container.toml antes de desplegar:
toml
[relay]
name = "My Relay" # se muestra en clientes vía NIP-11
description = "A friendly relay for everyone"
private_key = "..." # obligatorio para grupos NIP-29
public_url = "wss://<your-app-name>.fly.dev" # obligatorio para NIP-42/62/98private_key: genera localmente connostrfy genkey(con una config temporal) y pega la clave, o genera una con cualquier herramienta Nostrpublic_urldebe coincidir con tu nombre de app — sin ella, NIP-42 AUTH, NIP-62 vanish y la API de gestión NIP-86 no funcionarán- Todo lo demás puede quedar por defecto
4. Desplegar
sh
fly deployFly construye la imagen (unos minutos — la descarga del binario es rápida, la imagen es pequeña), crea una máquina y ejecuta la comprobación de estado contra /health.
Verificar
sh
# línea de registro: "relay listening on ws://0.0.0.0:8080"
fly logs
# documento de información NIP-11 sobre la dirección pública
curl https://<your-app-name>.fly.dev/
# apunta tu cliente Nostr a wss://<your-app-name>.fly.devEscalado y actualizaciones
- Actualizar el relé: edita
deploy/nostrfy.container.tomly repitefly deploy— la imagen siempre descarga el último binario de release de GitHub, así que actualizar es un simple redespliegue - Fijar una versión:
docker build --build-arg NOSTRFY_VERSION=v0.1.16 ...o cambia elARGen el Dockerfile - Escalar: el relé es una sola máquina por defecto.
fly machines clone <id>crea una segunda máquina; ambas comparten el volumen (los volúmenes Fly admiten varias máquinas en la misma región) - Métricas: Fly recoge el endpoint
/metrics(ver[metrics]enfly.toml) y lo muestra en el panel de Fly bajo Metrics
Personalizar la configuración
La imagen lee /etc/nostrfy/nostrfy.toml, generado desde deploy/nostrfy.container.toml. Dos formas de personalizar:
- Edita
deploy/nostrfy.container.tomlen el repositorio y redespliega (lo más simple) - Monta tu propia config: construye un fork de la imagen que copie tu archivo de config sobre
/etc/nostrfy/nostrfy.toml
Cada opción está documentada en la referencia de configuración.
Notas
- Siempre activo por diseño:
auto_stop_machines = falseenfly.toml— un relé nunca debe detenerse en periodos de inactividad - El contenedor ejecuta el relé en modo primer plano (
nostrfy start --foreground); los logs van a stdout/stderr y los recoge Fly - TLS lo termina Fly; el relé sirve WebSocket sin cifrar en el puerto 8080
- Host multimedia Blossom: para servir también el servidor Blossom, pon
blossom.host = "media.example.com"en la config, añademedia.example.comcomo nombre de host adicional de la misma app Fly (fly.toml [[services]] http_options.allowed_http_hostnamesofly hostnames), y añade el certificado TLS demedia.en el panel de Fly — el relé separa los hosts internamente (comoserver.api_host)