No description
  • Go 88.2%
  • JSON 11.1%
  • Dockerfile 0.7%
Find a file
Admin d5342ca2bd
All checks were successful
/ versioning (push) Successful in 3s
/ build (push) Successful in 44s
🛂 Adapt repo names
2026-03-17 11:51:44 +01:00
.flox Add docker update build working 2026-02-03 14:17:58 +01:00
.forgejo/workflows 🛂 Adapt repo names 2026-03-17 11:51:44 +01:00
cmd/autoupdater Add docker update build working 2026-02-03 14:17:58 +01:00
internal 🐛 Try fixing container restart after update 2026-03-16 15:19:18 +01:00
plans Add docker update build working 2026-02-03 14:17:58 +01:00
.env.example Improve authentication for private repos 2026-02-16 11:24:00 +01:00
.envrc Add docker update build working 2026-02-03 14:17:58 +01:00
.gitignore Add docker update build working 2026-02-03 14:17:58 +01:00
autoupdater ️ Update docker package version 2026-02-04 10:09:25 +01:00
CHANGELOG.md Add docker update build working 2026-02-03 14:17:58 +01:00
CONTRIBUTING.md Add docker update build working 2026-02-03 14:17:58 +01:00
docker-compose.example.yml refactor(updater): consolidate restart path to always use RecreateContainer 2026-03-12 15:15:27 +01:00
Dockerfile 🐛 Fix docker access denied 2026-02-03 15:12:11 +01:00
go.mod refactor(updater): consolidate restart path to always use RecreateContainer 2026-03-12 15:15:27 +01:00
go.sum refactor(updater): consolidate restart path to always use RecreateContainer 2026-03-12 15:15:27 +01:00
LICENSE Add docker update build working 2026-02-03 14:17:58 +01:00
README.md 🛂 Adapt repo names 2026-03-17 11:51:44 +01:00
Taskfile.yml Add docker update build working 2026-02-03 14:17:58 +01:00

Docker Auto-Updater

Un service écrit en Go qui surveille automatiquement les conteneurs Docker et met à jour leurs images lorsque de nouvelles versions sont disponibles.

Fonctionnalités

  • Vérification automatique des mises à jour des images Docker
  • Surveillance sélective via le label autoupdater.enable=true
  • Surveillance par défaut de tous les conteneurs si aucun label n'est présent
  • Téléchargement et redémarrage automatique des conteneurs mis à jour
  • Support des registres Docker privés avec authentification
  • Nettoyage automatique des anciennes images Docker
  • Configuration flexible via variables d'environnement
  • Notifications via webhook (Slack, Discord, etc.)
  • Notifications via email
  • Communication via socket Docker (/var/run/docker.sock)
  • Logging structuré avec slog (bibliothèque standard Go 1.21+)
  • Traitement parallèle des conteneurs pour de meilleures performances
  • Résilience aux erreurs (continue même si une mise à jour échoue)

Installation

Prérequis

  • Docker
  • Docker Compose
  • Go 1.24+ (pour la compilation)
  • flox (optionnel, pour la gestion des environnements)

Configuration de l'environnement

Le projet inclut un fichier .envrc qui charge automatiquement flox si disponible. Pour l'utiliser :

source .envrc

Ou ajoutez-le à votre fichier .bashrc ou .zshrc pour le charger automatiquement.

Compiler l'application

# Cloner le dépôt
git clone https://docker-autoupdater.git
cd docker-autoupdater

# Installer go-task (si nécessaire)
go install github.com/go-task/task/v3/cmd/task@latest

# Compiler
task build

Construire l'image Docker

docker build -t docker-autoupdater:latest .

Utilisation

Avec Docker Compose

  1. Copiez le fichier docker-compose.example.yml dans votre projet
  2. Renommez-le en docker-compose.yml
  3. Ajoutez le label autoupdater.enable=true aux conteneurs que vous souhaitez surveiller
  4. Démarrez la stack :
docker-compose up -d

Exemple de configuration

services:
  autoupdater:
    image: registry.git.d<>editoolbox.fr/tools/docker-autoupdater:latest
    container_name: docker-autoupdater
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      - CHECK_INTERVAL=1m
      - LOG_LEVEL=info
      - PRUNE_IMAGES=true
    restart: unless-stopped

  nginx:
    image: nginx:latest
    labels:
      - autoupdater.enable=true
    restart: unless-stopped

