Herkos

Власний поштовий релей

Останнє оновлення: 3 жовтня 2026 року

Пошта Herkos подорожує в запечатаних конвертах (NIP-59 gift wrap) і чекає на релеях із вашого списку релеїв DM, доки ваш застосунок її не забере. Більшість публічних релеїв віддають ці конверти будь-кому, хто попросить. Ніхто не може їх відкрити, але будь-хто може порахувати, хто отримує пошту і коли, а релей може видалити їх, коли забажає.

Власний релей, який питає, хто читає (NIP-42), віддає ваші конверти вам і нікому іншому та зберігає їх стільки, скільки вирішите ви. Ця сторінка пояснює, як налаштувати такий релей у три кроки, плюс щонічне резервне копіювання. Це займає близько п'ятнадцяти хвилин, якщо у вас уже є сервер.

Який релей обрати

24 вересня 2026 року ми запустили обидва кандидати й перевірили, що вони насправді роблять із поштою, а не що вони рекламують.

nogringo/nostr-relay HAVEN 1.2.2
Хто може читати ваші конверти Лише ви, після ідентифікації /chat: будь-хто з вашої мережі довіри, після ідентифікації. /inbox: будь-хто, без ідентифікації
Хто може доставляти вам пошту Будь-який відправник, що ідентифікується Лише ваша мережа довіри
Видалення отриманої пошти Так Ні
Швидка ресинхронізація (NIP-77) Так Ні
Ліцензія MIT MIT

Використовуйте nogringo/nostr-relay як свою поштову скриньку. Саме він робить те, що потрібно пошті: будь-хто може вам написати, і лише ви можете читати. HAVEN — хороший інструмент для інших речей (особиста вихідна скринька, медіа, приватні нотатки), але як поштова скринька він відхилятиме пошту від усіх, на кого ви не підписані, включно з мостом, що переносить звичайну електронну пошту.

Що вам знадобиться

Крок 1: запустіть релей

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

Відредагуйте .env: дайте релею назву (RELAY_NAME) і задайте в RELAY_URLS його публічну адресу, wss://relay.example.com.

Потім відкрийте docker-compose.yml і змініть рядок порту на "127.0.0.1:3334:3334". Перевіряючи, хто ідентифікується, релей довіряє адресі, яку йому пересилає проксі, тож він має бути доступний лише через проксі. Запустіть його:

docker compose up -d

Крок 2: поставте попереду HTTPS

З Caddy уся конфігурація (/etc/caddy/Caddyfile) така:

relay.example.com {
    reverse_proxy 127.0.0.1:3334
}

Перезавантажте Caddy (sudo systemctl reload caddy). Тепер, якщо відкрити https://relay.example.com у браузері, він має відповісти.

Крок 3: повідомте Herkos

  1. У Herkos відкрийте Налаштування → Мережа та сервери → Власний релей і торкніться Перевірити релей. Введіть wss://relay.example.com.
  2. Herkos під'єднується й випробовує його: просить чужу пошту і залишає тестовий конверт від незнайомця (потім видаляє його). Ви маєте побачити Лише ви можете читати тут свою пошту і Приймає пошту від будь-якого відправника.
  3. Торкніться Зробити першим релеєм DM, а потім Зберегти вгорі.

Залиште в списку також публічний релей, другим: якщо ваш сервер не працює, пошті все одно буде де чекати. relay.damus.io — хороший другий варіант, бо він теж питає, хто читає.

Крок 4: робіть резервну копію щоночі

Herkos зберігає власну копію пошти, яку вже забрав, але конверт, що надійшов, поки ваш застосунок був закритий, існує лише на вашому сервері, доки ви не відкриєте Herkos. Щонічна копія закриває цю прогалину й дає змогу відновити сервер, якщо диск вийде з ладу або провайдер закриє ваш обліковий запис.

Релей зберігає все в одній базі даних LMDB усередині тому Docker nostr-relay_relay-db (назва починається з теки, в яку ви клонували; перевірте її командою docker volume ls). Файл LMDB, скопійований під час запису релеєм, може не відкритися, тож скрипт зупиняє релей на ті кілька секунд, які триває локальне копіювання, знову запускає його і лише тоді вивантажує копію. Поки релей зупинено, пошта чекає на публічному релеї, який ви залишили другим у списку.

Копія залишає сервер за допомогою restic, який шифрує її перед відправленням. Використовуйте місце в іншого провайдера, ніж сервер: обліковий запис SFTP (storage box, домашній комп'ютер) або S3-сумісний бакет.

  1. Встановіть інструменти й створіть репозиторій. Збережіть пароль також у своєму менеджері паролів: без нього копії неможливо прочитати, а якщо він зберігається лише на сервері, то загине разом із сервером. Для SFTP root також потрібен SSH-ключ, який приймає машина для резервних копій (sudo ssh-keygen -t ed25519, потім додайте туди /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. Збережіть це як /usr/local/bin/backup-relay і зробіть виконуваним (sudo chmod 700 /usr/local/bin/backup-relay). Змініть RELAY_DIR, якщо ви клонували не в /root/nostr-relay. Скрипт зберігає копії за останні 14 днів, 8 тижнів і 12 місяців: рік історії при розмірі, близькому до розміру бази даних.

    #!/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. Запустіть його один раз вручну (sudo /usr/local/bin/backup-relay), потім заплануйте за допомогою sudo crontab -e. Другий рядок щомісяця зчитує десяту частину збережених даних, щоразу іншу, щоб довести, що копії й досі можна відкрити. Час від часу переглядайте /var/log/backup-relay.log: рядок із Fatal означає, що копія тієї ночі не вдалася.

    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
    

Щоб відновити (новий сервер або після збою диска): знову налаштуйте релей (кроки 1–3) і повторіть пункти 1 і 2 цього кроку з тим самим репозиторієм, але запишіть збережений пароль у /root/.restic-password замість того, щоб створювати новий, і пропустіть restic init. Потім скопіюйте останню резервну копію в том релея:

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

Раз на рік виконуйте це відновлення на запасній машині й перевіряйте, що релей запускається з вашою поштою: це єдина перевірка, яка доводить, що працює весь ланцюжок, включно з паролем.

Варто знати