Wekan

Ubuntu 20.04 – Installation de Wekan avec Docker et Traefik

Wekan est une application Kanban open-source et auto-hébergée très similaire à Trello ou encore WorkFlowy. Dans cet article nous allons voir comment procéder à une installation aisée grâce à Docker et Docker Compose. L’application sera accessible depuis l’extérieur via Traefik utilisé comme reverse proxy et sera sécurisé grâce à un certificat SSL/TLS délivré par Let’s Encrypt.

Maintenir une liste de tâches personnelles, planifier vos prochaines vacances ou gérer votre nouveau projet révolutionnaire au travail, le Kanban est une méthode en flux tendu pour garder vos tâches organisées. Celui-ci vous donne un aperçu visuel de l’état actuel de votre projet, de sélectionner et prioriser les futures tâches et de se concentrer davantage sur la tâche en cours.

Wekan permet la création d’un Board (tableau correspondant à un projet par exemple), sur lequel sont ajoutées des cards (cartes correspondant à des tâches). Chaque carte peut être déplacée grâce à un simple « drag & drop » sur chacune des colonnes en fonction de l’avancement de la tâche. Un tableau peut être partagé entre différents utilisateurs et chaque action met à jour le tableau en temps réel. Il est aussi possible d’attribuer des étiquettes de différente couleur (pour regrouper des tâches par fonctionnalité ou encore pour définir une priorité) et d’appliquer des filtres sur ces étiquettes.

Wekan
       
  • À qui s’adresse ce tutoriel ?

    Cette procédure fonctionne à la fois pour des installations en local, sur VM ou sur serveur dédié (kimsufi, dedibox, etc.). Si vous avez un nom de domaine, nous verrons comment mettre en place un serveur HTTP Traefik et chiffrer vos échanges avec le protocole SSL/TLS, le tout sous Docker.

  • Pourquoi Docker et Traefik ?

    Wekan sera déployé en quelques minutes et isolé dans un container Docker. Ce container contientra toutes les dépendances (librairies, démons, configurations, etc.) nécessaires à son exécution sans interférer avec les autres outils ou d’autres services installés sur votre serveur. Enfin la mise à jour sera simplifiée et pourra être totalement automatisée (nous le verrons). L’image Docker sera versionnée et permettra de redéployer une version précédente très facilement.

    Traefik est un reverse-proxy et un load-balancer moderne conçu (par un Français) pour faciliter le déploiement des microservices (Docker, Kubernetes, AWS, etc.). Traefik est extrêmement simple à configurer et gère automatiquement vos certificats délivrés par Let’s Encrypt. Il les renouvelle 30 jours avant leurs expirations sans action de votre part. De plus, il est capable de charger vos containers dynamiquement sans interruption de service et dispose d’un dashboard affichant l’ensemble de vos routes configurées.

1 – Prérequis

  • Vous devez disposer d’Ubuntu 20.04 en version Desktop, Server ou ARM (Raspberry Pi). Si vous disposez d’une version antérieure, vous pouvez mettre à jour votre système en suivant cette procédure.
  • Votre utilisateur doit avoir accès à sudo.
  • Vos dépôts APT doivent être à jour. Dans le doute, tapez la commande suivante :
    sudo apt-get update
  • Les paquets curl et software-properties-common doivent être installés sur votre système. Dans le doute, tapez la commande suivante :
    sudo apt-get install -y curl software-properties-common

2 – Installation de Docker & Docker Compose

Docker

  1. Installez Docker :

    sudo apt-get install -y docker.io
  2. Vérifiez que Docker est correctement installé avec la commande :

    docker -v
    Docker version 19.03.8, build afacb8b7f0

    La commande doit retourner la version installée de Docker.

Docker Compose

  1. Téléchargez Docker Compose avec la commande suivante en modifiant la version si besoin avec la dernière release du repository officiel de Docker :

    sudo curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
  2. Ajoutez les droits d'exécution sur le binaire de Docker Compose :

    sudo chmod +x /usr/local/bin/docker-compose
  3. Vérifiez l'installation de Docker Compose avec la commande :

    docker-compose -v
    docker-compose version 1.27.4, build 8a1c60f6

    Si l'installation s'est correctement effectuée, cette commande doit vous renvoyer la version de Docker Compose.

  1. Installez les dépendances requises pour Docker Compose :

    sudo apt install -y python3-pip libffi-dev
  2. Installez Docker Compose :

    sudo pip3 install docker-compose
  3. Vérifiez l'installation de Docker Compose avec la commande :

    docker-compose -v
    docker-compose version 1.27.4, build 8a1c60f6

    Si l'installation s'est correctement effectuée, cette commande doit vous renvoyer la version de Docker Compose.


