Openmediavault : Installation de Nextcloud

Étape importante pour mon nouveau NAS : installer Nextcloud avec un accès externe sécurisé afin de pouvoir y accéder hors de la maison.

Car en plus de fichiers classiques dont un Cloud offre la disponibilité, il y a une autre fonctionnalité que j’apprécie énormément : le téléchargement automatique des photos prises sur le smartphone, chose rendue possible par l’application cliente Nextcloud.

L’accès par internet était donc primordial. J’ai eu plus de mal que prévu, et pas forcément sur l’installation en elle-même (avec Docker et ses containers c’est plutôt bien fait), mais j’ai du faire face à des problèmes de réseau (NAT, DNS…) et le plus dur a été finalement de bien identifier les problèmes, puis de leur trouver une solution.

Mais bon, aujourd’hui tout fonctionne, et je vais pouvoir me débarrasser de mon NAS Synology, et ce sera sans aucun regret, je suis plutôt épaté par Openmediavault et par tout ce qu’il propose.

Je vais donc installer le triptyque Nextcloud-MariaDB-Swag. SWAG (Secure Web Application Gateway, qui s’appelait précédemment letsencrypt), inclut un webserver, un reverse-proxy, un client certbot pour la génération de certificats SSL, et enfin fail2ban pour prévenir les intrusions. Plutôt complet donc !

Pour cela, il faut définir un nom de domaine ; comme j’ai un domaine avec ce blog (pled.fr), et que mon hébergeur permet de se créer des enregistrements, j’ai procédé de cette manière.

Hélas, une fois l’installation terminée, il m’était impossible d’accéder à la page web de Nextcloud. D’où venait le problème : configuration ? NAT ? DNS ? J’ai pas mal galéré avant de trouver la solution.

Il s’agissait en fait d’un problème de NAT hairpinning : on ne peut pas communiquer entre deux machines sur le même réseau interne en utilisant les adresses externes. On verra comment régler ce problème.

Bref, voyons un peu tout cela de plus près, et comment tout a fini par tomber en marche… 😎

Préparation

Voilà ce que donne le schéma général : le reverse proxy et nextcloud tournent sur la même machine, mais cette vue permet de voir la redirection des ports 443 et 80 :

Première chose à faire : on passe l’interface d’administration d’OMV sur le port 8080 afin de libérer le port 80 :

Ensuite, une des premières questions à se poser est celle-ci : ma box dispose-t-elle d’une IP fixe ? Car les enregistrements DNS que l’on va créer vont pointer sur cette adresse, c’est donc très important.

Adresse IP

Orange à priori ne fournit pas d’adresse IP fixe aux particuliers ! Mais heureusement j’ai trouvé cette information :

Orange ne fournit pas d’adresse fixe pour ses contrats grand public. Mais :
  • Les liaisons Fibre et VDSL ont des adresses “presque fixe”. Elles ne changent que rarement.
  • Les liaisons ADSL (en voie de disparition) ont des adresses dynamiques.
  • L’utilisateur ne peut pas forcer une IP strictement fixe.
  • L’utilisateur peut forcer un changement d’IP depuis son espace client ou l’interface d’administration de sa box (forcer un redémarrage par logiciel)
De plus ce n’est pas nécessaire, même pour atteindre une machine ayant une fonction de “serveur” : disque NAS, caméra, imprimante, serveur web, etc… Il suffit de passer par l’utilisation d’un DNS dynamique.

Dans mon cas, étant en VDSL, je peux considérer que mon adresse IP ne changera que très rarement. Je peux donc me baser sur celle-ci pour définir mon domaine DNS.

Je ne souhaite pas utiliser de DNS dynamique : beaucoup de vidéos d’installation de Nextcloud sur OMV utilisent cette méthode (avec le service duckdns par exemple). Mais comme mon hébergeur me permet de créer mon propre sous-domaine, je voulais vraiment utiliser cette solution, c’est plus propre.

DNS

D’après ce que j’ai pu lire, il faut donc créer deux enregistrements: un enregistrement A qui pointe vers l’adresse IP de la box, puis un enregistrement CNAME qui pointe vers ce “A record” (qui est en fait un simple alias). Alors voilà ce que cela donne dans mon cas :

Type Nom Pointe vers
A xxx.pled.fr 1.2.3.4
Type Nom Alias de
CNAME nextcloud.xxx.pled.fr xxx.pled.fr

