Ubuntu 20.04 & 21.04 - Installation de Nextcloud avec Docker et Traefik

Article écrit par • créé le • mis à jour le 16 janvier 2024
← Partie 1
Installation de Docker et Nextcloud

6 - Accéder à Nextcloud depuis l'extérieur avec Traefik

ⓘ Si vous souhaitez accéder à votre Nextcloud de l'extérieur (et non seulement via localhost), il est nécessaire de faire pointer votre domaine ou sous-domaine vers l'IP de votre serveur. Pour cela, commencez par modifier les règles DNS dans l'interface administrateur du fournisseur de votre nom de domaine. 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 open-source 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 6.4.

6.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

6.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 Nextcloud dans ce réseau par la suite.

6.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 = "[email protected]"
      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

6.4 - Labels Nextcloud et réseau Traefik

  1. Connectez-vous sous l'utilisateur nextcloud et déplacez-vous dans son répertoire personnel :
    su nextcloud
    cd
  2. Modifiez votre fichier /home/nextcloud/.env et ajoutez la propriété NEXTCLOUD_URL en modifiant l'url cloud.mondomaine.com par la vôtre. Veillez à ne pas préciser le protocole http ou https !
    MYSQL_DATABASE=nextcloud
    MYSQL_USER=mysql_user
    MYSQL_PASSWORD=mysql_password
    NEXTCLOUD_URL=cloud.mondomaine.com
  3. Dans votre fichier /home/nextcloud/docker-compose.yml, ajoutez les lignes en surbrillance sans rien modifier. Pour information, l'URL d'accès est tout d'abord déclarée dans la configuration du container nextcloud_app. Le réseau traefik_network est ensuite ajouté dans la configuration du container Nextcloud. Enfin, les labels permettant de communiquer avec Traefik sont spécifiés dans le container nextcloud_app :
    version: '3.7'
    services:
      database:
        image: mariadb
        container_name: nextcloud_database
        restart: unless-stopped
        command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
        environment:
          - MYSQL_RANDOM_ROOT_PASSWORD=yes
          - MYSQL_DATABASE=${MYSQL_DATABASE}
          - MYSQL_USER=${MYSQL_USER}
          - MYSQL_PASSWORD=${MYSQL_PASSWORD}
        networks:
          - lan
        volumes:
          - db:/var/lib/mysql
    
      nextcloud:
        depends_on:
          - database
        image: nextcloud
        container_name: nextcloud_app
        restart: unless-stopped
        ports:
          - 8080:80
        environment:
          - MYSQL_HOST=database
          - MYSQL_DATABASE=${MYSQL_DATABASE}
          - MYSQL_USER=${MYSQL_USER}
          - MYSQL_PASSWORD=${MYSQL_PASSWORD}
          - NEXTCLOUD_TRUSTED_DOMAINS=${NEXTCLOUD_URL}
        networks:
          - lan
          - traefik_network
        volumes:
          - html:/var/www/html
        labels:
          - "traefik.enable=true"
          - "traefik.docker.network=traefik_network"
          - "traefik.http.routers.nextcloud.entrypoints=web,websecure"
          - "traefik.http.routers.nextcloud.rule=Host(`${NEXTCLOUD_URL}`)"
          - "traefik.http.services.nextcloud.loadbalancer.server.port=80"
          - "traefik.http.routers.nextcloud.tls=true"
          - "traefik.http.routers.nextcloud.tls.certresolver=leresolver"
    
    volumes:
      db:
      html:
    
    networks:
      lan:
      traefik_network:
        external: true

    Il est primordial de respecter l'indentation !

    • 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 Nextcloud.
    • 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(`${NEXTCLOUD_URL}`) : ici nous précisons une règle, toute requête arrivant sur http://cloud.mondomaine.com sera transmise au container nextcloud_app.
    • 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.
  4. Déplacez-vous dans le répertoire personnel de l'utilisateur nextcloud et démarrez le container :
    cd
    docker-compose up -d

Il est nécessaire de patienter 2 à 3min avant d'accéder à votre cloud, le temps que Traefik génère vos certificats SSL/TLS.

Suite et fin du tutoriel ➔

Testé sur
Ubuntu Server 20.04 LTS
Auteur
Edouard WATTECAMPS

2 réflexions au sujet de “Ubuntu 20.04 & 21.04 - Installation de Nextcloud avec Docker et Traefik”

  1. Bonjour,
    Lorsque je lance la commande « docker-compose -v », j’ai le message suivant :
    « /usr/local/bin/docker-compose: line 1: Not: command not found »
    La version de Docker est la suivante : Docker version 19.03.13, build 4484c46
    Merci de votre aide

    Répondre
  2. Bonjour!
    Attention, depuis les versions récentes dun conteneur de Collabora, la variable d’environnement domain= n’est plus acceptée. Si je reprend l’exemple de ce guide, dans docker-compose.yml il faut remplacer « domain=${NEXTCLOUD_URL_ESCAPED} » par « aliasgroup1=${NEXTCLOUD_URL_ESCAPED} »
    Puis dans le fichier .env il faut remplacer NEXTCLOUD_URL_ESCAPED=cloud\.mondomaine\.com par NEXTCLOUD_URL_ESCAPED=https://cloud.mondomaine.com:443,https://cloud\.mondomaine\.com,https://cloud\.mondomaine\.com:443
    Voilà, j’espère avoir aidé 🙂

    Répondre

Laisser un commentaire