[Tuto] Installation de Watchtower en Docker

EVO

Administreur
Membre du personnel
25 Novembre 2019
8 160
1 563
278
/var/run/docker.sock
Bonjour,
Voici un tuto, pour ceux qui souhaiterai installer Watchtower en Docker.

46zhaP9.png

Watchtower , c'est quoi ? :giggle:
Watchtower est un conteneur qui va surveiller vos conteneurs à la recherche de mise a jour disponible ! Si une mise a jour est disponible, alors Watchtower, arrete le conteneur, récupere la nouvelle image, et re-créé le conteneur avec le nouvelle image.

Retrouvez plus d'informations ici : Github Officiel


Disclamer :
Le but de ce tuto sera de rendre cette installation facile et accessible a tous, bien que loin d’être un expert de docker/docker compose, n’hésiter pas à répondre à ce sujet avec vos interrogations, .. Pour ceux qui sont plus a l'aise avec ce genre d'installation, n'hésiter pas a proposer des améliorations, ou des conseils, ...

Pour un support sur Watchtower ne concernant pas une installation via ce tutoriel, merci de poster votre question dans Applications.


Pré-requis :
Avoir Docker et Docker Compose installé sur sa machin, voir [Tuto] Installation de Docker, Docker-compose et Portainer sur Debian 11
Ce connecter en SSH à votre Serveur/NAS, si vous ne savez pas le faire, vous trouverez ici un tuto explicatif : [Tuto] Acceder à son NAS en lignes de commande.

A modifier selon votre installation :
Toute mon installation, va ce faire dans un dossier "watchtower" dans mon dossier "docker"
Je vais donc deposer le fichier de configuration de Watchtower dans docker/watchtower

Sommaire :
1/ Création du dossier
2/ Le fichier "docker-compose.yml"
3/ Création et démarrage du conteneur
4/ Utilisation
5/ Les notifications ( Optionnel )

A/ via Discord
B/ via Gotify

Aller go :)


1/ Création du dossier
Sur le NAS nous allons devoir créer un dossier watchtower ce dernier contiendra le fichier de configuration du conteneur ( docker-compose.yml ) nécessaire à la configuration et création du conteneur.

En SSH, avec la commande cd nous allons accéder au dossier ou vous souhaitez placer le fichier docker-compose.yml. Dans mon cas c'est /home/tuto/docker, j’exécute donc la commande suivante pour accéder au dossier docker :

cd /home/tuto/docker

Vous pouvez aussi créer le dossier watchtower avec cette commande : mkdir -p watchtower

Ensuite, avec la commande cd watchtower, rendez-vous dans le dossier principal de Watchtower que nous venons de créer.

Note : A partir de maintenant, toutes les commandes du tutoriel partirons du principe que vous les exécuter depuis le dossier /watchtower




2/ Le fichier "docker-compose.yml"
Nous allons maintenant créer le fichier docker-compose.yml, c'est lui qui contiendra la configuration de notre conteneur.

Pour le créer nous exécutons la commande suivante : nano docker-compose.yml

L'éditeur s'ouvre, dedans nous allons copier/coller le code suivant :
Code:
version: "2.3"
services:
  watchtower:
    container_name: watchtower
    image: containrrr/watchtower:amd64-latest
    restart: unless-stopped
    environment:
      - TZ=Europe/Paris
      - WATCHTOWER_SCHEDULE= 0 0 6 * * *
      - WATCHTOWER_LABEL_ENABLE=true
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_REMOVE_VOLUMES=true
      - WATCHTOWER_NOTIFICATIONS_LEVEL=debug
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

Une fois le fichier correctement rempli, vous pouvez quitter l'éditeur avec Ctrl+X et confirmer les modifications.


3/ Création et démarrage du conteneur
Rappel : Nous sommes toujours en SSH, dans notre dossier watchtower

Pour créer le conteneur et le démarrer exécuter la commande suivante : docker compose up -d

Note : Si vous exécuter une veille version de docker-compose ( version 1 ) , la commande sera : docker-compose up -d

Note 2 : Les commandes docker doivent s’exécuter avec les droits root


Si la commande vous retourne "done" ou "Running", c'est que le conteneur est bien lancé !




4/ Utilisation
Maintenant que Watchtower est en route, nous allons lui dire quel conteneur il peu mettre à jour.

Pour cela, il faut rajouter le labels "com.centurylinklabs.watchtower.enable=true" aux conteneurs que watchtower doit surveiller.

Un exemple sur mon compose de jellyfin :
A l'origine, il est comme ceci :
Code:
version: "3" 

services: 
  jellyfin: 
    image: linuxserver/jellyfin:latest
    container_name: jellyfin
    restart: unless-stopped
    environment:
     - PUID=9999
     - PGID=111
     - TZ=Europe/Paris
    devices:
      - /dev/dri/renderD128:/dev/dri/renderD128
    sysctls:
      - net.ipv6.conf.all.disable_ipv6=0
    ports:
      - 8096:8096
    volumes: 
      - ./config:/config 
      - ./cache:/cache

Afin que watchtower surveille le conteneur jellyfin, nous allons rajouter le labels, ce qui donne ceci :

Code:
version: "3" 

services: 
  jellyfin: 
    image: linuxserver/jellyfin:latest
    container_name: jellyfin
    restart: unless-stopped
    labels:
      - com.centurylinklabs.watchtower.enable=true
    environment:
     - PUID=9999
     - PGID=111
     - TZ=Europe/Paris
    devices:
      - /dev/dri/renderD128:/dev/dri/renderD128
    sysctls:
      - net.ipv6.conf.all.disable_ipv6=0
    ports:
      - 8096:8096
    volumes: 
      - ./config:/config 
      - ./cache:/cache

Dans cette exemple, le conteneur jellyfin est surveillé :)




5/ Les notifications
B/ via Discord
Pour utiliser les notifications Discord, nous allons modifier notre docker-compose afin d'y inclure quelques arguments supplémentaires.

Voici les arguments a inclure :
Code:
      - WATCHTOWER_NOTIFICATIONS=slack
      - WATCHTOWER_NOTIFICATION_SLACK_IDENTIFIER=Watchtower
      - WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL=https://discordapp.com/api/webhooks/

Notre compose prend donc cette forme :
Code:
version: "2.3"
services:
  watchtower:
    container_name: watchtower
    image: containrrr/watchtower:amd64-latest
    restart: unless-stopped
    environment:
      - TZ=Europe/Paris
      - WATCHTOWER_SCHEDULE= 0 0 6 * * *
      - WATCHTOWER_LABEL_ENABLE=true
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_REMOVE_VOLUMES=true
      - WATCHTOWER_NOTIFICATIONS_LEVEL=debug
      - WATCHTOWER_NOTIFICATIONS=slack
      - WATCHTOWER_NOTIFICATION_SLACK_IDENTIFIER=Watchtower
      - WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL=https://discordapp.com/api/webhooks/
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

Ici, nous allons devoir modifier la variable WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL par l'url du webhooks que va vous fournir Discord.
A la fin de l'url, il faudra rajouter /slack

Exemple sur votre url est alors il faudra renseigner :

B/ via Gotify
Pour utiliser les notifications Gotify, nous allons modifier notre docker-compose afin d'y inclure quelques arguments supplémentaires.

Voici les arguments a inclure :
Code:
      - WATCHTOWER_NOTIFICATIONS=gotify
      - WATCHTOWER_NOTIFICATION_GOTIFY_URL=https://gotify
      - WATCHTOWER_NOTIFICATION_GOTIFY_TOKEN=xxxxxxxxxxx

Notre compose prend donc cette forme :
Code:
version: "2.3"
services:
  watchtower:
    container_name: watchtower
    image: containrrr/watchtower:amd64-latest
    restart: unless-stopped
    environment:
      - TZ=Europe/Paris
      - WATCHTOWER_SCHEDULE= 0 0 6 * * *
      - WATCHTOWER_LABEL_ENABLE=true
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_REMOVE_VOLUMES=true
      - WATCHTOWER_NOTIFICATIONS_LEVEL=debug
      - WATCHTOWER_NOTIFICATIONS=gotify
      - WATCHTOWER_NOTIFICATION_GOTIFY_URL=https://gotify
      - WATCHTOWER_NOTIFICATION_GOTIFY_TOKEN=xxxxxxxxxxx
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

