Herkos

Votre propre relais boîte aux lettres

Dernière mise à jour : 3 octobre 2026

Le courrier Herkos voyage sous forme d'enveloppes scellées (gift wraps NIP-59) et attend sur les relais de votre liste de relais DM jusqu'à ce que votre application le récupère. La plupart des relais publics remettent ces enveloppes à quiconque les demande. Personne ne peut les ouvrir, mais n'importe qui peut compter qui reçoit du courrier et quand, et le relais peut les supprimer quand bon lui semble.

Un relais à vous qui demande qui lit (NIP-42) ne remet vos enveloppes qu'à vous, et les garde aussi longtemps que vous le décidez. Cette page explique comment en mettre un en place en trois étapes, plus une sauvegarde chaque nuit. Comptez environ un quart d'heure si vous avez déjà un serveur.

Quel relais utiliser

Nous avons fait tourner les deux candidats le 24 septembre 2026 et vérifié ce qu'ils font réellement du courrier, pas ce qu'ils annoncent.

nogringo/nostr-relay HAVEN 1.2.2
Qui peut lire vos enveloppes Vous seul, après identification /chat : toute personne de votre réseau de confiance, après identification. /inbox : n'importe qui, sans identification
Qui peut vous livrer du courrier Tout expéditeur qui s'identifie Uniquement votre réseau de confiance
Supprimer le courrier reçu Oui Non
Resynchronisation rapide (NIP-77) Oui Non
Licence MIT MIT

Utilisez nogringo/nostr-relay comme boîte aux lettres. C'est celui qui fait ce dont le courrier a besoin : n'importe qui peut vous écrire, et vous seul pouvez lire. HAVEN est un bon outil pour d'autres usages (une boîte d'envoi personnelle, des médias, des notes privées), mais comme boîte aux lettres il refuserait le courrier de toute personne que vous ne suivez pas, y compris le bridge qui achemine le courriel ordinaire.

Ce qu'il vous faut

Étape 1 : lancer le relais

git clone https://github.com/nogringo/nostr-relay
cd nostr-relay
cp .env.example .env

Modifiez .env : donnez un nom au relais (RELAY_NAME) et réglez RELAY_URLS sur son adresse publique, wss://relay.example.com.

Ouvrez ensuite docker-compose.yml et remplacez la ligne du port par "127.0.0.1:3334:3334". Le relais se fie à l'adresse que le proxy lui transmet lorsqu'il vérifie qui s'identifie : il ne doit donc être joignable qu'à travers le proxy. Démarrez-le :

docker compose up -d

Étape 2 : mettre le HTTPS devant

Avec Caddy, toute la configuration (/etc/caddy/Caddyfile) tient en :

relay.example.com {
    reverse_proxy 127.0.0.1:3334
}

Rechargez Caddy (sudo systemctl reload caddy). En ouvrant https://relay.example.com dans un navigateur, vous devriez maintenant obtenir une réponse.

Étape 3 : l'indiquer à Herkos

  1. Dans Herkos, ouvrez Paramètres → Réseau et serveurs → Ton propre relais et touchez Vérifier un relais. Saisissez wss://relay.example.com.
  2. Herkos s'y connecte et le met à l'épreuve : il demande le courrier de quelqu'un d'autre, et il dépose une enveloppe de test venant d'un inconnu (puis la supprime). Vous devriez voir Toi seul peux lire ton courrier ici et Accepte le courrier de n'importe quel expéditeur.
  3. Touchez En faire ton premier relais DM, puis Enregistrer en haut.

Gardez aussi un relais public dans la liste, en deuxième position : si votre serveur est hors service, le courrier a toujours un endroit où attendre. relay.damus.io est un bon second choix, car il demande lui aussi qui lit.

Étape 4 : le sauvegarder chaque nuit

Herkos garde sa propre copie du courrier qu'il a récupéré, mais une enveloppe arrivée pendant que votre application était fermée n'existe que sur votre serveur jusqu'à ce que vous ouvriez Herkos. Une copie nocturne couvre ce trou, et elle vous permet de reconstruire le serveur si le disque lâche ou si l'hébergeur ferme votre compte.

