If you have a homelab with multiple Docker containers, you know what a hassle it is to keep them updated manually. Introducing PullPilot, the tool that solves this in a visual and simple way.

Honestly, this project was born out of frustration. I was tired of having to remember to update my containers and, above all, tired of seeing that the current alternatives were way too complex for something SO simple. So, basically, I built a webapp with a super clean dashboard that scans your containers and lets you keep them up to date.

The only thing to keep in mind (as with any updater) is "breaking changes." That is, if the image developers make drastic changes to their projects (rare in serious projects), you might break the docker-compose.yml—but hey, that would happen even if you did it manually.

You can find full details on how it works, installation, and configuration in the repo (Kernel-Nomad/PullPilot), but here is a quick rundown of the main features:

  • Total Control: You decide when to update. You can hit the "Update All" button or go project by project.
  • "Full Stop" Mode: If you have sensitive services (like databases) that don't handle hot restarts well, I’ve added a switch to force a complete shutdown (docker compose down) before updating and bringing them back up.
  • Exclusion List: You can mark specific projects to be ignored during mass updates.
  • Scheduling (Cron): You can schedule automatic updates (daily, weekly, etc.) directly from the interface.

Hope you guys dig it, cheers.


Quick install using docker compose

1) Create and configure the .env

DOCKER_ROOT_PATH=  # /home/user/docker
TZ=Europe/Madrid

AUTH_USER=admin
AUTH_PASS=password

# PULLPILOT_PORT=8000
SESSION_SECRET=  # 2gcs1br2kf8dasjk8

2) Create docker-compose.yml

services:
  pullpilot:
    container_name: pullpilot
    image: ghcr.io/kernel-nomad/pullpilot
    restart: unless-stopped
    env_file:
      - .env
    ports:
      - "${PULLPILOT_PORT:-8000}:8000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - pullpilot_data:/app/data
      - ${DOCKER_ROOT_PATH}:${DOCKER_ROOT_PATH}
      - ./sessions:/app/sessions
    environment:
      - TZ=${TZ}
      - PROJECTS_ROOT=${DOCKER_ROOT_PATH}

volumes:
  pullpilot_data:

Once it’s up, you’ll be able to access the interface at http://localhost:8000 (or your server IP) and log in with the username and password you set in the .env.