PROJET AUTOBLOG


Le blog de Seboss666

Site original : Le blog de Seboss666

⇐ retour index

Utiliser Lsyncd pour synchroniser deux dossiers

mercredi 6 septembre 2017 à 18:30

J’ai vaguement évoqué ce petit logiciel lors de mon billet de réflexion sur le passage à plusieurs serveurs pour un hébergement de site web. Sachant que j’ai eu l’occasion de revenir dessus récemment, je me suis dit qu’il était pertinent de ne pas passer par une simple astuce diverse et donc de lui consacrer un billet dédié.

Lsyncd est un service qui tourne en arrière plan, et lance au besoin une synchronisation entre deux dossiers, qui peuvent se trouver sur la même machine ou, dans le cas qui m’intéresse le plus, deux machines différentes.

C’est une solution fréquemment proposée lorsqu’il s’agit de synchroniser deux serveurs qui hébergent un Drupal, mais la solution est valable pour pratiquement tout type d’application. En effet, si vous avez deux serveurs qui doivent délivrer le même site web, il est absolument nécessaire que leur contenu soit identique. Et ici, l’idée est de se passer de NFS pour limiter les appels lents via le réseau.

Pourquoi le préférer à une solution classique type rsync via une tâche planifiée ? Ben déjà une tâche planifiée c’est toutes les minutes, et il faut ruser pour réduire ce délai. Vous pouvez donc très souvent avoir des contenus différents entre vos machines, ce qui est dommageable (images qui ne s’affichent pas, cache d’agrégation JS/CSS différent…). Ici, lsyncd va travailler avec inotify, que j’ai déjà pu évoquer dans un lien en vrac pour le coup, qui est un mécanisme qui permet de déclencher un évènement en fonction d’une modification du système de fichier. Donc ici dès qu’on change quelque chose, il déclenche le rsync.

Si j’ai travaillé sur des ressources intégralement en anglais au boulot, j’ai découvert par la suite que certains francophones en ont parlé. Pour une utilisation basique, je vais donc éviter de faire de la redite et vous conseiller cet article qui parle de son utilisation sous Debian.

Et si on veut que les deux serveurs communiquent entre eux, il suffit de faire la même configuration en changeant la destination en fonction du serveur. Une cross-synchronisation qui marche pas mal dans mon cas, et que j’ai donc voulu réutiliser lorsqu’on a demandé à ajouter un nouveau site destiné, à terme, à remplacer l’actuel (« vieux » Drupal 7 coincé avec du PHP 5.4, pour un nouveau Drupal 8 avec PHP 7.0).

Si l’on suit la documentation, on découvre pas mal de possibilités d’options qui permettent d’adapter le fonctionnement à notre environnement. Malgré tout, dans mon cas, et ce qui me pousse à écrire aujourd’hui, elle ne donne pas toutes les clés.

Surveiller plusieurs dossiers, pas si intuitif

C’est dans une issue Github que j’ai trouvé la piste pour la solution qui me convient, ce n’est pas inscrit dans la documentation, si ça se trouve les drogués au LUA trouveront ça très logique.

Voilà le fichier que j’avais :

----
-- User configuration file for lsyncd.
--
settings {
        logfile = "/home/logs/lsyncd/lsyncd.log",
        statusFile = "/home/logs/lsyncd/lsyncd-status.log",
        statusInterval = 1,
        insist = true
}

sync {
        default.rsync,
        delay=0,
        source="/home/sites_web/client/www1",
        target="2.2.2.2:/home/sites_web/client/www1",
        rsync = {
                archive = true,
                perms = true,
                owner = true,
                rsh = "/usr/bin/ssh -p 22 -o StrictHostKeyChecking=no",
                _extra = {"-a"}
        }
}

C’est bien, mais ça ne fonctionne que pour un seul dossier (et ses sous-dossiers évidemment), je ne vais pas trop m’étendre sur le sujet, je vous laisse chercher les options qui vous paraissent obscures. Ce qui m’intéresse surtout c’est la méthode pour passer à plusieurs dossiers, puisqu’on ne peut pas définir plusieurs sources et plusieurs destinations.

