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

ArchivoPropósito
DockerfileImagen 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.tomlConfiguració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.tomlLa 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.toml de 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/98
  • private_key: genera localmente con nostrfy genkey (con una config temporal) y pega la clave, o genera una con cualquier herramienta Nostr
  • public_url debe 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 deploy

Fly 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.dev

Escalado y actualizaciones

  • Actualizar el relé: edita deploy/nostrfy.container.toml y repite fly 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 el ARG en 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] en fly.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:

  1. Edita deploy/nostrfy.container.toml en el repositorio y redespliega (lo más simple)
  2. 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 = false en fly.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ñade media.example.com como nombre de host adicional de la misma app Fly (fly.toml [[services]] http_options.allowed_http_hostnames o fly hostnames), y añade el certificado TLS de media. en el panel de Fly — el relé separa los hosts internamente (como server.api_host)
TLS lo termina Fly
El relé sirve WebSocket sin cifrar en el puerto 8080.