Création et gestion d'un serveur de cloud Personnel

A - Notes de travaux

L'ensemble des travaux se fait sur mon ordinateur personnel, avec une distribution Manjaro Linux (basé Arch) et l'hyperviseur de niveau 2 VMWare Workstation dans sa version AUR.

1 - Préparation des Machines

Les machines virtuelles sont en Bridged (afin de tester l'accès de ma machine hôte au cloud et permettre une attribution d'IP sur le réseau 192.168.1.0/24).

1 - 1 VM Serveur

Configuration physique de la machine
OS Debian 12.5 Netinstall
CPU 2 x 2 Coeurs avec Virtualisation AMD -V
RAM 4 Go de RAM
Stockage 40 Gb en Sata émulée depuis un NVME
Réseau Bridged sur 192.168.1.0/24
Installation

Elle se fait sans interface graphique

La machine a cette configuration d'hostname et de username.

Pour permettre des accès aux stockages sans formattage logique opu groupe de stockage, il n'y a pas d'utilisation du LVM. Le partitionnement se fait à l'avantage en volume du serveur SMB et donc un partitionnement basé sur du EXT4. Compte tenu de la virtualisation des disques, il n'existe aucun intérêt à la création d'un groupe de volumes RAID physique ou logique.

La partition cloudfiles se verra montée à l'emplacement du stockage défini par le serveur SMB. Les paquets de la pile LAMP ainsi que les outils SSH sont installés lors de la configuration initiale ainsi que l'outil d'amorçage GRUB.

Il faudra ensuite, après installation, modifier l'adressage du serveur pour attribution IP fixe.

Il faudra ensuite déterminer le port de connexion pour les sessions SSH d'administration avant création du poste client. La configuration limite la plage d'adresses d'écoute, l'authentification root par mdp et le port de session. Ainsi:

1 - 2 : Installation de la machine client

Configuration matérielle
OS Archlinux 6.01
CPU 4 x 2 Coeurs Virtualisés
RAM 8 Go
Stockage 40 Go de Nvme Réservés
Réseau NAT sur 192.168.123.0/24
Installation

Configuration pour l'installation:

archinstall

Le menu de configuration indique l'ensemble des paramètres à appliquer ensuite, il est possible d'installer ici les paquets pour ne pas avoir ensuite à les installer via pacman. La liste des paquets sélectionnables est disponible ici: Arch Linux - Package Search

Ceci est à ajouter aux services et programmes inclus dans l'environnement KDE.

J'ai donc ajouté les clients Nextcloud (officiel et rclone) pour la gestion des fichiers ainsi que openssh et firefox.

J'ai ensuite modifié l'environnement de bureau de kde pour ressemble à Windows Vista. Parce que.

Création de la paire de clés SSH et envoi sur serveur.

L'identification par mot de passe pour les sessions SSH est désormais impossible sur le serveur:

2 - Installation de NexcloudServer

Après avoir installé quelques prérequis (mariadb et unzip, surtout), il faut configurer la base de données.

mysql -u root -p
CREATE DATABASE nextcloud;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON nextcloud.* TO 'cloudder'@'localhost' IDENTIFIED BY 'Greta37
!';
FLUSH PRIVILEGES;
EXIT;

Il faut maintenant télécharger et décompresser l'archive contenant Nextcloud:

wget https://download.nextcloud.com/server/releases/latest.zip
unzip latest.zip -d /var/www/html/

Puis modifier les droits d'accès au dossier du serveur:

chown -R www-data:www-data /var/www/html/nextcloud/
chmod -R 755 /var/www/html/nextcloud/

Il faudra ensuite créer un virtualhost pour le serveur créé:

Il faudra ensuite reconfigurer apache pour prendre en compte l'utilisation du virtualhost

a2ensite nextcloud
a2enmod rewrite
systemctl restart apache2

La suite de la configuration se déroule désormais dans le navigateur à l'adresse http://192.168.1.17

Le dossier utilisé comme stockage cloud a été modifié pour /CloudFiles (emplacement qui auraît pu être le point de montage d'un array de disques en RAID0 pour augmenter la bande passante en lecture écriture des disques)

Utilisation d'un Virtualhost sur le port 8080 pour le site:

Comme indiqué sur la capture ci-contre, pour modifier l'adresse vers le port 8080 en accès direct via 192.168.1.17:8080 , j'ai du passer par trois étapes:

  1. Ajout d'un port d'écoute pour le serveur Apache sur le port 8080 dans /etc/apache2/ports.conf pour permettre aux sites d'être accessibles via d'autres ports que les ports standards 80 et 443

  2. Modification de la configuration du site Nextcloud dans le fichier /etc/apache2/sites-enabled/nextcloud.conf avec la premieère ligne changée pour <VirtualHost *:8080 >

  3. Maintenant que les ports d'écoute et le port assigné au site correspondent, il faut désormais simplement recharger le service apache2 avec :

    sudo systemctl restart apache2.service

Utilisation des clients

Un utilisateur non-admin a été créé disposant d'un quota de données:

3 - 1 Client Officiel

Il faut ensuite utiliser l'application et la connecter au serveur pour inscrire l'utilisateur à l'application nextcloud.

3 - 1 Client Rclone

Et voici le compte qui utilisera les fonctionnalités Webdav

Le fichier de configuration de rclone pour webdav se présente ainsi:

Pour faire fonctionner rclone sur le même poste client, j'ai du enlever la protection contre le bruteforce du fichier de configuration puisque je n'obtenais que des erreurs 429 en raison de connexions sur un autre compte a partir du même poste.

et je suis passé par le protocole webdav pour la synchronisation

Sinon, il est possible d'utiliser directement l'espace cloud dans Dolphin par le protocole Webdav en le configurant dans la partie "Réseau" de l'explorateur de fichiers:

4 - Scripting

4-1 Création d'un script surveillant l'utilisation du stockage cloud
Version 1
#!/bin/bash

#Cette partie du script met à jour et télécharge les paqets nécéssaires au fonctionnement
sudo pacman -Syu --noconfirm
sudo pacman -S bc sshpass --noconfirm

#L'inscription d'une variable d'environnement comme variable interne du script permet de mémoriser l'utilisateur actif et ne pas utiliser un variable d'environnement du serveur pour le SCP
suppli=$LOGNAME

#Cette séquence du script  n'affiche que l'adresse IP du client afin de l'inscrire comme celle de la session SCP
MYINTERFACE=$(ip addr show | awk -F': ' '/[0-9]+: / {print $2}' | sed -n '2p')
MYIP=$(ip addr show $MYINTERFACE | awk '$1 == "inet" {gsub(/\/.*$/, "", $2); print $2}')

#L'utilisateur du cloud a un dossier dans la partition de stockage sur le serveur
echo "Donnez le nom de l'utilisateur qui doit annoncer ses quotas d'utilisation"
read clouduser
#Cette partie du script est celle de la requête vers le serveur qui découpe la valeur d'utilisation des données pour la renvoyer
#des clés d'authentification existent dans les deux sens et celle du serveur dispose d'une passphrase 
sshpass -P passphrase -p Greta37! ssh -p 20202 -i laclef -o PreferredAuthentications=publickey admincloud@192.168.1.17 \
"sudo du -h -c /CloudFiles/$clouduser > /tmp/quota.txt && scp -i copykey /tmp/quota.txt $suppli@$MYIP:/tmp/quota.txt"

#Sélection du nombre de la dernière ligne de la commande "du" en Megaoctets
UsedBytes=$(tail -n 1 /tmp/quota.txt | sed 's|[^0-9]||g')

echo "$clouduser ,Vous avez utilisé $UsedBytes mégaoctets de données sur les 5 Go de données disponibles"

#calcul d'un taux d'utilisation du stockage
Quota=5120.00
RatioUse=$(echo "$UsedBytes /  $Quota" | bc)
PourcentsUse=$(echo "$RatioUse * 100.00" | bc)

#retour utilisateur avec messages d'alerte selon les paliers d'utilisation
echo "Il reste à $clouduser environ $PourcentsLibre % de votre volume de stockage de disponible"
if (( $(echo "$PourcentsUse >= 90.00" | bc) )); then
    echo "Veuillez libérer de l'espace disque"
        elif (( $(echo "$PourcentsUse >= 75.00" | bc) )); then
        echo "Vous approchez de la limite de stockage, attention !"
    else
        echo "Profitez bien de votre utilisation de Nextcloud, cher $clouduser "
fi

#sortie "gracieuse" du script
exit 0

Ce qui donne dans le terminal:

Version 2:

Une partie du script ne parvient pas à se lancer: En effet, toutes les parties fonctionnent sauf la boucle de lecture sur nxtcloudusers.txt qui s'arrête systématiquement au premier compte (intégré correctement au fichier CSV, tout de même).C'est pour cela que seul le compte admin apparaît.

#!/bin/bash

#Reprise de la détection d'ip du client et de son username
suppli=$LOGNAME
MYINTERFACE=$(ip addr show | awk -F': ' '/[0-9]+: / {print $2}' | sed -n '2p')
MYIP=$(ip addr show $MYINTERFACE | awk '$1 == "inet" {gsub(/\/.*$/, "", $2); print $2}')

#Création des emplacements pour le fichier de logs et attibution des droits
#Suppression des fichiers précédemments créés par d'autres occurences du script
mkdir -p nextcloudlogs > /dev/null
sudo chown -R $suppli:$suppli nextcloudlogs > /dev/null
sudo chmod -R 744 nextcloudlogs > /dev/null
touch ~/nextcloudlogs/usagecloud.csv > /dev/null
rm nxtcldusers.txt > /dev/null

#Utilisationd de la fonction php de nextcloud nommée occ pour récupérer une liste d'utilisateurs
sshpass -P passphrase -p Greta37! ssh -p 20202 -i laclef -o PreferredAuthentications=publickey admincloud@192.168.1.17 \
"sudo -u www-data php /var/www/html/nextcloud/occ user:list > nxtcldusers.txt && scp -i copykey nxtcldusers.txt $suppli@$MYIP:nxtcldusers.txt"

#Création de la boucle de lecture et modifcation de la ligne du compte user
userlist=nxtcldusers.txt
cat $userlist | while IFS= read -r line
   do

nxtusr=$(echo -e "$line" | cut -c 5- | cut -d':' -f1)

echo $nxtusr
#récupération du volume de stockage utilisé comme pour la version 1 du script
        sshpass -P passphrase -p Greta37! ssh -p 20202 -i laclef -o PreferredAuthentications=publickey admincloud@192.168.1.17 \
        "sudo du -h -c /CloudFiles/$nxtusr > usage.txt && scp -i copykey usage.txt $suppli@$MYIP:/home/$suppli/usage.txt"
UsedBytes=$(tail -n 1 usage.txt | sed 's|[^0-9]||g')
            if [[ $UsedBytes == "0" ]]
#mise en place de la condition pour l'append du fichier CSV
                    then
                echo "$nxtusr, [MISSING], $(date)" >> /home/$LOGNAME/nextcloudlogs/usagecloud.csv && echo "[MISSING]"
                    else 
                    echo "$nxtusr, $UsedBytes Mo, $(date)" >> /home/$LOGNAME/nextcloudlogs/usagecloud.csv
            fi
    done

exit 0

Voici le fichier de liste récupéré sur le serveur par la commande:

sudo -u www-data php /var/www/html/nextcloud/occ user:list > nxtcldusers.txt

Et le fichier csv exporté:

4-2 Automatisation du script

La difficulté avec Arch Linux, c'est que cron n'est pas intégré au système d'exploitation et qu'il faut installer et utiliser une solution tierce. J'ai donc installé cronie qui intègre anacrontab par la commande suivante: sudo pacman -S cronie

Une fois installé, il faut configurer la tâche automatisée ainsi dans anacrontab:

Pour une utilisation horaire du script, il faut faire appel au service dédié, intégré dans cronie.

5 - Scripts de fichiers d'échange:

1 - Synchronisation

Rclone a précédemment été ajouté au service du côté client, il faut désormais scripter son utilisation pour générer des dossiers de synchronisation:

#!/bin/bash

#mise a jour du système et de rclone
sudo pacman -Syu
sudo rclone selfupdate

#nommage du dossier unique et daté de synchronisation
suppli=$LOGNAME
day=$(date +%m-%d)
syncfd=(sync$day)

#création du dossier concerné ét sychronisation de celui-ci
rclone mkdir nextcloud:/$syncfd
rclone sync --ignore-errors --suffix COPY  /home/$suppli/Documents/ nextcloud:/$syncfd

exit 0
2 - Backup

6 - Ajout de certificat

6-1 Création du certificat auto-signé

Il a fallu ajouter le protocole SSL à Apache pour obtenir le certificat SSL et donc la capacité du site à fonctionner avec le protocole https. Le navigateur, après avertissement sur le risque du certificat permet l'utilisation de Nextcloud avec ce protocole:

6 - 2 Chiffrement et certificat "Lets Encrypt"

Après plusieures tentatives de modifcation de la résolution DNS du nom de domaine http://www.arestoin.sv sur le localhost (et aussi l'adresse du serveur), les modications ont entrainé des erreurs sur le serveur.

J'ai tenté à plusieurs reprises de réinitialiser la configuration mais rien ne semble fonctionner. Le dossier Webdav est également inaccessible.