J’en suis arrivé à utiliser la configuration suivante :

----
-- User configuration file for lsyncd.
--
settings {
        logfile = "/home/logs/lsyncd/lsyncd.log",
        statusFile = "/home/logs/lsyncd/lsyncd-status.log",
        statusInterval = 1,
        insist = true
}

source_list = { 
        "/home/sites_web/client/www1",
        "/home/sites_web/client/www2",
 }

        
for _, source in ipairs( source_list ) do

sync {
default.rsync,
        delay=0,
        source=source,
        target="2.2.2.2:" .. source,
        rsync = {
                archive = true,
                perms = true,
                owner = true,
                rsh = "/usr/bin/ssh -p 22 -o StrictHostKeyChecking=no",
                _extra = {"-a"}
        }
}
end

Qu’est-ce qui change ? J’ai créé une liste de sources, la destination étant identique d’un point de vue de l’arborescence et il n’y a qu’un seul serveur. Et ensuite je fais une boucle sur ces sources, et j’applique la même configuration d’origine avec comme seule modification le target, qui contient une concaténation de l’IP du serveur cible et de la variable source (et la syntaxe de cette concaténation n’est pas triviale).

Quand j’ai dit que c’était pas intuitif, c’est que je me suis planté sur la création de la liste, et quand on lit la définition de la boucle for, pour moi « _, source » n’est pas quelque chose d’évident.

Enfin bref, ça fonctionne, j’ai pu réappliquer sur mes deux fronts pour que ça soit identique, ça l’est, c’est cool 🙂

 

Un mois d’Août pas reposant

dimanche 3 septembre 2017 à 10:30

Hello les gens, nouveau mois, nouveau bilan de santé, en ce mois de vacances pour la grande majorité des cas, mais pas du mien (c’est un choix ceci dit, ma priorité est ailleurs). Il y a du mieux, du moins bien, du logique, bref, la vie quoi.

Visites toujours en berne, mais…

On est toujours sur une pente descendante sur les visites enregistrées par Piwik, La fin des vacances et les publications fréquentes se font sentir, mais le pic de descente est vraiment marquant depuis l’ajout du filtre de EasyList sur l’image. Couplé avec le mois d’août, j’arrive même pas à être choqué.

Malgré tout, j’ai réussi à retrouver un rythme de publication un peu plus soutenu que ces derniers mois, j’ai même fait un petit graphique 🙂

Pierre m’a aussi relancé sur Goaccess, je serai peut-être motivé, bientôt…

Technique : toujours pas migré, mais…

Je n’ai pas fait grand chose en effet. Si j’ai fait un clean au niveau Redis récemment, le plus gros changement finalement est un petit réglage de MariaDB issu de mes derniers apprentissages sur le SGBD (plusieurs cas de soucis de performances chez des clients qui m’ont poussé à me muscler) : innodb_flush_log_at_trx_commit, passé à 2 au lieu de 1. C’est simple, tout est instantané ou presque. Le plus gros apport est au niveau de Piwik, la génération de rapports est instantanée.

Soit j’écrirai un article sur tout ce que j’ai appris de MySQL ces derniers mois, soit je vous trouverai des ressources francophones déjà partagées par d’autres (j’espère que ça sera facile et relativement complet, parce que pour l’instant c’est majoritairement de l’anglais).

J’ai également ajouté une fonction au thème enfant, pour retarder l’exécution du Javascript (defer en anglais), en me basant sur cet article en anglais. Globalement ça semble fonctionner comme il faut, je vous laisse juger et n’hésitez pas à me remonter s’il y a un pépin.

Futur : toujours flou mais…

Sur un autre plan, j’ai commencé à tester Qwant depuis quelques semaines en remplacement de Duckduckgo (je l’ai peut-être déjà dit d’ailleurs). Le test semble très concluant, il est possible que j’en fasse également un retour. J’ai toujours dans les cartons une vidéo sur Stylish, que je vais devoir reconsidérer : en effet, l’extension ne sera pas mise à jour pour Firefox 57 qui casse tout pour mieux reconstruire. Mais il y a un remplaçant, il faudra que je teste un peu. J’en ai d’ailleurs parlé la semaine dernière.

Je commence également à envisager de changer de thème pour le blog. J’essaie encore de me décider sur ce que j’en attend, parce que celui-ci me convient déjà très bien. Mais techniquement en dessous un petit refresh ne ferait pas de mal. J’avoue que c’est pas pour tout de suite, il me faut déjà mon environnement de test.

Quelques liens en vrac et en français, 22° édition

mercredi 30 août 2017 à 18:30

Le mois d’Aout est déjà bientôt terminé, et avec le temps pourri, pas question de perdre son temps au soleil. Qu’à cela ne tienne, à défaut de terminer mes propres articles plus ou moins bien écrits, voici les « productions » françaises que j’ai pu lire dernièrement qui je pense valent le coup d’être lues et partagées.

Une brève histoire des hackers

Hacker, en voilà un terme compliqué à définir, d’autant plus qu’il a été torturé et mal utilisé sous couvert de sensationnalisme. Et pour en comprendre un peu les origines, afin de se réapproprier le terme dans ce qui se rapproche le plus de la vérité, il faut repartir à ses origines.

Qu’est devenu la million dollar homepage ?

Symbole de la fabrication du web gratuit au début des années 2000, la million dollar homepage part d’un concept simple : 1 million de pixels, 1 dollar par pixel, pour afficher de la publicité. Ce projet un peu moribond mais toujours en ligne est aussi un témoignage de ce qui était déjà une sacrée agression visuelle (remember la raison que j’évoque à propos de mon usage d’un bloqueur de publicités).

Comment détecter un mail de hameçonnage/phishing ?

Quand on a pas mal d’années au compteur en matière d’utilisation du mail et du web, on voit venir les arnaques à des kilomètres. Mais pour les gens moins avertis, ce n’est pas toujours évident, et bien qu’il soit sponsorisé, cet article est tout à fait pertinent dans sont role d’éducation et de sensibilisation à la pratique pour s’en prémunir.

Boite noire auto, repérer les bons et les mauvais conducteurs ?

Puisque tout le monde veut surveiller la population pour en tirer un bénéfice, les assureurs automobiles ont réussi leur lobbying pour imposer des boites noires officielles dans les véhicules (en dehors des données déjà collectées par les ordinateurs de bord qui ne sont pas normalisées, mais déjà parfois exploitées à des fins douteuses par les constructeurs). La raison officielle est toujours la même, réduire votre facture si vous êtes un « gentil ». au final vous paierez plus cher, la nature du paiement sera juste différente.

MySQL, mysqldump et PHP : convertir de latin1 vers UTF8

Une fois n’est pas coutume, c’est le petit nouveau de l’équipe, Jean Félix, que j’accompagne dans sa formation qui a du traiter ce sujet épineux de la remise en conformité UTF8 d’une base de données, pour éviter les multiples conversions et donc les horreurs qui vont potentiellement avec. Et la solution a été trouvée en français, pour une fois, si c’est pas cool ça 🙂

Les attaques SSL/TLS

Pour rappel, le SSL/TLS qui est exploité pour faire du HTTPS sur le web permet de garantir la confidentialité d’une communication entre le serveur et le client en chiffrant cette communication. Les attaques consistent à permettre le déchiffrement d’une telle communication, et cet article de Korben nous dresse un petit historique sélectif des possibilités, en partenariat avec Radware à l’occasion de la Hacker’s Challenge.

Comment le selfie d’un singe a ruiné la vie d’un photographe

Cette histoire pourrait faire l’objet d’un film ou d’un bouquin tellement elle parait ahurissante. Mais non, elle est bien réelle, et une cour de justice aux USA a bien eu à débattre du droit d’auteur et du droit à l’image d’un singe d’un pays étranger. Le grand gagnant ? Tous ceux qui ont pu faire de l’argent en racontant cette histoire, parce que l’auteur, lui, a tout perdu, jusqu’au goût de son métier…

Optimiser les performances de MySQL

Ces derniers mois, j’ai eu très souvent à tenter de régler plus finement le carburateur de cette technologie très répandue sur le web qu’est MySQL/MariaDB, et si cet article n’est pas non plus d’une complétude totale, les points qu’il aborde sont dans tous les cas nature à vous apporter également un gain en performance.

