Herkos

Oma postilaatikkopalvelin

Viimeksi päivitetty: 3. lokakuuta 2026

Herkos-posti kulkee suljettuina kirjekuorina (NIP-59-gift wrapit) ja odottaa yksityisviestien välityspalvelinlistasi välityspalvelimilla, kunnes sovelluksesi noutaa sen. Useimmat julkiset välityspalvelimet antavat nämä kirjekuoret kenelle tahansa, joka niitä pyytää. Kukaan ei voi avata niitä, mutta kuka tahansa voi laskea, kuka saa postia ja milloin, ja välityspalvelin voi poistaa ne milloin haluaa.

Oma välityspalvelin, joka kysyy, kuka lukee (NIP-42), antaa kirjekuoresi sinulle eikä kenellekään muulle ja säilyttää ne niin kauan kuin itse päätät. Tämä sivu kertoo, miten sellainen pystytetään kolmessa vaiheessa, sekä öisestä varmuuskopiosta. Siihen menee noin vartti, jos sinulla on jo palvelin.

Mikä välityspalvelin valita

Ajoimme molempia ehdokkaita 24. syyskuuta 2026 ja tarkistimme, mitä ne todella tekevät postille, emme sitä, mitä ne mainostavat.

nogringo/nostr-relay HAVEN 1.2.2
Kuka voi lukea kirjekuoresi Vain sinä, tunnistauduttuasi /chat: kuka tahansa luottamusverkostostasi, tunnistauduttuaan. /inbox: kuka tahansa, ilman tunnistautumista
Kuka voi toimittaa sinulle postia Kuka tahansa tunnistautuva lähettäjä Vain luottamusverkostosi
Vastaanotetun postin poistaminen Kyllä Ei
Nopea uudelleensynkronointi (NIP-77) Kyllä Ei
Lisenssi MIT MIT

Käytä nogringo/nostr-relayta postilaatikkonasi. Se tekee sen, mitä posti tarvitsee: kuka tahansa voi kirjoittaa sinulle, ja vain sinä voit lukea. HAVEN on hyvä työkalu muihin tarkoituksiin (henkilökohtainen lähtevien laatikko, media, yksityiset muistiinpanot), mutta postilaatikkona se torjuisi postin keneltä tahansa, jota et seuraa, mukaan lukien sillan, joka kuljettaa tavallista sähköpostia.

Mitä tarvitset

Vaihe 1: käynnistä välityspalvelin

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

Muokkaa tiedostoa .env: anna välityspalvelimelle nimi (RELAY_NAME) ja aseta RELAY_URLS sen julkiseksi osoitteeksi, wss://relay.example.com.

Avaa sitten docker-compose.yml ja muuta porttirivi muotoon "127.0.0.1:3334:3334". Välityspalvelin luottaa osoitteeseen, jonka proxy välittää sille, kun se tarkistaa, kuka tunnistautuu, joten siihen on päästävä vain proxyn kautta. Käynnistä se:

docker compose up -d

Vaihe 2: lisää HTTPS eteen

Caddylla koko määritys (/etc/caddy/Caddyfile) on:

relay.example.com {
    reverse_proxy 127.0.0.1:3334
}

Lataa Caddyn määritys uudelleen (sudo systemctl reload caddy). Kun avaat https://relay.example.com selaimessa, sen pitäisi nyt vastata.

Vaihe 3: kerro Herkosille

  1. Avaa Herkosissa Asetukset → Verkko ja palvelimet → Oma palvelin ja napauta Tarkista palvelin. Syötä wss://relay.example.com.
  2. Herkos muodostaa yhteyden ja kokeilee sitä: se pyytää jonkun toisen postia ja jättää testikirjekuoren tuntemattomalta (ja poistaa sen sitten). Sinun pitäisi nähdä Vain sinä voit lukea postisi täällä ja Ottaa vastaan postia keneltä tahansa lähettäjältä.
  3. Napauta Aseta ensimmäiseksi yksityisviestien palvelimeksi ja ylhäältä Tallenna.