On peut vérifier facilement que la résolution du nom en adresse fonctionne avec la commande nslookup par exemple.

pascal$ nslookup nextcloud.xxx.pled.fr
Server:		127.0.0.53
Address:	127.0.0.53#53

Non-authoritative answer:
nextcloud.xxx.pled.fr	canonical name = xxx.pled.fr.
Name:	xxx.pled.fr
Address: 1.2.3.4

Box orange

On va rediriger les ports 443 et 80 vers 444 et 81. Il suffit d’aller sur la box, “Configuration réseau”, puis “Configuration avancée”, et enfin choisir l’onglet NAT/PAT. Ensuite, sélectionner les deux services concernés, et les faire pointer sur le périphérique ou tourne Openmediavault :

Voilà, tout est prêt, on peut maintenant installer Nextcloud.

Nextcloud – Mariadb – Swag

La première méthode que j’ai essayé est normalement la plus simple, à savoir utiliser “Stacks”, qui permet de tout installer en une seule fois.

Tout est expliqué sur cette vidéo de Techno Dad Life. Concernant la configuration et les paramètres, On trouve pas mal d’explications et d’exemples de configuration sur cette page, ou encore celle-ci.

Comme j’ai rencontré des problèmes de NAT, j’ai fini par tout installer container par container, mais la méthode “Stacks” est beaucoup plus simple et plus rapide ! C’est donc celle-là que je vais décrire.

Dans Portainer, le gestionnaire Docker d’Openmediavault (voir l’article sur Plex si nécessaire), on clique sur Stacks à gauche, puis sur le bouton “Add stack”. Il ne reste plus qu’à coller le contenu suivant qui définit les 3 containers que l’on souhaite installer.

---
version: "2"
services:
  nextcloud:
    image: linuxserver/nextcloud
    container_name: nextcloud
    environment:
      - PUID=997
      - PGID=100
      - TZ=Europe/Paris
    volumes:
      - /srv/dev-disk-by-label-DATA/AppData/Nextcloud/config:/config
      - /srv/dev-disk-by-label-DATA/Nextcloud/data:/data
    ports:
      - 443:443
    depends_on:
      - mariadb
    restart: unless-stopped
  mariadb:
    image: linuxserver/mariadb
    container_name: nextclouddb
    environment:
      - PUID=997
      - PGID=100
      - MYSQL_ROOT_PASSWORD=password
      - TZ=Europe/Paris
    volumes:
      - /srv/dev-disk-by-label-DATA/AppData/Nextclouddb:/config
    restart: unless-stopped
  swag:
    image: linuxserver/swag
    container_name: swag
    cap_add:
      - NET_ADMIN
    environment:
      - PUID=997
      - PGID=100
      - TZ=Europe/Paris
      - URL=xxx.pled.fr
      - SUBDOMAINS=nextcloud
      - VALIDATION=http
      - EMAIL=xxx@yyy.zz
    volumes:
      - /srv/dev-disk-by-label-DATA/AppData/swag:/config
    ports:
      - 444:443
      - 81:80
    restart: unless-stopped

Quelques remarques sur ce contenu :

  • Le PUID et le PGID du compte admin sont à identifier sur votre serveur, comme lors de l’installation de PLEX. Vous pouvez éventuellement créer un compte spécifique “nextcloud” pour cette installation, à vous de voir.
  • Pour le chemin d’accès aux volumes, j’ai d’abord créé via l’interface d’OMV les dossiers partagés AppData (utilisé pour la configuration des containers), et un répertoire Nextcloud qui sera utilisé par les utilisateurs de Nextcloud. Je peux ainsi accéder facilement à ce dernier avec un partage NFS (ou autre) si je le souhaite.
OMV-DATA est lui utilisé pour le partage NFS, les autres dossiers sont ceux utilisés par PLEX.

Ensuite, il faut se connecter en SSH pour créer les sous-dossiers “Nextcloud”, “Nextclouddb” et “swag” qui sont utilisés pour les dossiers “config” des applis, et les faire appartenir au compte admin (le compte utilisé par OMV).