Trois méthodes pour découvrir le processus exécuté sur un port particulier sur Linux

Je connaissais déjà netstat et ss, que j’avais eu l’occasion de présenter à l’occasion d’un billet sur la surveillance réseau. Je connaissais moins lsof pour cet usage par contre, c’est cool d’avoir partagé ça au final.

Met au point ton speech spécial French Tech pour lever des fonds

L’initiative French Tech est en soi une bonne idée, il est vrai qu’un peu de visibilité ne fait jamais de mal, et trouver des financements, depuis 2008, est un sacré challenge pour une boite qui débute (le buzzword associé est startup). Mais à voir ce qui a été mis en valeur pour l’instant, on sent le grand n’importe quoi du concept, et pour refléter ça, rien de tel qu’un site parodique, un peu à l’image du pipotron, mais spécial french tech. Chaque pitch généré est sauvegardé et peut être partagé partout 🙂

Installation de Proxmox VE en RAID1 logiciel

L’installation standard de Proxmox demande un disque unique pour lui seul et ne permet pas de configurer un RAID à l’installation. Fort heureusement c’est tout de même possible, et j’ai déniché cet article très didactique dans les tréfonds de mes marque-pages. D’autant plus que ces dernières années la stabilité d’un LVM au dessus d’un RAID logiciel n’est vraiment plus un problème.

Bloquer les appels indésirables sur Android

dimanche 27 août 2017 à 18:30

Récemment mon numéro de téléphone mobile s’est retrouvée sur une liste de prospection (associée à la maison de ma mère à Saint-Quentin Lamotte, comme propriétaire de la maison, ce qui ne devrait pourtant pas être possible, mais passons), et je suis maintenant régulièrement harcelé par téléphone par certains numéros inconnus au bataillon plusieurs fois par jour. C’est chiant, très désagréable, fort heureusement, il y a moyen de s’y remédier.

J’ai d’abord voulu passer par une application. En effet, je ne suis pas le seul touché et certains proposent des solutions, sauf que dans mon cas, ça bloquait également toutes les notifications d’application, ce qui n’était pas ce que je cherchais. Également, l’application d’origine de Google ne permet pas de bloquer un contact directement depuis l’historique ou le carnet d’adresse. Mais il y a l’option bien pratique que les robots n’aiment pas du tout. J’ai donc créé un contact poubelle dans lequel j’ajoute tous les numéros que j’identifie au fur et à mesure :

La petite case à cocher qui change la vie

Sur ce contact, j’active donc une option qui indique de renvoyer directement sur la messagerie. Et ça fait le taf. Alors pour les numéros inconnus, ça vous importunera nécessairement au moins une fois. Mais une recherche sur votre moteur favori vite fait pour confirmer que c’est bien un robot de démarchage et paf, l’ajout au contact se fait en deux coups de doigts et la paix règne à nouveau sur le téléphone.

Paradoxalement, c’est une option qui est intégrée à Windows Phone, que j’ai eu l’occasion de mettre en place sur le téléphone qui m’avait servi de crash test et que j’ai donné à un ami. Je pense également que iOS permet ça aussi, et pire, c’était intégré dans d’anciennes versions d’Android, un peu comme le mode UMS pour la connexion USB retirée depuis au « profit » d’MTP dont le respect des spécifications est plus qu’aléatoire par les fabricants, rendant son exploitation sous Linux bien compliquée. Et Android oblige, c’est un bordel sans nom dès que les constructeurs commencent à utiliser leur propre application, qui elle peut inclure une telle fonctionnalité.

Je rêve également de pouvoir faire un système de liste blanche, où seulement les contacts connus peuvent contacter le téléphone. Il serait intéressant aussi de pouvoir proposer une version « sortante », histoire d’éviter aux chérubins de composer n’importe quel numéro à l’arrache, et permettre d’éviter les factures inopinées. J’imagine aussi qu’il y a une application pour ça, mais il faut avouer que j’ai pas encore cherché. Et si mieux, ça pouvait être open-source et sur F-Droid, ça serait le pied. Sanity à l’air d’inclure le blocage, mais pas mis à jour depuis 2011, je déconseille donc de l’installer sur un téléphone récent 🙁

