Herkos

La teva pròpia bústia: un relay

Última actualització: 3 d'octubre de 2026

El correu de Herkos viatja en sobres segellats (gift wraps NIP-59) i espera als relays de la teva llista de relays DM fins que la teva aplicació el recull. La majoria de relays públics lliuren aquests sobres a qualsevol que els demani. Ningú no els pot obrir, però qualsevol pot comptar qui rep correu i quan, i el relay els pot esborrar quan vulgui.

Un relay propi que pregunta qui llegeix (NIP-42) et dona els sobres a tu i a ningú més, i els guarda tant de temps com decideixis. Aquesta pàgina explica com muntar-ne un en tres passos, més una còpia de seguretat cada nit. Calen uns quinze minuts si ja tens un servidor.

Quin relay cal fer servir

Vam posar en marxa tots dos candidats el 24 de setembre de 2026 i vam comprovar què fan realment amb el correu, no què anuncien.

nogringo/nostr-relay HAVEN 1.2.2
Qui pot llegir els teus sobres Només tu, després d'identificar-te /chat: qualsevol de la teva xarxa de confiança, després d'identificar-se. /inbox: qualsevol, sense identificar-se
Qui et pot lliurar correu Qualsevol remitent que s'identifiqui Només la teva xarxa de confiança
Esborrar el correu que has rebut Sí No
Resincronització ràpida (NIP-77) Sí No
Llicència MIT MIT

Fes servir nogringo/nostr-relay com a bústia. És el que fa el que el correu necessita: qualsevol et pot escriure, i només tu pots llegir. HAVEN és una bona eina per a altres coses (una safata de sortida personal, multimèdia, notes privades), però com a bústia rebutjaria el correu de qualsevol que no segueixis, inclòs el bridge que porta el correu tradicional.

Què et cal

Pas 1: posa en marxa el relay

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

Edita .env: dona un nom al relay (RELAY_NAME) i posa a RELAY_URLS la seva adreça pública, wss://relay.example.com.

Després obre docker-compose.yml i canvia la línia del port per "127.0.0.1:3334:3334". El relay es refia de l'adreça que li passa el proxy quan comprova qui s'identifica, així que només ha de ser accessible a través del proxy. Engega'l:

docker compose up -d

Pas 2: posa-hi HTTPS al davant

Amb Caddy, tota la configuració (/etc/caddy/Caddyfile) és:

relay.example.com {
    reverse_proxy 127.0.0.1:3334
}

Recarrega Caddy (sudo systemctl reload caddy). Si obres https://relay.example.com en un navegador, ara hauria de respondre.

Pas 3: digues-ho a Herkos

  1. A Herkos, obre Ajustos → Xarxa i servidors → El teu relay personal i toca Comprova un relay. Escriu wss://relay.example.com.
  2. Herkos s'hi connecta i el prova: demana el correu d'una altra persona i hi deixa un sobre de prova d'un desconegut (que després esborra). Hauries de veure Només tu pots llegir aquí el teu correu i Accepta correu de qualsevol remitent.
  3. Toca Posa'l com a primer relay DM, i Desa a dalt de tot.

Mantén també un relay públic a la llista, en segon lloc: si el teu servidor cau, el correu continua tenint on esperar. relay.damus.io és una bona segona opció, perquè també pregunta qui llegeix.

Pas 4: fes-ne una còpia de seguretat cada nit

Herkos guarda la seva pròpia còpia del correu que ha recollit, però un sobre que ha arribat mentre l'aplicació estava tancada només existeix al teu servidor fins que obres Herkos. Una còpia cada nit cobreix aquest buit, i et permet refer el servidor si el disc mor o el proveïdor et tanca el compte.

El relay ho guarda tot en una sola base de dades LMDB dins del volum de Docker nostr-relay_relay-db (el nom comença amb la carpeta on l'has clonat; comprova-ho amb docker volume ls). Un fitxer LMDB copiat mentre el relay hi escriu pot no obrir-se, així que l'script atura el relay els pocs segons que triga una còpia local, el torna a engegar, i només llavors puja la còpia. Mentre està aturat, el correu espera al relay públic que has deixat en segon lloc a la llista.

La còpia surt del servidor amb restic, que la xifra abans que surti. Fes servir un lloc d'un proveïdor diferent del del servidor: un compte SFTP (una storage box, un ordinador a casa) o un bucket compatible amb S3.

  1. Instal·la les eines i crea el repositori. Guarda la contrasenya també al teu gestor de contrasenyes: sense ella les còpies no es poden llegir, i si només viu al servidor, mor amb el servidor. Per a SFTP, root també necessita una clau SSH que la màquina de còpies accepti (sudo ssh-keygen -t ed25519, i després afegeix-hi /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. Desa això com a /usr/local/bin/backup-relay i fes-lo executable (sudo chmod 700 /usr/local/bin/backup-relay). Canvia RELAY_DIR si no l'has clonat a /root/nostr-relay. Conserva els últims 14 dies, 8 setmanes i 12 mesos: un any enrere, amb una mida propera a la de la base de dades.

    #!/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. Executa'l una vegada a mà (sudo /usr/local/bin/backup-relay) i després programa'l amb sudo crontab -e. La segona línia torna a llegir una desena part de les dades guardades cada mes, una desena diferent cada vegada, per demostrar que les còpies encara es poden obrir. Mira de tant en tant /var/log/backup-relay.log: una línia amb Fatal vol dir que la còpia d'aquella nit ha fallat.

    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
    

Per restaurar (un servidor nou, o després d'una avaria del disc): torna a muntar el relay (passos 1 a 3) i repeteix els punts 1 i 2 d'aquest pas amb el mateix repositori, però escriu la contrasenya que vas guardar a /root/.restic-password en lloc de crear-ne una de nova, i salta't restic init. Després copia l'última còpia al volum del relay:

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

Un cop l'any, fes aquesta restauració en una màquina de recanvi i comprova que el relay arrenca amb el teu correu a dins: és l'única prova que demostra tota la cadena, contrasenya inclosa.

Bo de saber