[⚡] usenostr
← voltar

montando um relay nostr

com strfry, docker e caddy.

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

  1. Conecte no servidor via SSH e crie uma pasta para o relay: mkdir -p ~/nostr-relay && cd ~/nostr-relay
  2. 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:

  1. Crie a rede Docker compartilhada: docker network create caddy
  2. Inicie o relay: docker compose up -d
  3. 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.

  1. Crie uma pasta nova no mesmo nível que nostr-relay: mkdir ~/caddy && cd ~/caddy
  2. 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:

  1. docker compose up -d
  2. 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

  1. Abra https://relay.example.com no navegador. Você deve ver um JSON pequeno com as informações do seu relay (isso é NIP-11).
  2. Em qualquer cliente Nostr, adicione wss://relay.example.com à sua lista de relays e publique uma nota.
  3. 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.