Montar um relay não é muito difícil. Você vai precisar de algum traquejo com o terminal e conhecimentos básicos de Docker, mas deve ser viável para a maioria.
Neste guia mostro como montar seu próprio relay com strfry (um relay Nostr moderno e rápido, escrito em C++) e Caddy na frente para te dar HTTPS automático.
Se strfry parecer demais para o seu caso, dê uma olhada em haven (um relay pessoal opinativo, já vem com inbox e outbox), khatru (uma biblioteca em Go para construir um relay em poucas linhas) ou nostr-rs-relay (pequeno, em Rust, com SQLite).
pré-requisitos
- Um domínio. Pode comprar em Njalla, que aceita criptomoedas e é focado em privacidade. Namecheap também aceita Bitcoin. Porkbun é outra boa opção.
- Um servidor. Dá para alugar um VPS pequeno por uns poucos euros por mês na Netcup, Hetzner ou DigitalOcean. Para opções focadas em privacidade, veja kycnot.me.
requisitos
- Hardware: nada especial. Eventos são só texto, então o armazenamento cresce devagar. Um VPS com 1GB de RAM dá e sobra para um relay pessoal ou de comunidade pequena.
- Sistema: recomendo uma versão recente de Debian ou Ubuntu se não tiver preferência.
- Software:
git, docker e docker compose.
Com isso em mãos, dá para começar.
dns
Antes de mexer no Caddy, confirme que você adicionou um registro A (e/ou AAAA) no seu domínio apontando para o IP do servidor. Algo como relay.example.com está ótimo. O Caddy vai usar isso para pegar o certificado TLS do Let's Encrypt.
configuração
preparação base
- Conecte no servidor via SSH e crie uma pasta para o relay: mkdir -p ~/nostr-relay && cd ~/nostr-relay
- Crie as pastas de dados e config: mkdir -p data strfry
Agora crie strfry/strfry.conf com este conteúdo. Edite os campos name, description, pubkey e contact para que o relay se identifique direito (o pubkey deve ser sua chave pública em hex, não o npub):
# strfry.conf, config mínima db = "/app/strfry-db/" relay { bind = "0.0.0.0" port = 7777 info { name = "meu relay nostr" description = "um relay pessoal" pubkey = "SEU_PUBKEY_HEX" contact = "voce@example.com" } maxWebsocketPayloadSize = 131072 autoPingSeconds = 55 enableTcpKeepalive = true writePolicy { plugin = "" # aponte para um script se quiser filtros customizados } compression { enabled = true slidingWindow = true } }
Se quiser ver todas as opções, o exemplo completo de configuração fica no repo do strfry.
Depois crie um docker-compose.yml em ~/nostr-relay. As labels caddy.* dizem ao nosso proxy reverso para descobrir esse serviço automaticamente (configuramos o proxy no próximo passo):
services:
strfry:
image: dockurr/strfry:latest
container_name: strfry
restart: unless-stopped
volumes:
- ./data:/app/strfry-db
- ./strfry/strfry.conf:/app/strfry.conf:ro
networks:
- caddy
labels:
caddy: relay.example.com
caddy.reverse_proxy: "{{upstreams 7777}}"
networks:
caddy:
external: true
Troque relay.example.com pelo seu domínio. Os clientes vão se conectar via wss://relay.example.com.
Suba tudo:
- Crie a rede Docker compartilhada: docker network create caddy
- Inicie o relay: docker compose up -d
- Veja os logs: docker compose logs -f. Você deve ver o strfry escutando em
0.0.0.0:7777.
O relay está rodando dentro da rede Docker, mas ainda não acessível de fora. Agora colocamos um proxy na frente para HTTPS.
proxy (caddy-docker-proxy)
Usamos o caddy-docker-proxy, uma build do Caddy que lê labels dos contêineres em execução e se autoconfigura. Sem Caddyfile pra manter. Adicionar mais serviços depois é só uma questão de colocar labels neles.
Se você já tem seu próprio proxy reverso (nginx, Caddy puro, Nginx Proxy Manager, etc.), só ponha ele na mesma rede Docker caddy e encaminhe para strfry:7777. Se não, siga aqui.
- Crie uma pasta nova no mesmo nível que
nostr-relay: mkdir ~/caddy && cd ~/caddy - Crie um docker-compose.yml:
services:
caddy:
image: lucaslorentz/caddy-docker-proxy:ci-alpine
container_name: caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
environment:
- CADDY_INGRESS_NETWORKS=caddy
- CADDY_DOCKER_CADDYFILE_PATH=/config/Caddyfile
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- caddy_data:/data
- caddy_config:/config
networks:
- caddy
volumes:
caddy_data:
caddy_config:
networks:
caddy:
external: true
Sobe:
- docker compose up -d
- docker compose logs -f caddy, e veja ele pegar as labels do strfry e o certificado do Let's Encrypt.
Confirme que as portas 80 e 443 estão abertas no firewall do servidor. A porta 7777 não deve ficar exposta publicamente; todo o tráfego passa pelo Caddy.
conferindo se funciona
- Abra
https://relay.example.comno navegador. Você deve ver um JSON pequeno com as informações do seu relay (isso é NIP-11). - Em qualquer cliente Nostr, adicione
wss://relay.example.comà sua lista de relays e publique uma nota. - Para algumas estatísticas: docker exec strfry strfry info
Pronto. Você tem seu próprio relay. Anuncie no Nostr para outras pessoas usarem, ou guarde para si como arquivo pessoal.
próximos passos
- Backups. O importante fica em
~/nostr-relay/data/. Faça snapshots. - Filtro de spam. strfry aceita scripts de política de escrita que você pode usar para allowlists ou filtro por web of trust. Veja a documentação de plugins.
- Sincronizar com outros relays. strfry suporta negentropy, um jeito eficiente de dois relays descobrirem quais eventos têm em comum. Rode strfry sync wss://outro-relay para espelhar ou preencher.
- Aparecer em listagens. Registre seu relay em nostr.watch para as pessoas acharem.