Si tienes un homelab con varios contenedores Docker, sabrás la pereza que da mantenerlos actualizados manualmente. Os presento PullPilot, la herramienta que soluciona esto de forma visual, automática y, sobre todo, súper segura.
La verdad es que este proyecto nace de la frustración. Como os he comentado antes, estaba cansado de tener que acordarme de actualizar los contenedores y, sobre todo, de ver que las alternativas actuales eran demasiado complejas para algo TAN simple. Así que básicamente he creado una webapp con un dashboard súper limpio que escanea tus Dockers y te permite mantenerlos al día.
Lo único que hay que tener en cuenta (como con cualquier actualizador) son los "breaking changes"; es decir, que si los desarrolladores de esas imágenes Docker hacen cambios bruscos en sus proyectos (rara vez pasa en proyectos serios) puede que rompas el docker-compose.yml, pero te pasaría exactamente lo mismo si lo hicieras a mano.
Tenéis toda la información de su funcionamiento, instalación y configuración en el nuevo repositorio oficial (KN990x/PullPilot), pero os destaco sus características principales:
- Control Total: Tú decides cuándo actualizar. Puedes darle al botón de "Actualizar Todo" o ir proyecto por proyecto desde sus tarjetas individuales.
- Modo "Full Stop": Si tienes servicios delicados (como bases de datos) que no se llevan bien con un reinicio en caliente, he añadido un interruptor para forzar una bajada completa (
docker compose down) antes de descargar la nueva imagen y volver a subir el servicio. - Lista de Excluidos: Puedes marcar proyectos específicos para que sean ignorados por completo en las actualizaciones masivas.
- Programación Inteligente (Cron/Date): Puedes programar actualizaciones automáticas (diarias, semanales, mensuales) o fijar una fecha única directamente desde la interfaz visual.
- Rollback Automático integrado: PullPilot toma un snapshot del commit de Git antes de actualizar. Si el contenedor nuevo falla críticamente o no supera el control de salud (healthcheck), el sistema hace un
git reset --hardautomáticamente y fuerza un redespliegue de la versión anterior para que tu servicio no se quede caído. - Mantenimiento y limpieza de disco: Tras una actualización global que finalice con cero errores, PullPilot ejecuta un comando interno
docker image prune -fde forma totalmente segura. Así, las imágenes antiguas y colgadas (dangling images) se eliminan solas y no te llenan el disco duro. - Soporte Multiidioma Nativo: La interfaz y los logs de historial soportan Español e Inglés. El frontend detecta tu navegador automáticamente, pero puedes forzar el idioma de las tareas en segundo plano usando la variable
LOG_LOCALE=es.
Notas importantes sobre seguridad
Como PullPilot interactúa directamente con el socket de Docker, trátalo con el mismo cuidado que un acceso root.
- No expongas el puerto 8000 a internet sin un proxy inverso con TLS.
- El sistema incluye una directiva de Rate Limiting integrada en el backend: si se detectan más de 15 intentos fallidos de inicio de sesión desde una IP en un lapso de 5 minutos, esa IP quedará bloqueada temporalmente para evitar ataques de fuerza bruta.
Instalación rápida mediante docker compose
Por defecto, el despliegue está diseñado para escanear los proyectos que guardes dentro de la ruta del host /srv/docker-stacks. Cada proyecto debe ser una subcarpeta que tenga su propio archivo docker-compose.yml en su interior.
1) Configurar el .env (Recomendado)
# Ruta absoluta en el host donde guardas tus carpetas de proyectos Docker
DOCKER_ROOT_PATH=/srv/docker-stacks
# Puerto de la interfaz y Zona Horaria
PULLPILOT_PORT=8000
TZ=Europe/Madrid
# Seguridad (Obliga a iniciar sesión)
ALLOW_NO_AUTH=false
AUTH_USER=admin
AUTH_PASS=tu-contraseña-segura
# Clave fija para firmar las cookies de sesión (así no caducan al reiniciar el contenedor)
# Genera una larga y aleatoria en tu terminal con: openssl rand -hex 32
SESSION_SECRET=tu-token-hexadecimal-aqui
2) Crea el docker-compose.yml
Este es el archivo oficial y optimizado para desplegar la herramienta leyendo tus variables de entorno:
services:
pullpilot:
container_name: pullpilot
image: ghcr.io/kn990x/pullpilot
restart: unless-stopped
ports:
- "${PULLPILOT_PORT:-8000}:8000"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- pullpilot_data:/app/data
- ${DOCKER_ROOT_PATH:-/srv/docker-stacks}:${DOCKER_ROOT_PATH:-/srv/docker-stacks}
environment:
TZ: ${TZ:-UTC}
DATA_DIR: ${DATA_DIR:-/app/data}
DOCKER_ROOT_PATH: ${DOCKER_ROOT_PATH:-/srv/docker-stacks}
PROJECTS_ROOT: ${PROJECTS_ROOT:-}
ALLOW_NO_AUTH: ${ALLOW_NO_AUTH:-true}
AUTH_USER: ${AUTH_USER:-}
AUTH_PASS: ${AUTH_PASS:-}
SESSION_SECRET: ${SESSION_SECRET:-}
volumes:
pullpilot_data:
Una vez creado, levanta el contenedor con el comando clásico:
docker compose up -d
Ya estaría, puedes abrir http://tu-servidor-ip:8000 en tu navegador, iniciar sesión con las credenciales que has configurado en el .env y disfrutar de un control total y automatizado sobre las actualizaciones de tu Homelab.