¿Qué es una unidad systemd y por qué usar este generador?
En el Linux moderno (Ubuntu, Debian, Fedora, Arch, Rocky, Alma...) systemd es el programa que arranca servicios al inicio, los reinicia cuando se cuelgan y ejecuta trabajos programados. Un fichero de unidad es un pequeño fichero de texto en `/etc/systemd/system/` que le dice a systemd *qué* ejecutar y *cómo* comportarse.
Este generador escribe dos tipos de unidades por ti:
- Ficheros `.service` ExecStart para programas de larga duración (una app web Node, un worker Python, una base de datos).
- Ficheros `.timer` OnCalendar para trabajos que deben ejecutarse en un horario (el reemplazo moderno de cron).
Elige un preset, rellena los campos, copia el resultado en un fichero bajo `/etc/systemd/system/`, ejecuta `sudo systemctl daemon-reload && sudo systemctl enable --now miapp.service`, y listo. Todo ocurre en tu navegador, sin subidas, sin cuenta.
Cómo usarlo
- Elige un preset que se parezca a tu caso (app web Node, worker Python, backup oneshot, base de datos, binario Go, docker compose, servidor estático). El formulario se rellena con valores sensatos por defecto que puedes ajustar.
- Pon el nombre de la unidad (`miapp` se convierte en `miapp.service`), la Description (se muestra en `systemctl status`) y las dependencias (After, Wants, Requires, donde casi todo el mundo quiere `network-online.target`).
- En la sección Service elige un Type (usa `simple` para la mayoría de apps, `oneshot` para scripts que se ejecutan y salen, `forking` para daemons que hacen fork al fondo), el User y Group para soltar privilegios, y ExecStart con la ruta absoluta a tu binario.
- Elige una política de Restart. `on-failure` es el valor por defecto seguro: systemd reinicia solo si tu programa sale con código distinto de cero o se cuelga. `always` es para workers de larga vida que deben volver pase lo que pase. Usa RestartSec para fijar un back-off (5 segundos está bien).
- Añade variables de Environment (NODE_ENV, DATABASE_URL...). Las sensibles (passwords, tokens) van en `EnvironmentFile=` en su lugar: ponlas en un fichero con `chmod 600` fuera de la unidad.
- Hardening opcional: activa `PrivateTmp`, `ProtectSystem`, `NoNewPrivileges`. No cuestan nada y limitan el daño si el servicio se ve comprometido. El generador explica cada uno.
- Cambia a la pestaña .timer si quieres una ejecución programada en lugar de (o además de) el servicio de larga duración. Rellena OnCalendar (p. ej. `daily`, `Mon *-*-* 03:00:00`), activa Persistent para que una ejecución perdida corra tras un reinicio, apunta Unit a tu servicio.
- Pulsa Copiar o Descargar. Coloca el fichero en `/etc/systemd/system/miapp.service` (y `miapp.timer` si aplica), luego ejecuta `sudo systemctl daemon-reload`, `sudo systemctl enable --now miapp.service` y mira los logs con `journalctl -u miapp.service -f`.
Cuándo es útil
Siete situaciones concretas en las que una buena unidad systemd ahorra tiempo real:
- Has escrito un programa en Node, Python o Go y quieres que arranque al inicio y se reinicie al cuelgue. Suelta un `.service` en `/etc/systemd/system/` y olvídate de `pm2`, `forever`, `screen` o `nohup`.
- Tienes un script que debe ejecutarse en un horario (backup nocturno, reporte semanal, refresco de caché horario). Un par `.timer` + `.service` es el reemplazo moderno de cron y los logs van directos a journalctl.
- Necesitas ejecutar un programa como usuario no-root con permisos controlados. `User=` y `Group=` sueltan privilegios; `ProtectSystem=strict`, `PrivateTmp=yes` y `NoNewPrivileges=yes` añaden hardening gratis.
- Gestionas una flota pequeña y quieres la misma definición de servicio en todas las máquinas. El fichero de unidad es texto plano: ponlo en git, despliega con ansible / un Makefile / scp.
- Necesitas que un servicio espere a la red o a una base de datos antes de arrancar. `After=network-online.target` y `Requires=postgresql.service` hacen explícito el orden.
- Un stack docker compose debe arrancar al boot. Un `.service` oneshot con `ExecStart=docker compose up -d` más `Requires=docker.service` lo gestiona limpio.
- Quieres logs centralizados sin configurar nada. `StandardOutput=journal` (por defecto) significa que `journalctl -u miapp` rastrea tu programa y `journalctl --since "1 hour ago"` es tu única búsqueda.