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
- Maszyny, która jest zawsze włączona i osiągalna z internetu: małego VPS-a (około 4-6 € miesięcznie) albo komputera w domu.
- Domeny lub subdomeny, która na nią wskazuje, na przykład
relay.example.com. - Dockera i reverse proxy, które zapewnia HTTPS. Przykłady używają Caddy, który sam zdobywa certyfikat.
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
- W Herkos otwórz Ustawienia → Sieć i serwery → Twój własny relay i dotknij
Sprawdź relay. Wpisz
wss://relay.example.com. - 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.
- 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.
-
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' -
Zapisz to jako
/usr/local/bin/backup-relayi 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 -
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 zFataloznacza, ż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ć
- To przekaźnik ogólnego przeznaczenia. Oprócz Twojej poczty przyjmuje publiczne notatki od każdego, więc inne osoby mogłyby przechowywać rzeczy na Twoim serwerze. Nie ma jeszcze ustawienia, które pozwalałoby je odrzucać.
- Poczta ze zwykłego e-maila przychodzi przez bridge, który musi się identyfikować, gdy Twój przekaźnik o to prosi. Jeśli po zmianie zwykłe e-maile przestaną przychodzić, nadal odbierze je publiczny przekaźnik, który zostawiłeś na liście.
- Rób kopię zapasową danych (krok 4). Koperty znajdują się w woluminie Dockera
relay-db, a poczta, której Twoja aplikacja jeszcze nie odebrała, istnieje tylko tam. - Twój adres IP. Przekaźnik widzi adres każdej aplikacji, która się z nim łączy, jak każdy przekaźnik. Na Twoim własnym serwerze widzisz je tylko Ty.