Contexte
Problème
Avec Traefik, j’ai eu des problèmes pour rendre accessible Nextcloud. Au début, c’était par ce que mon conteneur Nextcloud était en HTTPS et Traefik voulait gérer les certificats par lui même.

Exemple de log que j’avais sur la page :
Content-Security-Policy : Les paramètres de la page ont empêché le chargement d’une ressource (img-src) à l’adresse http://nextcloud.mon_domaine.com/apps/mail/img/mail-dark.svg car elle enfreint la directive suivante : « img-src 'self' data: blob: https://*.tile.openstreetmap.org https://192.168.x.x:mon_port »
Mise à part cette affichage, tout fonctionne bien. Mais ce n’est pas le cas pour la connexion avec le téléphone, qui renvoyait en boucle :
Mode strict : aucune connexion HTTP n'est autorisée
Solution
Application mobile
Pour le problème avec le téléphone, j’ai réussi à régler le problème en ajoutant un middleware à mon routeur Traefik, comme ça par exemple :
http: routers: nextcloud: rule: "Host(`nextcloud.mon_domaine.com`)" service: nextcloud-service entryPoints: - websecure tls: certResolver: mon_certResolver middlewares: - nextcloud-headers services: nextcloud-service: loadBalancer: servers: - url: "http://nextcloud:80" middlewares: nextcloud-headers: headers: customRequestHeaders: X-Forwarded-Proto: "https"
En faisant ça, le middlewares permet de prévenir NextCloud que c’est Traefik qui gère le HTTPS, donc il n’y a pas de problème de sécurité.
Si vous ne faites pas comme moi, à utiliser les fichiers dynamiques de Traefik, mais que vous passez par les « labels » dans le fichier « docker-compose.yml », voici un équivalent :
labels: # Active Traefik pour ce conteneur - "traefik.enable=true" # ROUTEUR : règle d’hôte (domaine) - "traefik.http.routers.nextcloud.rule=Host(`nextcloud.mon_domaine.com`)" - "traefik.http.routers.nextcloud.entrypoints=websecure" - "traefik.http.routers.nextcloud.tls=true" - "traefik.http.routers.nextcloud.tls.certresolver=mon_certResolver" # MIDDLEWARE : envoie l’en-tête X-Forwarded-Proto - "traefik.http.middlewares.nextcloud-headers.headers.customrequestheaders.X-Forwarded-Proto=https" # Attache le middleware au routeur nextcloud - "traefik.http.routers.nextcloud.middlewares=nextcloud-headers"
Affichage NextCloud
Pour l’affichage côté NextCloud via le navigateur, il suffit d’aller dans le fichier de configuration de NextCloud, dans « www/nextcloud/config/config.php » par exemple.
Ensuite, il suffit d’ajouter ces deux lignes dans le array de « $CONFIG = array () » :
'overwritehost' => 'nextcloud.mon_domaine.com', 'overwriteprotocol' => 'https',
Grâce à ça, NextCloud va rechercher les fichiers dont il a besoin en se basant sur votre domaine et le protocole que vous utilisez (https).
Dans mon cas, sans ça, il essaie de récupérer les fichiers sur « https://192.168.x.x:mon_port » alors que comme je l’ai expliqué au début, mon Nextcloud local utilise http, pas https, donc c’est normal qu’il ne les retrouve pas.
De plus, dans une logique où l’application doit être accessible depuis l’extérieur, ça n’a aucun sens de basé sur une ip comme « 192.168.x.x » qui est une ip locale.
D’où le fait de mettre notre nom de domaine.