Herkos

O seu próprio relay de correio

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

O correio do Herkos viaja em envelopes selados (gift wraps NIP-59) e espera nos relays da sua lista de relays DM até a sua aplicação o recolher. A maioria dos relays públicos entrega esses envelopes a quem os pedir. Ninguém os consegue abrir, mas qualquer pessoa pode contar quem recebe correio e quando, e o relay pode apagá-los quando lhe apetecer.

Um relay próprio que pergunta quem está a ler (NIP-42) entrega os seus envelopes a si e a mais ninguém, e guarda-os durante o tempo que decidir. Esta página explica como montar um em três passos, mais uma cópia de segurança noturna. Demora cerca de quinze minutos se já tiver um servidor.

Que relay usar

Pusemos os dois candidatos a funcionar a 24 de setembro de 2026 e verificámos o que fazem de facto com o correio, não o que anunciam.

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

Use o nogringo/nostr-relay como a sua caixa de correio. É o que faz aquilo de que o correio precisa: qualquer pessoa lhe pode escrever, e só você pode ler. O HAVEN é uma boa ferramenta para outras coisas (uma caixa de saída pessoal, multimédia, notas privadas), mas como caixa de correio recusaria o correio de qualquer pessoa que não siga, incluindo o bridge que transporta o email comum.

O que precisa

Passo 1: pôr o relay a funcionar

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 seu endereço público, wss://relay.example.com.

Depois abra o docker-compose.yml e altere a linha da porta para "127.0.0.1:3334:3334". O relay confia no endereço que o proxy lhe reencaminha quando verifica quem se está a identificar, por isso só deve ser acessível através do proxy. Inicie-o:

docker compose up -d

Passo 2: colocar HTTPS à frente

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

relay.example.com {
    reverse_proxy 127.0.0.1:3334
}

Recarregue o Caddy (sudo systemctl reload caddy). Ao abrir https://relay.example.com num navegador, deverá agora obter resposta.

Passo 3: informar o Herkos

  1. No Herkos, abra Definições → Rede e servidores → O teu relay pessoal e toque em Verificar um relay. Introduza wss://relay.example.com.
  2. O Herkos liga-se e testa-o: pede o correio de outra pessoa e deixa um envelope de teste de um desconhecido (que depois apaga). Deverá ver Só tu podes ler aqui o teu correio e Aceita correio de qualquer remetente.
  3. Toque em Torná-lo o teu primeiro relay DM, e em Guardar no topo.

Mantenha também um relay público na lista, em segundo lugar: se o seu servidor estiver em baixo, o correio continua a ter onde esperar. relay.damus.io é uma boa segunda escolha, porque também pergunta quem está a ler.

Passo 4: fazer uma cópia de segurança todas as noites

O Herkos guarda a sua própria cópia do correio que recolheu, mas um envelope que chegou enquanto a sua aplicação estava fechada só existe no seu servidor até abrir o Herkos. Uma cópia noturna cobre essa lacuna, e permite-lhe reconstruir o servidor se o disco morrer ou se o fornecedor encerrar a sua conta.

O relay guarda tudo numa base de dados LMDB dentro do volume Docker nostr-relay_relay-db (o nome começa pela pasta para a qual clonou; confirme-o com docker volume ls). Um ficheiro LMDB copiado enquanto o relay está a escrever nele pode não abrir, por isso o script para o relay durante os poucos segundos que uma cópia local demora, volta a iniciá-lo e só depois envia a cópia. Enquanto está parado, o correio espera no relay público que manteve em segundo lugar na sua lista.

A cópia sai do servidor com o restic, que a cifra antes de sair. Use um sítio num fornecedor diferente do servidor: uma conta SFTP (uma storage box, um computador em casa) ou um bucket compatível com S3.

  1. Instale as ferramentas e crie o repositório. Guarde também a palavra-passe no seu gestor de palavras-passe: sem ela as cópias não podem ser lidas, e se só existir no servidor, morre com o servidor. Para SFTP, o root também precisa de uma chave SSH que a máquina de cópias aceite (sudo ssh-keygen -t ed25519, e depois adicione lá /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. Guarde isto como /usr/local/bin/backup-relay e torne-o executável (sudo chmod 700 /usr/local/bin/backup-relay). Altere RELAY_DIR se não clonou para /root/nostr-relay. Mantém os últimos 14 dias, 8 semanas e 12 meses: um ano para trás, com um tamanho próximo do da base 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. Execute-o uma vez à mão (sudo /usr/local/bin/backup-relay) e depois agende-o com sudo crontab -e. A segunda linha volta a ler um décimo dos dados guardados todos os meses, um décimo diferente de cada vez, para provar que as cópias ainda podem ser abertas. Veja de vez em quando o /var/log/backup-relay.log: uma linha com Fatal significa que a cópia dessa 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 avaria do disco): monte de novo o relay (passos 1 a 3) e repita os pontos 1 e 2 deste passo com o mesmo repositório, mas escreva a palavra-passe que guardou em /root/.restic-password em vez de criar uma nova, e salte o restic init. Depois copie a cópia 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 este restauro numa máquina de reserva e verifique que o relay arranca com o seu correio lá dentro: é o único teste que prova a cadeia completa, palavra-passe incluída.

Bom saber