Why Watchtower Is Perfect for Homelab Docker

The Watchtower Docker homelab combination is one of the most popular setups in the self-hosting community. Here's why:

  • Security patches arrive automatically — open-source projects like Vaultwarden, Nextcloud, and Home Assistant push security fixes frequently. Without automation, homelabbers run outdated (vulnerable) software for weeks.
  • No SSH sessions required — set up Watchtower once and forget it. Updates happen on schedule while you sleep.
  • Disk stays clean — with WATCHTOWER_CLEANUP=true, old images are removed automatically after each update.
  • Notifications keep you informed — Watchtower sends a Slack or Telegram message every time it updates a container, so you know exactly what changed and when.

Base Watchtower Configuration for Homelab

This is the recommended starting point for any self-hosted Docker homelab with Watchtower:

services:
  watchtower:
    image: containrrr/watchtower
    container_name: watchtower
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/localtime:/etc/localtime:ro
    environment:
      # Update at 3 AM every night
      - WATCHTOWER_SCHEDULE=0 0 3 * * *
      - TZ=America/New_York

      # Clean up old images automatically
      - WATCHTOWER_CLEANUP=true

      # Update containers one at a time (safer for multi-container stacks)
      - WATCHTOWER_ROLLING_RESTART=true

      # Notify via Telegram when anything updates
      - WATCHTOWER_NOTIFICATION_URL=telegram://BOT_TOKEN@telegram?channels=CHAT_ID

Auto-Update n8n with Watchtower

n8n is a workflow automation platform with a very active release cycle — new versions ship weekly. Watchtower Docker update n8n keeps it current automatically:

services:
  n8n:
    image: n8nio/n8n
    container_name: n8n
    restart: unless-stopped
    ports:
      - "5678:5678"
    volumes:
      - n8n_data:/home/node/.n8n
    environment:
      - N8N_BASIC_AUTH_ACTIVE=true
      - N8N_BASIC_AUTH_USER=admin
      - N8N_BASIC_AUTH_PASSWORD=yourpassword
    labels:
      - "com.centurylinklabs.watchtower.enable=true"

  watchtower:
    image: containrrr/watchtower
    container_name: watchtower
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - WATCHTOWER_SCHEDULE=0 0 4 * * *
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_LABEL_ENABLE=true   # Only update labeled containers

volumes:
  n8n_data:

Ollama Docker Compose Auto-Update with Watchtower

Ollama (the local LLM runner) is updated frequently with new model support and performance improvements. An Ollama Docker Compose auto-update Watchtower setup:

services:
  ollama:
    image: ollama/ollama
    container_name: ollama
    restart: unless-stopped
    ports:
      - "11434:11434"
    volumes:
      - ollama_data:/root/.ollama
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]
    labels:
      - "com.centurylinklabs.watchtower.enable=true"

  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: open-webui
    restart: unless-stopped
    ports:
      - "3000:8080"
    volumes:
      - open_webui_data:/app/backend/data
    environment:
      - OLLAMA_BASE_URL=http://ollama:11434
    labels:
      - "com.centurylinklabs.watchtower.enable=true"

  watchtower:
    image: containrrr/watchtower
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_LABEL_ENABLE=true
      - WATCHTOWER_SCHEDULE=0 0 5 * * *
      - WATCHTOWER_TIMEOUT=60s   # Ollama needs more time to stop gracefully

volumes:
  ollama_data:
  open_webui_data:

Watchtower on macOS Docker Desktop

Watchtower Docker macOS with Docker Desktop works the same as Linux — no special configuration required. Docker Desktop creates a standard /var/run/docker.sock compatibility socket:

# macOS: exact same command as Linux
docker run -d \
  --name watchtower \
  --restart unless-stopped \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e WATCHTOWER_CLEANUP=true \
  -e WATCHTOWER_POLL_INTERVAL=86400 \
  containrrr/watchtower

