Herkos

Ditt eget brevlådsrelä

Senast uppdaterad: 3 oktober 2026

Post i Herkos färdas som förseglade kuvert (NIP-59 gift wraps) och väntar på reläerna i din lista över DM-reläer tills din app hämtar den. De flesta offentliga reläer lämnar ut kuverten till vem som helst som frågar. Ingen kan öppna dem, men vem som helst kan räkna vem som får post och när, och reläet kan radera dem när det vill.

Ett eget relä som frågar vem som läser (NIP-42) lämnar ut dina kuvert till dig och ingen annan, och behåller dem så länge du bestämmer. Den här sidan förklarar hur du sätter upp ett i tre steg, plus en säkerhetskopiering varje natt. Det tar ungefär en kvart om du redan har en server.

Vilket relä du ska använda

Vi körde båda kandidaterna den 24 september 2026 och kontrollerade vad de faktiskt gör med post, inte vad de utlovar.

nogringo/nostr-relay HAVEN 1.2.2
Vem som kan läsa dina kuvert Bara du, efter identifiering /chat: alla i ditt förtroendenätverk, efter identifiering. /inbox: vem som helst, utan identifiering
Vem som kan leverera post till dig Alla avsändare som identifierar sig Bara ditt förtroendenätverk
Radera mottagen post Ja Nej
Snabb omsynkronisering (NIP-77) Ja Nej
Licens MIT MIT

Använd nogringo/nostr-relay som din brevlåda. Det är det relä som klarar det som post kräver: vem som helst kan skriva till dig, och bara du kan läsa. HAVEN är ett bra verktyg för annat (en personlig utkorg, media, privata anteckningar), men som brevlåda skulle det avvisa post från alla du inte följer, även bryggan som för vidare vanlig e-post.

Vad du behöver

Steg 1: kör reläet

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

Redigera .env: ge reläet ett namn (RELAY_NAME) och sätt RELAY_URLS till dess offentliga adress, wss://relay.example.com.

Öppna sedan docker-compose.yml och ändra portraden till "127.0.0.1:3334:3334". Reläet litar på adressen som proxyn vidarebefordrar när det kontrollerar vem som identifierar sig, så det får bara vara nåbart via proxyn. Starta det:

docker compose up -d

Steg 2: lägg HTTPS framför

Med Caddy är hela konfigurationen (/etc/caddy/Caddyfile):

relay.example.com {
    reverse_proxy 127.0.0.1:3334
}

Läs in Caddy på nytt (sudo systemctl reload caddy). Om du öppnar https://relay.example.com i en webbläsare ska du nu få svar.

Steg 3: berätta för Herkos

  1. Öppna Inställningar → Nätverk och servrar → Ditt eget relä i Herkos och tryck på Kontrollera ett relä. Ange wss://relay.example.com.
  2. Herkos ansluter och provar reläet: appen ber om någon annans post och lämnar ett testkuvert från en främling (som sedan raderas). Du ska se Bara du kan läsa din post här och Tar emot post från alla avsändare.
  3. Tryck på Gör det till ditt första DM-relä, och på Spara högst upp.

Behåll också ett offentligt relä i listan, på andra plats: om din server ligger nere har posten ändå någonstans att vänta. relay.damus.io är ett bra andraval, eftersom det också frågar vem som läser.

Steg 4: säkerhetskopiera varje natt

Herkos behåller en egen kopia av den post appen har hämtat, men ett kuvert som kom medan appen var stängd finns bara på din server tills du öppnar Herkos. En kopia varje natt täcker den luckan, och den låter dig bygga upp servern igen om disken går sönder eller leverantören stänger ditt konto.

Reläet lagrar allt i en enda LMDB-databas i Docker-volymen nostr-relay_relay-db (namnet börjar med mappen du klonade till; kontrollera det med docker volume ls). En LMDB-fil som kopieras medan reläet skriver till den kanske inte går att öppna, så skriptet stoppar reläet under de få sekunder en lokal kopia tar, startar det igen och laddar först därefter upp kopian. Medan reläet är stoppat väntar posten på det offentliga relä som du behöll på andra plats i listan.

Kopian lämnar servern med restic, som krypterar den innan den skickas. Använd en plats hos en annan leverantör än servern: ett SFTP-konto (en lagringsbox, en dator hemma) eller en S3-kompatibel bucket.

  1. Installera verktygen och skapa arkivet. Spara lösenordet i din lösenordshanterare också: utan det går kopiorna inte att läsa, och om det bara finns på servern försvinner det med servern. För SFTP behöver root dessutom en SSH-nyckel som backupdatorn godtar (sudo ssh-keygen -t ed25519, lägg sedan till /root/.ssh/id_ed25519.pub där).

    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. Spara detta som /usr/local/bin/backup-relay och gör det körbart (sudo chmod 700 /usr/local/bin/backup-relay). Ändra RELAY_DIR om du inte klonade till /root/nostr-relay. Skriptet behåller de senaste 14 dagarna, 8 veckorna och 12 månaderna: ett år bakåt, i en storlek nära databasens.

    #!/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. Kör det en gång för hand (sudo /usr/local/bin/backup-relay) och schemalägg det sedan med sudo crontab -e. Den andra raden läser tillbaka en tiondel av de lagrade data varje månad, en ny tiondel varje gång, för att bevisa att kopiorna fortfarande går att öppna. Titta i /var/log/backup-relay.log då och då: en rad med Fatal betyder att nattens kopia misslyckades.

    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
    

Så återställer du (en ny server, eller efter ett diskfel): sätt upp reläet igen (steg 1 till 3) och upprepa punkt 1 och 2 i det här steget med samma arkiv, men skriv in lösenordet du sparade i /root/.restic-password i stället för att skapa ett nytt, och hoppa över restic init. Kopiera sedan den senaste säkerhetskopian till reläets volym:

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

En gång om året bör du göra den här återställningen på en reservdator och kontrollera att reläet startar med din post i: det är det enda testet som bevisar hela kedjan, lösenordet inräknat.

Bra att veta