Implantar na Fly.io

Implante o nostrfy na Fly.io em poucos minutos com o modelo pronto — volumes, máquinas, terminação TLS e atualizações simples.

O que vem no repositório

ArquivoFinalidade
DockerfileImagem de contêiner — baixa o binário de release pré-compilado dos assets do GitHub (x86_64 / aarch64, conforme a arquitetura de build) e verifica seu checksum sha256. Nenhuma compilação acontece na Fly
fly.tomlConfiguração do app Fly: serviço HTTP na porta 8080, verificações de saúde, montagem do volume /data, máquinas sempre ativas
deploy/nostrfy.container.tomlA configuração do relay embutida na imagem em /etc/nostrfy/nostrfy.toml

Pré-requisitos

  • Uma conta Fly.io
  • A CLI flyctl (fly version)
  • Autenticado: fly auth login

Implantação em quatro passos

1. Crie o app (sem implantar ainda)

sh
cd /path/to/nostrfy
fly launch --no-deploy --name <your-app-name> --region <region>
  • <your-app-name> deve ser único na Fly (faz parte da URL do relay: wss://<your-app-name>.fly.dev)
  • <region>: ex. nrt (Tóquio), fra, iad, sjc — escolha a região mais próxima dos seus usuários
  • Isso pode sobrescrever os valores fly.toml do modelo (nome do app, região) — não há problema

2. Crie o volume persistente

O banco LMDB fica em um volume Fly montado em /data:

sh
fly volumes create data --size 1 --region <region>

1 GB é suficiente para começar (o banco cresce com o uso). Você pode redimensionar depois ou criar um volume maior desde o início.

3. Configure o relay

Edite deploy/nostrfy.container.toml antes de implantar:

toml
[relay]
name = "My Relay"                              # exibido nos clientes via NIP-11
description = "A friendly relay for everyone"
private_key = "..."                            # obrigatório para grupos NIP-29
public_url = "wss://<your-app-name>.fly.dev"   # obrigatório para NIP-42/62/98
  • private_key: gere localmente com nostrfy genkey (com uma config temporária) e cole a chave, ou gere com qualquer ferramenta Nostr
  • public_url deve corresponder ao nome do seu app — sem ela, NIP-42 AUTH, NIP-62 vanish e a API de gerenciamento NIP-86 não funcionarão
  • Todo o resto pode ficar nos padrões

4. Implantar

sh
fly deploy

A Fly constrói a imagem (alguns minutos — o download do binário é rápido, a imagem é pequena), cria uma máquina e executa a verificação de saúde contra /health.

Verificar

sh
# linha de log: "relay listening on ws://0.0.0.0:8080"
fly logs

# documento de informações NIP-11 no endereço público
curl https://<your-app-name>.fly.dev/

# aponte seu cliente Nostr para wss://<your-app-name>.fly.dev

Escala e atualizações

  • Atualizar o relay: edite deploy/nostrfy.container.toml e execute fly deploy novamente — a imagem sempre baixa o binário mais recente de release do GitHub, então atualizar é uma simples nova implantação
  • Fixar uma versão: docker build --build-arg NOSTRFY_VERSION=v0.1.16 ... ou altere o ARG no Dockerfile
  • Escala: o relay é uma única máquina por padrão. fly machines clone <id> cria uma segunda máquina; ambas compartilham o volume (volumes Fly suportam várias máquinas na mesma região)
  • Métricas: a Fly coleta o endpoint /metrics (veja [metrics] em fly.toml) e mostra no painel Fly em Metrics

Personalizar a configuração

A imagem lê /etc/nostrfy/nostrfy.toml, embutido a partir de deploy/nostrfy.container.toml. Duas formas de personalizar:

  1. Edite deploy/nostrfy.container.toml no repositório e reimplante (mais simples)
  2. Monte sua própria config: construa um fork da imagem que copie seu arquivo de config sobre /etc/nostrfy/nostrfy.toml

Cada opção está documentada na referência de configuração.

Observações

  • Sempre ativo por design: auto_stop_machines = false em fly.toml — um relay nunca deve ser parado em períodos ociosos
  • O contêiner executa o relay em modo foreground (nostrfy start --foreground); logs vão para stdout/stderr e são coletados pela Fly
  • O TLS é terminado pela Fly; o relay serve WebSocket puro na porta 8080
  • Host de mídia Blossom: para servir também o servidor Blossom, defina blossom.host = "media.example.com" na config, adicione media.example.com como nome de host adicional do mesmo app Fly (fly.toml [[services]] http_options.allowed_http_hostnames ou fly hostnames), e adicione o certificado TLS de media. no painel Fly — o relay separa os hosts internamente (como server.api_host)
TLS é terminado pela Fly
O relay serve WebSocket puro na porta 8080.