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
- Una macchina sempre accesa e raggiungibile da internet: un piccolo VPS (circa 4-6 € al mese) o un computer a casa.
- Un dominio o sottodominio che punti a essa, per esempio
relay.example.com. - Docker e un reverse proxy che fornisca HTTPS. Gli esempi usano Caddy, che ottiene il certificato da solo.
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
- In Herkos, apri Impostazioni → Rete e server → Il tuo relay personale e tocca
Verifica un relay. Inserisci
wss://relay.example.com. - 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.
- 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.
-
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' -
Salva questo come
/usr/local/bin/backup-relaye rendilo eseguibile (sudo chmod 700 /usr/local/bin/backup-relay). CambiaRELAY_DIRse 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 -
Eseguilo una volta a mano (
sudo /usr/local/bin/backup-relay), poi pianificalo consudo 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.logogni tanto: una riga conFatalsignifica 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
- È un relay generico. Oltre alla tua posta accetta note pubbliche da chiunque, quindi altre persone potrebbero archiviare cose sul tuo server. Per ora non ha un'impostazione per rifiutarle.
- La posta dall'email tradizionale arriva attraverso un bridge, che deve identificarsi quando il tuo relay lo chiede. Se dopo il cambio l'email tradizionale smette di arrivare, il relay pubblico che hai tenuto nell'elenco continuerà a riceverla.
- Fai il backup dei dati (passo 4). Le buste vivono nel volume Docker
relay-db, e la posta che la tua app non ha ancora ritirato esiste solo lì. - Il tuo indirizzo IP. Il relay vede l'indirizzo di ogni app che vi si connette, come qualsiasi relay. Sul tuo server, l'unico che li vede sei tu.