Tailscale et les IP fantômes

Tailscale est un formidable outil pour se constituer son propre réseau de machines reliées par un VPN auquel ces machines se connectent de manière sécurisées.

Un de ses défauts réside dans le fait que son processus d’authentification inclut la création d’une clé calculée pour chaque machine, mais que cette clé est maintenue en place lorsqu’on clone la machine, par exemple en restaurant ses données sur une autre machine via l’outil de restauration d’Apple. Il en résulte alors que les deux machines partagent la même IP sur le VPN, ce qui fait qu’une seule peut réellement s’y connecter à la fois.

La procédure pour y remédier est tout sauf simple, ce qui est bien dommage. Voici celle que j’ai suivie avec succès en pareil cas :

  • Etape 1 : déconnecter et quitter l’application Tailscale sur les deux machines
  • Etape 2 : supprimer l’application Tailscale sur l’une des deux machines
  • Etape 3 : sur la même machine que précédemment, taper les commandes suivantes :
sudo rm -rf ~/Library/Application Scripts/io.tailscale.ipn.macsys
sudo rm -rf ~/Library/Application Scripts/io.tailscale.ipn.macsys.login-item-helper
sudo rm -rf ~/Library/Application Scripts/io.tailscale.ipn.macsys.share-extension
sudo rm -rf ~/Library/Caches/io.tailscale.ipn.macsys
sudo rm -rf ~/Library/Containers/io.tailscale.ipn.macsys
sudo rm -rf ~/Library/Containers/io.tailscale.ipn.macsys.login-item-helper
sudo rm -rf ~/Library/Containers/io.tailscale.ipn.macsys.share-extension
sudo rm -rf ~/Library/Containers/Tailscale
sudo rm -rf ~/Library/Group Containers/*.io.tailscale.ipn.macsys
sudo rm -rf ~/Library/HTTPStorages/io.tailscale.ipn.macsys
sudo rm -rf ~/Library/Preferences/io.tailscale.ipn.macsys.plist
sudo rm -rf /Library/Tailscale
  • Etape 4 : toujours sur la même machine, ouvrir l’application « Trousseaux d’accès » et supprimer toutes les entrées contenant « tailscale »
  • Etape 5 : relancer l’application et se connecter sur les deux machines l’une après l’autre

Les deux machines devraient normalement disposer d’une adresse IP différente au sein du réseau Tailscale après ça.

Nextcloud AIO → Docker : journal d’une migration

Nextcloud All-In-One (alias « AIO ») est une version packagée de Nextcloud en version Docker, permettant essentiellement de déployer cette application facilement avec des modules permettant d’optimiser ses performances en cas de montée en charge d’utilisation, notamment avec des modules comme PostgreSQL, Redis et Imaginary. Ces différents conteneurs sont automatiquement générés, configurés, mis à jour, démarrés, arrêtés et sauvegardés en fonction de ce que fait l’utilisateur, qui n’a dès lors qu’à faire un minimum de clics pour gérer l’ensemble.

Il s’agit d’un bon outil si on n’a pas envie de s’embêter à composer son conteneur et ce qui tourne autour, et il faut reconnaître que ça fonctionne plutôt bien. Cela dit, comme toutes les solutions packagées, celle-ci porte en elle l’inconvénient d’occulter la complexité inhérente de l’ensemble, et donc de dégager une fausse impression de simplicité, qui peut finir par se payer au prix fort le jour où survient un dysfonctionnement. D’autre part, et là il s’agit beaucoup plus d’un choix de ses concepteurs qu’autre chose : la montée en version des conteneurs est rendue obligatoire à partir du moment où on les arrête et où une mise à jour est disponible.

C’est pour ces deux raisons que j’ai décidé, sur mon NAS Synology, de basculer vers une version Docker plus classique, appuyée par les modules suivants :

  • PostgreSQL
  • Redis
  • Imaginary

J’ai ainsi utilisé la fonction « docker-compose » en lui donnant le fichier suivant :

version: '3.8'

services:
  db:
    image: postgres:17-alpine
    container_name: nextcloud-db
    volumes:
      - /volume1/docker/nextcloud/db:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=nextcloud_db
      - POSTGRES_USER=nextcloud_user
      - POSTGRES_PASSWORD=UN_MOT_DE_PASSE
    restart: unless-stopped

  redis:
    image: redis:7-alpine
    container_name: nextcloud-redis
    restart: unless-stopped

  app:
    image: nextcloud:31
    container_name: nextcloud-app
    ports:
      - "XXXX:80"
    volumes:
      - /volume1/docker/nextcloud/data:/var/www/html/data/
      - /volume1/docker/nextcloud/config:/var/www/html/config/
      - /volume1/docker/nextcloud/custom_apps:/var/www/html/custom_apps/
      - /volume1/docker/nextcloud/themes:/var/www/html/themes/
    environment:
      - POSTGRES_HOST=db
      - POSTGRES_DB=nextcloud_db
      - POSTGRES_USER=nextcloud_user
      - POSTGRES_PASSWORD=rwbgdo2njrg2A5y7vqGZ
      - REDIS_HOST=redis
      - NEXTCLOUD_ADMIN_USER=admin
      - NEXTCLOUD_ADMIN_PASSWORD=UN_LONG_MOT_DE_PASSE
      - NEXTCLOUD_TRUSTED_DOMAINS=cloud.mondomaine.com
      - PREVIEW_IMAGINARY_URL=http://imaginary:9000
    depends_on:
      - db
      - redis
    restart: unless-stopped

Une chose à savoir concernant les volumes montées par Nextcloud et PostgreSQL : les dossiers correspondants ont besoin de de droits et d’autorisations bien spécifiques. J’ai mis au point un script qui permet de créer ces dossiers avec les bons propriétaires et les droits correspondants :

  • rm -rf config custom_apps data db themes
  • mkdir config custom_apps data db themes
  • chown 33:33 config custom_apps data db themes
  • chmod 750 config custom_apps data db themes

Une fois ces dossiers créés, on peut procéder à la création des conteneurs et à leur lancement : « docker compose up -d », et on peut dès lors s’y connecter (après avoir fait le bon réglage dans son reverse-proxy), en utilisant l’URL : https://cloud.mondomaine.com

Concernant la migration des données de l’ancienne instance, c’est un peu plus compliqué. Il y a deux points essentiels : la base de données et les fichiers des utilisateurs.

Partie base de données

Le schéma n’est pas très compliqué mais implique plusieurs manipulations : dumper la base existante, puis la ré-importer dans une base toute neuve créée au moment du premier démarrage du conteneur nextcoud-db. Ensuite, il faut s’assurer que le user créé pour la nouvelle base (« nextcloud_user ») dispose bien des droits pour accéder à cette base et la modifier :

  • docker exec -t nextcloud-aio-database pg_dump -U oc_nextcloud nextcloud_database > /volume1/docker/nextcloud/db.sql
  • docker exec -it nextcloud-db psql -U nextcloud_user -d postgres -c "DROP DATABASE IF EXISTS nextcloud_db;"
  • docker exec -it nextcloud-db psql -U nextcloud_user -d postgres -c "CREATE DATABASE nextcloud_db;"
  • docker exec -it nextcloud-db psql -U nextcloud_user -d nextcloud_db -c "\du"
  • sed -i 's/OWNER TO oc_nextcloud/OWNER TO nextcloud_user/g' /volume1/docker/nextcloud/db.sql
  • cat /volume1/docker/nextcloud/db.sql | docker exec -i nextcloud-db psql -U nextcloud_user nextcloud_db
  • docker exec -it nextcloud-db psql -U nextcloud_user -d nextcloud_db
    --> GRANT ALL PRIVILEGES ON SCHEMA public TO nextcloud_user;
    --> GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO nextcloud_user;
    --> GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO nextcloud_user;-

Partie fichiers des utilisateurs

Là aussi, pas de grande difficulté : on copie le dossier « data » de la précédente installation vers celui de la nouvelle. Il faut juste ensuite faire un « cc files:scan --all » qui permet de scanner tous les fichiers dudit dossier et s’assurer qu’il est bien connu dans la base de données afin d’être affiché correctement dans Nextcloud et pris en compte lors des opérations de synchronisation de fichiers :

  • cp -r -p DataDir/ /volume1/docker/nextcloud/
  • mv /volume1/docker/nextcloud/DataDir /volume1/docker/nextcloud/data
  • docker exec -u www-data nextcloud-app php occ files:scan --all

Derniers réglages

Une fois la DB en place et les fichiers utilisateurs récupérés, le plus gros du travail est fait, et on passe à la dernière phase de la migration. On peut normalement se connecter en utilisant le compte « admin » avec le mot de passe <UN_LONG_MOT_DE_PASSE> pour vérifier que ça fonctionne. Les autres utilisateurs doivent également pouvoir se reconnecter et retrouver toutes les données. A noter que s’ils utilisent une appli « desktop » (synchro de fichier sur Mac/PC), elle ne se reconnectera pas automatiquement, et il faudra forcer une reconnexion. Idéalement, il faudrait déconnecter ces applis avant la migration pour faire plus propre.

Il faut aussi veiller à ce que le contenu du dossier « custom_apps » de l’ancienne installation soit bien copié dans le nouveau, sinon les applications installées via l’app store ne fonctionneront pas alors même qu’elles seront marquées comme « enabled », auquel cas il faudra les désactiver et les réinstaller (leurs réglages doivent normalement être conservés).

Synchrnonisation iPhone pour « nom de fichier dupliqué »

J’ai commencé à avoir une erreur au moment de la synchronisation des fichiers entre mon Mac et mon iPhone (c’est à dire après la sauvegarde), avec le message suivant :

L'iPhone XXXXX ne peut pas être synchronisé. Un nom de fichier dupliqué a été spécifié.

Après analyse, il s’avère qu’en réalité j’avais délocalisé le dossier « iPod Photo Cache » (qui contient les conversions des photos à synchroniser au format de l’appareil) vers un autre volume, via un lien symbolique. Ce lien ne fonctionnait plus suite à un changement de disque, ce qui empêchait la synchronisation de se faire correctement.

Après avoir recréé le lien (commande « ln -ls »), la synchronisation se passe à nouveau normalement.

Windows 11 et l’icône du dossier utilisateur

Il peut arriver que l’icône du dossier « Utilisateur » sur le bureau de Windows 11 ne s’affiche pas correctement : taille trop petite, mauvaises couleurs… Il s’agit d’un problème de cache d’icônes qui nécessite un peu de nettoyage. Pour cela, on ouvre une fenêtre de commandes :

> taskkill /IM explorer.exe /F
> cd C:\Users\celeri\AppData\Local\Microsoft\Windows\Explorer
> del iconcache_*
> del thumbcache_*
> explorer

Le dossier devrait normalement retrouver son icône.

Imprimantes Canon et macOS

Sur les systèmes macOS récents (à partir de la version 11 semble-t-il), il est posssible qu’une imprimante Canon Pixma en réseau ne puisse plus scanner : sur l’appli Transfert d’Images d’Apple, on obtient une erreur -21345.

Une manière d’y remédier est de désactiver le protocole IPv6 sur l’imprimante. Pour cela, il faut dans le menu de configuration de celle-ci et suivre le chemin suivant :

  • Paramètres du périphérique → Paramètres réseau → Wi-Fi → Avancés → Paramètres TCP/IP → IPv6 → Activer/désactiver IPv6

Bitwarden et Safari

Bitwarden possède une extension pour la plupart des navigateurs web, mais la seule qui pose problème et celle de Safari : parfois, sans prévenir, l’icône de Bitwarden disparaît de la barre de la toolbar, et il est impossible de la réactiver, car l’extension est absente de la liste dans les préférences.

Comme ce problème continue à se manifester malgré les mises à jour de l’appli, il faut de temps en temps utiliser cette commande pour la réactiver (après avoir quitté Safari) :

  • /System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -f -R /Applications/Safari.app

En relançant Safari, l’icône de Bitwarden devrait directement réapparaître dans la toolbar, ou sinon c’est qu’il faut activer l’extension dans les préférences.

Syno : certificats pour un routeur ET un NAS

Etant donné que la création d’un certificat chez Let’s Encrypt nécessite l’ouverture des ports 80 et 443 sur l’adresse IP du domaine à sécurisé, il n’est pas possible d’enregistrer deux équipements sur le même nom de domaine. En théorie, c’est donc le routeur OU le NAS qui peuvent ainsi obtenir un certificat, mais pas les deux.

Une astuce permet malgré tout de contourner ce problème : dans la fenêtre de gestion des certificats du NAS (Panneau de Configuration / Sécurité / Certificats), il suffit de faire un clic-droit sur le certificat existant et de cliquer sur « Exporter le certificat ». On obtient ainsi 3 fichiers (cert.pem, chain.pem, privkey.pem) que l’on peut alors importer dans le routeur (Panneau de configuration / Services / Certificat).

Après quelquess secondes de redémarrage du serveur web du routeur, la sécurisation SSL est alors en place.

Attention : cette opération doit être réalisée après chaque renouvellement du certificat d’origine, donc tous les 90 jours !

NextCloud : purger les anciens tokens

Le système d’authentification des utilisateurs de NextCloud se base sur des tokens par device (et par navigateur), ce qui fait que si on accède à son compte avec de multiples appareils, cela remplit la base de données en conséquence. Et comme parfois dans ce cas, une application ou un script buggé peut causer la prolifération de ces tokens, ce qui risque de ralentir le serveur, voire carrément de le bloquer.

Voici comment purger les tokens qui n’ont pas été utilisés depuis plus de 30 jours. Le mieux est de se connecter en mode console sur le serveur MariaDB (via l’interface Docker ou Portainer) :

  • mysql -u root -pXXXXXXX
  • show databases ;
  • connect nextcloud_db ;
  • DELETE FROM oc_authtoken WHERE last_activity<=UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 day));

Synology & DDNS : instances multiples

DSM intègre une rubrique « DDNS » bien pratique car elle propose un client capable de mettre à jour des pointeurs d’adresses IP dynamique chez de nombreux hébergeurs. Cela dit, une limitation assez grotesque existe : le système refuse de créer deux instances pour un même fournisseur ! Or, quand on y réfléchit, les cas de ce genre sont assez courants, car il suffit notamment d’avoir deux noms de domaine différents chez le même hébergeur, par exemple…

Heureusement une bidouille simple permet de contourner cette limitation purement artibitraire : il suffit pour cela d’éditer le fichier « /etc/ddns.conf » et d’y copier le paragraphe d’une instance existante en y modifiant les paramètres différents, et le tour est joué.

Et le fin du fin, c’est que quand on retourne dans l’interface de gestion, la nouvelle ligne est alors affichée… et modifiable à loisir !