Herkos

Il tuo relay per la posta

Ultimo aggiornamento: 3 ottobre 2026

La posta di Herkos viaggia in buste sigillate (gift wrap NIP-59) e attende sui relay del tuo elenco di relay DM finché la tua app non la ritira. La maggior parte dei relay pubblici consegna quelle buste a chiunque le chieda. Nessuno può aprirle, ma chiunque può contare chi riceve posta e quando, e il relay può eliminarle quando vuole.

Un relay tutto tuo che chiede chi sta leggendo (NIP-42) consegna le tue buste a te e a nessun altro, e le conserva per tutto il tempo che decidi tu. Questa pagina spiega come configurarne uno in tre passi, più un backup notturno. Ci vogliono circa quindici minuti se hai già un server.

Quale relay usare

Il 24 settembre 2026 abbiamo messo alla prova entrambi i candidati e verificato cosa fanno davvero con la posta, non cosa dichiarano.

nogringo/nostr-relay HAVEN 1.2.2
Chi può leggere le tue buste Solo tu, dopo esserti identificato /chat: chiunque nella tua rete di fiducia, dopo essersi identificato. /inbox: chiunque, senza identificazione
Chi può consegnarti posta Qualsiasi mittente che si identifichi Solo la tua rete di fiducia
Eliminare la posta ricevuta Sì No
Risincronizzazione rapida (NIP-77) Sì No
Licenza MIT MIT

Usa nogringo/nostr-relay come casella di posta. È quello che fa ciò di cui la posta ha bisogno: chiunque può scriverti, e solo tu puoi leggere. HAVEN è un buon strumento per altre cose (una outbox personale, contenuti multimediali, note private), ma come casella di posta respingerebbe la posta di chiunque tu non segua, compreso il bridge che trasporta l'email tradizionale.

Cosa ti serve

Passo 1: avvia il relay

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

Modifica .env: dai un nome al relay (RELAY_NAME) e imposta RELAY_URLS sul suo indirizzo pubblico, wss://relay.example.com.

Poi apri docker-compose.yml e cambia la riga della porta in "127.0.0.1:3334:3334". Il relay si fida dell'indirizzo che il proxy gli inoltra quando controlla chi si sta identificando, quindi deve essere raggiungibile solo attraverso il proxy. Avvialo:

docker compose up -d

Passo 2: metti HTTPS davanti

Con Caddy, l'intera configurazione (/etc/caddy/Caddyfile) è:

relay.example.com {
    reverse_proxy 127.0.0.1:3334
}

Ricarica Caddy (sudo systemctl reload caddy). Aprendo https://relay.example.com in un browser ora dovrebbe rispondere.

Passo 3: dillo a Herkos

  1. In Herkos, apri Impostazioni → Rete e server → Il tuo relay personale e tocca Verifica un relay. Inserisci wss://relay.example.com.
  2. Herkos si connette e lo mette alla prova: chiede la posta di qualcun altro e lascia una busta di prova da parte di uno sconosciuto (poi la elimina). Dovresti vedere Solo tu puoi leggere qui la tua posta e Accetta posta da qualsiasi mittente.
  3. Tocca Rendilo il tuo primo relay DM, e Salva in alto.

Tieni anche un relay pubblico nell'elenco, al secondo posto: se il tuo server è giù, la posta ha comunque un posto dove attendere. relay.damus.io è una buona seconda scelta, perché anch'esso chiede chi sta leggendo.

Passo 4: fanne un backup ogni notte

Herkos conserva una propria copia della posta che ha ritirato, ma una busta arrivata mentre la tua app era chiusa esiste solo sul tuo server finché non apri Herkos. Una copia notturna copre quel vuoto, e ti permette di ricostruire il server se il disco si guasta o il fornitore chiude il tuo account.

Il relay conserva tutto in un unico database LMDB dentro il volume Docker nostr-relay_relay-db (il nome inizia con la cartella in cui hai clonato; verificalo con docker volume ls). Un file LMDB copiato mentre il relay ci sta scrivendo potrebbe non aprirsi, quindi lo script ferma il relay per i pochi secondi che richiede una copia locale, lo riavvia e solo allora carica la copia. Mentre è fermo, la posta attende sul relay pubblico che hai tenuto al secondo posto nell'elenco.

La copia lascia il server con restic, che la cifra prima che parta. Usa una destinazione presso un fornitore diverso da quello del server: un account SFTP (uno storage box, un computer a casa) o un bucket compatibile S3.

  1. Installa gli strumenti e crea il repository. Conserva la password anche nel tuo gestore di password: senza di essa le copie non si possono leggere, e se vive solo sul server, muore con il server. Per SFTP, root ha anche bisogno di una chiave SSH accettata dalla macchina di backup (sudo ssh-keygen -t ed25519, poi aggiungi lì /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. Salva questo come /usr/local/bin/backup-relay e rendilo eseguibile (sudo chmod 700 /usr/local/bin/backup-relay). Cambia RELAY_DIR se non hai clonato in /root/nostr-relay. Conserva gli ultimi 14 giorni, 8 settimane e 12 mesi: un anno indietro, con una dimensione vicina a quella del database.

    #!/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. Eseguilo una volta a mano (sudo /usr/local/bin/backup-relay), poi pianificalo con sudo crontab -e. La seconda riga rilegge un decimo dei dati archiviati ogni mese, un decimo diverso ogni volta, per dimostrare che le copie si possono ancora aprire. Dai un'occhiata a /var/log/backup-relay.log ogni tanto: una riga con Fatal significa che la copia di quella notte non è riuscita.

    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 ripristinare (un nuovo server, o dopo un guasto del disco): configura di nuovo il relay (passi da 1 a 3) e ripeti i punti 1 e 2 di questo passo con lo stesso repository, ma scrivi in /root/.restic-password la password che hai conservato invece di crearne una nuova, e salta restic init. Poi copia l'ultimo backup nel volume 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

Una volta all'anno, esegui questo ripristino su una macchina di riserva e verifica che il relay si avvii con dentro la tua posta: è l'unico test che dimostra l'intera catena, password compresa.

Buono a sapersi