PullPilot es un actualizador de stacks Docker Compose autoalojado, pensado para homelabs y despliegues personales. Reúne en una sola interfaz el estado de todos tus proyectos, la descarga de imágenes nuevas y la recreación de los servicios — con rollback automático cuando un despliegue no levanta sano.
El problema
Mantener al día una docena de stacks de Compose es trabajo manual y repetitivo: entrar por SSH, git pull, docker compose pull, up -d, comprobar que todo sigue en pie y repetirlo carpeta por carpeta. Las alternativas o actualizan a ciegas, o piden montar más infraestructura de la que quieres para un homelab.
PullPilot escanea la raíz donde guardas tus stacks, muestra una tarjeta por proyecto y deja la decisión en tus manos: actualizarlo todo, actualizar uno, o no tocar ese nunca.
Qué hace
- Dashboard por proyecto. Una tarjeta por stack con su estado, su botón de actualización y los interruptores Full stop y Excluir.
- Update All. Recorre los proyectos no excluidos, hace
git pulldonde aplica, recrea los contenedores y deja un resumen en el Historial. - Full stop. Para servicios delicados que no llevan bien un reinicio en caliente: fuerza un
docker compose downcompleto antes de descargar la imagen nueva y volver a levantar. - Excluir. Significa nunca actualices esto automáticamente: Update All lo salta, su botón individual queda deshabilitado y una tarea programada que lo apunte no se ejecuta. Solo quitar el interruptor lo devuelve.
- Programación. Tareas cron o puntuales, por proyecto o para todo a la vez. No hay ninguna programación hasta que la creas. Las horas cron siguen el reloj del contenedor (
TZ); una tarea puntual conserva la zona horaria del navegador que la creó. Se rechaza una programación si su objetivo no existe, está excluido o duplicaría otra que ya tienes. - Actualizaciones en segundo plano. Tanto Update All como la actualización de un solo proyecto responden de inmediato y trabajan por detrás; la interfaz las sigue por sondeo. Ninguna conexión HTTP queda abierta durante todo el despliegue, así que un proxy inverso con un timeout de lectura corto no marcará como fallido un despliegue que funcionó.
- Español e inglés en la interfaz y en el historial.
Qué pasa si una actualización falla
Antes de descargar nada, PullPilot anota qué imagen local está usando cada servicio. Si el despliegue o el healthcheck fallan, vuelve a poner esas etiquetas, revierte el fichero compose cuando el stack es un clon de Git y levanta el stack igualmente: una actualización fallida no lo deja caído.
Dos límites que conviene conocer: los servicios construidos desde un Dockerfile (build:) se reconstruyen en lugar de revertirse, y una imagen que nunca se había descargado en ese host no tiene versión anterior a la que volver.
Seguridad y alcance
- PullPilot habla directamente con el socket de Docker: trátalo con el mismo cuidado que un acceso root. No expongas el puerto 8000 a internet sin TLS mediante proxy inverso, una contraseña fuerte y, a poder ser, una capa extra de autenticación (Authelia, Authentik y similares).
- Las credenciales se crean en el asistente del primer arranque y viven hasheadas en la base de datos. No hay ninguna variable de entorno capaz de crearlas, sustituirlas o esquivarlas.
- Las actualizaciones y las tareas programadas solo se ejecutan bajo
STACKS_PATH; las rutas fuera de ese árbol se rechazan. - Detrás de un proxy inverso, define
PUBLIC_URLcon la dirección real que usas: un valorhttps://marca la cookie de sesión comoSecurey hace que el límite de intentos de login leaX-Forwarded-For. Déjalo sin definir en una instalación de LAN. - Un único worker de Uvicorn por instancia: el planificador, el límite de login y el estado de las actualizaciones son por proceso, así que más de un worker significaría actualizaciones programadas duplicadas.
Stack
React y Vite en el frontend; FastAPI sobre Uvicorn con SQLite en el backend; todo en un contenedor. Licencia Apache-2.0, imagen ghcr.io/kn990x/pullpilot. Si todavía fijas ghcr.io/kernel-nomad/pullpilot, actualiza la ruta: el repositorio se renombró.
Empezar
sudo mkdir -p /srv/docker-stacks
mkdir -p ~/pullpilot && cd ~/pullpilot
curl -fsSL -o docker-compose.yml https://raw.githubusercontent.com/KN990x/PullPilot/main/docker-compose.yml
docker compose up -d
Abre http://tu-servidor:8000 y crea usuario y contraseña en el asistente. Cada proyecto es una subcarpeta bajo /srv/docker-stacks con su propio docker-compose.yml; cuando puedas, mantén la carpeta de compose de PullPilot fuera de ese árbol.
Todas las variables son opcionales. Si necesitas cambiar alguna, crea un .env junto al docker-compose.yml: STACKS_PATH (raíz de stacks, misma ruta en host y contenedor), PULLPILOT_PORT (puerto publicado, por defecto 8000), TZ (zona horaria de las tareas programadas) y PUBLIC_URL (solo detrás de proxy inverso). Tras cualquier cambio, docker compose up -d.
La documentación completa y las notas de versión están en pullpilot.app y en el repositorio KN990x/PullPilot.