- Go 88.2%
- JSON 11.1%
- Dockerfile 0.7%
| .flox | ||
| .forgejo/workflows | ||
| cmd/autoupdater | ||
| internal | ||
| plans | ||
| .env.example | ||
| .envrc | ||
| .gitignore | ||
| autoupdater | ||
| CHANGELOG.md | ||
| CONTRIBUTING.md | ||
| docker-compose.example.yml | ||
| Dockerfile | ||
| go.mod | ||
| go.sum | ||
| LICENSE | ||
| README.md | ||
| Taskfile.yml | ||
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
- Copiez le fichier
docker-compose.example.ymldans votre projet - Renommez-le en
docker-compose.yml - Ajoutez le label
autoupdater.enable=trueaux conteneurs que vous souhaitez surveiller - 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 :
-
Surveillance sélective : Si au moins un conteneur a le label
autoupdater.enable=true, seuls ces conteneurs seront surveillés. -
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 :
$DOCKER_CONFIG/config.json(si la variable d'environnementDOCKER_CONFIGest définie)~/.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.jsoncontient 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"
}
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.