Guía de despliegue

Healthchecks en un VPS: monitoriza tus tareas cron, autoalojado

Desplegar en un VPS Cloud →

Tutorial

Healthchecks en un VPS: monitoriza tus tareas cron, autoalojado

Autoalojamiento6 min de lectura4 pasos

Una tarea cron que deja de ejecutarse no hace ruido. La copia nocturna falla, la limpieza de registros se detiene, la sincronización con un proveedor se rompe — y nada te avisa, porque nada se ejecuta. Healthchecks es una herramienta open source (licencia BSD-3) que invierte el problema: cada tarea envía un ping al terminar, y Healthchecks te avisa cuando ese ping no llega. Esta guía lo instala en un único contenedor Docker en un VPS, lo coloca detrás de un proxy inverso HTTPS y conecta una primera tarea cron.

Contenido· Por qué vigilar lo que debe ejecutarse, no solo lo que responde1/10
  1. 01Por qué vigilar lo que debe ejecutarse, no solo lo que responde
  2. 02Lo que aporta Healthchecks
  3. 03Healthchecks frente a los métodos habituales
  4. 04Requisitos previos
  5. 05Instalar Healthchecks con Docker Compose
  6. 06Mantén el registro cerrado
  7. 07Conectar tus tareas cron
  8. 08Recibir las alertas
  9. 09Resolución de problemas
  10. 10Instalación en un clic desde el Marketplace de ServOrbit

Por qué vigilar lo que debe ejecutarse, no solo lo que responde

Un monitor de disponibilidad comprueba que un servicio responde. No ve lo que ocurre entre dos peticiones: la copia de las 3 h, el envío de facturas, la renovación de un certificado, la exportación al contable. Estas tareas fallan en silencio — un disco lleno, una contraseña caducada, un servidor reiniciado sin su timer — y te das cuenta el día que las necesitas.

La variable MAILTO de cron apenas ayuda: solo envía un mensaje si la tarea se ejecuta y escribe en su salida, y no dice nada cuando la tarea ni siquiera arranca. Healthchecks parte de la ausencia: cada tarea tiene una planificación esperada, y el silencio más allá del margen de gracia dispara la alerta.

Lo que aporta Healthchecks

  • Monitorización por ping — cada tarea llama a una URL única; la ausencia de ping dispara la alerta.
  • Planificación cron o por periodo — expresión cron con zona horaria, o un intervalo simple, más un margen de gracia.
  • Duración de la ejecución — los pings /start y /fail miden la duración y señalan los fallos explícitos.
  • Códigos de salida y registros — el código de salida y el final de la salida del comando, visibles en el panel.
  • Más de veinte integraciones — correo, webhook, Slack, Discord, Matrix, ntfy, Telegram, Gotify, PagerDuty, Opsgenie…
  • Equipo y API — proyectos separados, miembros invitados, insignias de estado y una API REST para crear comprobaciones desde tus scripts.

Healthchecks frente a los métodos habituales

Desplace la tabla

HealthchecksMAILTO de cronMonitor de disponibilidad
Alerta si la tarea no arrancaSíNoNo
Alerta si la tarea fallaSí, código de salida o /failSolo si escribe en su salidaNo
Duración de la ejecuciónMedidaNoNo
Máquinas sin puerto abiertoSí, una simple llamada HTTPS salienteSíNo, hay que alcanzar el destino
Canales de alertaMás de veinte integracionesCorreo localSegún la herramienta
Historial centralizadoSí, por comprobaciónNoSí, para los servicios

Requisitos previos

Basta un VPS Ubuntu 24.04 con 1 GB de RAM: Healthchecks funciona en un solo contenedor y guarda sus datos en una base SQLite. Necesitas Docker con el plugin Compose y un nombre de dominio que apunte al VPS, con nginx y un certificado HTTPS: las URL de ping y los enlaces de las alertas se construyen sobre esa dirección, y la aplicación rechaza las peticiones dirigidas a otro nombre.

Lo ideal es instalar Healthchecks en una máquina distinta de los servidores que vigila: si cae con ellos, nadie te avisará.

