Tareas Celery
NoxPanel usa Celery 5.3+ con Redis como broker y DatabaseScheduler de
django-celery-beat para programar tareas periódicas. Las tareas se definen
en ficheros tasks.py de cada módulo.
Configuración
# proxmoxpanel/settings.py
CELERY_BROKER_URL = os.environ.get('CELERY_BROKER_URL', 'redis://redis:6379/0')
CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'
Servicios Docker:
celery_worker: Ejecuta las tareas (
concurrency=4)celery_beat: Programa y despacha tareas periódicas
Tareas por Módulo
Billing
Ubicación: billing/tasks.py
Tarea |
Descripción |
Frecuencia |
|---|---|---|
|
Registra uso horario para suscripciones VM activas con facturación por hora |
Cada hora |
|
Registra uso diario para suscripciones de hosting |
Cada 24h |
|
Genera facturas mensuales para todos los tenants con suscripciones activas. Ejecuta verificación diaria, genera factura del mes anterior |
Cada 24h |
|
Marca facturas pendientes como vencidas y envía emails de recordatorio (dunning). También envía notificaciones Telegram |
Cada hora |
|
Renueva suscripciones cuyo periodo ha finalizado. Avanza fechas al siguiente periodo y genera facturas de renovación. Excluye suscripciones Stripe/PayPal (gestionadas via webhooks) |
Cada hora |
Hosting
Ubicación: hosting/tasks.py
Tarea |
Descripción |
Frecuencia |
|---|---|---|
|
Sincroniza el uso real de cuotas por tenant: sitios, bases de datos, dominios, FTP, buzones, alias y shell users. Alerta cuando se superan cuotas |
Cada hora |
|
Verifica registros DNS críticos (A root, MX, SPF) para todas las zonas activas. Registra warnings para DNS mal configurado |
Cada hora |
|
Verifica fechas de expiración de certificados SSL. Alerta si expiran en <30 días. Intenta renovación automática para Let’s Encrypt |
Cada 24h |
|
Registra estado de despliegue de certificados SNI para mail. El sync real
lo ejecuta |
Cada 6h |
|
Sincroniza certificados SSL desde |
Cada 6h |
|
Backup nocturno automatizado de todos los sitios activos. Genera tarballs con archivos + dumps de BD |
Cada 24h (nocturno) |
|
Elimina backups automáticos con más de 30 días. Preserva backups manuales y limpia registros de backups fallidos |
Cada 24h |
|
Detecta registros huérfanos (existen en DB pero no en hosting engine) y los marca como inactivos |
Solo manual |
Ticketing
Ubicación: ticketing/tasks.py
Tarea |
Descripción |
Frecuencia |
|---|---|---|
|
Recupera emails de todas las cuentas de correo activas y los convierte en tickets. Soporta IMAP y OAuth2 (Microsoft/Google) |
Cada 5 min |
|
Detecta y escala tickets con violaciones SLA. Incumplimiento de primera respuesta: asigna al manager del departamento. Incumplimiento de resolución: escala prioridad a “urgente” y notifica admins |
Cada 15 min |
|
Envía emails de notificación para eventos: new_ticket, new_reply, status_changed, sla_breach. Enruta a destinatarios apropiados |
Bajo demanda ( |
|
Cierra automáticamente tickets resueltos hace >7 días. Actualiza estado a “closed” y registra timestamp |
Cada 24h |
Notifications
Ubicación: notifications/tasks.py
Tarea |
Descripción |
Frecuencia |
|---|---|---|
|
Envía email para una notificación específica. Compone asunto + cuerpo
con título, mensaje y URL. Marca como |
Bajo demanda |
|
Elimina notificaciones leídas con más de 90 días. Las no leídas se preservan independientemente de la antigüedad |
Solo manual |
VMs (Threading, no Celery)
Ubicación: vms/tasks.py
Note
Las tareas de VMs usan threading (no Celery @shared_task) para comunicación
en tiempo real via WebSocket durante la creación/eliminación de VMs.
create_vm_async()— Creación de VM con progreso via WebSocketdelete_vm_async()— Eliminación de VM con progresoclone_vm_async()— Clonación de VMmigrate_vm_async()— Migración de VM entre nodos
Resumen de Programación
Tarea |
Frecuencia |
Módulo |
Criticidad |
|---|---|---|---|
|
5 min |
Ticketing |
Alta |
|
15 min |
Ticketing |
Alta |
|
1 hora |
Billing |
Alta |
|
1 hora |
Billing |
Alta |
|
1 hora |
Billing |
Alta |
|
1 hora |
Hosting |
Media |
|
1 hora |
Hosting |
Media |
|
6 horas |
Hosting |
Media |
|
6 horas |
Hosting |
Baja |
|
24 horas |
Billing |
Alta |
|
24 horas |
Billing |
Alta |
|
24 horas |
Hosting |
Media |
|
24 horas |
Hosting |
Alta |
|
24 horas |
Hosting |
Baja |
|
24 horas |
Ticketing |
Baja |
Comandos Útiles
# Ver logs del worker
docker logs noxpanel-celery_worker-1 --tail 100
# Ver logs del beat (scheduler)
docker logs noxpanel-celery_beat-1 --tail 100
# Ejecutar tarea manualmente
docker exec noxpanel-web-1 python manage.py shell -c \
"from billing.tasks import check_overdue_invoices; \
check_overdue_invoices.delay()"
# Ver tareas programadas (via Django admin)
# /admin/django_celery_beat/periodictask/
# Reiniciar worker y beat
docker restart noxpanel-celery_worker-1 noxpanel-celery_beat-1
Troubleshooting
Las tareas no se ejecutan:
Verificar que Redis está corriendo:
docker logs noxpanel-redis-1Verificar que el worker está sano:
docker ps | grep celeryVerificar conexión del worker:
docker logs noxpanel-celery_worker-1 | head -20
Las tareas periódicas no se disparan:
Verificar que celery_beat está corriendo y sano
Verificar que
DatabaseSchedulerse configuró correctamenteComprobar las tareas en Django admin:
/admin/django_celery_beat/periodictask/
Error de importación en tarea:
Las tareas se registran con nombres explícitos (name='module.task_name').
Si cambia el nombre del módulo, actualizar el CELERY_BEAT_SCHEDULE y los
registros en django_celery_beat.