Le relais garde tout dans une base de données LMDB à l'intérieur du volume Docker nostr-relay_relay-db (le nom commence par le dossier dans lequel vous avez cloné ; vérifiez-le avec docker volume ls). Un fichier LMDB copié pendant que le relais y écrit risque de ne pas s'ouvrir : le script arrête donc le relais pendant les quelques secondes que prend une copie locale, le redémarre, et seulement ensuite téléverse la copie. Pendant l'arrêt, le courrier attend sur le relais public que vous avez gardé en deuxième position dans votre liste.

La copie quitte le serveur avec restic, qui la chiffre avant qu'elle ne parte. Utilisez un emplacement chez un autre fournisseur que celui du serveur : un compte SFTP (une storage box, un ordinateur chez vous) ou un bucket compatible S3.

  1. Installez les outils et créez le dépôt. Gardez aussi le mot de passe dans votre gestionnaire de mots de passe : sans lui, les copies sont illisibles, et s'il ne vit que sur le serveur, il meurt avec le serveur. Pour SFTP, root a aussi besoin d'une clé SSH acceptée par la machine de sauvegarde (sudo ssh-keygen -t ed25519, puis ajoutez-y /root/.ssh/id_ed25519.pub).

    sudo apt install restic rsync
    sudo sh -c 'openssl rand -base64 32 > /root/.restic-password'
    sudo sh -c 'cat > /root/.restic-env' <<'END'
    export RESTIC_REPOSITORY=sftp:backup@backup.example.com:/relay
    export RESTIC_PASSWORD_FILE=/root/.restic-password
    END
    sudo chmod 600 /root/.restic-password /root/.restic-env
    sudo sh -c '. /root/.restic-env && restic init'
    
  2. Enregistrez ceci sous /usr/local/bin/backup-relay et rendez-le exécutable (sudo chmod 700 /usr/local/bin/backup-relay). Modifiez RELAY_DIR si vous n'avez pas cloné dans /root/nostr-relay. Il conserve les 14 derniers jours, 8 semaines et 12 mois : un an d'historique, pour une taille proche de celle de la base de données.

    #!/bin/sh
    set -eu
    . /root/.restic-env
    RELAY_DIR=/root/nostr-relay
    COPY=/var/backups/relay-db
    VOLUME=$(docker volume inspect --format '{{ .Mountpoint }}' nostr-relay_relay-db)
    mkdir -p "$COPY"
    cd "$RELAY_DIR"
    docker compose stop relay
    trap 'docker compose start relay' EXIT
    rsync -a --delete "$VOLUME/" "$COPY/"
    docker compose start relay
    trap - EXIT
    restic backup "$COPY" --tag relay
    restic forget --tag relay --keep-daily 14 --keep-weekly 8 --keep-monthly 12 --prune
    
  3. Lancez-le une fois à la main (sudo /usr/local/bin/backup-relay), puis planifiez-le avec sudo crontab -e. La deuxième ligne relit chaque mois un dixième des données stockées, un dixième différent à chaque fois, pour prouver que les copies peuvent toujours être ouvertes. Jetez un œil de temps en temps à /var/log/backup-relay.log : une ligne contenant Fatal signifie que la copie de cette nuit-là a échoué.

    15 4 * * * /usr/local/bin/backup-relay >> /var/log/backup-relay.log 2>&1
    45 5 1 * * . /root/.restic-env && restic check --read-data-subset=10% >> /var/log/backup-relay.log 2>&1
    

Pour restaurer (un nouveau serveur, ou après une panne de disque) : remettez le relais en place (étapes 1 à 3) et refaites les points 1 et 2 de cette étape avec le même dépôt, mais écrivez le mot de passe que vous avez conservé dans /root/.restic-password au lieu d'en créer un nouveau, et sautez restic init. Copiez ensuite la dernière sauvegarde dans le volume du relais :

sudo sh -c '. /root/.restic-env && restic restore latest --tag relay --target /'
cd /root/nostr-relay && sudo docker compose stop relay
sudo rsync -a --delete /var/backups/relay-db/ "$(sudo docker volume inspect --format '{{ .Mountpoint }}' nostr-relay_relay-db)/"
sudo docker compose start relay

Une fois par an, faites cette restauration sur une machine de rechange et vérifiez que le relais démarre avec votre courrier dedans : c'est le seul test qui prouve toute la chaîne, mot de passe compris.

Bon à savoir