Instalar Healthchecks con Docker Compose

  1. Preparar el archivo .env

    Crea el directorio de la aplicación y un archivo .env con la clave secreta y la dirección pública. Sustituye hc.example.com por tu dominio.

    mkdir -p /opt/healthchecks && cd /opt/healthchecks
    cat > .env <<EOF
    SECRET_KEY=$(openssl rand -hex 24)
    SITE_ROOT=https://hc.example.com
    EOF
  2. Crear el archivo Compose

    Coloca este docker-compose.yml en el mismo directorio. El puerto solo se publica en la interfaz de loopback, el registro público está cerrado y la base SQLite vive en un volumen.

    services:
      healthchecks:
        image: healthchecks/healthchecks:v5.0.1
        restart: unless-stopped
        ports:
          - "127.0.0.1:8102:8000"
        env_file: .env
        environment:
          DEBUG: "False"
          DB_NAME: /data/hc.sqlite
          REGISTRATION_OPEN: "False"
          GUNICORN_WORKERS: "2"
        volumes:
          - healthchecks-data:/data
    volumes:
      healthchecks-data: {}
  3. Arrancar y crear la cuenta de administrador

    Al arrancar, el contenedor aplica las migraciones y lanza el servidor web y los procesos de envío de alertas. Después crea tu cuenta: el comando pide una dirección de correo y una contraseña.

    docker compose up -d
    docker compose exec healthchecks ./manage.py createsuperuser
  4. Publicar en HTTPS detrás de nginx

    Añade un bloque server para tu dominio, con un certificado de Let's Encrypt, y reenvía las cabeceras de origen: sin X-Forwarded-Proto, el inicio de sesión falla con un error CSRF.

    location / {
        proxy_pass http://127.0.0.1:8102;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

Mantén el registro cerrado

Por defecto, Healthchecks acepta registros públicos. REGISTRATION_OPEN: "False" los cierra: solo pueden entrar las cuentas que crees o invites a un proyecto. En un servidor expuesto a Internet, configúralo desde el primer arranque.

Conectar tus tareas cron

En el panel, crea una comprobación, indica la planificación — la expresión cron de la tarea y su zona horaria — y un margen de gracia que cubra su duración normal. Copia la URL de ping y añádela a la tarea.

# crontab: copia a las 3 h, ping solo si tiene éxito
0 3 * * * /usr/local/bin/backup.sh && curl -fsS -m 10 --retry 5 -o /dev/null https://hc.example.com/ping/<uuid>

# variante: señalar el inicio y luego enviar el código de salida
URL=https://hc.example.com/ping/<uuid>
curl -fsS -m 10 --retry 5 -o /dev/null "$URL/start"
/usr/local/bin/backup.sh > /tmp/backup.log 2>&1
curl -fsS -m 10 --retry 5 -o /dev/null --data-binary @/tmp/backup.log "$URL/$?"

La primera forma solo envía el ping si hay éxito: un fallo se traduce en un ping ausente, y por tanto en una alerta al terminar el margen de gracia. La segunda es más expresiva: /start mide la duración, el código de salida enviado en lugar del ping señala el fallo de inmediato y la salida enviada en el cuerpo de la petición aparece en el historial de la comprobación. Las opciones -m 10 --retry 5 evitan que una red inestable bloquee la tarea o simule una caída.

Recibir las alertas

En Integrations, añade al menos un canal que leas de verdad y asócialo a tus comprobaciones. Webhook, Slack (webhook entrante), Mattermost, ntfy y Gotify funcionan sin configuración en el servidor. Otras integraciones necesitan credenciales declaradas en .env: un token de bot para Telegram, una cuenta y un token para Matrix, una aplicación OAuth para Discord.

Las alertas por correo pasan por un servidor SMTP: añade EMAIL_HOST, EMAIL_PORT, EMAIL_HOST_USER, EMAIL_HOST_PASSWORD y DEFAULT_FROM_EMAIL a .env y reinicia con docker compose up -d. Los mismos ajustes sirven para las invitaciones del equipo y los informes periódicos.

Resolución de problemas

La página devuelve un error 400. La petición no llega con el nombre de host correcto: comprueba que SITE_ROOT coincide exactamente con el dominio servido por nginx y que el bloque location reenvía la cabecera Host.

El inicio de sesión falla con un error CSRF. nginx no reenvía X-Forwarded-Proto: la aplicación cree recibir HTTP mientras el navegador habla HTTPS. Añade la cabecera y recarga nginx.

Una comprobación entra en alerta aunque la tarea se ejecutó. El ping no salió: prueba el comando curl a mano desde la máquina afectada, verifica el acceso saliente en HTTPS y amplía el margen de gracia si la tarea dura más de lo previsto.

No llega ningún correo. Sin EMAIL_HOST, Healthchecks no envía nada y lo indica en sus registros al arrancar: consulta docker compose logs healthchecks.

Instalación en un clic desde el Marketplace de ServOrbit

El Marketplace de ServOrbit instala Healthchecks en tu VPS sin línea de comandos: despliega el contenedor con el registro cerrado, crea la cuenta de administrador con una contraseña generada y publica la aplicación en HTTPS en un subdominio de tu dominio o en el subdominio gratuito del VPS. El usuario y la contraseña aparecen en tu área de cliente; solo queda crear tus comprobaciones.

Tus tareas programadas vigiladas, en tu propio VPS

Un VPS ServOrbit Ubuntu 24.04 con 1 GB de RAM basta para Healthchecks. Instalación en un clic desde el Marketplace, HTTPS en tu dominio o en el subdominio gratuito del VPS, y la cuenta de administrador creada para ti.

¿Necesita ayuda?

Consulte nuestro centro de ayuda y nuestra FAQ, o contacte con nuestro equipo: llamada, WhatsApp o correo electrónico. Soporte en francés, inglés y árabe.

Escribir por WhatsAppse abre en una pestaña nueva