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 — хороший инструмент для других задач (личный outbox, медиафайлы, личные заметки), но как почтовый ящик он отвергал бы почту от всех, на кого вы не подписаны, включая мост, который доставляет обычную электронную почту.

Что понадобится

Шаг 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

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

Полезно знать