Nextcloud

De wikarphy

Nextcloud est un service permettant le stockage, la gestion et le partage de fichier. En plus de ces fonctionnalités, il peut être utilisé avec des extensions, qui peuvent le transformer en gestionnaire d'agendas, de notes, de tâches, mais aussi être intégré à Collabora Office pour permettre l'édition de document avec plusieurs personnes en même temps. C'est l'un des service le plus important disponible.

Configuration actuelle[modifier | modifier le wikicode]

Actuellement, cette solution fonctionne sur le serveur Computing et est disponible ici. Les données sont stockées sur le serveur Storage via un montage NFS et l'authentification s'effectue via Keycloak. Nextcloud utilisant PHP, les requêtes sont traitées par Nginx puis envoyé à Php-fpm.

Installation[modifier | modifier le wikicode]

Prérequis[modifier | modifier le wikicode]

Fichiers[modifier | modifier le wikicode]

La première étape est d'obtenir le lien pour télécharger l'archive contenant les fichiers du service. Le lien est disponible ici mais ne devrait pas changer souvent. Au dernière nouvelle, le lien est [1]. Pour télécharger l'archive sur le serveur, en tant que root, exécuter la commande curl -L {lien} -o nextcloud.tar.bz2. Si ce n'est pas déjà fait, il est aussi nécessaire d'installer lbzip2 pour pouvoir décompresser l'archiver (par exemple avec apt install lbzip2 sur debian). Ensuite, exécuter tar -xf nextcloud.tar-bz2 permet de créer le dossier nextcloud contenant les fichiers décompressés. Avec mv nextcloud /var/www/{nextcloud-url}, le dossier est déplacé vers son emplacement final, pour ensuite avoir ses droits modifiés avec la commande chown -R www-data:www-data /var/www/{nextcloud-url}{nextcloud-url} est l'URL de l'instance Nextcloud.

Nginx & Certbot[modifier | modifier le wikicode]

Ajouter le nom de domaine sur la zone DNS de l'interface d'administration de FreeIPA (procédure ici).

Créer le fichier /etc/nginx/sites-available/{nextcloud-url} contenant la configuration Nginx suivante:

server {
  server_name {nextcloud-url};

  listen 80;
  listen [::]:80;
}

Puis créer un lien symbolique avec la commande ln -s /etc/nginx/sites-available/{nextcloud-url} /etc/nginx/sites-enabled/{nextcloud-url} et tester la configuration via nginx -t. Si la configuration est valide, il est nécessaire de recharger le service systemd avec systemctl reload nginx et mettre en place le chiffrement ssl avec certbot --nginx --domain {nextcloud-url}.

Vérifier ensuite sur un navigateur l'accès au service sur le protocole https.

Modifier ensuite le fichier /etc/nginx/sites-available/{nextcloud-url} avec le contenu suivant:

