Herkos

Własny przekaźnik na pocztę

Ostatnia aktualizacja: 3 października 2026

Poczta Herkos podróżuje jako zapieczętowane koperty (gift wrapy NIP-59) i czeka na przekaźnikach z Twojej listy przekaźników DM, aż Twoja aplikacja ją odbierze. Większość publicznych przekaźników wydaje te koperty każdemu, kto o nie poprosi. Nikt nie może ich otworzyć, ale każdy może policzyć, kto dostaje pocztę i kiedy, a przekaźnik może je usunąć, kiedy zechce.

Własny przekaźnik, który pyta, kto czyta (NIP-42), wydaje Twoje koperty Tobie i nikomu innemu, i przechowuje je tak długo, jak zdecydujesz. Ta strona wyjaśnia, jak go skonfigurować w trzech krokach, plus nocna kopia zapasowa. Zajmuje to około piętnastu minut, jeśli masz już serwer.

Którego przekaźnika użyć

24 września 2026 uruchomiliśmy obu kandydatów i sprawdziliśmy, co faktycznie robią z pocztą, a nie co reklamują.

nogringo/nostr-relay HAVEN 1.2.2
Kto może czytać Twoje koperty Tylko Ty, po identyfikacji /chat: każdy z Twojej sieci zaufania, po identyfikacji. /inbox: każdy, bez identyfikacji
Kto może doręczać Ci pocztę Każdy nadawca, który się identyfikuje Tylko Twoja sieć zaufania
Usuwanie otrzymanej poczty Tak Nie
Szybka resynchronizacja (NIP-77) Tak Nie
Licencja MIT MIT

Użyj nogringo/nostr-relay jako skrzynki. To ten, który robi to, czego potrzebuje poczta: każdy może do Ciebie pisać, a tylko Ty możesz czytać. HAVEN to dobre narzędzie do innych rzeczy (osobista skrzynka nadawcza, multimedia, prywatne notatki), ale jako skrzynka odrzucałby pocztę od każdego, kogo nie obserwujesz, łącznie z bridge'em, który przenosi zwykły e-mail.

Czego potrzebujesz

Krok 1: uruchom przekaźnik

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

Edytuj .env: nadaj przekaźnikowi nazwę (RELAY_NAME) i ustaw RELAY_URLS na jego publiczny adres, wss://relay.example.com.

Następnie otwórz docker-compose.yml i zmień linię z portem na "127.0.0.1:3334:3334". Przekaźnik ufa adresowi przekazanemu mu przez proxy, gdy sprawdza, kto się identyfikuje, więc musi być osiągalny wyłącznie przez proxy. Uruchom go:

docker compose up -d

Krok 2: dodaj HTTPS z przodu

Z Caddy cała konfiguracja (/etc/caddy/Caddyfile) wygląda tak:

relay.example.com {
    reverse_proxy 127.0.0.1:3334
}

Przeładuj Caddy (sudo systemctl reload caddy). Otwarcie https://relay.example.com w przeglądarce powinno teraz dać odpowiedź.

Krok 3: powiedz o nim Herkos

  1. W Herkos otwórz Ustawienia → Sieć i serwery → Twój własny relay i dotknij Sprawdź relay. Wpisz wss://relay.example.com.
  2. Herkos łączy się i go testuje: prosi o cudzą pocztę i zostawia testową kopertę od nieznajomego (potem ją usuwa). Powinieneś zobaczyć Tylko ty możesz tu czytać swoją pocztę i Przyjmuje pocztę od każdego nadawcy.
  3. Dotknij Ustaw jako pierwszy relay DM, a potem Zapisz na górze.

Zostaw też na liście publiczny przekaźnik, jako drugi: jeśli Twój serwer nie działa, poczta nadal ma gdzie czekać. relay.damus.io to dobry drugi wybór, bo też pyta, kto czyta.

Krok 4: rób kopię zapasową co noc

Herkos przechowuje własną kopię poczty, którą odebrał, ale koperta, która przyszła, gdy aplikacja była zamknięta, istnieje tylko na Twoim serwerze, dopóki nie otworzysz Herkos. Nocna kopia zamyka tę lukę i pozwala odbudować serwer, jeśli padnie dysk albo dostawca zamknie Twoje konto.

Przekaźnik trzyma wszystko w jednej bazie LMDB w woluminie Dockera nostr-relay_relay-db (nazwa zaczyna się od nazwy folderu, do którego sklonowałeś repozytorium; sprawdź ją poleceniem docker volume ls). Plik LMDB skopiowany, gdy przekaźnik do niego zapisuje, może się nie otworzyć, więc skrypt zatrzymuje przekaźnik na kilka sekund potrzebnych na lokalną kopię, uruchamia go ponownie i dopiero wtedy wysyła kopię. Gdy jest zatrzymany, poczta czeka na publicznym przekaźniku, który zostawiłeś jako drugi na liście.

Kopia opuszcza serwer za pomocą restic, który szyfruje ją, zanim wyjdzie. Użyj miejsca u innego dostawcy niż serwer: konta SFTP (storage box, komputer w domu) albo kubełka zgodnego z S3.

  1. Zainstaluj narzędzia i utwórz repozytorium. Hasło zapisz też w swoim menedżerze haseł: bez niego kopii nie da się odczytać, a jeśli istnieje tylko na serwerze, zginie razem z serwerem. W przypadku SFTP root potrzebuje też klucza SSH akceptowanego przez maszynę z kopiami (sudo ssh-keygen -t ed25519, a następnie dodaj tam /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. Zapisz to jako /usr/local/bin/backup-relay i nadaj prawo wykonywania (sudo chmod 700 /usr/local/bin/backup-relay). Zmień RELAY_DIR, jeśli nie sklonowałeś do /root/nostr-relay. Skrypt zachowuje ostatnie 14 dni, 8 tygodni i 12 miesięcy: rok wstecz, przy rozmiarze zbliżonym do rozmiaru bazy.

    #!/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. Uruchom go raz ręcznie (sudo /usr/local/bin/backup-relay), a potem zaplanuj za pomocą sudo crontab -e. Druga linia co miesiąc odczytuje dziesiątą część zapisanych danych, za każdym razem inną, aby udowodnić, że kopie nadal da się otworzyć. Zaglądaj od czasu do czasu do /var/log/backup-relay.log: linia z Fatal oznacza, że kopia z tej nocy się nie udała.

    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
    

Aby przywrócić (nowy serwer albo po awarii dysku): skonfiguruj przekaźnik ponownie (kroki od 1 do 3) i powtórz punkty 1 i 2 tego kroku z tym samym repozytorium, ale zamiast tworzyć nowe hasło, wpisz zapisane hasło do /root/.restic-password i pomiń restic init. Następnie skopiuj najnowszą kopię do woluminu przekaźnika:

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

Raz w roku wykonaj to przywracanie na zapasowej maszynie i sprawdź, czy przekaźnik uruchamia się z Twoją pocztą: to jedyny test, który sprawdza cały łańcuch, łącznie z hasłem.

Warto wiedzieć