Blog DevOps

Créer un espace de stockage avec Nextcloud et Docker | Padok

Rédigé par Terence Chateigné | 17 mars 2021 23:00:00

Nextcloud est une application de partage de fichiers que l’on peut installer et héberger par ses propres moyens (sur un VPS, une Raspberry Pi…) afin de disposer de son propre stockage cloud. Il se présente sous la forme d’un site fonctionnant avec PHP et quelques autres composants que nous analyserons dans ce guide. Voici quelques avantages que propose Nextcloud :

  • Open-source: le code source est disponible sur Github et la documentation est très bien rédigée
  • Polyvalent: en plus d’héberger vos fichiers, Nextcloud peut servir d’agenda, de point de synchronisation de contacts, de plateforme de streaming vidéo…
  • Personnalisable: Nextcloud possède une marketplace permettant d’installer de nombreuses applications
  • Collaboratif: vous pouvez gérer de multiples utilisateurs et groupes dans le cadre d’un espace de stockage partagé

Prérequis

Pour pouvoir suivre ce tutoriel, voici ce dont vous aurez besoin :

Configuration

Docker-Compose

Pour démarrer ce projet, vous aurez besoin de créer un premier fichier : docker-compose.yml qui va définir les différents conteneurs faisant fonctionner Nextcloud :

version: "3.8"
services:
  nextcloud-db:
    image: mariadb:latest
    container_name: nextcloud-db
    hostname: nextcloud-db
    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
    restart: unless-stopped
    env_file: .env
    volumes:
      - ./nextcloud-data-db:/var/lib/mysql

  nextcloud-redis:
    image: redis:latest
    container_name: nextcloud-redis
    env_file: .env
    hostname: nextcloud-redis
    restart: unless-stopped

  nextcloud-app:
    image: nextcloud:fpm
    container_name: nextcloud-app
    hostname: nextcloud-app
    restart: unless-stopped
    env_file: .env
    depends_on:
      - nextcloud-db
      - nextcloud-redis
    volumes:
      - ./nextcloud-data/:/var/www/html
      # Uncomment and specify your data directory (if you have a mounted hard drive)
      # !! ALWAYS make a backup of your data before such manipulations !!
      # - /path/to/data/directory:/var/www/html/data

  nextcloud-web:
    image: nginx:latest
    container_name: nextcloud-web
    hostname: nextcloud-web
    restart: unless-stopped
    env_file: .env
    depends_on:
      - nextcloud-app
    volumes:
      - ./nextcloud-data/:/var/www/html:ro
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    ports:
      - 8888:80

  nextcloud-cron:
    image: nextcloud:fpm
    container_name: nextcloud-cron
    hostname: nextcloud-cron
    restart: unless-stopped
    env_file: .env
    volumes:
      - ./nextcloud-data/:/var/www/html
    entrypoint: /cron.sh
    depends_on:
      - nextcloud-db
      - nextcloud-redis

Nextcloud est donc ici réparti en 5 conteneurs Docker :

  • nextcloud-db : base de données MariaDB
    • Stockage d’un état persistant des fichiers hébergés et de données applicatives (utilisateurs, versions de fichiers…)
  • nextcloud-redis : service de caching de fichier Redis
    • Mise à disposition plus rapide des données stockées
  • nextcloud-app : serveur PHP qui exécute le code de Nextcloud
  • nextcloud-web : serveur NginX frontal
    • Un reverse-proxy pour gérer les requêtes HTTP
  • nextcloud-cron : service d’exécution de tâches de routine
    • Tâches régulières ne nécessitant pas une action humaine (ex : nettoyage de la base de donnée)

Il faut noter que le conteneur nextcloud-app créé un volume partagé entre Docker et votre système d’exploitation hôte. Cela permet d’accéder à des fichiers de configuration générés par Nextcloud ainsi qu’aux données que vous y stockerez.

Environnement

Nous devons aussi configurer un fichier de variables d’environnement .env :

# GENERAL

# The domain from where you'll access Nextcloud (eg. cloud.myself.com)
MY_DOMAIN=your_domain
# Your timezone
TZ=Europe/Paris

# NEXTCLOUD-MARIADB

# The database's root user password
# ! Set a stronger password !
MYSQL_ROOT_PASSWORD=changeme
# The database's nextcloud user password
# ! Set a stronger password !
MYSQL_PASSWORD=changeme
MYSQL_DATABASE=nextcloud
MYSQL_USER=nextcloud

# NEXTCLOUD
MYSQL_HOST=nextcloud-db
REDIS_HOST=nextcloud-redis

Pour une configuration pérenne, il est bien-sûr nécessaire de créer des mots de passe robustes pour votre base de données.

La variable MY_DOMAIN correspond au nom de domaine qui va pointer vers le conteneur NginX.

Ce conteneur reçoit la configuration nginx.conf comme suit :

worker_processes auto;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    upstream php-handler {
        server nextcloud-app:9000;
    }

    server {
        listen 80;

        # Add headers to serve security related headers
        # Before enabling Strict-Transport-Security headers please read into this
        # topic first.
        #add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
        #
        # WARNING: Only add the preload option once you read about
        # the consequences in https://hstspreload.org/. This option
        # will add the domain to a hardcoded list that is shipped
        # in all major browsers and getting removed from this list
        # could take several months.
        add_header Referrer-Policy "no-referrer" always;
        add_header X-Content-Type-Options "nosniff" always;
        add_header X-Download-Options "noopen" always;
        add_header X-Frame-Options "SAMEORIGIN" always;
        add_header X-Permitted-Cross-Domain-Policies "none" always;
        add_header X-Robots-Tag "none" always;
        add_header X-XSS-Protection "1; mode=block" always;

        # Remove X-Powered-By, which is an information leak
        fastcgi_hide_header X-Powered-By;

        # Path to the root of your installation
        root /var/www/html;

        location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
        }

        # The following 2 rules are only needed for the user_webfinger app.
        # Uncomment it if you're planning to use this app.
        #rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
        #rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;

        # The following rule is only needed for the Social app.
        # Uncomment it if you're planning to use this app.
        #rewrite ^/.well-known/webfinger /public.php?service=webfinger last;

        location = /.well-known/carddav {
            return 301 $scheme://$host:$server_port/remote.php/dav;
        }

        location = /.well-known/caldav {
            return 301 $scheme://$host:$server_port/remote.php/dav;
        }

        # set max upload size
        client_max_body_size 10G;
        fastcgi_buffers 64 4K;

        # Enable gzip but do not remove ETag headers
        gzip on;
        gzip_vary on;
        gzip_comp_level 4;
        gzip_min_length 256;
        gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
        gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;

        # Uncomment if your server is build with the ngx_pagespeed module
        # This module is currently not supported.
        #pagespeed off;

        location / {
            rewrite ^ /index.php;
        }

        location ~ ^\/(?:build|tests|config|lib|3rdparty|templates|data)\/ {
            deny all;
        }
        location ~ ^\/(?:\.|autotest|occ|issue|indie|db_|console) {
            deny all;
        }

        location ~ ^\/(?:index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+)\.php(?:$|\/) {
            fastcgi_split_path_info ^(.+?\.php)(\/.*|)$;
            set $path_info $fastcgi_path_info;
            try_files $fastcgi_script_name =404;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $path_info;
            # fastcgi_param HTTPS on;

            # Avoid sending the security headers twice
            fastcgi_param modHeadersAvailable true;

            # Enable pretty urls
            fastcgi_param front_controller_active true;
            fastcgi_pass php-handler;
            fastcgi_intercept_errors on;
            fastcgi_request_buffering off;
        }

        location ~ ^\/(?:updater|oc[ms]-provider)(?:$|\/) {
            try_files $uri/ =404;
            index index.php;
        }

        # Adding the cache control header for js, css and map files
        # Make sure it is BELOW the PHP block
        location ~ \.(?:css|js|woff2?|svg|gif|map)$ {
            try_files $uri /index.php$request_uri;
            add_header Cache-Control "public, max-age=15778463";
            # Add headers to serve security related headers (It is intended to
            # have those duplicated to the ones above)
            # Before enabling Strict-Transport-Security headers please read into
            # this topic first.
            #add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
            #
            # WARNING: Only add the preload option once you read about
            # the consequences in https://hstspreload.org/. This option
            # will add the domain to a hardcoded list that is shipped
            # in all major browsers and getting removed from this list
            # could take several months.
            add_header Referrer-Policy "no-referrer" always;
            add_header X-Content-Type-Options "nosniff" always;
            add_header X-Download-Options "noopen" always;
            add_header X-Frame-Options "SAMEORIGIN" always;
            add_header X-Permitted-Cross-Domain-Policies "none" always;
            add_header X-Robots-Tag "none" always;
            add_header X-XSS-Protection "1; mode=block" always;

            # Optional: Don't log access to assets
            access_log off;
        }

        location ~ \.(?:png|html|ttf|ico|jpg|jpeg|bcmap|mp4|webm)$ {
            try_files $uri /index.php$request_uri;
            # Optional: Don't log access to other assets
            access_log off;
        }
    }
}

Installation

Pour démarrer Nextcloud, lancez la commande :

docker-compose up

Renseignez un nom et un mot de passe pour le compte administrateur de votre instance et cliquez sur “Terminez l’installation”.Patientez quelques instants le temps que Nextcloud initialise son environnement. Dès que cette initialisation est terminée, accédez dans votre navigateur à l’adresse http://localhost:8888. Vous verrez alors cette page :

Après quelques secondes de mise en route, vous arriverez sur la page Tableau de bord de Nextcloud. Félicitations !

Démarrage

Pour bien commencer avec Nextcloud, nous pouvons déjà définir un compte utilisateur personnel :

  • Cliquez sur la bulle en haut à droite de l’écran et cliquez sur la section “Utilisateurs”
  • Créez un groupe “utilisateur” qui ne sera pas privilégié
  • Créez un utilisateur qui sera votre compte principal pour utiliser Nextcloud

C’est toujours une bonne pratique d’utiliser un compte non-privilégié pour effectuer vos opérations de tous les jours, il n’y a pas de raison de ne pas le faire ici non plus !

Déconnectez-vous du compte administrateur et connectez-vous avec votre nouveau compte utilisateur.

Vous pouvez maintenant accéder à votre espace de stockage !

L’interface web vous permettra d’explorer tous vos fichiers ainsi que d’en charger et télécharger.

Voici une démonstration de l’utilisation de l’interface web de Nextcloud :

Nous avons installé Nextcloud avec Docker, ce qui nous a épargné de nombreuses étapes d’installation par rapport à une mise en place classique. Cette installation est tout à fait fonctionnelle, mais si vous souhaitez en avoir le même usage que Dropbox, de nombreux guides existent afin de rendre votre application accessible depuis internet et grâce à cela, synchroniser vos fichiers à travers tous vos appareils.

Vous pourrez donc profiter de votre espace de stockage cloud sans perdre le contrôle de vos données !