Phpbrew : installer plusieurs versions de PHP en parallèle

jeudi 24 août 2017 à 18:30

J’ai eu il y a quelques temps à installer php7 sur une Debian 7, mais pas en remplacement de php 5.4 (sinon j’aurais fait appel à dotdeb), mais à côté. Si CentOS bénéficie des Software Collections de la grande sœur Redhat, ce n’est pas le cas sur notre distribution préférée et pratiquement toutes les solutions proposent un passage par la compilation à la main. Mais ça c’était avant.

Bon il est vrai que Phpbrew passe quand même par de la compilation, mais il vous mâche grandement le travail. C’est un programme diablement pratique pour vous permettre de gérer installation, compilation, ajout d’extensions, tout ça avec des commandes simplifiées avec en prime la gestion du FPM.

Je ne vais pas détailler les raisons qui m’ont forcé à chercher à installer ça sur Debian 7, il me faudrait une vie tellement le client en question nous l’a malmène. Mais bref, en cherchant des solutions j’ai dégoté le sésame que j’ai installé dans /usr/local/bin. Pour info, si pour l’installation dans ce dossier il vous faut être administrateur, ça ne sera pas obligatoire pour la compilation/gestion, elle peut être faite via un utilisateur standard.

La doc parle d’elle-même (bien penser à installer les prérequis, vous gagnerez beaucoup temps), si dans l’ensemble c’est fonctionnel il y a tout de même peu de ressources sur le sujet dès qu’on sort des clous. Il faut parfois bien fouiller les issues pour avoir des réponses, une bonne maîtrise de l’anglais est plus que nécessaire.

Il faut aussi être à l’aise avec la compilation. Pour résoudre les erreurs qui pourraient apparaître , c’est très souvent dû à un manque de paquets dével, et je m’y suis facilement repris à 10 fois la première installation. En gros, ça s’arrête au premier paquet manquant et fort heureusement pour moi les dépôts sont encore debout.

Toute la configuration et la compilation des versions installées sont effectuées dans un dossier .phpbrew dans le dossier home de l’utilisateur qui a effectué les compilations. Et chaque version a sa propre arborescence et donc ses fichiers de configuration. Dans mon cas avec FPM d’activé, un simple phpbrew fpm restart permet de prendre la nouvelle configuration à jour. C’est donc bien organisé, et ça me plaît. Pour la gestion du démarrage automatique, j’ai privilégié un passage par cron, à l’image de ce qui se fait souvent dans le monde node.js.

Concernant l’ajout d’extensions après coup, phpbrew supporte l’utilisation de dépôts Github en plus du repository PECL. Nécessaire pour PHP7 et Memcached notamment, il y a même un message spécifique pour celui-ci. Par contre pour PECL, j’ai eu un pépin, il semble qu’il y aie eu des modifications récemment et ça plante facilement. Exemple, pour une raison que j’ignore l’extension GD n’était pas compilée avec le support du format JPEG, alors que les paquets « devel » sont bien présents. En reforçant une installation avec les bons paramètres il a voulu télécharger la source sur PECL, mais ça tombait en erreur. S’agissant d’un module core inutile de télécharger quoi que ce soit on a déjà les sources de php et donc du module. C’est là que la bonne connaissance de la compilation est nécessaire pour forcer make à utiliser le dossier local des sources :

phpbrew -d ext install gd -- --with-gd=/root/.phpbrew/build/php-7.0.17/ext/ --with-libdir=lib/x86_64-linux-gnu --with-gd=shared --enable-gd-native-ttf --with-jpeg-dir=/usr --with-png-dir=/usr  --with-xpm-dir=/usr

Bien que je sois quelqu’un de globalement réticent à la compilation manuelle, je suis satisfait de cette solution et je souhaitais en parler en français parce que je n’ai rien trouvé de pertinent sur le sujet pour autre chose que les accrocs à la pomme sur des installations de dev donc. Si d’aventure vous avez besoin d’une telle solution, eh bien sachez qu’elle existe et qu’elle est fiable.