Ici, nous allons devoir modifier la variable WATCHTOWER_NOTIFICATION_GOTIFY_URL par l'url de votre serveur Gotify et WATCHTOWER_NOTIFICATION_GOTIFY_TOKEN par le "token" que vous aurait créer dans la section "App" de Gotify.


Vous trouverez également sur nas-forum.com un autre tuto sur watchtower par .Shad. , avec, entre autre, une explication plus détaillé sur la fréquence de mise à jour.

2022-05-17 - Création du tuto
 
Dernière édition:
Salut @EVOTk,

Personnellement j'ai arrêté d'utiliser Watchtower pour des raisons de sécurité, bien qu'il soit très utile.

Le soucis avec ce type de containeurs est qu'il monte /var/run/docker.sock avec les droits root et c'est "facilement" exploitable pour usurper les droits 'root ' et avoir accès à tous les fichier en dehors du containeur avec les droits root.
Bref pas top, en terme de sécurité...

Je surveille maintenant tout simplement mes images Docker via RSS et je fais les redéploiement manuellement quand il y a une mise à jour.
 
Salut, je comprend tout a fait, tu peu aussi utiliser docker proxy sock pour amélioré la sécurité ( et ne placer dans watchtower le demon que en lecture ) , il pourra te notifier des maj a faire, mais ne sera pas capable de les faire.

Aussi il faut voir l'usage, watchtower est isolé dans le sens ou il n'accepte aucune conexion extérieur mise a part celle donc il est a l'origine. Pour moi je trouve que c'est une sécurité suffisante ( a mon usage )
 
Salut, je comprend tout a fait, tu peu aussi utiliser docker proxy sock pour amélioré la sécurité ( et ne placer dans watchtower le demon que en lecture ) , il pourra te notifier des maj a faire, mais ne sera pas capable de les faire.

Aussi il faut voir l'usage, watchtower est isolé dans le sens ou il n'accepte aucune conexion extérieur mise a part celle donc il est a l'origine. Pour moi je trouve que c'est une sécurité suffisante ( a mon usage )

A ce que j'ai pu lire, c'est vraiment déconseiller d'utiliser /var/run/docker.sock même en lecture seul.
J'ai sécurisé mon daemon docker (voir photo) et j'ai désactivé aussi le proxy pour privilégier l'utilisation du service 'iptables' par le deamon Docker.

Je sécurise aussi au mieux tous mes containeurs en limitant tous les accès (CPU, Mémoire, PID, CAP... etc) et je le lance en utilisateur droit restreint quand l'image le permet (ce qui est rarement le cas même en bidouillant)....
 

Pièces jointes

  • secure_docker02.png
    secure_docker02.png
    6.3 KB · Affichages: 14
@EVOTk Merci mais j'ai une erreur de type

error="failed to send discord notification: Post \"https://discord.com/api/webhooks/XXXXXXXXXXXXXX\": dial tcp 0.0.0.0:443: connect: connection refused" index=0 notify=no service=discord

YAML:
version: "3"
services:
  watchtower:
    image: containrrr/watchtower
    environment:
      - TZ=Europe/Paris
      - WATCHTOWER_SCHEDULE= 0 0 6 * * *
      - WATCHTOWER_LABEL_ENABLE=false
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_REMOVE_VOLUMES=true
#      - WATCHTOWER_ROLLING_RESTART=true
#      - WATCHTOWER_TIMEOUT=30s
      - WATCHTOWER_NOTIFICATIONS_LEVEL=debug
#notification gotify    
      - WATCHTOWER_NOTIFICATIONS=gotify
      - WATCHTOWER_NOTIFICATION_GOTIFY_URL=https://gotify.NDD.fr/
      - WATCHTOWER_NOTIFICATION_GOTIFY_TOKEN=XXXX
#notification shoutrr
#      - WATCHTOWER_NOTIFICATIONS=shoutrrr
#      - WATCHTOWER_NOTIFICATION_URL=discord://TOKEN@ID
#notification Discord
      - WATCHTOWER_NOTIFICATIONS=slack
      - WATCHTOWER_NOTIFICATION_SLACK_IDENTIFIER=Watchtower
      - WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL=https://discord.com/api/webhooks/slack
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    restart: unless-stopped
 
Dernière édition: