Publié le 17 mars 2021, mis à jour le 6 octobre 2022.
Des produits comme Google Drive et Dropbox sont populaires aujourd’hui car ils permettent de stocker des données à moindre coût. Nextcloud se positionne comme un remplaçant auto-hébergé de ces services. Nous allons voir comment l'installer à l’aide de Docker et Docker-Compose et comment l'utiliser.
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 :
- Installer et configurer Docker et Docker-Compose
- C’est tout !
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 !