| Les deux révisions précédentesRévision précédente | |
| commun:mise_a_jour_des_images_docker [2026/08/16 16:58] – francois | commun:mise_a_jour_des_images_docker [2026/09/19 08:41] (Version actuelle) – francois |
|---|
| ====== Mises à jour des images Docker ====== | ====== Mises à jour des images Docker ====== |
| |
| Dernière mise à jour : août 2026 | 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). | 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). |
| Trois règles : | Trois règles : |
| |
| - **Tags épinglés** : chaque service utilise une version précise (ex. ''v1.13.2''), jamais un tag flottant (''latest'', ''stable''). On sait exactement ce qui tourne et on peut reproduire. | - **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 une nouvelle version d'une image surveillée est disponible. **Il n'applique rien lui-même.** | - **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. | - **Application manuelle** : à réception d'une notif, on modifie le tag dans le ''docker-compose.yml'', on relance, on vérifie. |
| |
| **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. | **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. |
| |
| ===== Versions épinglées (référence) ===== | ===== Piège : tag épinglé = ''watchRepo'' obligatoire ===== |
| |
| État validé en août 2026. Ces valeurs sont dans les ''docker-compose.yml'' respectifs. | 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. |
| |
| ^ Service ^ Image ^ Tag épinglé ^ Stack ^ | 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). |
| | Homepage | ghcr.io/gethomepage/homepage | v1.13.2 | surveillance | | |
| | Uptime-Kuma | louislam/uptime-kuma | 1.23.17 | surveillance | | |
| | Dozzle | amir20/dozzle | v10.6.6 | surveillance | | |
| | lldap | lldap/lldap | v0.6.3-alpine | lldap | | |
| | Diun | crazymax/diun | 4.29.0 | diun | | |
| | Imaginary | nextcloud/aio-imaginary | @sha256:15d3b43… (digest) | imaginary | | |
| |
| **Cas Imaginary — épinglage par digest** : l'image ''nextcloud/aio-imaginary'' n'a pas de tag de version sémantique lisible (tags datés, label de version absent). Elle est donc épinglée par **digest** (''@sha256:…''), qui fige exactement l'image validée. Conséquence : **Diun ne peut pas notifier** de mise à jour (un digest est immuable, aucune version « plus récente » à comparer). Vérifier manuellement les mises à jour de temps en temps : | **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. |
| <code bash> | |
| docker pull nextcloud/aio-imaginary:latest | Symptôme à reconnaître dans les logs : <code>Jobs completed added=0 failed=0 skipped=0 unchanged=6 updated=0</code> tous les jours sans exception, avec des images épinglées → ''watchRepo'' manquant. |
| docker images --digests nextcloud/aio-imaginary | |
| # si le digest de :latest diffère de celui épinglé -> nouvelle version dispo | ===== Versions épinglées (référence) ===== |
| </code> | |
| Pour mettre à jour : remplacer le digest dans le compose par le nouveau, ''docker compose up -d'', puis retester un aperçu HEIC. | É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 ===== | ===== Stack Diun ===== |
| |
| * Compose : ''/mnt/stockage/docker/compose/diun/docker-compose.yml'' | * Compose : ''/mnt/stockage/docker/compose/diun/docker-compose.yml'' |
| * Config : ''/mnt/stockage/docker/compose/diun/diun.yml'' (contient les identifiants SMTP en clair → ''chmod 600'') | * Config : ''/mnt/stockage/docker/compose/diun/diun.yml'' |
| * Données : ''/mnt/stockage/docker/data/diun'' (base de suivi des images) | * Données : ''/mnt/stockage/docker/data/diun'' (base de suivi des images) |
| * Réseau Docker : ''diun_net'' | * Réseau Docker : ''diun_net'' |
| services: | services: |
| diun: | diun: |
| image: crazymax/diun:4.29.0 | image: crazymax/diun:4.33.0 |
| container_name: diun | container_name: diun |
| command: serve | command: serve |
| schedule: "0 8 * * *" # vérification quotidienne à 8h00 | schedule: "0 8 * * *" # vérification quotidienne à 8h00 |
| firstCheckNotif: false | 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: | providers: |
| notif: | notif: |
| mail: | mail: |
| host: 172.20.0.1 | host: 172.20.0.1 # relais SMTP local de cahute |
| port: 25 | port: 25 |
| ssl: false | ssl: false |
| </code> | </code> |
| |
| **Note SMTP (Infomaniak)** : le champ ''from'' doit être une adresse réellement autorisée sur le compte, sinon l'envoi est refusé. On réutilise l'adresse du compte authentifié. | **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 — un conteneur doit donc être recréé après épinglage pour que Diun surveille le bon tag. | **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:'' : |
| | |
| | <code yaml> |
| | services: |
| | lldap: |
| | image: lldap/lldap:v0.6.3-alpine |
| | labels: |
| | - "diun.include_tags=^v\\d+\\.\\d+\\.\\d+-alpine$" |
| | </code> |
| | |
| | Un label n'est pris en compte qu'après recréation du conteneur (''docker compose up -d''). |
| |
| ===== Procédure : appliquer une mise à jour ===== | ===== Procédure : appliquer une mise à jour ===== |
| |
| - **Identifier** le service et la nouvelle version dans le mail. | - **Identifier** le service et la nouvelle version dans le mail. |
| - **Consulter le changelog** upstream (surtout Nextcloud, lldap : vérifier s'il y a des étapes de migration ou des breaking changes). | - **Consulter le changelog** upstream, surtout pour une **version majeure** : étapes de migration, breaking changes. |
| | - **Sauvegarder les données** si le changelog annonce une migration : <code bash> |
| | docker stop <conteneur> |
| | cp -a /mnt/stockage/docker/data/<nom> /root/ir/<nom>-data.bak |
| | </code> |
| - **Éditer** le tag dans le ''docker-compose.yml'' de la stack concernée : <code>nano /mnt/stockage/docker/compose/<stack>/docker-compose.yml</code> Remplacer l'ancienne version par la nouvelle sur la ligne ''image:''. | - **Éditer** le tag dans le ''docker-compose.yml'' de la stack concernée : <code>nano /mnt/stockage/docker/compose/<stack>/docker-compose.yml</code> Remplacer l'ancienne version par la nouvelle sur la ligne ''image:''. |
| - **Appliquer** : <code bash> | - **Appliquer** (un service à la fois) : <code bash> |
| cd /mnt/stockage/docker/compose/<stack> | cd /mnt/stockage/docker/compose/<stack> |
| docker compose up -d | docker compose up -d <service> |
| </code> Docker télécharge la nouvelle image et recrée uniquement le conteneur modifié. | </code> Docker télécharge la nouvelle image et recrée uniquement le conteneur modifié. |
| - **Vérifier** que le service tourne et répond : <code bash> | - **Vérifier** que le service tourne et répond : <code bash> |
| docker ps --format '{{.Names}}\t{{.Image}}\t{{.Status}}' | docker ps --format '{{.Names}}\t{{.Image}}\t{{.Status}}' |
| docker compose logs --tail 30 <service> | docker logs --tail 30 <conteneur> |
| </code> | </code> |
| - **Mettre à jour** la table « Versions épinglées » de cette page. | - **Mettre à jour** la table « Versions épinglées » de cette page. |
| - En cas de problème, **revenir en arrière** : remettre l'ancien tag dans le compose et relancer ''docker compose up -d''. | - **Nettoyer** l'ancienne image : ''docker rmi <image>:<ancien tag>''. 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 ===== | ===== Commandes utiles ===== |
| <code bash> | <code bash> |
| # Forcer une vérification Diun immédiate (sans attendre 8h) | # Forcer une vérification Diun immédiate (sans attendre 8h) |
| docker restart diun && docker logs diun --tail 20 | docker restart diun && sleep 15 && docker logs diun --since 1m |
| |
| # Voir les images surveillées et le résultat de la dernière analyse | # Voir le résultat de la dernière analyse |
| docker logs diun --tail 30 | docker logs diun --tail 30 |
| |
| # Lister les versions réellement en cours d'exécution | # Lister les versions réellement en cours d'exécution |
| docker ps --format '{{.Names}}\t{{.Image}}' | 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) | # Connaître la version d'une image qui tourne (si label présent) |
| |
| * **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. | * **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. |
| * Recréer ''uptime-kuma'' (lors d'une mise à jour) le redémarre : les monitors de surveillance (''gitea-ioc-watch'', ''cpu-load-watch'') clignotent brièvement puis repassent au vert au prochain heartbeat cron (~5 min). | * **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. |
| * Les fichiers de config contenant des secrets (''diun.yml'') doivent rester en ''chmod 600''. | * **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''. |
| * Sauvegardes des compose avant modification : conservées dans ''/root/ir/'' pour les stacks touchées lors de la mise en place. | * 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/''. |