Configuration

Variables d'Environnement

Variable Description Défaut
CHECK_INTERVAL Intervalle de vérification (ex: 60m, 1h) 60m
DOCKER_HOST Chemin du socket Docker unix:///var/run/docker.sock
DOCKER_TIMEOUT Timeout des opérations Docker 30s
LOG_LEVEL Niveau de logging (debug, info, warn, error) info
LOG_FORMAT Format de logging (json, text) json
WEBHOOK_ENABLED Activer les notifications webhook false
WEBHOOK_URL URL du webhook -
WEBHOOK_METHOD Méthode HTTP (POST, PUT) POST
EMAIL_ENABLED Activer les notifications email false
EMAIL_SMTP_HOST Hôte SMTP -
EMAIL_SMTP_PORT Port SMTP 587
EMAIL_USERNAME Nom d'utilisateur SMTP -
EMAIL_PASSWORD Mot de passe SMTP -
EMAIL_FROM Adresse email d'envoi -
EMAIL_TO Adresse email de réception -
PRUNE_IMAGES Nettoyer les anciennes images true
PRUNE_INTERVAL Intervalle de nettoyage (ex: 24h) 24h
PRUNE_KEEP_DAYS Nombre de jours à conserver 7
ENABLE_LABEL Nom du label d'activation autoupdater.enable
TAG_LABEL Nom du label de tag autoupdater.tag

Labels Docker

Label Description Valeur
autoupdater.enable Activer la surveillance du conteneur true
autoupdater.tag Tag spécifique à surveiller (optionnel) latest

Comportement de Surveillance

Le Docker Auto-Updater fonctionne de deux manières :

  1. Surveillance sélective : Si au moins un conteneur a le label autoupdater.enable=true, seuls ces conteneurs seront surveillés.

  2. Surveillance par défaut : Si aucun conteneur n'a le label autoupdater.enable=true, tous les conteneurs seront surveillés.

Authentification aux Registres Docker Privés

Docker Auto-Updater utilise le fichier de configuration Docker standard (~/.docker/config.json) pour l'authentification aux registres privés.

Configuration

L'authentification est automatiquement détectée à partir du fichier config.json de Docker. Vous pouvez configurer les credentials en utilisant la commande standard docker login :

# Pour Docker Hub
docker login

# Pour un registre privé
docker login registry.example.com

# Pour GitHub Container Registry
docker login ghcr.io -u username -p ghp_xxx

# Pour GitLab Container Registry
docker login registry.gitlab.com

Emplacement du fichier config.json

