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é.
-
Créez un utilisateur traefik :
sudo adduser traefik
-
Ajoutez-le au groupe docker :
sudo adduser traefik docker
6.2 - L'image et réseau Traefik
-
Connectez-vous sous l'utilisateur traefik :
su traefik
-
Déplacez-vous dans le répertoire personnel de cet utilisateur :
cd
-
Créez le réseau dédié à Traefik et à l'ensemble de vos containers :
docker network create traefik_network
-
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.
-
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
-
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.
-
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
-
Connectez-vous sous l'utilisateur nextcloud et déplacez-vous dans son répertoire personnel :
su nextcloud
cd
-
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
-
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.
-
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.
Ubuntu Server 20.04 LTS
Edouard WATTECAMPS
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
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é 🙂