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

Article écrit par • créé le • mis à jour le 16 janvier 2024
← Partie 2
Installation de Traefik

7 - Configuration

Veillez à décocher « Installer les applications recommandées » ! L'image officielle Nextcloud présente un bug qui ralentit considérablement l'application si vous laissez cocher cette case. Il est recommandé d'installer les applications dans l'interface de votre cloud une fois la configuration terminée.

Renseignez l'utilisateur et le mot de passe de votre choix et cliquez sur « Terminer l'installation » :

Nextcloud Configuration Docker

8 - Suivre les recommandations de Nextcloud

Votre instance Nextcloud effectue automatiquement des vérifications sur la sécurité et la configuration. Il est possible de consulter les avertissements liés à votre configuration dans les paramètres (Administration → Vue d'ensemble) :

Nextcloud Recommandations

8.1 - La configuration des en-têtes du reverse proxy

Comme l'indique le message d'avertissement, vous devez définir explicitement les serveurs proxy auxquels Nextcloud doit faire confiance et fournir des en-têtes spécifiques pour des raisons de sécurité.

  • Ajoutez les lignes suivantes dans votre docker-compose.yml :
    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"
          - "traefik.http.routers.nextcloud.middlewares=nextcloud"
          - "traefik.http.middlewares.nextcloud.headers.stsSeconds=155520011"
          - "traefik.http.middlewares.nextcloud.headers.stsIncludeSubdomains=true"
          - "traefik.http.middlewares.nextcloud.headers.stsPreload=true"
    
    volumes:
      db:
      html:
    
    networks:
      lan:
      traefik_network:
        external: true
  • Exécutez les commandes suivantes (attention à bien remplacer cloud.mondomaine.com par le vôtre dans la deuxième commande) :
    docker exec -it -u www-data nextcloud_app php occ config:system:set trusted_proxies 1 --value='127.0.0.1'
    docker exec -it -u www-data nextcloud_app php occ config:system:set overwritehost --value="cloud.mondomaine.com"
    docker exec -it -u www-data nextcloud_app php occ config:system:set overwriteprotocol --value="https"
  • Redémarrez vos containers pour prendre en compte la nouvelle configuration avec la commande suivante :
    docker-compose up -d

8.2 - CalDAV et CardDAV

CalDAV et CardDAV sont des protocoles réseaux permettant de synchroniser respectivement vos calendriers et vos contacts créés au sein de votre cloud vers d'autres appareils (votre smartphone Android par exemple).

Les redirections pour CalDAV ou CardDAV ne fonctionnent pas si Nextcloud s'exécute derrière un reverse proxy (ici Traefik). La solution est de demander à Traefik de réaliser les redirections.

  • Ajoutez le middleware nextcloud_redirect à la ligne 45 et les 3 propriétés de redirections dans votre docker-compose.yml :
    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"
          - "traefik.http.routers.nextcloud.middlewares=nextcloud,nextcloud_redirect"
          - "traefik.http.middlewares.nextcloud.headers.stsSeconds=155520011"
          - "traefik.http.middlewares.nextcloud.headers.stsIncludeSubdomains=true"
          - "traefik.http.middlewares.nextcloud.headers.stsPreload=true"
          - "traefik.http.middlewares.nextcloud-redirectregex.redirectRegex.permanent=true"
          - "traefik.http.middlewares.nextcloud_redirect.redirectregex.regex=/.well-known/(card|cal)dav"
          - "traefik.http.middlewares.nextcloud_redirect.redirectregex.replacement=/remote.php/dav/"
    volumes:
      db:
      html:
    
    networks:
      lan:
      traefik_network:
        external: true
  • Redémarrez vos containers pour prendre en compte la nouvelle configuration avec la commande suivante :
    docker-compose up -d

8.3 - Index manquants

Ajoutez les index manquants avec la commande suivante :
docker exec -it -u www-data nextcloud_app php occ db:add-missing-indices

Vous pouvez maintenant recharger la page et constater que la sécurité et la configuration suivent désormais les recommandations officielles :

Nextcloud Recommandations Succès

9 - Améliorer le temps de réponse avec Redis

En construction...

10 - Installation de la suite Collabora Online

Nextcloud Collabora Online

Collabora Online permet d'éditer vos documents en temps réel directement dans Nextcloud, en affichant un rendu WYSIWYG de haute fidélité et en préservant la présentation et le formatage de vos documents.

Les utilisateurs peuvent insérer des commentaires et y répondre, et en inviter d'autres personnes sans compte Nextcloud à se joindre anonymement pour éditer des fichiers se trouvant dans un dossier public partagé par lien.

Collabora Online prend en charge des dizaines de formats de documents dont DOC, DOCX, PPT, PPTX, XLS, XLSX + ODF, Import/View Visio, Publisher et bien plus...

ⓘ Si vous accédez à votre Nextcloud de l'extérieur via Traefik, il est nécessaire de faire pointer un nouveau domaine ou sous-domaine vers votre Collabora comme vous l'avez fait pour votre Nextcloud. Dans la suite du tutoriel, nous utiliserons le sous-domaine https://collabora.mondomaine.com.
  • Modifiez votre fichier /home/nextcloud/.env et ajoutez les propriétés NEXTCLOUD_URL_ESCAPED, COLLABORA_URL, COLLABORA_USER et COLLABORA_PASSWORD :
    MYSQL_DATABASE=nextcloud
    MYSQL_USER=mysql_user
    MYSQL_PASSWORD=mysql_password
    NEXTCLOUD_URL=cloud.mondomaine.com
    NEXTCLOUD_URL_ESCAPED=cloud\.mondomaine\.com
    COLLABORA_URL=collabora.mondomaine.com
    COLLABORA_USER=collabora_admin
    COLLABORA_PASSWORD=collabora_password
    • NEXTCLOUD_URL_ESCAPED : l'URL de votre Nextcloud mais en échappant chaque caractère « . » par un backslash « \ ». Cette valeur sera passée en variable d'environnement à votre Collabora et seules les requêtes venant de cette URL seront autorisées au sein de Collabora. Si vous êtes en local, laissez la valeur vide : NEXTCLOUD_URL_ESCAPED=
    • COLLABORA_URL : l'URL de votre Collabora. Si vous êtes en local, cette propriété n'est pas nécessaire.
    • COLLABORA_USER : identifiant de l'administrateur de votre Collabora.
    • COLLABORA_PASSWORD : mot de passe de l'administrateur de votre Collabora.
  • Ajoutez les lignes suivantes dans votre /home/nextcloud/docker-compose.yml sans rien modifier :
    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"
          - "traefik.http.routers.nextcloud.middlewares=nextcloud,nextcloud_redirect"
          - "traefik.http.middlewares.nextcloud.headers.stsSeconds=155520011"
          - "traefik.http.middlewares.nextcloud.headers.stsIncludeSubdomains=true"
          - "traefik.http.middlewares.nextcloud.headers.stsPreload=true"
          - "traefik.http.middlewares.nextcloud-redirectregex.redirectRegex.permanent=true"
          - "traefik.http.middlewares.nextcloud_redirect.redirectregex.regex=/.well-known/(card|cal)dav"
          - "traefik.http.middlewares.nextcloud_redirect.redirectregex.replacement=/remote.php/dav/"
    volumes:
      db:
      html:
    
      collabora:
        image: collabora/code
        container_name: nextcloud_collabora
        restart: unless-stopped
        ports:
          - 9980:9980
        networks:
          - lan
          - traefik_network
        environment:
          - "domain=${NEXTCLOUD_URL_ESCAPED}"
          - "extra_params=--o:ssl.enable=false --o:ssl.termination=true"
          - "dictionaries=fr"
          - "username=${COLLABORA_USER}"
          - "password=${COLLABORA_PASSWORD}"
          - "SLEEPFORDEBUGGER=0"
        cap_add:
          - MKNOD
        tty: true
        labels:
          - "traefik.enable=true"
          - "traefik.docker.network=traefik_network"
          - "traefik.http.routers.collabora.entrypoints=web,websecure"
          - "traefik.http.routers.collabora.rule=Host(`${COLLABORA_URL}`)"
          - "traefik.http.services.collabora.loadbalancer.server.port=9980"
          - "traefik.http.routers.collabora.tls=true"
          - "traefik.http.routers.collabora.tls.certresolver=leresolver"
    
    networks:
      lan:
      traefik_network:
        external: true

    Si vous êtes en local, les labels Traefik ne sont pas nécessaires. De plus, le network traefik_network déclaré à la ligne 64 n'est nécessaire.

  • Redémarrez vos containers pour prendre en compte la nouvelle configuration avec la commande suivante :
    docker-compose up -d

Suivant votre configuration, le container Collabora peut mettre jusqu'à 10 minutes avant d'être opérationnel ! Vous pouvez suivre le démarrage du container avec la commande :

docker-compose logs --follow nextcloud_collabora

Une fois le container opérationnel, il est nécessaire de configurer Nextcloud afin d'accéder à votre Collabora. Pour cela, vous devez télécharger et activer les applications.

Pour information, l'interface d'administration de Collabora Online est accessible via l'URL : https://collabora.mondomaine.com/loleaflet/dist/admin/admin.html ou localhost:9980/loleaflet/dist/admin/admin.html si vous êtes en local.

11 - Nextcloud sur Android...


Découvrez l'excellente application officielle Nextcloud sur Android qui vous permettra de synchroniser et de partager vos fichiers sur votre mobile.
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