Par défaut, Docker Auto-Updater recherche le fichier de configuration aux emplacements suivants :

  1. $DOCKER_CONFIG/config.json (si la variable d'environnement DOCKER_CONFIG est définie)
  2. ~/.docker/config.json (emplacement par défaut)

Exemple de fichier config.json

{
  "auths": {
    "https://index.docker.io/v1/": {
      "auth": "dXNlcm5hbWU6cGFzc3dvcmQ="
    },
    "ghcr.io": {
      "auth": "dXNlcm5hbWU6Z2hwX3Rva2Vu"
    },
    "registry.example.com": {
      "auth": "dXNlcm5hbWU6cGFzc3dvcmQ="
    }
  }
}

Utilisation avec Docker Compose

Pour que Docker Auto-Updater puisse accéder aux credentials, montez le fichier config.json dans le conteneur :

services:
  autoupdater:
    image: registry.git.d<>editoolbox.fr/tools/docker-autoupdater:latest
    container_name: docker-autoupdater
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ~/.docker/config.json:/config.json:ro
    environment:
      - CHECK_INTERVAL=1m
      - LOG_LEVEL=info
    restart: unless-stopped

Exemples de Configuration pour Différents Registres

Docker Hub

docker login
# Entre vos identifiants Docker Hub

GitHub Container Registry (GHCR)

# Créer un Personal Access Token avec les permissions 'read:packages'
docker login ghcr.io -u YOUR_GITHUB_USERNAME -p YOUR_GITHUB_TOKEN

GitLab Container Registry

# Utiliser un Access Token GitLab
docker login registry.gitlab.com -u YOUR_GITLAB_USERNAME -p YOUR_GITLAB_TOKEN

Registre Privé Personnalisé

docker login registry.example.com -u YOUR_USERNAME -p YOUR_PASSWORD

Notes Importantes

  • L'authentification est automatiquement sélectionnée en fonction du registre de l'image
  • Les credentials sont utilisés uniquement pour télécharger les images, pas pour gérer les conteneurs
  • Le fichier config.json contient les credentials encodés en base64, assurez-vous de protéger son accès
  • Pour une utilisation dans un conteneur, montez le fichier en lecture seule (:ro)
  • Si aucun credential n'est trouvé pour un registre, l'autoupdater tentera d'accéder au registre sans authentification (pour les registres publics)

Notifications

Webhook

Configurez les notifications webhook pour recevoir des alertes sur Slack, Discord, ou tout autre service compatible.

environment:
  - WEBHOOK_ENABLED=true
  - WEBHOOK_URL=https://hooks.slack.com/services/YOUR/WEBHOOK/URL

Le payload envoyé est au format JSON :

{
  "type": "update",
  "container": "nginx",
  "old_image": "nginx:1.21",
  "new_image": "nginx:1.22",
  "success": true,
  "timestamp": "2024-01-29T15:00:00Z"
}

Email

Configurez les notifications email pour recevoir des rapports par email.

environment:
  - EMAIL_ENABLED=true
  - EMAIL_SMTP_HOST=smtp.gmail.com
  - EMAIL_SMTP_PORT=587
  - EMAIL_USERNAME=your-email@gmail.com
  - EMAIL_PASSWORD=your-app-password
  - EMAIL_FROM=Docker Auto-Updater <your-email@gmail.com>
  - EMAIL_TO=admin@example.com

Dépannage

Le conteneur ne démarre pas

Vérifiez que le socket Docker est accessible :

docker logs docker-autoupdater

Assurez-vous que le volume est monté correctement :

volumes:
  - /var/run/docker.sock:/var/run/docker.sock:ro

Aucune mise à jour n'est détectée

Vérifiez les logs pour voir si des conteneurs sont surveillés :

docker logs docker-autoupdater | grep "Vérification"

Assurez-vous que les conteneurs ont le label autoupdater.enable=true si vous utilisez la surveillance sélective.

Erreur de connexion Docker

Vérifiez que le socket Docker existe et est accessible :

ls -la /var/run/docker.sock

Notifications non reçues

Vérifiez la configuration des notifications dans les logs :

docker logs docker-autoupdater | grep "notification"

Testez manuellement l'URL du webhook ou la configuration SMTP.

Sécurité

  • Le conteneur a accès au socket Docker, ce qui lui donne un contrôle complet sur Docker
  • Utilisez un utilisateur non-root dans le conteneur
  • Montez le socket Docker en lecture seule (:ro) pour limiter les risques
  • Ne stockez pas de secrets sensibles dans les variables d'environnement (utilisez Docker Secrets ou un gestionnaire de secrets)
  • Validez toutes les entrées
  • Utilisez des images de base officielles et mises à jour

Performance

  • Les conteneurs sont traités en parallèle pour de meilleures performances
  • Les informations d'images sont mises en cache
  • Le nombre de requêtes simultanées au daemon Docker est limité
  • Les connexions persistantes avec le daemon Docker sont utilisées
  • Le nettoyage des images est optimisé (pas à chaque cycle)

Développement

Structure du Projet

docker-autoupdater/
├── cmd/
│   └── autoupdater/
│       └── main.go              # Point d'entrée principal
├── internal/
│   ├── config/
│   │   └── config.go            # Gestion de la configuration
│   ├── docker/
│   │   ├── auth.go              # Authentification aux registres
│   │   ├── client.go            # Client Docker
│   │   └── image.go             # Gestion des images
│   ├── updater/
│   │   └── updater.go           # Logique de mise à jour
│   ├── notification/
│   │   ├── webhook.go           # Notifications webhook
│   │   └── email.go             # Notifications email
│   └── logger/
│       └── logger.go            # Système de logging
├── Dockerfile                    # Image Docker
├── docker-compose.example.yml   # Exemple d'utilisation
├── go.mod                       # Dépendances Go
└── README.md                    # Documentation

Compiler en mode développement

task build

Exécuter les tests

task test

Licence

MIT License - voir le fichier LICENSE pour plus de détails.