Despliegue de Infraestructura de Relés
Objetivos de Aprendizaje
Al final de esta lección, entenderás:
- Arquitectura de relés y requisitos operacionales
- Procedimientos de instalación y configuración para despliegue en producción
- Técnicas de endurecimiento de seguridad y optimización de rendimiento
- Estrategias de monitoreo, mantenimiento y escalado
Resumen de Infraestructura de Relés
Los relés de Nostr sirven como la infraestructura fundamental para el protocolo descentralizado, proporcionando servicios de almacenamiento, recuperación y distribución de eventos. Operar un relé contribuye a la resistencia de la red mientras ofrece control sobre la persistencia de datos y políticas de acceso.
Entender el despliegue de relés permite la participación en la infraestructura del protocolo y soporta casos de uso avanzados incluyendo redes privadas, curación de contenido y servicios especializados.
Consideraciones de Arquitectura de Despliegue
Requisitos del Sistema
Especificaciones Mínimas de Producción
- CPU: 2+ núcleos con soporte de conjunto de instrucciones moderno
- Memoria: 4GB RAM mínimo, 8GB+ recomendado para mayor rendimiento
- Almacenamiento: 50GB+ SSD con capacidad de expansión para crecimiento de base de datos de eventos
- Red: Conexión a internet confiable con asignación adecuada de ancho de banda
- Sistema Operativo: Distribución Linux con actualizaciones de seguridad actuales
Consideraciones de Escalado
- El almacenamiento de base de datos crece aproximadamente 1-10GB por mes dependiendo de las políticas del relé
- Los requisitos de ancho de banda de red escalan con el conteo de usuarios y patrones de actividad
- La utilización de CPU se correlaciona con la validación de eventos y operaciones criptográficas
- El uso de memoria depende de la concurrencia de conexiones y estrategias de caché
Opciones de Arquitectura de Software
Strfry (Implementación en C++)
Características Técnicas: - Implementación de alto rendimiento optimizada para throughput y latencia - Backend de base de datos LMDB proporcionando cumplimiento ACID y resistencia a fallos - Huella de recursos mínima con gestión eficiente de memoria - Arquitectura de plugins para filtrado personalizado de eventos y aplicación de políticas
Beneficios Operacionales: - Estabilidad probada bajo condiciones de alta carga - Herramientas administrativas integrales para gestión de base de datos - Desarrollo activo con actualizaciones regulares de seguridad y rendimiento - Documentación extensa de despliegue y soporte comunitario
Nostream (TypeScript/Node.js)
Características Técnicas: - Integración del ecosistema JavaScript con amplio soporte de librerías - Opciones de base de datos PostgreSQL o SQLite para diferentes escalas de despliegue - Procesamiento de pagos integrado e integración con Lightning Network - Arquitectura modular que soporta plugins personalizados y extensiones
Beneficios Operacionales: - Entorno de desarrollo familiar para desarrolladores web - Endpoints API integrales para monitoreo y administración - Características avanzadas incluyendo analíticas y gestión de usuarios - Soporte de contenedorización Docker para despliegue simplificado
Despliegue de Producción: Implementación Strfry
Preparación del Sistema
Aprovisionamiento del Servidor:
# Actualizaciones del sistema y endurecimiento de seguridad
apt update && apt upgrade -y
apt install -y ufw fail2ban unattended-upgrades
# Configuración del firewall
ufw default deny incoming
ufw default allow outgoing
ufw allow ssh
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable
# Crear usuario dedicado del sistema
useradd -r -s /bin/false -d /opt/strfry strfry
mkdir -p /opt/strfry
chown strfry:strfry /opt/strfry
Instalación de Dependencias:
# Dependencias de compilación
apt install -y git build-essential libtool autotools-dev automake \
pkg-config libssl-dev libevent-dev bsdmainutils python3 \
nginx certbot python3-certbot-nginx
# Librerías de optimización de rendimiento
apt install -y libjemalloc2 libjemalloc-dev
Compilación e Instalación de Strfry
Preparación del Código Fuente:
cd /opt/strfry
sudo -u strfry git clone https://github.com/hoytech/strfry.git .
sudo -u strfry git submodule update --init
Configuración de Compilación:
# Configurar entorno de compilación
sudo -u strfry make setup-golpe
# Compilar con optimizaciones
sudo -u strfry make -j$(nproc) CXXFLAGS="-O3 -march=native"
# Verificar integridad de compilación
sudo -u strfry ./strfry --version
Gestión de Configuración
Archivo de Configuración Principal (/opt/strfry/strfry.conf
):
# Configuración de base de datos
db = "/opt/strfry/data/strfry-db/"
dbParams {
maxreaders = 512
mapsize = 1TB
}
# Configuración de red
relay {
bind = "127.0.0.1"
port = 7777
nofiles = 65536
# Ajuste de rendimiento
maxWebsocketPayloadSize = 131072
autoPingSeconds = 30
enableTcpKeepalive = true
queryTimesliceBudgetMicroseconds = 5000
# Limitación de velocidad
maxFilterLimit = 1000
maxSubsPerConnection = 50
# Metadatos del relé (NIP-11)
info {
name = "Relé Nostr de Producción"
description = "Infraestructura de relé Nostr de alto rendimiento"
pubkey = "<relay_operator_pubkey>"
contact = "admin@relay.example.com"
supported_nips = [1, 2, 9, 11, 12, 15, 16, 20, 22]
software = "strfry"
version = "0.9.6"
}
}
# Filtrado y validación de eventos
events {
maxEventSize = 65536
rejectEventsNewerThanSeconds = 900
rejectEventsOlderThanSeconds = 31536000
rejectEphemeralEventsOlderThanSeconds = 60
maxNumTags = 1000
maxTagValSize = 1024
}
# Configuración de política de escritura
writePolicy {
plugin = "/opt/strfry/write-policy.sh"
}
Implementación de Política de Escritura (/opt/strfry/write-policy.sh
):
#!/bin/bash
# Leer evento desde stdin
event=$(cat)
# Extraer propiedades del evento para análisis
kind=$(echo "$event" | jq -r '.kind')
pubkey=$(echo "$event" | jq -r '.pubkey')
content=$(echo "$event" | jq -r '.content')
# Filtrado básico de contenido
if echo "$content" | grep -qi "spam\|scam\|malware"; then
echo '{"action": "reject", "msg": "Violación de política de contenido"}'
exit 0
fi
# Limitación de velocidad por pubkey (implementar con almacenamiento externo)
# rate_limit_check "$pubkey" || {
# echo '{"action": "reject", "msg": "Límite de velocidad excedido"}'
# exit 0
# }
# Aceptar eventos que cumplen
echo '{"action": "accept"}'
Configuración de Proxy Inverso
Configuración de Nginx (/etc/nginx/sites-available/nostr-relay
):
upstream strfry_backend {
server 127.0.0.1:7777;
keepalive 32;
}
server {
listen 80;
server_name relay.example.com;
# Redirigir a HTTPS
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name relay.example.com;
# Configuración SSL
ssl_certificate /etc/letsencrypt/live/relay.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/relay.example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# Optimización de rendimiento
keepalive_timeout 65;
keepalive_requests 1000;
# Configuración de proxy WebSocket
location / {
proxy_pass http://strfry_backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Configuración de timeout
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# Configuración de buffer
proxy_buffering off;
proxy_request_buffering off;
}
# Información del relé NIP-11
location = / {
add_header Content-Type application/nostr+json;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
add_header Access-Control-Allow-Headers "Content-Type";
if ($http_accept ~* "application/nostr\+json") {
proxy_pass http://strfry_backend;
}
# Respuesta por defecto para navegadores web
return 200 '{"name":"Relé Nostr de Producción","description":"Infraestructura de relé de alto rendimiento","supported_nips":[1,2,9,11,12,15,16,20,22],"software":"strfry","version":"0.9.6"}';
}
}
Gestión de Certificados SSL
Configuración de Let's Encrypt:
# Generación inicial de certificados
certbot --nginx -d relay.example.com --email admin@example.com --agree-tos
# Configuración de renovación automática
cat > /etc/cron.d/certbot << EOF
0 12 * * * root certbot renew --quiet --post-hook "systemctl reload nginx"
EOF
Configuración de Servicio del Sistema
Unidad de Servicio Systemd (/etc/systemd/system/strfry.service
):
[Unit]
Description=Relé Nostr Strfry
After=network.target
Wants=network.target
[Service]
Type=simple
User=strfry
Group=strfry
WorkingDirectory=/opt/strfry
ExecStart=/opt/strfry/strfry relay
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal
# Endurecimiento de seguridad
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/opt/strfry/data
# Límites de recursos
LimitNOFILE=65536
LimitNPROC=4096
[Install]
WantedBy=multi-user.target
Gestión de Servicios:
# Habilitar e iniciar servicio
systemctl daemon-reload
systemctl enable strfry
systemctl start strfry
# Verificar operación
systemctl status strfry
journalctl -u strfry -f
Monitoreo y Mantenimiento
Monitoreo de Rendimiento
Recolección de Métricas del Sistema:
# Instalar herramientas de monitoreo
apt install -y htop iotop nethogs
# Monitoreo de tamaño de base de datos
du -sh /opt/strfry/data/strfry-db/
# Monitoreo de conexiones
ss -tuln | grep :7777
netstat -an | grep :443 | wc -l
Métricas de Aplicación:
# Estadísticas del relé
/opt/strfry/strfry export --count
# Análisis de eventos
/opt/strfry/strfry export --since=1hour | jq '.kind' | sort | uniq -c
# Pruebas de rendimiento
echo '["REQ","test",{"kinds":[1],"limit":10}]' | websocat wss://relay.example.com
Mantenimiento de Base de Datos
Operaciones de Mantenimiento Rutinario:
# Compactación de base de datos
systemctl stop strfry
sudo -u strfry /opt/strfry/strfry compact
systemctl start strfry
# Procedimientos de respaldo
sudo -u strfry /opt/strfry/strfry export > backup-$(date +%Y%m%d).jsonl
tar -czf backup-$(date +%Y%m%d).tar.gz /opt/strfry/data/
# Verificación de base de datos
sudo -u strfry /opt/strfry/strfry verify
Endurecimiento de Seguridad
Implementación de Control de Acceso:
# Configuración de Fail2ban para abuso de WebSocket
cat > /etc/fail2ban/jail.d/strfry.conf << EOF
[strfry]
enabled = true
port = 443
filter = strfry
logpath = /var/log/nginx/access.log
maxretry = 10
bantime = 3600
findtime = 600
EOF
# Limitación de velocidad a nivel nginx
# Agregar a configuración nginx:
# limit_req_zone $binary_remote_addr zone=websocket:10m rate=10r/s;
# limit_req zone=websocket burst=20 nodelay;
Seguridad de Red:
# Configuración de protección DDoS
echo 'net.core.rmem_default = 262144' >> /etc/sysctl.conf
echo 'net.core.rmem_max = 16777216' >> /etc/sysctl.conf
echo 'net.core.wmem_default = 262144' >> /etc/sysctl.conf
echo 'net.core.wmem_max = 16777216' >> /etc/sysctl.conf
sysctl -p
Ejercicio Práctico: Laboratorio de Despliegue de Relé
Implementación de Relé de Producción
Objetivo: Desplegar y configurar un relé Nostr listo para producción
Fase 1: Configuración de Infraestructura 1. Aprovisionar VPS con especificaciones apropiadas 2. Completar endurecimiento de seguridad y preparación del sistema 3. Instalar y configurar todas las dependencias requeridas 4. Implementar infraestructura de monitoreo y logging
Fase 2: Configuración del Relé 1. Compilar e instalar Strfry con optimizaciones 2. Configurar políticas del relé y parámetros operacionales 3. Implementar proxy inverso con terminación SSL 4. Crear servicio systemd para gestión de procesos
Fase 3: Pruebas y Validación 1. Verificar conectividad WebSocket y cumplimiento del protocolo 2. Probar funcionalidad de publicación y recuperación de eventos 3. Validar configuración y renovación de certificados SSL 4. Realizar pruebas de carga y optimización de rendimiento
Fase 4: Procedimientos Operacionales 1. Implementar procedimientos de respaldo y recuperación 2. Configurar sistemas de monitoreo y alertas 3. Documentar procedimientos de mantenimiento y solución de problemas 4. Establecer procesos de actualización de seguridad y gestión de parches
Escalado y Optimización
Optimización de Rendimiento
Ajuste de Base de Datos:
# Configuración avanzada de LMDB
dbParams {
maxreaders = 1024
mapsize = 5TB
# Optimización de mapeo de memoria
mdb_env_set_mapsize = 5497558138880 # 5TB en bytes
mdb_env_set_maxdbs = 16
}
Optimización de Conexiones:
relay {
# Incrementar límites de conexión
nofiles = 131072
maxSubsPerConnection = 100
# Optimizar rendimiento de consultas
queryTimesliceBudgetMicroseconds = 10000
maxFilterLimit = 2000
# Ajuste de red
autoPingSeconds = 25
enableTcpKeepalive = true
}
Estrategias de Escalado Horizontal
Configuración de Balanceamiento de Carga:
upstream strfry_cluster {
least_conn;
server 10.0.1.10:7777 weight=3;
server 10.0.1.11:7777 weight=3;
server 10.0.1.12:7777 weight=2;
keepalive 64;
}
Replicación de Base de Datos:
# Configuración de replicación maestro-esclavo
/opt/strfry/strfry sync --source wss://master-relay.example.com \
--target /opt/strfry/data/strfry-db/
Solución de Problemas y Diagnósticos
Problemas Comunes y Resolución
Problemas de Conexión:
# Pruebas de conectividad WebSocket
wscat -c wss://relay.example.com
# Validación de certificado SSL
openssl s_client -connect relay.example.com:443 -servername relay.example.com
# Análisis de conectividad de red
tcptraceroute relay.example.com 443
Problemas de Rendimiento:
# Análisis de utilización de recursos
htop
iotop -a
iostat -x 1
# Monitoreo de rendimiento de base de datos
/opt/strfry/strfry stats
lmdb_stat /opt/strfry/data/strfry-db/
Problemas de Procesamiento de Eventos:
# Pruebas de validación de eventos
echo '{"id":"test","pubkey":"test","created_at":1234567890,"kind":1,"tags":[],"content":"test","sig":"test"}' | /opt/strfry/strfry import
# Depuración de política de escritura
echo '{"kind":1,"content":"contenido de prueba"}' | /opt/strfry/write-policy.sh
Configuración Avanzada
Filtrado Personalizado de Eventos
Política de Escritura Avanzada:
#!/bin/bash
event=$(cat)
# Extraer metadatos del evento
kind=$(echo "$event" | jq -r '.kind')
pubkey=$(echo "$event" | jq -r '.pubkey')
created_at=$(echo "$event" | jq -r '.created_at')
content=$(echo "$event" | jq -r '.content')
# Validación de timestamp
current_time=$(date +%s)
time_diff=$((current_time - created_at))
if [ $time_diff -gt 300 ] || [ $time_diff -lt -60 ]; then
echo '{"action": "reject", "msg": "Timestamp inválido"}'
exit 0
fi
# Validación de longitud de contenido
content_length=${#content}
if [ $content_length -gt 10000 ]; then
echo '{"action": "reject", "msg": "Contenido demasiado largo"}'
exit 0
fi
# Implementación de lista blanca/negra
if grep -q "$pubkey" /opt/strfry/blacklist.txt; then
echo '{"action": "reject", "msg": "Usuario bloqueado"}'
exit 0
fi
echo '{"action": "accept"}'
Analíticas y Reportes
Implementación de Analíticas de Eventos:
# Estadísticas diarias de eventos
/opt/strfry/strfry export --since=1day | \
jq -r '[.kind, .pubkey[0:8]] | @csv' | \
sort | uniq -c | sort -nr > daily-stats.txt
# Análisis de actividad de usuarios
/opt/strfry/strfry export --since=1week | \
jq -r '.pubkey' | sort | uniq -c | sort -nr | head -20
Próximos Pasos
El despliegue exitoso de relés proporciona experiencia práctica con la infraestructura de Nostr y te prepara para el desarrollo avanzado de protocolos. Entender los requisitos operacionales permite una contribución efectiva a la infraestructura de red y el desarrollo de servicios especializados.
Evaluación de Maestría en Infraestructura
Competencia en Operaciones de Relé
- ¿Cuáles son las consideraciones críticas para la configuración y optimización de la base de datos del relé?
- ¿Cómo permiten las políticas de escritura la moderación de contenido mientras mantienen los principios de descentralización?
- ¿Qué medidas de seguridad son esenciales para el despliegue de relés en producción?
- ¿Cómo pueden los operadores de relés equilibrar rendimiento, escalabilidad y costos de recursos?
Análisis de Infraestructura
- La configuración de base de datos debe equilibrar eficiencia de almacenamiento, rendimiento de consultas y patrones de acceso concurrente mientras asegura integridad de datos y resistencia a fallos
- Las políticas de escritura proporcionan filtrado programático de contenido a nivel de relé, permitiendo a los operadores implementar reglas personalizadas mientras los usuarios conservan la capacidad de elegir relés que se alineen con sus preferencias
- Las medidas de seguridad incluyen endurecimiento del sistema, protección de red, cifrado SSL/TLS, control de acceso, monitoreo y actualizaciones regulares de seguridad para proteger contra varios vectores de ataque
- La optimización de rendimiento requiere ajuste cuidadoso de parámetros de base de datos, límites de conexión, estrategias de caché y recursos de hardware mientras implementa estrategias de escalado rentables