Pidä listalla myös julkinen välityspalvelin, toisena: jos palvelimesi on alhaalla, postilla on silti paikka, jossa odottaa. relay.damus.io on hyvä toinen vaihtoehto, koska se myös kysyy, kuka lukee.

Vaihe 4: varmuuskopioi joka yö

Herkos säilyttää oman kopionsa noutamastaan postista, mutta kirjekuori, joka saapui sovelluksesi ollessa suljettuna, on olemassa vain palvelimellasi, kunnes avaat Herkosin. Öinen kopio paikkaa tämän aukon, ja sen avulla voit rakentaa palvelimen uudelleen, jos levy hajoaa tai palveluntarjoaja sulkee tilisi.

Välityspalvelin säilyttää kaiken yhdessä LMDB-tietokannassa Docker-taltiossa nostr-relay_relay-db (nimi alkaa sen kansion nimellä, johon kloonasit; tarkista se komennolla docker volume ls). LMDB-tiedosto, joka on kopioitu välityspalvelimen kirjoittaessa siihen, ei välttämättä aukea, joten skripti pysäyttää välityspalvelimen niiksi muutamaksi sekunniksi, jotka paikallinen kopio vie, käynnistää sen uudelleen ja vasta sitten lähettää kopion. Pysäytyksen aikana posti odottaa julkisella välityspalvelimella, jonka pidit listallasi toisena.

Kopio siirretään pois palvelimelta resticillä, joka salaa sen ennen lähtöä. Käytä paikkaa, joka on eri palveluntarjoajalla kuin palvelin: SFTP-tili (tallennuslaatikko, kotitietokone) tai S3-yhteensopiva bucket.

  1. Asenna työkalut ja luo repositorio. Säilytä salasana myös salasanojen hallintasovelluksessasi: ilman sitä kopioita ei voi lukea, ja jos se on vain palvelimella, se kuolee palvelimen mukana. SFTP:tä varten root tarvitsee myös SSH-avaimen, jonka varmuuskopiokone hyväksyy (sudo ssh-keygen -t ed25519, ja lisää sitten /root/.ssh/id_ed25519.pub sinne).

    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. Tallenna tämä nimellä /usr/local/bin/backup-relay ja tee siitä suoritettava (sudo chmod 700 /usr/local/bin/backup-relay). Muuta RELAY_DIR, jos et kloonannut kansioon /root/nostr-relay. Se säilyttää viimeiset 14 päivää, 8 viikkoa ja 12 kuukautta: vuoden taaksepäin, suunnilleen tietokannan kokoisena.

    #!/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. Aja se kerran käsin (sudo /usr/local/bin/backup-relay) ja ajasta se sitten komennolla sudo crontab -e. Toinen rivi lukee joka kuukausi takaisin kymmenesosan tallennetuista tiedoista, joka kerta eri kymmenesosan, todistaakseen, että kopiot voi yhä avata. Katso tiedostoa /var/log/backup-relay.log silloin tällöin: rivi, jossa on Fatal, tarkoittaa, että sen yön kopio epäonnistui.

    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
    

Palauttaminen (uusi palvelin tai levyvian jälkeen): pystytä välityspalvelin uudelleen (vaiheet 1–3) ja toista tämän vaiheen kohdat 1 ja 2 samalla repositoriolla, mutta kirjoita tallentamasi salasana tiedostoon /root/.restic-password uuden luomisen sijaan ja ohita restic init. Kopioi sitten uusin varmuuskopio välityspalvelimen taltioon:

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

Tee tämä palautus kerran vuodessa varakoneella ja tarkista, että välityspalvelin käynnistyy postisi kanssa: se on ainoa testi, joka todistaa koko ketjun toimivan, salasana mukaan lukien.

Hyvä tietää