Herkos

Uw eigen postbusrelay

Laatst bijgewerkt: 3 oktober 2026

Herkos-e-mail reist als verzegelde enveloppen (NIP-59 gift wraps) en wacht op de relays in uw lijst met DM-relays tot uw app hem ophaalt. De meeste openbare relays geven die enveloppen aan iedereen die erom vraagt. Niemand kan ze openen, maar iedereen kan tellen wie e-mail ontvangt en wanneer, en het relay kan ze verwijderen wanneer het wil.

Een eigen relay dat vraagt wie er leest (NIP-42) geeft uw enveloppen aan u en aan niemand anders, en bewaart ze zo lang als u beslist. Deze pagina legt uit hoe u er in drie stappen een opzet, plus een nachtelijke back-up. Het kost ongeveer een kwartier als u al een server hebt.

Welk relay te gebruiken

We hebben beide kandidaten op 24 september 2026 gedraaid en gecontroleerd wat ze werkelijk met e-mail doen, niet wat ze beloven.

nogringo/nostr-relay HAVEN 1.2.2
Wie uw enveloppen kan lezen Alleen u, na identificatie /chat: iedereen in uw web of trust, na identificatie. /inbox: iedereen, zonder identificatie
Wie u e-mail kan bezorgen Elke afzender die zich identificeert Alleen uw web of trust
Ontvangen e-mail verwijderen Ja Nee
Snelle hersynchronisatie (NIP-77) Ja Nee
Licentie MIT MIT

Gebruik nogringo/nostr-relay als uw postbus. Dat is het relay dat doet wat e-mail nodig heeft: iedereen kan u schrijven, en alleen u kunt lezen. HAVEN is een goed hulpmiddel voor andere dingen (een persoonlijke outbox, media, privénotities), maar als postbus zou het e-mail weigeren van iedereen die u niet volgt, inclusief de bridge die gewone e-mail doorgeeft.

Wat u nodig hebt

Stap 1: het relay starten

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

Bewerk .env: geef het relay een naam (RELAY_NAME) en zet RELAY_URLS op zijn openbare adres, wss://relay.example.com.

Open daarna docker-compose.yml en wijzig de poortregel in "127.0.0.1:3334:3334". Het relay vertrouwt het adres dat de proxy doorgeeft wanneer het controleert wie zich identificeert, dus het mag alleen via de proxy bereikbaar zijn. Start het:

docker compose up -d

Stap 2: HTTPS ervoor zetten

Met Caddy is de hele configuratie (/etc/caddy/Caddyfile):

relay.example.com {
    reverse_proxy 127.0.0.1:3334
}

Herlaad Caddy (sudo systemctl reload caddy). Als u nu https://relay.example.com in een browser opent, hoort er antwoord te komen.

Stap 3: Herkos inlichten

  1. Open in Herkos Instellingen → Netwerk en servers → Je eigen relay en tik op Relay controleren. Voer wss://relay.example.com in.
  2. Herkos maakt verbinding en test het: het vraagt om de e-mail van iemand anders, en het laat een testenveloppe van een onbekende achter (en verwijdert die daarna). U zou Alleen jij kunt hier je e-mail lezen en Accepteert e-mail van elke afzender moeten zien.
  3. Tik op Maak er je eerste DM-relay van, en bovenaan op Opslaan.

Houd ook een openbaar relay in de lijst, op de tweede plaats: als uw server uitvalt, kan e-mail nog ergens wachten. relay.damus.io is een goede tweede keuze, omdat het ook vraagt wie er leest.

Stap 4: elke nacht een back-up maken

Herkos bewaart zelf een kopie van de e-mail die het heeft opgehaald, maar een envelop die binnenkwam terwijl uw app gesloten was, bestaat alleen op uw server tot u Herkos opent. Een nachtelijke kopie dicht dat gat, en daarmee kunt u de server opnieuw opbouwen als de schijf het begeeft of de provider uw account opheft.

Het relay bewaart alles in één LMDB-database binnen het Docker-volume nostr-relay_relay-db (de naam begint met de map waarin u hebt gekloond; controleer het met docker volume ls). Een LMDB-bestand dat wordt gekopieerd terwijl het relay erin schrijft, gaat mogelijk niet meer open, dus het script stopt het relay voor de paar seconden die een lokale kopie kost, start het opnieuw en uploadt pas daarna de kopie. Zolang het gestopt is, wacht e-mail op het openbare relay dat u op de tweede plaats in uw lijst hebt gehouden.

De kopie verlaat de server met restic, dat hem versleutelt voordat hij vertrekt. Gebruik een plek bij een andere provider dan de server: een SFTP-account (een storage box, een computer thuis) of een S3-compatibele bucket.

  1. Installeer de tools en maak de repository aan. Bewaar het wachtwoord ook in uw wachtwoordmanager: zonder dat zijn de kopieën niet te lezen, en als het alleen op de server staat, gaat het met de server verloren. Voor SFTP heeft root ook een SSH-sleutel nodig die de back-upmachine accepteert (sudo ssh-keygen -t ed25519, en voeg daar dan /root/.ssh/id_ed25519.pub toe).

    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. Sla dit op als /usr/local/bin/backup-relay en maak het uitvoerbaar (sudo chmod 700 /usr/local/bin/backup-relay). Wijzig RELAY_DIR als u niet in /root/nostr-relay hebt gekloond. Het bewaart de laatste 14 dagen, 8 weken en 12 maanden: een jaar terug, met een omvang die dicht bij die van de database ligt.

    #!/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. Voer het één keer met de hand uit (sudo /usr/local/bin/backup-relay) en plan het daarna in met sudo crontab -e. De tweede regel leest elke maand een tiende van de opgeslagen gegevens terug, telkens een ander tiende, om te bewijzen dat de kopieën nog te openen zijn. Kijk af en toe in /var/log/backup-relay.log: een regel met Fatal betekent dat de kopie van die nacht is mislukt.

    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
    

Terugzetten (een nieuwe server, of na een schijfdefect): zet het relay opnieuw op (stap 1 tot 3) en herhaal punt 1 en 2 van deze stap met dezelfde repository, maar schrijf het wachtwoord dat u hebt bewaard in /root/.restic-password in plaats van een nieuw aan te maken, en sla restic init over. Kopieer daarna de nieuwste back-up naar het volume van het 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

Doe dit terugzetten één keer per jaar op een reservemachine en controleer dat het relay start met uw e-mail erin: het is de enige test die de hele keten bewijst, wachtwoord inbegrepen.

Goed om te weten