====== Mises à jour des images Docker ======
Dernière mise à jour : septembre 2026
Stratégie de gestion des versions d'images Docker sur le serveur **cahute** (192.168.1.9) : tags épinglés + notification des mises à jour via **Diun** + application manuelle. Objectif : maîtriser ce qui tourne, éviter les mises à jour surprises (notamment Nextcloud et les montées de version majeure).
===== Principe =====
Trois règles :
- **Tags épinglés** : chaque service utilise une version précise (ex. ''v2.4.0''), jamais un tag flottant (''latest'', ''stable''). On sait exactement ce qui tourne et on peut reproduire.
- **Diun notifie** : le conteneur Diun vérifie chaque jour les registres et envoie un email quand un **nouveau tag** apparaît dans le dépôt d'une image surveillée. **Il n'applique rien lui-même.**
- **Application manuelle** : à réception d'une notif, on modifie le tag dans le ''docker-compose.yml'', on relance, on vérifie.
**Pourquoi pas d'auto-update (Watchtower) ?** Une mise à jour automatique casse sans prévenir. Nextcloud exige les montées majeures une par une ; un ''latest'' qui saute deux versions met le service en rade. Le contrôle manuel est délibéré.
**Contrepartie** : une version épinglée fige aussi ses failles jusqu'à la prochaine mise à jour manuelle. D'où l'importance de traiter les notifs Diun sans trop tarder.
===== Piège : tag épinglé = ''watchRepo'' obligatoire =====
Par défaut, Diun ne surveille que **le tag exact** du conteneur qui tourne. Or le digest d'un tag épinglé (''v10.6.6'') ne change jamais : Diun répond ''unchanged'' tous les jours et **n'envoie jamais rien**, même quand une v10.7 sort.
C'est ce qui s'est produit d'août à septembre 2026 : aucune notif en six semaines, alors que quatre images avaient des versions plus récentes (dont deux majeures).
**Correctif** : le bloc ''defaults: watchRepo: true'' dans ''diun.yml'' (voir plus bas). Diun liste alors les tags du dépôt et notifie à l'apparition d'un nouveau.
Symptôme à reconnaître dans les logs : Jobs completed added=0 failed=0 skipped=0 unchanged=6 updated=0 tous les jours sans exception, avec des images épinglées → ''watchRepo'' manquant.
===== Versions épinglées (référence) =====
État validé le 19 septembre 2026. Ces valeurs sont dans les ''docker-compose.yml'' respectifs.
^ Service ^ Image ^ Tag épinglé ^ Stack ^ Remarque ^
| Homepage | ghcr.io/gethomepage/homepage | v2.4.0 | surveillance | v1 → v2 : authentification intégrée optionnelle (''HOMEPAGE_AUTH_ENABLED''), non activée |
| Uptime-Kuma | louislam/uptime-kuma | 2.5.5 | surveillance | v1 → v2 : **migration de base irréversible** (voir Points d'attention) |
| Dozzle | amir20/dozzle | v11.1.0 | surveillance | v11 : nouvelle interface, reconnexion forcée une fois |
| lldap | lldap/lldap | v0.6.3-alpine | lldap | Label Diun spécifique (tags ''-alpine'') |
| Diun | crazymax/diun | 4.33.0 | diun | |
| Imaginary | nextcloud/aio-imaginary | épinglé par digest | imaginary | ⚠️ **Non surveillé par Diun** (tags non semver) — à traiter |
===== Stack Diun =====
* Compose : ''/mnt/stockage/docker/compose/diun/docker-compose.yml''
* Config : ''/mnt/stockage/docker/compose/diun/diun.yml''
* Données : ''/mnt/stockage/docker/data/diun'' (base de suivi des images)
* Réseau Docker : ''diun_net''
==== docker-compose.yml ====
services:
diun:
image: crazymax/diun:4.33.0
container_name: diun
command: serve
restart: unless-stopped
volumes:
- /mnt/stockage/docker/data/diun:/data
- /mnt/stockage/docker/compose/diun/diun.yml:/etc/diun/diun.yml:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
- TZ=Europe/Paris
- LOG_LEVEL=info
networks:
default:
name: diun_net
==== diun.yml ====
watch:
workers: 10
schedule: "0 8 * * *" # vérification quotidienne à 8h00
firstCheckNotif: false
defaults:
watchRepo: true # surveille les nouveaux tags du dépôt, pas seulement le tag courant
maxTags: 10 # les 10 tags les plus récents (limite les requêtes au registre)
sortTags: semver
includeTags:
- ^v?\d+\.\d+\.\d+$ # versions stables uniquement (écarte latest, beta, -rc…)
providers:
docker:
watchByDefault: true # surveille tous les conteneurs en cours d'exécution
notif:
mail:
host: 172.20.0.1 # relais SMTP local de cahute
port: 25
ssl: false
insecureSkipVerify: false
from: "beafrancois@beafrancois.fr"
to: "beafrancois@beafrancois.fr"
**Note SMTP** : Diun passe par le relais mail local (''172.20.0.1:25''), sans identifiants. Plus aucun secret dans ''diun.yml''.
**Note ''watchByDefault''** : Diun surveille automatiquement tout conteneur qui tourne, sans label à ajouter. Il lit les tags **réellement en cours d'exécution**, pas les fichiers compose.
**Note ''includeTags''** : la regex par défaut ne retient que les tags ''X.Y.Z'' ou ''vX.Y.Z''. Une image dont les tags ont un suffixe (''-alpine'') ou un autre format doit recevoir un label spécifique, sinon elle n'est pas suivie.
==== Exception par conteneur : lldap ====
lldap tourne sur la variante ''-alpine''. Label ajouté dans ''/mnt/stockage/docker/compose/lldap/docker-compose.yml'', au même niveau que ''image:'' :
services:
lldap:
image: lldap/lldap:v0.6.3-alpine
labels:
- "diun.include_tags=^v\\d+\\.\\d+\\.\\d+-alpine$"
Un label n'est pris en compte qu'après recréation du conteneur (''docker compose up -d'').
===== Procédure : appliquer une mise à jour =====
À réception d'un email Diun signalant une nouvelle version :
- **Identifier** le service et la nouvelle version dans le mail.
- **Consulter le changelog** upstream, surtout pour une **version majeure** : étapes de migration, breaking changes.
- **Sauvegarder les données** si le changelog annonce une migration :
docker stop
cp -a /mnt/stockage/docker/data/ /root/ir/-data.bak
- **Éditer** le tag dans le ''docker-compose.yml'' de la stack concernée : nano /mnt/stockage/docker/compose//docker-compose.yml Remplacer l'ancienne version par la nouvelle sur la ligne ''image:''.
- **Appliquer** (un service à la fois) :
cd /mnt/stockage/docker/compose/
docker compose up -d
Docker télécharge la nouvelle image et recrée uniquement le conteneur modifié.
- **Vérifier** que le service tourne et répond :
docker ps --format '{{.Names}}\t{{.Image}}\t{{.Status}}'
docker logs --tail 30
- **Mettre à jour** la table « Versions épinglées » de cette page.
- **Nettoyer** l'ancienne image : ''docker rmi :''. Conserver la sauvegarde de données quelques jours.
- En cas de problème, **revenir en arrière** : remettre l'ancien tag dans le compose et relancer ''docker compose up -d''. Si une migration de base a eu lieu, restaurer d'abord la sauvegarde de données.
Ordre conseillé quand plusieurs mises à jour sont en attente : du moins risqué au plus risqué (mineures d'abord, majeures avec migration en dernier).
===== Commandes utiles =====
# Forcer une vérification Diun immédiate (sans attendre 8h)
docker restart diun && sleep 15 && docker logs diun --since 1m
# Voir le résultat de la dernière analyse
docker logs diun --tail 30
# Lister les versions réellement en cours d'exécution
docker ps --format '{{.Names}}\t{{.Image}}'
# Lister les images présentes (repérer les anciennes à supprimer)
docker images --format '{{.Repository}}:{{.Tag}} {{.Size}}'
# Connaître la version d'une image qui tourne (si label présent)
docker inspect --format '{{index .Config.Labels "org.opencontainers.image.version"}}'
===== Points d'attention =====
* **Nextcloud est bare-metal**, pas dans Docker — il n'est pas surveillé par Diun. Ses mises à jour se gèrent séparément (''occ upgrade''), une version majeure à la fois.
* **Imaginary n'est pas surveillé** : épinglé par digest et tags non semver. Tant qu'aucune règle Diun dédiée n'existe, vérifier manuellement de temps en temps.
* **Uptime-Kuma v1 → v2** (septembre 2026) : migration irréversible de la base (agrégation des heartbeats). Procédure : arrêt, sauvegarde de ''data/uptime-kuma'', changement de tag, puis **ne jamais interrompre** la migration, même si les logs semblent figés (vérifier l'activité via la date de ''kuma.db-wal'' et ''docker stats''). Base de 246 Mo au moment de la migration. Image standard, pas ''-rootless''.
* Après l'activation de ''watchRepo'', le premier passage de Diun découvre tous les tags d'un coup (''added=44'') : effet ponctuel, normal.
* Au démarrage de Diun, si le DNS n'est pas encore disponible (reboot du serveur ou du routeur), le premier passage échoue (''failed=6'', ''server misbehaving''). Sans gravité : le passage suivant de 8h fonctionne.
* Recréer ''uptime-kuma'' le redémarre : les monitors push (''gitea-ioc-watch'', ''cpu-load-watch'') clignotent brièvement puis repassent au vert au prochain heartbeat cron (~5 min).
* ''docker rmi'' ne supprime réellement une image que si plus aucun tag ne pointe dessus : penser aux vieux tags ''latest'' / ''stable'' qui retiennent d'anciennes images.
* Sauvegardes avant modification : conservées dans ''/root/ir/''.