Herkos

Seu próprio relay de caixa postal

Última atualização: 3 de outubro de 2026

Os e-mails do Herkos viajam como envelopes lacrados (gift wraps NIP-59) e esperam nos relays da sua lista de relays de DM até que seu aplicativo os busque. A maioria dos relays públicos entrega esses envelopes a qualquer um que peça. Ninguém consegue abri-los, mas qualquer um pode contar quem recebe e-mail e quando, e o relay pode apagá-los quando quiser.

Um relay próprio que pergunta quem está lendo (NIP-42) entrega seus envelopes a você e a mais ninguém, e os guarda pelo tempo que você decidir. Esta página explica como configurar um em três passos, mais um backup noturno. Leva uns quinze minutos se você já tiver um servidor.

Qual relay usar

Rodamos os dois candidatos em 24 de setembro de 2026 e verificamos o que eles realmente fazem com o e-mail, não o que anunciam.

nogringo/nostr-relay HAVEN 1.2.2
Quem pode ler seus envelopes Só você, depois de se identificar /chat: qualquer um na sua rede de confiança, depois de se identificar. /inbox: qualquer um, sem identificação
Quem pode te entregar e-mail Qualquer remetente que se identifique Só sua rede de confiança
Apagar e-mails que você recebeu Sim Não
Ressincronização rápida (NIP-77) Sim Não
Licença MIT MIT

Use o nogringo/nostr-relay como sua caixa postal. É ele que faz o que o e-mail precisa: qualquer um pode te escrever, e só você pode ler. O HAVEN é uma boa ferramenta para outras coisas (uma caixa de saída pessoal, mídia, notas privadas), mas como caixa postal ele recusaria e-mails de qualquer pessoa que você não segue, inclusive do bridge que traz o e-mail comum.

Do que você precisa

Passo 1: rode o relay

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

Edite o .env: dê um nome ao relay (RELAY_NAME) e defina RELAY_URLS com o endereço público dele, wss://relay.example.com.

Depois abra o docker-compose.yml e mude a linha da porta para "127.0.0.1:3334:3334". O relay confia no endereço que o proxy repassa a ele quando verifica quem está se identificando, então ele só deve ser acessível através do proxy. Inicie-o:

docker compose up -d

Passo 2: coloque HTTPS na frente

Com o Caddy, a configuração inteira (/etc/caddy/Caddyfile) é:

relay.example.com {
    reverse_proxy 127.0.0.1:3334
}

Recarregue o Caddy (sudo systemctl reload caddy). Abrir https://relay.example.com num navegador agora deve dar resposta.

Passo 3: avise o Herkos

  1. No Herkos, abra Configurações → Rede e servidores → Seu relay pessoal e toque em Verificar um relay. Digite wss://relay.example.com.
  2. O Herkos se conecta e o testa: pede os e-mails de outra pessoa e deixa um envelope de teste de um desconhecido (e depois o apaga). Você deve ver Só você pode ler seus e-mails aqui e Aceita e-mails de qualquer remetente.
  3. Toque em Torná-lo seu primeiro relay DM e em Salvar, no topo.

Mantenha também um relay público na lista, em segundo lugar: se seu servidor cair, o e-mail ainda tem onde esperar. relay.damus.io é uma boa segunda opção, porque também pergunta quem está lendo.

Passo 4: faça backup toda noite

O Herkos guarda sua própria cópia dos e-mails que já buscou, mas um envelope que chegou enquanto seu aplicativo estava fechado só existe no seu servidor até você abrir o Herkos. Uma cópia noturna cobre essa lacuna, e permite reconstruir o servidor se o disco morrer ou se o provedor encerrar sua conta.

O relay guarda tudo num único banco de dados LMDB dentro do volume Docker nostr-relay_relay-db (o nome começa com a pasta em que você clonou; confira com docker volume ls). Um arquivo LMDB copiado enquanto o relay escreve nele pode não abrir, então o script para o relay pelos poucos segundos que uma cópia local leva, inicia-o de novo e só então envia a cópia. Enquanto ele está parado, o e-mail espera no relay público que você deixou em segundo lugar na lista.

A cópia sai do servidor com o restic, que a criptografa antes que ela saia. Use um lugar num provedor diferente do servidor: uma conta SFTP (um storage box, um computador em casa) ou um bucket compatível com S3.

  1. Instale as ferramentas e crie o repositório. Guarde a senha também no seu gerenciador de senhas: sem ela as cópias não podem ser lidas, e se ela só existir no servidor, morre com o servidor. Para SFTP, o root também precisa de uma chave SSH que a máquina de backup aceite (sudo ssh-keygen -t ed25519 e depois adicione /root/.ssh/id_ed25519.pub lá).

    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. Salve isto como /usr/local/bin/backup-relay e torne-o executável (sudo chmod 700 /usr/local/bin/backup-relay). Mude RELAY_DIR se você não clonou em /root/nostr-relay. Ele mantém os últimos 14 dias, 8 semanas e 12 meses: um ano para trás, num tamanho próximo ao do banco de dados.

    #!/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. Rode-o uma vez à mão (sudo /usr/local/bin/backup-relay) e depois agende-o com sudo crontab -e. A segunda linha relê um décimo dos dados guardados a cada mês, um décimo diferente a cada vez, para provar que as cópias ainda podem ser abertas. Olhe o /var/log/backup-relay.log de vez em quando: uma linha com Fatal significa que a cópia daquela noite falhou.

    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
    

Para restaurar (um servidor novo, ou depois de uma falha de disco): configure o relay de novo (passos 1 a 3) e repita os pontos 1 e 2 deste passo com o mesmo repositório, mas escreva a senha que você guardou em /root/.restic-password em vez de criar uma nova, e pule o restic init. Depois copie o backup mais recente para o volume do relay:

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

Uma vez por ano, faça essa restauração numa máquina reserva e confira se o relay inicia com seus e-mails dentro: é o único teste que prova a cadeia inteira, senha incluída.

Bom saber