En-tête et paramètres globaux
Le fichier confxml.xml est l'élément central de Sersync, un utilitaire qui couple inotify et rsync pour assurer la réplication de fichiers en temps réel. Cette section détaille les paramètres fondamentaux de l'outil.
<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
<!-- Les attributs hostip et port sont réservés aux plugins internes et n'impactent pas la synchronisation principale. -->
<host hostip="127.0.0.1" port="8080"></host>
<!-- Activez le mode débogage pour afficher les événements inotify et les commandes rsync dans la console. -->
<debug start="true"/>
<!-- Activez cette option si votre système de fichiers est XFS pour garantir le bon fonctionnement de Sersync. -->
<fileSystem xfs="true"/>
Les attributs hostip et port dans la balise <host> sont princpialement utilisés par les modules d'extension. Le mode debug est crucial pour le dépannage. Si votre partition de stockage est formatée en XFS, l'attribut xfs doit impérativement être défini sur true.
Filtrage des fichiers et répertoires
<filter start="true">
<exclude expression="(.*)\.tmp"></exclude>
<exclude expression="(.*)\.log"></exclude>
<exclude expression="^cache/*"></exclude>
<exclude expression="^uploads/temp/*"></exclude>
</filter>
Sersync ignore automatiquement les fichiers temporaires du système d'exploitation (ceux commençant par "." ou se terminant par "~"). La section <filter> vous permet d'ajouter des règles d'exclusion personnalisées via des expressions régulières pour ignorer des extensions spécifiques ou des arborescences entières.
Configuration des événements Inotify
<inotify>
<delete start="true"/>
<createFolder start="true"/>
<createFile start="false"/>
<closeWrite start="true"/>
<moveFrom start="true"/>
<moveTo start="true"/>
<attrib start="false"/>
<modify start="false"/>
</inotify>
Cette section définit les événements du noyau Linux à surveiller. Pour optimiser les performances et réduire le trafic réseau, il est fortement recommandé de désactiver createFile (start="false"). En effet, la copie d'un fichier génère à la fois un événement create et close_write. En ne surveillant que close_write, on garantit que le fichier est entièrement écrit sur le disque avant de déclencher la synchronisation.
Note importante : L'option createFolder doit rester active (true). Si elle est désactivée, les nouveaux répertoires et leur contenu futur ne seront pas pris en compte. Si votre architecture ne nécessite pas la réplication des suppressions vers le serveur distant, vous pouvez désactiver l'événement delete.
Paramètres de synchronisation Rsync
<sersync>
<localpath watch="/var/www/html/sync_data">
<remote ip="10.0.0.5" name="web_assets"/>
<!--<remote ip="10.0.0.6" name="web_assets_backup"/>-->
</localpath>
<rsync>
<commonParams params="-avz --delete"/>
<auth start="true" users="syncuser" passwordfile="/etc/sersync/rsync_auth.pas"/>
<userDefinedPort start="true" port="8730"/>
<timeout start="true" time="300"/>
<ssh start="false"/>
</rsync>
La balise <localpath> spécifie le répertoire local à surveiller. Les balises <remote> définissent les serveurs cibles avec leur adresse IP et le nom du module rsync correspondant.
La section <rsync> contient les arguments de la commande de transfert. commonParams définit les options standards. Si l'authentification est requise, activez auth et pointez vers le fichier de mots de passe. Vous pouvez également personnaliser le port réseau et le délai d'expiration. Activez ssh si vous préférez utiliser un tunnel SSH plutôt que le protocole rsync natif.
Gestion des échecs et synchronisation périodique
<failLog path="/var/log/sersync/rsync_errors.sh" timeToExecute="120"/>
<crontab start="true" schedule="1440">
<crontabfilter start="true">
<exclude expression="*.bak"></exclude>
<exclude expression="cache/*"></exclude>
</crontabfilter>
</crontab>
failLog : Si une synchronisation échoue, Sersync réessaie immédiatement. En cas de nouvel échec, la commande est ajoutée à un script shell défini par l'attribut path. Ce script est exécuté périodiquement (en minutes, via timeToExecute) pour retenter les transferts qui ont échoué, puis il est vidé.
crontab : Permet de planifier une synchronisation complète et régulière (ici toutes les 1440 minutes, soit 24 heures). Si le filtre global <filter> est actif, vous devez impérativement configurer <crontabfilter> pour éviter que les fichiers exclus en temps réel ne soient tout de même synchronisés lors de la tâche planifiée.
Plugins : Exécution de commandes et Socket
<plugin start="true" name="command"/>
</sersync>
<plugin name="command">
<param prefix="/usr/bin/php" suffix="--clear-cache" ignoreError="true"/>
<filter start="true">
<include expression="(.*)\.php"/>
</filter>
</plugin>
<plugin name="socket">
<localpath watch="/var/www/html/sync_data">
<deshost ip="192.168.10.50" port="9000"/>
</localpath>
</plugin>
Le plugin command exécute une commande système après une synchronisation réussie. Par exemple, si le fichier app.php est modifié et transféré, Sersync exécutera /usr/bin/php app.php --clear-cache > /dev/null 2>&1 (la redirection des erreurs est ajoutée si ignoreError est vrai). Le filtre interne permet de limiter l'exécution à certains types de fichiers via des expressions régulières.
Le plugin socket envoie les chemins des fichiers modifiés (détectés par inotify) à une adresse IP et un port distants via une connexion socket TCP.
Plugin de rafraîchissement CDN
<plugin name="refreshCDN">
<localpath watch="/data/web/cms.example.com/public/">
<cdninfo domainname="api.cdnprovider.com" port="80" username="admin" passwd="securepassword"/>
<sendurl base="http://static.example.com/assets"/>
<regexurl regex="true" match="cms.example.com/public([/a-zA-Z0-9]*).example.com/media"/>
</localpath>
</plugin>
</head>
Ce module interagit avec l'API d'un fournisseur CDN pour purger le cache des fichiers mis à jour. La balise cdninfo contient les identifiants de l'API, tandis que sendurl définit le préfixe de l'URL publique.
L'attribut regexurl permet de manipuler les chemins : si regex="true", l'expressoin régulière match est utilisée pour extraire une partie du chemin local et la concaténer à l'URL de base. Par exemple, un événement sur /data/web/cms.example.com/public/app.example.com/media/img/pic.jpg avec la regex ci-dessus générera une requête de purge pour http://static.example.com/assets/app/img/pic.jpg. Si regex="false", le chemin complet est simplement ajouté à l'URL de base sans transformation.