3 – Droits Unix : un utilisateur dédié wekan

Il est recommandé, pour des raisons de sécurité, de créer un utilisateur dédié à la gestion du volume Wekan et de ne pas le lancer sous votre super-utilisateur.

  1. Créez un utilisateur wekan :

    sudo adduser wekan
  2. Ajoutez-le au groupe docker :

    sudo adduser wekan docker

4 – Création du volume Wekan

  • Connectez-vous sous l’utilisateur wekan :

    su wekan
  • Déplacez-vous dans le répertoire personnel de cet utilisateur :

    cd
  • Créez le fichier /home/wekan/docker-compose.yml et modifiez les lignes en surbrillance en fonction de votre configuration :

    version: '3.7'
    services:
      wekandb:
        image: mongo:3.2.21
        container_name: wekan-db
        restart: unless-stopped
        command: mongod --smallfiles --oplogSize 128
        networks:
          - wekan-tier
        expose:
          - 27017
        volumes:
          - wekan-db:/data/db
          - wekan-db-dump:/dump
    
      wekan:
        image: quay.io/wekan/wekan:latest
        container_name: wekan-app
        restart: unless-stopped
        networks:
          - wekan-tier
        ports:
          - 8080:8080
        environment:
          - MONGO_URL=mongodb://wekandb:27017/wekan
          - ROOT_URL=http://wekan.mondomaine.com
          - MAIL_URL=smtp://mon_utilisateur_gmail:mon_password_gmail@smtp.gmail.com:25/
          - MAIL_FROM='Wekan <mon_utilisateur_gmail@gmail.com>'
          - WITH_API=true
        depends_on:
          - wekandb
    
    volumes:
      wekan-db:
        driver: local
      wekan-db-dump:
        driver: local
    
    networks:
      wekan-tier:
        driver: bridge
    • ROOT_URL : URL de votre Wekan. Cette propriété est obligatoire. Si vous êtes sur un dédié sans nom de domaine, renseignez l’IP publique de votre serveur suivie du port 8080 : http://X.X.X.X:8080. Si vous êtes en local, renseignez la valeur http://localhost:8080.
    • MAIL_URL : informations relatives à un compte SMTP pour l’envoi d’emails à partir de l’application.
    • MAIL_FROM : adresse sous laquelle l’application enverra les emails.

    Les variables d’environnement MAIL_URL et MAIL_FROM sont facultatives et peuvent être supprimées si vous ne souhaitez pas envoyer d’email via Wekan.

  • Démarrez le container wekan :

    docker-compose up -d
  • Revenez sous votre super utilisateur :

    exit

Si vous êtes en local, vous pouvez désormais accéder à Wekan via http://localhost:8080.

5 – Accéder à Wekan depuis l’extérieur avec Traefik

N'oubliez pas d'ajouter des règles DNS pour chacun des sous-domaines dans l'interface administrateur du fournisseur de votre nom de domaine pour pointer vers l'IP de votre serveur. Les règles à ajouter sont de type « A ».

Si votre serveur est hébergé chez vous, il sera aussi nécessaire de créer une redirection du port 80 et 443 vers votre serveur dans l'interface de configuration de votre box internet (ou routeur).

Traefik est un reverse-proxy et un load-balancer moderne conçu (par un Français) pour faciliter le déploiement des microservices (Docker, Kubernetes, AWS, etc.). Traefik est extrêmement simple à configurer et gère automatiquement vos certificats délivrés par Let's Encrypt. Il les renouvelle 30 jours avant leurs expirations sans action de votre part. De plus, il est capable de charger vos containers dynamiquement sans interruption de service et dispose d'un dashboard affichant l'ensemble de vos routes configurées.

Si vous avez déjà un Traefik sous Docker, vous pouvez vous rendre directement à l'étape 5.4.

5.1 - Création de l'utilisateur traefik

Si vous avez plusieurs containers ou si vous avez pour projet d'en ajouter par la suite, il est préférable d'isoler le container Traefik. Il est recommandé de ne pas le lancer sous votre super-utilisateur et de créer un utilisateur dédié.

  1. Créez un utilisateur traefik :

    sudo adduser traefik
  2. Ajoutez-le au groupe docker :

    sudo adduser traefik docker

5.2 - L'image et réseau Traefik

  1. Connectez-vous sous l'utilisateur traefik :

    su traefik
  2. Déplacez-vous dans le répertoire personnel de cet utilisateur :

    cd
  3. Créez le réseau dédié à Traefik et à l'ensemble de vos containers :

    docker network create traefik_network
  4. Créez le fichier /home/traefik/docker-compose.yml en ajoutant le contenu suivant :

    version: '3.7'
    services:
      traefik:
        image: "traefik:v2.2"
        container_name: "traefik"
        restart: unless-stopped
        networks:
          - traefik_network
        ports:
          - "80:80"
          - "443:443"
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock:ro
          - /home/traefik/traefik.toml:/traefik.toml:ro
          - /home/traefik/acme.json:/acme.json
    
    networks:
      traefik_network:
        external: true
    
    • /var/run/docker.sock:/var/run/docker.sock:ro : précise le socket Unix de votre docker. Laissez cette valeur par défaut.
    • /home/traefik/traefik.toml:/traefik.toml:ro : précise le chemin du fichier de configuration de Traefik. Nous le créerons à l'étape suivante.
    • /home/traefik/acme.json:/acme.json : précise le chemin du fichier contenant les informations relatives à vos certificats.
    • traefik_network : ici nous spécifions le réseau dédié à Traefik. Nous ajouterons aussi le container Wekan dans ce réseau par la suite.

5.3 - Configuration Traefik

Traefik peut être configuré de différentes manières, nous allons détailler ici, la configuration recommandée par Traefik, à savoir par un fichier statique au format TOML.

  1. Traefik stocke les informations liées au certificat dans un fichier acme.json. Vous devez au préalable créer le fichier et lui attribuer un minimum de permissions :

    touch /home/traefik/acme.json && chmod 600 /home/traefik/acme.json
  2. Créez le fichier de configuration Traefik /home/traefik/traefik.toml en ajoutant les lignes suivantes. L'unique propriété à modifier est l'email :

    [providers.docker]
      endpoint = "unix:///var/run/docker.sock"
      watch = true
      exposedByDefault = false
    
    [entryPoints.web]
      address = ":80"
      [entryPoints.web.http.redirections.entryPoint]
        to = "websecure"
        scheme = "https"
    
    [entryPoints.websecure]
      address = ":443"
    
    [certificatesResolvers.leresolver.acme]
      email = "votre-adresse@email.com"
      storage = "acme.json"
      [certificatesResolvers.leresolver.acme.httpChallenge]
        entryPoint = "web"
    • [providers.docker] : cette directive permet tout simplement d'activer le support Docker.
    • endpoint = "unix:///var/run/docker.sock" : précise le socket Unix de votre Docker à Traefik. Laissez la valeur par défaut.
    • watch = true : permet de déployer à chaud les containers dès qu'un changement dans la configuration est détectée.
    • exposedByDefault = false : n'expose pas par défaut les containers au monde extérieur. Il est préférable d'activer cette option dans le docker-compose.yml pour chacun des containers dans le cas où, si pour une raison ou une autre, vous ne souhaiteriez plus rendre accessible un container de l'extérieur.
    • [entryPoints.web] et [entryPoints.websecure] : ces directives définissent les points d'entrée de votre Traefik. web et websecure sont purement indicatifs, vous pouvez les nommer autrement mais ils doivent correspondre aux labels que nous définirons plus tard dans le docker-compose.yml. Les propriétés address précisent les ports sur lesquels Traefik « écoute » en fonction du point d'entrée.
    • [entryPoints.web.http.redirections.entryPoint] : force la redirection du port 80 vers le port 443 donc force le HTTP en HTTPS.
    • [certificatesResolvers.[NOM_RESOLVEUR].acme] : nous indiquons ici que nous souhaitons utiliser le protocole ACME (donc le service Let's Encrypt) pour obtenir un certificat. Le nom du résolveur est purement indicatif, il doit simplement correspondre aux labels que nous définirons plus tard dans le docker-compose.yml.
    • storage = "acme.json" : la propriété storage précise à Traefik le fichier (que nous avons créé précédemment) où seront stockées les informations relatives aux certificats. L'erreur commune est d'indiquer le chemin absolu (dans notre cas /home/traefik/acme.json), ici le chemin à renseigner est celui au sein du container Traefik, il faut donc laisser cette valeur par défaut.
    • [certificatesResolvers.[NOM_RESOLVEUR].acme.httpChallenge] : cette directive précise tout simplement par quel point d'entrée (dans notre cas le port 80) Traefik peut obtenir un certificat.
  3. Déplacez-vous dans le répertoire personnel de l'utilisateur traefik et démarrez le container :

    cd
    docker-compose up -d

5.4 – Labels wekan et réseau Traefik

  1. Connectez-vous sous l’utilisateur wekan et déplacez-vous dans son répertoire personnel :

    su wekan
    cd
  2. Dans votre fichier /home/wekan/docker-compose.yml, ajoutez le réseau traefik_network dans la configuration du container et en fin de fichier.

    Enfin, ajoutez les labels permettant de communiquer avec Traefik (attention à bien modifier le domaine) :

    version: '3.7'
    services:
      wekandb:
        image: mongo:3.2.21
        container_name: wekan-db
        restart: unless-stopped
        command: mongod --smallfiles --oplogSize 128
        networks:
          - wekan-tier
        expose:
          - 27017
        volumes:
          - wekan-db:/data/db
          - wekan-db-dump:/dump
    
      wekan:
        image: quay.io/wekan/wekan:latest
        container_name: wekan-app
        restart: unless-stopped
        networks:
          - wekan-tier
          - traefik_network
        ports:
          - 8080:8080
        environment:
          - MONGO_URL=mongodb://wekandb:27017/wekan
          - ROOT_URL=http://wekan.mondomaine.com
          - MAIL_URL=smtp://mon_utilisateur_gmail:mon_password_gmail@smtp.gmail.com:25/
          - MAIL_FROM='Wekan <mon_utilisateur_gmail@gmail.com>'
          - WITH_API=true
        depends_on:
          - wekandb
        labels:
          - "traefik.enable=true"
          - "traefik.docker.network=traefik_network"
          - "traefik.http.routers.wekan-app.entrypoints=web,websecure"
          - "traefik.http.routers.wekan-app.rule=Host(`wekan.mondomaine.com`)"
          - "traefik.http.services.wekan-app.loadbalancer.server.port=8080"
          - "traefik.http.routers.wekan-app.tls=true"
          - "traefik.http.routers.wekan-app.tls.certresolver=leresolver"
    
    volumes:
      wekan-db:
        driver: local
      wekan-db-dump:
        driver: local
    
    networks:
      wekan-tier:
        driver: bridge
      traefik_network:
        external: true
    • traefik.enable=true : ce label expose le container au monde extérieur. Il surchage la propriété exposedByDefault de votre fichier /home/traefik/traefik.toml.
    • traefik.docker.network=traefik_network : ce label précise à Traefik quel réseau utilise le container Wekan.
    • traefik.http.routers.[NOM_DU_CONTAINER].entrypoints : chaque règle de routage spécifique à un container doit être spécifiée par un nom, ici nous utilisons tout simplement le nom du container. Le label entrypoints précise que les requêtes entrantes sur les points d’entrée web (port 80) et websecure (port 443) seront transmises au container.
    • traefik.http.routers.[NOM_DU_CONTAINER].rule=Host(`wekan.mondomaine.com`) : ici nous précisons une règle, toute requête arrivant sur http://wekan.mondomaine.com sera transmise au container wekan.
    • traefik.http.services.[NOM_DU_CONTAINER].loadbalancer.server.port=[PORT] : ici nous précisons le port du container sur lequel les requêtes doivent être transmises.
    • traefik.http.routers.[NOM_DU_CONTAINER].tls : active le support SSL/TLS.
    • traefik.http.routers.[NOM_DU_CONTAINER].tls.certresolver : précise le résolveur et donc les certificats à utiliser.
  3. Déplacez-vous dans le répertoire personnel de l’utilisateur wekan et démarrez le container :

    cd
    docker-compose up -d
Il est nécessaire de patienter 2 à 3min avant d’accéder à Wekan, le temps que Traefik génère vos certificats SSL/TLS.

6 – Sauvegarde / Restauration de Wekan

6.1 – Sauvegarde

  1. Connectez-vous avec l’utilisateur wekan et rendez-vous dans son dossier personnel :

    su wekan
    cd
  2. Ouvrez une session bash à l’intérieur du container wekan-db contenant la base de données :

    docker exec -it wekan-db bash
  3. Déplacez-vous dans le répertoire /data :

    cd /data
  4. Sauvegardez la base de données en lançant la commande suivante :

    mongodump
  5. Fermez la session bash et quittez le container :

    exit
  6. Copiez les fichiers de sauvegarde à l’extérieur du container :

    docker cp wekan-db:/data/dump .

6.2 – Restauration

  1. Connectez-vous avec l’utilisateur wekan et rendez-vous dans son dossier personnel :

    su wekan
    cd
  2. Copiez le répertoire de sauvegarde dump à l’intérieur du container dans le répertoire /data :

    docker cp dump wekan-db:/data/
  3. Ouvrez une session bash à l’intérieur du container wekan-db contenant la base de données :

    docker exec -it wekan-db bash
  4. Déplacez-vous dans le répertoire /data :

    cd /data
  5. Restaurez la base de données en lançant la commande suivante :

    mongorestore --drop --db wekan dump/wekan/
  6. Fermez la session bash et quittez le container :

    exit
blank

Ubuntu 20.04 ServerDocker 19.03.8
Docker Compose 1.26.2
Traefik 2.2
Wekan 2.94


blank

4.7/5 - (4 votes)
0 réponses

Laisser un commentaire

Rejoindre la discussion?
N’hésitez pas à contribuer !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *