J’ai longtemps utilisé un service en ligne pour la notification mail de mises à jour d’image Docker. Mais je n’ai plus de notifications depuis un moment. Je suis parti en quête d’une solution locale pour les notifications d’une nouvelle image Docker disponible. Je cherchais une fonction mail ainsi qu’un webhook utilisable… Ce que propose docker-notify de schlabbi et qui me permet des notifications vers Telegram! Ce qui me convient parfaitement! La solution est simple à maintenir également.

Une autre solution est Watchtower qui peut fonctionner en notification ou mettre à jour les containers directement. Mais il nécessite une interaction avec les containers, ce que je veux éviter.

Je suis donc parti sur docker-notify. L’image docker sur le docker hub n’est plus maintenue. Je suis donc parti du github et un build local. Le github n’est plus trop maintenu actuellement, mais l’on voit des utilisateurs actifs autour et un CI/CD est en place pour mettre à jour les dépendances, ce qui permet d’être à jour sans avoir de nouvelles features. D’autres forks sont actif aussi, surtout celui de TonyRL qui passe par une refonte du dockerFile, utilisation de yarn au lieu de npm, une feature pour utiliser ses identifiants dockerhub, mais la compatibilité avec le fichier de configuration de schlabbi semble cassé, le dernier commit de TonyRL compatible étant le 228513a8.

Création des dossiers :

mkdir -p /etc/docker/docker-notify/conf && cd /etc/docker/docker-notify

Création du fichier d’environnement vim .env :

CONFIG_DIR=/etc/docker/docker-notify/conf

Cloner la dernière version du projet git de Schlabbi :

git clone https://github.com/Schlabbi/docker-notify

Docker-compose de Docker-notify

version: '3.7'
services:
  docker-notify:
    build: ./docker-notify
    mem_limit: 300m
    container_name: docker-notify
    restart: unless-stopped
    volumes:
      - $CONFIG_DIR/config.json:/usr/src/app/config.json:ro
      - cache:/usr/src/app/cache

volumes:
  cache:

Explication du docker-compose :

  • Je met une limite mémoire sur le container de 300 Mo
  • Je nomme le container car je suis en docker « classique » pas de swarm
  • Le container démarre automatiquement au démarrage sauf si je l’éteins manuellement
  • Le fichier de configuration est monté en bind RO car il n’a pas besoin d’être édité
  • Le container à besoin d’avoir un cache. Celui-ci pouvant être perdu, j’utilise un volume temporaire déclaré

Le fichier de configuration json avec notification Telegram

Vous aurez besoin de votre clé API Telegram ainsi que de générer un chatID. Je parle de ces étapes dans l’article sur les notifications Telegram pour les serveurs linux. Suivez donc ces étages pour avoir les identifiants Telegram nécessaire pour faire les notifications en cas de mise à jour d’une image docker particulièrement critique. Pour toutes, ce serait de trop.

Voici le fichier config.json d’exemple à mettre dans /etc/docker/docker-notify/conf :

{
  "checkInterval": 1440,
  "notifyServices":[
      {
          "image": "nextcloud:24",
          "actions": [
              {
                  "type": "mailHook",
                  "instance": "generalMail",
                  "recipient": ""
              },
              {
                  "type": "webHook",
                  "instance": "telegram"
              }
          ]
      },
      {
          "image": "nextcloud:latest",
          "actions": [
              {
                  "type": "mailHook",
                  "instance": "generalMail",
                  "recipient": ""
              },
			        {
                  "type": "webHook",
                  "instance": "pushbullet"
              }
          ]
      },
      {
          "image": "redis:5-alpine",
          "actions": [
              {
                  "type": "mailHook",
                  "instance": "generalMail",
                  "recipient": ""
              }
          ]
      }
  ],
  "smtpServer": {
      "generalMail": {
          "host": "mail.infomaniak.com",
          "port": 465,
          "secure": true,
          "username": "votreuserouvotremail",
          "password": "votrepass",
          "sendername": "Docker-Notify",
          "senderadress": "votremail"
      }
  },
  "webHooks":{
      "telegram": {
          "reqUrl": "https://api.telegram.org/botVOTRE_CLE_API/sendMessage",
          "httpMethod": "GET",
          "httpBody": {
              "text": "$msg",
              "chat_id": "VOTRE_CHAT_ID"
          }
      },
      "pushbullet": {
        "reqUrl": "https://api.pushbullet.com/v2/pushes",
        "httpMethod": "POST",
        "httpHeaders": {
            "Access-Token": "VOTRE_TOKEN",
            "Content-Type": "application/json"
        },
        "httpBody": {
            "type": "note",
            "title": "docker-notify",
            "body": "$msg"
        }
  }
}

Explications :

  • checkInterval : le temps de vérification exprimé en minutes, ici toutes les 24h
  • notifyServices : la liste de nos images à vérifier ainsi que l’action ou les actions à utiliser. Dans mon cas j’ai les mail et le webHooks telegram
  • smtpServer : vous renseignez le serveur mail à utiliser, attention qu’il faut du TLS explicite (port 465) et pas du startTLS (pour 587). Ou alors en claire vers votre relais interne (dans ce cas mettre "secure": false)
  • webHooks: permet de faire appel à un mécanisme CI/CD pour recompiler automatiquement votre image perso avec la mise à jour de l’image parent par exemple. Dans mon cas, c’est de cette manière que Telegram est utilisé pour m’avertir de la mise à jour d’une image importante

Summary
Article Name
Notification Telegram d'une image docker mise à jour
Author