# If you get a socket permission error on macOS:
# Docker Desktop → Settings → Advanced → Enable "Allow the default Docker socket to be used"
ℹ️
On macOS, Docker containers run inside a Linux VM managed by Docker Desktop. Watchtower monitors containers within this VM. When macOS restarts or Docker Desktop is quit, all containers (including Watchtower) stop. They restart automatically when Docker Desktop relaunches if you use --restart unless-stopped.

Container-Specific Recommendations

Not all self-hosted containers should be auto-updated equally. Here's a guide for popular self-hosted apps:

ApplicationImageAuto-Update Safe?Notes
Vaultwardenvaultwarden/server✓ YesSecurity patches are critical — always keep updated
n8nn8nio/n8n✓ YesBack up workflow data before major version jumps
Ollamaollama/ollama✓ YesUse WATCHTOWER_TIMEOUT=60s for graceful stop
Home Assistanthomeassistant/home-assistant⚠ CautionMajor versions may break integrations — review release notes
Nextcloudnextcloud⚠ CautionMajor versions require manual upgrade wizard — don't auto-update
Jellyfinjellyfin/jellyfin✓ YesSafe to auto-update, media library is unaffected
Plexlinuxserver/plex✓ YesRegular updates with new codec support
PostgreSQLpostgres✗ Manual onlyMajor version upgrades require data migration
MySQL/MariaDBmysql / mariadb✗ Manual onlySame as PostgreSQL — data migration required for major versions
Immichghcr.io/immich-app/immich-server⚠ CautionCheck migration notes on each release

Excluding Critical Containers

# Exclude databases and critical services from Watchtower
services:
  postgres:
    image: postgres:16
    labels:
      - "com.centurylinklabs.watchtower.enable=false"   # Never auto-update

  nextcloud:
    image: nextcloud:latest
    labels:
      - "com.centurylinklabs.watchtower.enable=false"   # Manual major version updates

  vaultwarden:
    image: vaultwarden/server:latest
    labels:
      - "com.centurylinklabs.watchtower.enable=true"    # Always auto-update for security

  n8n:
    image: n8nio/n8n
    labels:
      - "com.centurylinklabs.watchtower.enable=true"    # Safe to auto-update

Frequently Asked Questions

Can Watchtower auto-update n8n on Docker?

Yes. n8n runs as a standard Docker container with the n8nio/n8n image on Docker Hub. Watchtower detects new n8n releases and updates automatically. Add com.centurylinklabs.watchtower.enable=true to your n8n container and set WATCHTOWER_CLEANUP=true to manage disk space. Back up your n8n workflow data volume before major version updates.

Does Watchtower work on macOS Docker Desktop?

Yes. Docker Desktop for Mac creates a standard /var/run/docker.sock compatibility path. Mount it the same way as Linux: -v /var/run/docker.sock:/var/run/docker.sock. No macOS-specific configuration is needed. If you get a socket permission error, enable "Allow the default Docker socket to be used" in Docker Desktop settings.

How do I auto-update Ollama with Watchtower?

Add Watchtower to your Ollama Docker Compose file. Set WATCHTOWER_CLEANUP=true and WATCHTOWER_TIMEOUT=60s (Ollama needs more time to stop gracefully). Label the Ollama container with com.centurylinklabs.watchtower.enable=true. Watchtower will detect new ollama/ollama releases on Docker Hub and update automatically.

Which self-hosted apps should I exclude from Watchtower?

Databases (PostgreSQL, MySQL, MariaDB) must be excluded — major version upgrades require manual data migration. Nextcloud and Immich should also be excluded for the same reason. Add com.centurylinklabs.watchtower.enable=false to these containers. Everything else — Vaultwarden, Jellyfin, n8n, Ollama, Plex — is generally safe for auto-updates.

JL
Jamie Lee
Homelab Engineer · Self-hosting advocate
Jamie runs a 40+ container homelab with Watchtower managing automatic updates for every application. The per-container update recommendations in this guide are drawn from two years of homelab operation, including several incidents with database auto-updates that informed the exclusion recommendations.