Développer sur un serveur distant : quand sshfs montre ses limites
Généralement j'ai tout ce qu'il faut sur mon ordinateur "local" pour développer et voir le résultat de mes devs ... mais depuis quelques temps il m'arrive de devoir bosser sur un serveur distant alors je m'appuie sur sshfs pour faire un "montage" du dossier distant et coder avec mes outils classiques.
Le hic c'est si dans l'arborescence se trouve un dépôt git ... c'est le drame et beaucoup de développeurs se plaignent de cette situation. Voici donc "ma" solution
Pour rappel voici le problème rencontré:
- https://stackoverflow.com/questions/7245837/using-git-over-sshfs-is-too-slow
- https://www.reddit.com/r/archlinux/comments/biioa4/sshfs_to_mount_a_remote_directory_locally/
- https://serverfault.com/questions/470059/how-to-make-sshfs-vpn-git-a-tolerable-working-environment
Donc, au lieu de continuer à criser à chaque fois que j'ai le malheur de faire un ls dans le point de montage sshfs dans lequel se trouve un .git (vu que dans ce cas j'ai automatiquement des informations affichées sur mon shell concernant le dépôt) je me suis posé la question de savoir s'il ne serait pas possible de faire autrement.
Toutes les "solutions" que j'ai trouvé proposent de faire soit un montage NFS, soit de faire des git commit locaux puis les envoyer sur le serveur. Cette dernière piste n'est même pas envisageable dans mon cas : je ne vais pas faire un commit chaque fois que je "sauvegarde" un fichier et que je veux voir le résultat.
Mon idée est la suivante:
- je duplique l'aborescence distante sur mon pc, 46Mo le rsync se fait en quelques secondes, si je fais le rsync via le montage sshfs ça tourne de longues minutes avant que je stoppe tout, oublions donc sshfs dans le cas de milliers de petits fichiers
- une fois mon arborescence dupliquée en local il suffit de trouver une solution pour qu'à chaque modification hop ça soit répliqué sur le serveur distant
Posé comme ça la réponse saute aux yeux: tous les outils de synchro devraient pouvoir répondre à ce problème mais je cherche un truc sans rien à installer sur le serveur et qui soit léger/rapide à mettre en oeuvre pour finalement repenser à inotify et voici la solution
#!/bin/bash
#
LOCALDIR=/home/erics/dev/projet/local
REMOTE=serveur:/srv/webs/projet/htdocs/demo
cd ${LOCAL}
inotifywait -r -m -e close_write --format '%w%f' . | while read MODFILE
do
echo -n "${MODFILE} : "
rsync -a ${MODFILE} ${REMOTE}/${MODFILE}
if [ ${?} -eq 0 ]; then
echo "[ok]"
else
echo "[err]"
fi
done
Et c'est tout ... attention c'est de la synchronisation "one way" c'est à dire uniquement de votre pc local vers le serveur distant. Si un fichier apparaît sur le serveur il ne sera pas répliqué sur votre poste.