Déployer sur Fly.io

Déployez nostrfy sur Fly.io en quelques minutes avec le modèle prêt à l’emploi — volumes, machines, terminaison TLS et mises à jour simples.

Contenu du dépôt

FichierRôle
DockerfileImage conteneur — télécharge le binaire de release précompilé depuis les assets GitHub (x86_64 / aarch64, selon l’architecture de build) et vérifie sa somme sha256. Aucune compilation n’a lieu sur Fly
fly.tomlConfiguration de l’app Fly : service HTTP sur le port 8080, contrôles de santé, montage du volume /data, machines toujours actives
deploy/nostrfy.container.tomlLa configuration du relais intégrée à l’image sous /etc/nostrfy/nostrfy.toml

Prérequis

  • Un compte Fly.io
  • La CLI flyctl (fly version)
  • Connecté : fly auth login

Déploiement en quatre étapes

1. Créer l’app (sans déployer pour l’instant)

sh
cd /path/to/nostrfy
fly launch --no-deploy --name <your-app-name> --region <region>
  • <your-app-name> doit être unique sur Fly (il fait partie de l’URL du relais : wss://<your-app-name>.fly.dev)
  • <region> : p. ex. nrt (Tokyo), fra, iad, sjc — choisissez la région la plus proche de vos utilisateurs
  • Cela peut écraser les valeurs fly.toml du modèle (nom d’app, région) — ce n’est pas grave

2. Créer le volume persistant

La base LMDB réside sur un volume Fly monté sur /data :

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

1 Go suffit pour commencer (la base grandit avec l’usage). Vous pouvez redimensionner plus tard, ou créer dès le départ un volume plus grand.

3. Configurer le relais

Modifiez deploy/nostrfy.container.toml avant de déployer :

toml
[relay]
name = "My Relay"                              # affiché dans les clients via NIP-11
description = "A friendly relay for everyone"
private_key = "..."                            # requis pour les groupes NIP-29
public_url = "wss://<your-app-name>.fly.dev"   # requis pour NIP-42/62/98
  • private_key : générez localement avec nostrfy genkey (avec une config temporaire) et collez la clé, ou générez-en une avec n’importe quel outil Nostr
  • public_url doit correspondre à votre nom d’app — sans elle, NIP-42 AUTH, NIP-62 vanish et l’API de gestion NIP-86 ne fonctionneront pas
  • Tout le reste peut rester par défaut

4. Déployer

sh
fly deploy

Fly construit l’image (quelques minutes — le téléchargement du binaire est rapide, l’image est petite), crée une machine et exécute le contrôle de santé contre /health.

Vérifier

sh
# ligne de journal : "relay listening on ws://0.0.0.0:8080"
fly logs

# document d’information NIP-11 via l’adresse publique
curl https://<your-app-name>.fly.dev/

# pointez votre client Nostr vers wss://<your-app-name>.fly.dev

Mise à l’échelle et mises à jour

  • Mettre à jour le relais : modifiez deploy/nostrfy.container.toml et relancez fly deploy — l’image télécharge toujours le dernier binaire de release GitHub, une mise à jour est donc un simple redéploiement
  • Épingler une version : docker build --build-arg NOSTRFY_VERSION=v0.1.16 ... ou modifiez l'ARG dans le Dockerfile
  • Mise à l’échelle : le relais est une machine unique par défaut. fly machines clone <id> crée une seconde machine ; les deux partagent le volume (les volumes Fly supportent plusieurs machines dans la même région)
  • Métriques : Fly collecte l’endpoint /metrics (voir [metrics] dans fly.toml) et l’affiche dans le tableau de bord Fly sous Metrics

Personnaliser la configuration

L’image lit /etc/nostrfy/nostrfy.toml, intégré depuis deploy/nostrfy.container.toml. Deux façons de personnaliser :

  1. Modifiez deploy/nostrfy.container.toml dans le dépôt et redéployez (le plus simple)
  2. Montez votre propre config : construisez un fork de l’image qui copie votre fichier de config par-dessus /etc/nostrfy/nostrfy.toml

Chaque option est documentée dans la référence de configuration.

Remarques

  • Toujours actif par conception : auto_stop_machines = false dans fly.toml — un relais ne doit jamais être arrêté pendant les périodes d’inactivité
  • Le conteneur exécute le relais en mode avant-plan (nostrfy start --foreground) ; les logs vont vers stdout/stderr et sont collectés par Fly
  • TLS est terminé par Fly ; le relais lui-même sert du WebSocket en clair sur le port 8080
  • Hôte média Blossom : pour servir aussi le serveur Blossom, définissez blossom.host = "media.example.com" dans la config, ajoutez media.example.com comme nom d’hôte supplémentaire de la même app Fly (fly.toml [[services]] http_options.allowed_http_hostnames ou fly hostnames), et ajoutez le certificat TLS media. dans le tableau de bord Fly — le relais sépare les hôtes en interne (comme server.api_host)
TLS est terminé par Fly
Le relais lui-même sert du WebSocket en clair sur le port 8080.