pascal@odroidhc2:~$ cd /srv/dev-disk-by-label-DATA/AppData
pascal@odroidhc2:/srv/dev-disk-by-label-DATA/AppData$ sudo mkdir Nextcloud Nextclouddb swag
pascal@odroidhc2:/srv/dev-disk-by-label-DATA/AppData$ sudo chown -R admin Nextcloud Nextclouddb swag
pascal@odroidhc2:/srv/dev-disk-by-label-DATA/AppData$ ls -l
total 12
drwxrwsrwx+  9 admin users 4096 Nov 22 18:23 Nextcloud
drwxrwsrwx+  4 admin users 4096 Nov 23 14:59 Nextclouddb
drwxrwsrwx+ 12 admin users 4096 Nov 23 19:00 swag
  • En ce qui concerne les noms de domaine, j’ai donc utilisé mon enregistrement de type A pour le paramètre URL, et le sous-domaine “nextcloud” du CNAME pour le paramètre SUBDOMAINS. La validation est elle de type http.
  • Concernant le port pour swag, j’ai bien mappé le port 444 (ce que je vais recevoir du router de la box) vers le port 443 (celui sur lequel écoute l’instance Nextcloud).

Voilà, il ne reste plus qu’à cliquer sur “Deploy the stack” pour que tout s’exécute et s’installe. Cela prend un peu de temps, puisque les logiciels vont être téléchargés, puis installés et configurés.


Ce n’est pas complètement terminé, il reste à finaliser l’installation en modifiant quelques fichiers de configuration.

Swag : comme je souhaite utiliser un sous-domaine (nextcloud.xxx.pled.fr) et non pas un sous-dossier (xxx.pled.fr/nextcloud) pour accéder au serveur, il va falloir “activer” le fichier d’exemple :

cd /srv/dev-disk-by-label-DATA/AppData/swag/nginx/proxy-confs
cp nextcloud.subdomain.conf.sample nextcloud.subdomain.conf
sudo chown -R admin nextcloud.subdomain.conf

Nextcloud : il faut éditer et modifier/ajouter quelques paramètres dans le fichier /srv/dev-disk-by-label-DATA/AppData/Nextcloud/www/nextcloud/config/config.php : vérifiez que ceux listés ci-dessous existent et adaptez-les à votre configuration.

  'trusted_proxies' =>
  array (
    0 => 'swag',
  ),
  'trusted_domains' => 
  array (
    0 => '192.168.1.30:444',
    1 => 'nextcloud.xxx.pled.fr',
  ),
  'overwrite.cli.url' => 'https://nextcloud.xxx.pled.fr',
  'overwritehost' => 'nextcloud.xxx.pled.fr',
  'overwriteprotocol' => 'https',

il faut vérifier que tout démarre bien. Il faut se connecter en SSH sur la machine, et entre les commandes suivantes :

sudo docker restart swag
sudo docker restart nextcloud
sudo docker logs -f swag
sudo docker logs -f nextcloud

Pour swag, vérifier que vous voyez bien les messages suivants : “Congratulations! Your certificate and chain have been saved at…“. Pour swag et nextcloud, vous devez voir “[services.d] starting services” suivi de “[services.d] done” en fin de log. Si ces deux messages s’affichent, c’est plutôt bon signe.

Du côté de l’interface de Portainer, on doit voir les containers démarrés et actifs :

Voilà, on doit maintenant pouvoir afficher la page de première connexion de Nextcloud. C’est là que j’ai eu des problèmes avec mon histoire de NAT. J’y reviens tout de suite, mais terminons rapidement l’installation de Nextcloud :

Sur l’écran qui s’affiche ci-dessous (je n’ai pas fait de capture d’écran sur le moment… j’en ai donc récupéré d’autres sur le net), il suffit de remplir les champs correctement. J’ai également décoché l’installation des applications recommandées, je n’installerai que ce dont j’ai besoin au fur et à mesure.

J’ai pour ma part décoché “Install recommended apps”
  • Créer un compte admin (choisissez le nom que vous voulez, c’est celui qui aura les droits d’administration) et lui donner un mot de passe.
  • Pour la base de données, laisser “/data” pour le dossier de la DB, choisir MySQL/MariaDB, le “Database user” est “root”, le “Database password” est celui que l’on a mis dans le fichier de configuration “Stack” (MYSQL_ROOT_PASSWORD), idem pour le nom de la base de donnée (nextclouddb), et enfin on remplace localhost par “mariadb” (le nom du container en tant que nom DNS).

Comme indiqué sur ce second screenshot, on peut aussi préciser le numéro de port. Dans mon cas, comme j’ai fait l’installation container par container, j’avais défini un port pour mariadb (3306, le port par défaut), j’ai donc remplacé” “localhost” par mon adresse IP locale suivie du numéro de port (soit 192.168.1.30:3306).

