Ini

Il y a quelques années, j'avais déployé owncloud sur mon hébergement web. Avec le temps, le volume de fichiers se faisant assez conséquent, l'espace alloué à mon usage est arrivé à saturation.
J'avais basculé sur un système de backup local sur un hdd réseau via un logiciel de synchro. Solution fonctionnelle, mais moins confortable que ce que j'avais connu avec owncloud, qui me permettait de sync partout et de manière transparente.

Pour retrouver ce confort je souhaite déployer un truc façon owncloud qui soit accessible au minimum sur mon réseau local. Et ce truc, c'est Nextcloud.

Comme j'aime me prendre la tête et trouver la solution la plus complexe possible à un problème simple, je me suis imposé des handicaps :

Manjaro

Coup de bol, les raspberry pi 4 b sont enfin bootables sur périphériques usb. Manque de bol, l'image Manjaro Architect n'était pas du tout à jour et donc pas compatible pour le boot depuis un périphérique usb.

La solution : créer une carte micro sd avec l'image XFCE la plus récente et la mettre à jour. Après avoir testé qu'elle démarrait bien en la glissant dans un lecteur de carte branché au raspi, j'ai créé un backup de la carte. Backup qui a été restauré sur un disque dur usb. Avant d'aller plus loin, j'ai redimensionné la partition root, créé une partition home et une data en ext4. Après avoir boot sur le hdd avec succès, j'ai modifié le fstab pour ajouter les deux partitions proprement.

Apache et PostgreSQL sous Docker

Pour docker, un petit coup de pacman et il était installé. Le plus dur, ça a été la prise en main de cet outil.

Après d'innombrables tentatives, j'ai fini par comprendre comment créer des containers pour postgresql et pour apache2 qui héberge nextcloud et configurer le stockage de données. Avec apache et php configurés pour permettre le transfert de gros fichiers et avec un accès chiffré via https et l'exécution du cron.php toutes les 5min.

La solution adoptée pour le cron, employer le cron de l'hôte manjaro pour demander à docker d'exécuter la commandé dans le bon container avec le bon utilisateur.

Sur l'hôte, un petit coup de crontab -e pour y ajouter une ligne du genre:

*/5 * * * * docker exec -u www-data php -f /var/www/html/cron.php

Dans le container, pour apache et php, il a fallu augmenter la taille max d'upload, de post et la limite de mémoire. J'ai juste eu à ajouter un fichier .ini contenant ça dans le dossier conf.d de php et zou !

nano /usr/local/etc/php/conf.d/nextcloud.ini

Et y mettre :

upload_max_filesize = [VALEUR]M
post_max_size = [VALEUR]M
memory_limit = [VALEUR]M

L'accès https m'a donné du fil à retordre, mais après quelques commandes et éditions de fichiers, c'était plié.
Il a fallu générer la clef SSL, puis la renseigner dans la config. ( C'est la version courte, il m'a fallu trois jour pour me documenter et ne plus que ça déconne lol)

a2enmod ssl
a2ensite default-ssl
mkdir /etc/apache2/ssl
openssl req -x509 -nodes -days 1095 -newkey rsa:2048 -out /etc/apache2/ssl/server.crt -keyout /etc/apache2/ssl/server.key

Active le ssl dans apache, crée le fichier de config pour l'accès en https, crée un dossier pour stocker la clé SSL, génère la clé.

nano /etc/apache2/sites-enabled/default-ssl.conf

Pour y modifier les lignes comme suit :

SSLCertificateFile      /etc/apache2/ssl/server.crt
SSLCertificateKeyFile   /etc/apache2/ssl/server.key

Et enfin

service apache2 reload

Qui relance apache avec ses nouveaux paramètres. Si j'ai oublié un truc, c'est à ce moment qu'il va gueuler xD

 

De manière à simplifier certaines manip, j'ai déployé un container de portainer. Je ne crache jamais sur une interface graphique qui permet de voir les infos direct, là où je mettrais un temps fou à retrouver la bonne commande.

Et finalement, j'ai forcé le raspberry à démarrer sur la console au lieu de l'interface graphique XFCE.

sudo systemctl set-default multi-user.target

Ça libère de la RAM et du CPU, même si ce raspberry ne manque ni de l'un ni de l'autre, vu que c'est un 4b équipé de 4Go de RAM.
Avec les trois containers actifs (nextcloud, postgresql et portainer) moins de 600Mo de RAM sont utilisés. Ca pourrait évidemment changer si j'ai plus d'utilisateurs.

Petite surprise

Suite à une coupure de courant, le serveur renvoyait systématiquement une erreur. Après fouille des logs, il s'avère que la base de données est impossible à atteindre.

Découverte : Docker attribue les adresses IP dans l'ordre de démarrage des containers... J'ai fini par comprendre comment forcer l'adresse IP sur un container en créant un nouveau réseau virtuel dans Docker.

 

Accès universel

Après longue réflexion, j'ai décidé de prendre le risque d'exposer le serveur nextcloud à la jungle hostile d'internet. La freebox permettant d'utiliser un service de type no-ip, il m'a suffit de renseigner un compte et de rediriger les ports adéquats vers nextcloud. Si j'avais été chez OVH, j'aurais pu rediriger un sous-domaine de reflexd.com vers mon serveur local...
Mais je n'y suis pas! Le jour où on sera raccordés à la fibre, je migrerai mes sites sur un serveur local, il faudra envisager de migrer le nom de domaine chez OVH pour profiter de leur service de redirection vers IP dynamique.

 

Hostname resolver

Derniers ajustements en date, je me suis retrouvé le nez dedans en essayant de joindre mon serveur depuis un ordinateur sous linux. Ca passe via l'adresse IP, mais contrairement à mes pc sous windows, impossible de le joindre en utilisant directement le nom d'hôte. Et pourtant, sur la même machine, j'arrive bien à joindre le serveur domotique en utilisant son hostname suivi de .local.

Après contrôle de la config réseau etc. je me suis rendu compte que les services AVAHI Zeroconf n'étaient ni installés ni activés. Pacman faisant son oeuvre, problème résolu, je passe le daemon à "enable" dans systemctl et ensuite je le start.

Retour sur le PC sous Manjaro petit ping de contrôle sur [hostname serveur nextcloud].local et .... parfait, ça répond ! Problème résolu :D