Montar un relay no es muy difícil. Necesitarás algo de soltura en la terminal y conocimientos básicos de Docker, pero debería ser asequible para la mayoría.
En esta guía te enseño cómo montar tu propio relay con strfry (un relay de Nostr moderno y rápido, escrito en C++) y Caddy delante para darte HTTPS automático.
Si strfry te parece excesivo para tu caso, échale un vistazo a haven (un relay personal con opinión fuerte, trae inbox y outbox integrados), khatru (una librería en Go para montar un relay en pocas líneas) o nostr-rs-relay (pequeño, en Rust, con SQLite).
pre-requisitos
- Un dominio. Puedes comprar uno en Njalla, que acepta criptomonedas y cuida la privacidad. Namecheap también acepta Bitcoin. Porkbun es otra buena opción.
- Un servidor. Puedes alquilar un VPS pequeño por unos pocos euros al mes en Netcup, Hetzner o DigitalOcean. Para opciones centradas en la privacidad, mira kycnot.me.
requisitos
- Hardware: nada especial. Los eventos son solo texto, así que el almacenamiento crece despacio. Un VPS con 1GB de RAM es más que suficiente para un relay personal o de comunidad pequeña.
- Sistema: recomiendo una versión reciente de Debian o Ubuntu si no tienes preferencia.
- Software:
git, docker y docker compose.
Una vez tengas eso, ya puedes empezar.
dns
Antes de tocar Caddy, asegúrate de haber añadido un registro A (y/o AAAA) en tu dominio apuntando a la IP del servidor. Algo como relay.example.com está bien. Caddy lo usará para obtener el certificado TLS de Let's Encrypt.
configuración
preparación base
- Conéctate a tu servidor por SSH y crea una carpeta para el relay: mkdir -p ~/nostr-relay && cd ~/nostr-relay
- Crea las carpetas de datos y config: mkdir -p data strfry
Ahora crea strfry/strfry.conf con este contenido. Edita los campos name, description, pubkey y contact para que el relay se identifique bien (el pubkey debe ser tu clave pública en hex, no tu npub):
# strfry.conf, config mínima db = "/app/strfry-db/" relay { bind = "0.0.0.0" port = 7777 info { name = "mi relay nostr" description = "un relay personal" pubkey = "TU_PUBKEY_HEX" contact = "tu@example.com" } maxWebsocketPayloadSize = 131072 autoPingSeconds = 55 enableTcpKeepalive = true writePolicy { plugin = "" # apunta a un script si quieres filtrar a medida } compression { enabled = true slidingWindow = true } }
Si quieres ver todas las opciones, el ejemplo completo de configuración vive en el repo de strfry.
Después crea un docker-compose.yml en ~/nostr-relay. Las etiquetas caddy.* le dicen a nuestro proxy inverso que descubra este servicio automáticamente (configuramos el proxy en el siguiente paso):
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
Reemplaza relay.example.com por tu dominio. Los clientes se conectarán con wss://relay.example.com.
Levántalo:
- Crea la red Docker compartida: docker network create caddy
- Arranca el relay: docker compose up -d
- Mira los logs: docker compose logs -f. Deberías ver strfry escuchando en
0.0.0.0:7777.
El relay está corriendo dentro de la red Docker, pero todavía no es accesible desde fuera. Ahora le ponemos un proxy delante para HTTPS.
proxy (caddy-docker-proxy)
Usamos caddy-docker-proxy, una build de Caddy que lee etiquetas de los contenedores en marcha y se autoconfigura. Sin Caddyfile que mantener. Añadir más servicios después es solo cosa de ponerles etiquetas.
Si ya tienes tu propio proxy inverso (nginx, Caddy a secas, Nginx Proxy Manager, etc.), solo ponlo en la misma red Docker caddy y reenvía a strfry:7777. Si no, sigue aquí.
- Crea una carpeta nueva al mismo nivel que
nostr-relay: mkdir ~/caddy && cd ~/caddy - Crea un 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
Levántalo:
- docker compose up -d
- docker compose logs -f caddy, y mira cómo recoge las etiquetas de strfry y obtiene el certificado de Let's Encrypt.
Asegúrate de que los puertos 80 y 443 están abiertos en el firewall del servidor. El puerto 7777 no debe estar expuesto públicamente; todo el tráfico debe pasar por Caddy.
comprobar que funciona
- Abre
https://relay.example.comen el navegador. Deberías ver un JSON pequeño con la información de tu relay (eso es NIP-11). - Desde cualquier cliente Nostr, añade
wss://relay.example.coma tu lista de relays y publica una nota. - Para algunas estadísticas: docker exec strfry strfry info
Y ya está. Tienes tu propio relay. Anúncialo en Nostr para que otra gente lo use, o guárdatelo como archivo personal.
siguientes pasos
- Copias de seguridad. Lo importante está en
~/nostr-relay/data/. Haz snapshots. - Filtrado de spam. strfry admite scripts de política de escritura que puedes usar para listas blancas o filtrado por web of trust. Mira los docs de plugins.
- Sincronizar con otros relays. strfry soporta negentropy, una forma eficiente de que dos relays averigüen qué eventos tienen en común. Ejecuta strfry sync wss://otro-relay para replicar o rellenar.
- Aparecer en listados. Registra tu relay en nostr.watch para que la gente lo encuentre.