Voilà, cliquer sur les quelques écrans de présentation qui suivent, et Nextcloud est installé et prêt à fonctionner !

L’écran d’accueil de Nextcloud !

NAT hairpinning

Revenons donc au problème qui m’a occupé bien des heures. Non pas qu’il soit compliqué à résoudre, mais j’ai mis un certain temps à comprendre ce qui se passait.

Donc lorsque je voulais afficher la page https://nextcloud.xxx.pled.fr pour finaliser l’installation de Nextcloud, je partais en timeout :

J’avais tout vérifié : les ports ouverts avec nmap, les noms de domaine avec nslookup, tout semblait correct. J’ai fini par réinstaller tous les containers un par un, pour chaque fois arriver au même résultat. Et puis j’ai eu l’idée de prendre mon smartphone, de couper le wifi, et de tester l’URL de Nextcloud en passant donc par le réseau GSM : et là, ça marchait !! 😛

Restait à comprendre le problème, et là c’est un type sur Discord (en bas de la page de Swag setup, il y a une invitation pour rejoindre le groupe) avec qui j’avais vérifié ma config swag quand je pensais que c’était peut-être la cause du problème, qui m’a parlé de ce désormais fameux “NAT hairpinning” !

Alors qu’est-ce qui se passe ? quand on envoie un message TCP sur le réseau, il y a une adresse destination et une adresse source : quand je suis sur mon PC, l’adresse source est donc mon adresse locale (192.168.x.y). Le message par vers la destination (le nom DNS du serveur Nextcloud), soit une fois le nom DNS résolu en adresse IP, l’adresse de ma box. Et la box, voyant un message TCP arriver de l’extérieur avec une adresse source ET destination locale… eh bien bloque tout simplement ce message le message : c’est apparemment une limitation du protocole NAT. Voilà ce qu’explique la page wikipedia sur le sujet :

le hairpinning décrit une communication entre deux machines placées derrière le même routeur NAT qui utilisent l’adresse IP de leurs points de sorties pour communiquer. Tous les mécanismes de NAT ne supportent pas cette configuration de communication.

Et donc soit vous avez un router évolué qui permet de définir une règle pour éviter ce problème (ce qui n’est pas le cas du router de box Orange), soit le plus simple est d’utiliser un serveur DNS local.

Or il se trouve que j’ai installé il y a peu un serveur Pihole sur mon Raspberry. J’avais fait ça pour le fun (ou presque), mais finalement cela va m’être très utile, puisque Pihole fait office de serveur DNS. Il me suffit alors de définir deux entrées pour mes deux enregistrements DNS :

Et voilà ! Après un rechargement de la page, Nextcloud s’affiche enfin correctement dans le PC et je peux finaliser l’installation ! 😎

Pour être complet, j’ai bien entendu eu le même problème avec le smartphone et l’application android Nextcloud. Sauf que là, quand j’ai voulu passer ma connexion wifi en mode “statique” (au lieu de DHCP) afin de définir mon propre DNS, cela ne fonctionnait toujours pas. Je n’ai pas creusé plus que ça, j’ai installé Blokada, ajouté mon propre DNS avec mon serveur Pihole en primaire, et celui de Google en secondaire, pour quand je suis en extérieur. Ça a l’air de bien fonctionner comme ça.

Conclusion

Cette installation n’aura pas été facile. Elle aurait pu l’être sans ce problème de NAT, qui m’a bien pris la tête. Comme toujours, à force de réinstaller, de tester, regarder les logs de docker, j’ai appris plein de choses (comme des commandes ‘docker’). C’est donc bénéfique globalement.

Et maintenant, j’ai un Nextcloud dernière version qui tourne sur une machine suffisamment puissante. Contrairement à ma baie Synology qui manque singulièrement de puissance CPU, et sur laquelle installer Nextcloud est une plaie.

C’est d’ailleurs la raison principale de ce changement de NAS : passer sur un système open-source, afin d’avoir un choix plus vaste de logiciels.

Il me reste maintenant à penser à la sauvegarde de tout ça (car je n’ai plus de RAID sur mon Odroid-HC2 !). Et puis ce sera le tour d’un client Open VPN, chose que je ne pouvais tout simplement pas installer sur la baie Synology.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *