Volver a la wiki

Configuración del Servidor ASGI - PRIORIDAD ALTA

Configuración del Servidor ASGI - PRIORIDAD ALTA

IMPORTANTE: Esta configuración es crítica para la estabilidad de la aplicación, especialmente cuando se conectan decenas o centenas de dispositivos simultáneamente.

Fecha: 04-02-2026 Versión: v6.4.1


Resumen Ejecutivo

La aplicación CreaRack Pro usa WebSockets para:

Cuando se monitorean muchos dispositivos simultáneamente, el consumo de memoria puede crecer significativamente. Esta guía documenta la configuración óptima.


1. Servidor ASGI: Daphne (Recomendado)

Por qué Daphne y NO Uvicorn

AspectoUvicornDaphne
Consumo memoria650-800 MB200-300 MB
Estabilidad WebSocketProblemas de timeoutEstable
OrigenGenérico ASGIOficial Django Channels
WebSocket keepaliveRequiere configuración manualOptimizado por defecto

Decisión (04-02-2026): Se migró de Uvicorn a Daphne debido a:

Configuración en compose.yml

web:
  command: daphne -b 0.0.0.0 -p 8000 --proxy-headers config.asgi:application
  restart: unless-stopped
  deploy:
    resources:
      limits:
        memory: 512M      # Límite duro - Docker reinicia si se excede
      reservations:
        memory: 256M      # Mínimo garantizado

Opciones de Daphne

OpciónDescripción
-b 0.0.0.0Escuchar en todas las interfaces
-p 8000Puerto
--proxy-headersRespetar headers X-Forwarded-* de proxy/load balancer
-v 2Verbosidad (opcional, para debug)

2. Channel Layer (Redis/Valkey)

Configuración Óptima

# config/settings/dev.py (o production.py)
CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {
            "hosts": [(os.getenv("REDIS_HOST", "cache"), 6379)],
            "capacity": 1500,  # Máximo mensajes en cola por canal
            "expiry": 60,      # Mensajes expiran en 60 segundos
        },
    },
}

Por qué es importante

ParámetroSin configurarConfiguradoImpacto
capacityIlimitado1500Evita memory leak por mensajes acumulados
expiryIlimitado60sLimpia mensajes huérfanos automáticamente

Escenario problemático sin configurar:


3. Límites de Memoria Docker

Configuración

deploy:
  resources:
    limits:
      memory: 512M    # CRÍTICO: Límite máximo
    reservations:
      memory: 256M    # Mínimo reservado

Comportamiento

SituaciónAcción de Docker
Memoria < 512MNormal
Memoria = 512MDocker mata el proceso (OOM)
restart: unless-stoppedDocker reinicia automáticamente

Esto actúa como Supervisord: Si hay memory leak, el contenedor se reinicia automáticamente en lugar de quedarse colgado.


4. Estimación de Recursos por Escala

Memoria estimada por número de dispositivos

DispositivosConexiones WSMemoria estimadaRecomendación
1-10~10150-200 MB512M límite
10-50~50200-350 MB512M límite
50-100~100350-500 MB768M límite
100-500~500500-1000 MB1.5G límite + workers

Para más de 100 dispositivos

Considerar:

  1. Múltiples workers Daphne:

    command: daphne -b 0.0.0.0 -p 8000 --proxy-headers -t 60 config.asgi:application
  2. Horizontal scaling con load balancer

  3. Separar servicios:

    • Web app (HTTP) → Gunicorn
    • WebSockets → Daphne dedicado

5. Monitoreo

VictoriaMetrics

Acceder a http://localhost:8428/vmui para monitorear métricas PromQL:

Comandos útiles

# Ver memoria actual
docker stats crearack_web

# Ver logs en tiempo real
docker compose logs -f web

# Reiniciar si hay problemas
docker compose restart web

6. Troubleshooting

Síntoma: Aplicación cae sin error aparente

Causa probable: OOM (Out of Memory)

Verificar:

docker inspect crearack_web | grep -A5 "State"
# Buscar "OOMKilled": true

Solución: Aumentar límite de memoria o reducir dispositivos monitoreados.

Síntoma: WebSocket se desconecta frecuentemente

Causa probable: Timeout de keepalive

Solución: Ya resuelto con Daphne. Si persiste, verificar:

Síntoma: Memoria crece constantemente

Causa probable: Channel Layer sin límites

Solución: Verificar configuración de capacity y expiry.


7. Historial de Cambios

FechaCambioMotivo
04-02-2026Migración Uvicorn → DaphneInestabilidad, memoria excesiva
04-02-2026Añadido capacity/expiry a Channel LayerPrevenir memory leak
04-02-2026Límite memoria Docker 512MAuto-recovery en OOM

Mantenido por: Equipo CreaRack

Véase también

Subir