docs Tareas programadas

Tareas programadas

Ejecuta trabajos cron y comandos puntuales (migraciones, scripts, consultas) sobre tus aplicaciones, stacks y bases de datos.

Resumen

Una tarea es un comando con nombre y repetible sobre un servicio, con una programación cron opcional. Úsala para cosas como php artisan schedule:run cada minuto, una limpieza nocturna o un php artisan migrate --force guardado que ejecutas a mano después de los despliegues. A diferencia del terminal web, cada ejecución queda registrada con su salida, código de salida, duración y quién la inició.

Las tareas viven en la pestaña Tasks de cada aplicación, stack de Compose y base de datos. La pestaña tiene tres partes: la lista de tareas, un cuadro Run a command para comandos puntuales y el Run history.

Crear una tarea

Haz clic en New task y rellena:

Name

Una etiqueta para la lista y el historial, p. ej. “Run migrations”.

Service

Solo en stacks — en qué servicio de Compose se ejecuta el comando.

Command

Hasta 4.000 caracteres. Se ejecuta mediante /bin/sh -lc, así que &&, pipes y globs funcionan.

Schedule

Un preset (cada minuto, cada 5 minutos, cada hora, a diario a las 2:00, semanal), Custom… o “No schedule (run manually)”.

Time zone

Cualquier zona IANA (p. ej. Europe/Madrid). Por defecto, UTC.

Timeout (seconds)

De 1 a 86.400; por defecto 300. El contenedor se mata cuando expira.

Mientras escribes una programación, el formulario previsualiza las próximas horas de ejecución, para que puedas comprobar la zona horaria antes de guardar. Cada tarea de la lista tiene las acciones Run now, Edit, Enable/Disable y Delete. Deshabilitar detiene la programación sin eliminar la tarea; aún puedes ejecutarla manualmente. Los cambios de programación surten efecto de inmediato, sin necesidad de reiniciar.

Sintaxis cron

Las programaciones usan cron estándar de 5 campos: minute hour day-of-month month day-of-week. Los campos de segundos y atajos como @daily se rechazan, y el intervalo mínimo es de un minuto.

bash
* * * * *      # every minute
*/15 * * * *   # every 15 minutes
0 3 * * *      # every day at 03:00 (in the task's time zone)
30 8 * * 1-5   # weekdays at 08:30
0 0 1 * *      # first day of every month at midnight

Dónde se ejecutan los comandos

Cada ejecución inicia un contenedor nuevo y temporal a partir de la imagen del servicio y lo elimina cuando el comando termina. Nunca se ejecuta dentro del contenedor en marcha, de modo que una migración funciona incluso con la aplicación detenida, un trabajo largo no le roba recursos al contenedor que sirve el tráfico y las réplicas nunca son un problema.

DestinoCómo se ejecuta
AplicaciónLa imagen actual de la aplicación con sus variables de entorno, volúmenes, límites de CPU/memoria y la deploykit-network. La aplicación debe haberse desplegado al menos una vez.
Servicio de stackdocker compose run --rm --no-deps para el servicio elegido: el entorno, los volúmenes y las redes provienen del stack, y los demás servicios no se inician.
Base de datosLa imagen cliente de la base de datos (psql, mysql, redis-cli, mongosh…) en la red compartida. El volumen de datos no se monta.

Las tareas de base de datos reciben DK_DB_HOST, DK_DB_PORT, DK_DB_USER, DK_DB_NAME y DK_DB_PASSWORD. Para PostgreSQL, MySQL/MariaDB y Redis, la contraseña también se define en PGPASSWORD, MYSQL_PWD o REDISCLI_AUTH, por lo que el cliente nunca la necesita en la línea de comandos. MongoDB no tiene una variable así — pasa tú mismo $DK_DB_PASSWORD a mongosh.

bash
# PostgreSQL database task
psql -h "$DK_DB_HOST" -U "$DK_DB_USER" -d "$DK_DB_NAME" -c "VACUUM ANALYZE;"

Comandos puntuales

Escribe un comando en Run a command, cambia opcionalmente su timeout y haz clic en Run. Se ejecuta exactamente como una tarea (contenedor nuevo, mismo entorno) pero sin guardarse, y aparece en el Run history. La salida se muestra en directo en un diálogo Command output que puedes reabrir más tarde desde el historial.

Historial de ejecuciones y comportamiento

  • Cada ejecución termina como success (código de salida 0), failed, timed_out o skipped, con su código de salida, duración y origen (programación o manual).
  • Sin solapamiento: si la ejecución anterior de la misma tarea sigue en curso, la nueva se registra como skipped en lugar de ejecutarse. Un trabajo cada minuto nunca puede acumularse.
  • Los timeouts matan el contenedor y añaden “[deploykit] Command timed out and was killed.” a la salida.
  • Solo se guardan los últimos 64 KB de salida — el final, donde suelen estar los errores. La salida más larga se marca como truncada.
  • Se conservan las 50 ejecuciones más recientes por tarea (y por servicio en los comandos puntuales). El historial sobrevive a la eliminación de la tarea.
  • Una ejecución captura el comando y el timeout al empezar, así que editar una tarea nunca cambia una ejecución ya en curso. Las ejecuciones no se pueden cancelar.
  • Se ejecutan hasta 3 ejecuciones a la vez en toda la instancia; las demás esperan en la cola.
  • Las ejecuciones fallidas y las que agotan el timeout disparan el evento de notificación Task Failed — actívalo en los canales de notificación de tu proyecto.
  • En los servidores remotos, la salida llega cuando el comando termina, en lugar de línea a línea.

Permisos

Ejecutar un comando es tan potente como el terminal, por lo que crear, editar, eliminar y ejecutar tareas requiere el rol global de Operator (o Admin) y acceso de Operator al proyecto. Cualquier miembro del proyecto puede ver la lista de tareas y el historial de ejecuciones, pero la salida del comando solo es visible para los Operator y Admin del proyecto, ya que puede contener secretos como cadenas de conexión. Todos los cambios y ejecuciones de tareas se escriben en el registro de auditoría.

Problemas habituales: La imagen necesita una shell POSIX en /bin/sh — las imágenes scratch y distroless no pueden ejecutar tareas. Los contenedores de tareas no publican puertos y nunca se reinician, así que un comando que deba seguir ejecutándose pertenece a un servicio, no a una tarea. En un stack, el cuadro Run a command usa siempre el primer servicio del archivo Compose; crea una tarea para elegir otro servicio.