map $arg_v $asset_immutable {
        "" "";
        default ", immutable";
}
server {
        server_name {nextcloud-url};

        listen [::]:443 ssl http2; # managed by Certbot
        listen 443 ssl http2; # managed by Certbot

        root /var/www/cloud.linarphy.net;

        index index.php index.html /index.php$request_uri;

        add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload" always;

        client_max_body_size 512M;
        client_body_timeout 300s;
        fastcgi_buffers 64 4K;

        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 text/javascript application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/wasm 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;

        client_body_buffer_size 512k;

        add_header Referrer-Policy                   "no-referrer"       always;
        add_header X-Content-Type-Options            "nosniff"           always;
        add_header X-Frame-Options                   "SAMEORIGIN"        always;
        add_header X-Permitted-Cross-Domain-Policies "none"              always;
        add_header X-Robots-Tag                      "noindex, nofollow" always;
        add_header X-XSS-Protection                  "1; mode=block"     always;

        include mime.types;
        types {
                text/javascript mjs;
        }

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

        location ^~ /.well-known {
                location = /.well-known/carddav { return 301 /remote.php/dav/; }
                location = /.well-known/caldav  { return 301 /remote.php/dav/; }
                location = /.well-known/webfinger { return 301 /index.php/.well-known/webfinger; }
                location = /.well-known/nodeinfo { return 301 /index.php/.well-known/nodeinfo; }

                location /.well-known/acme-challenge { try_files $uri $uri/ =404; }
                location /.well-known/pki-validation { try_files $uri $uri/ =404; }

                return 301 /$request_uri;
        }

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

        location ~ \.php(?:$|/) {
                rewrite ^/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|ocs-provider\/.+|.+\/richdocumentscode(_arm64)?\/proxy) /index.php$request_uri;

                fastcgi_split_path_info ^(.+?\.php)(/.*)$;
                set $path_info $fastcgi_path_info;

                include fastcgi_params;

                include snippets/fastcgi-php.conf;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param HTTPS on;

                fastcgi_param modHeadersAvailable true;
                fastcgi_param front_controller_active true;

                fastcgi_intercept_errors on;
                fastcgi_request_buffering off;

                fastcgi_max_temp_file_size 0;

                fastcgi_pass unix:/run/php/php-fpm.sock;
        }

        location ~ \.(?:css|js|mjs|svg|gif|ico|jpg|png|webp|webm|mp4|wasm|tflite|map|ogg|flac)$ {
                try_files $uri /index.php$request_uri;

                add_header Cache-Control                     "public, max-age=15778463$asset_immutable";
                add_header Referrer-Policy                   "no-referrer" always;
                add_header X-Content-Type-Options            "nosniff" always;
                add_header X-Frame-Options                   "SAMEORIGIN" always;
                add_header X-Permitted-Cross-Domain-Policies "none" always;
                add_header X-Robots-Tag                      "noindex, nofollow" always;
                add_header X-XSS-Protection                  "1; mode=block" always;
                access_log off;
        }

        location ~ \.(otf|woff2?)$ {
                try_files $uri /index.php$request_uri;
                expires 7d;
                access_log off;
        }

        location /remote {
                return 301 /remote.php$request_uri;
        }

        location / {
                #try_files $uri $uri/ /index.php$request_uri;
                rewrite ^ /index.php$request_uri;
        }

        ssl_certificate /etc/letsencrypt/live/{nextcloud-url}/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/{nextcloud-url}/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
        server_name {nextcloud-url};

        listen 80;
        listen [::]:80;

        location / {
                return 301 https://$host$request_uri;
        }
}

Modules PHP[modifier | modifier le wikicode]

Installer les modules PHP demandés ici. Sachant que la base de donnée utilisée sera Postgresql, et qu'il faudra donc pgsql en tant que "database connector".

Base de donnée[modifier | modifier le wikicode]

En tant qu'utilisateur postgres, lancer la commande psql puis exécuter les commandes suivantes:

  • CREATE DATABASE nextcloud;
  • CREATE USER nextcloud WITH ENCRYPTED PASSWORD '{nextcloud-postgresql-password}';
  • GRANT ALL PRIVILEGES ON DATABASE nextcloud TO nextcloud;
  • \c nextcloud
  • GRANT ALL ON SCHEMA public TO nextcloud;
  • \q

Montage NFS[modifier | modifier le wikicode]

En tant que root sur le serveur distant dans lequel vont être stocké les fichiers de données de nextcloud, créer le dossier qui servira de point de montage au serveur actuel avec la commande mkdir -p /data/nextcloud. Changer les droits pour autoriser l'utilisateur www-data l'accès au dossier avec la commande chown -R www-data:www-data /data/nextcloud. Toujours sur ce serveur distant, modifier le fichier /etc/exports en y ajoutant la ligne suivante:

/data/nextcloud {domaine du serveur sur lequel s'exécutera nextcloud}(rw,sync,sec=sys)

En tant que root sur le serveur dans lequel ont été effectué les étapes précédentes, créer le dossier qui servira de point de montage (connexion) au serveur distant avec la commande mkdir -p /data/nextcloud. Exécuter ensuite mount -t nfs4 {domaine du serveur sur lequel sera stocké les données nextcloud}:/data/nextcloud /data/nextcloud et ajouter au fichier /etc/fstab la ligne:

{domaine du serveur sur lequel sera stocké les données nextcloud}:/data/nextcloud /data/nextcloud nfs rw 0 0

Procédure d'installation[modifier | modifier le wikicode]

Une fois déplacé dans le dossier /var/www/{nextcloud-url}, la commande su -s /bin/bash -c 'php occ maintenance:install --database "pgsql" --database-name "nextcloud" --database-pass "{database-password}" --admin-user "{admin-name}" --admin-pass "{admin-password}" --data-dir "/data/nextcloud"' www-data