Une unit systemd pour le Solr embarqué dans EzPublish

closeCet article a été publié il y a 6 ans 9 mois 24 jours, il est donc possible qu’il ne soit plus à jour. Les informations proposées sont donc peut-être expirées.

EzPublish est un CMS open-source basé sur Symfony, qui traîne ses guêtres depuis quelques années déjà. Via son extension ezfind, il embarque un moteur Solr pour servir de moteur de recherche externe (plus rapide que la base de données). Si des scripts de démarrage sont proposés pour différents OS, il ne sont pas exploitables sur CentOS 7, et il a fallu pondre une solution alternative. Je me suis reposé sur systemd. L’occasion de voir une de ses forces.

Le client veut utiliser Solr : soit. Malgré le fait que c’est du Java, si l’on sait où on va c’est un outil puissant et performant pour les recherches et l’indexation sur le site. En plus il est déjà fourni avec EzPublish, pourquoi se priver ? Sauf que l’extension commence à dater et les options pour le démarrer ne sont pas super pratiques. En l’occurrence voilà le script qu’utilise le client (enfin, plus précisément l’agence web) :

Ça va à l’essentiel, pour le lancer en arrière plan il fallait jouer avec du nohup et de l’esperluette, et c’est pas pratique pour en faire un script de démarrage/extinction automatique. Il se trouve cependant qu’il y a un script dans un sous-dossier d’ezfind pour le démarrage, dédié à RedHat et dérivés (donc CentOS), et il a cette tronche :

Là au moins on a la structure d’un script de démarrage qui a de la gueule. J’ai tenté de l’exécuter, systemd a pris le relai, et a échoué. Après coup, et en analysant le fichier, ça ne risquait pas de fonctionner, et ce n’est pas la faute de systemd : la commande daemon présente dans le script n’existe plus sur CentOS 7. Après quelques tergiversations, des recherches Google, et un ou deux fails dont j’ai le secret, j’ai fini par pondre une unit systemd que je me permet de partager avec vous :

unit final

Attardons-nous sur les directives :

  • After permet de décrire les dépendances du service; systemd compile toutes les lignes After et Before pour construire un arbre de dépendances afin de lancer un max de services en parallèle tout en s’assurant qu’ils ne manquent de rien, ici les besoins sont basiques;
  • WorkingDirectory Permet de définir un dossier dans lequel travailler; le script du client était lancé directement dans ce dossier, et surtout assumait qu’il était lancé depuis ce dossier;
  • ExecStart est la ligne qui permet de lancer le service; j’ai repris la commande du script d’origine, ce qui est amplement suffisant.

Si on compare la taille de ce fichier avec le script d’init « à l’ancienne », on comprend l’une des forces de systemd. La ligne de lancement est également réduite à l’essentiel, à comparer avec les bricolages à base de nohup et d’esperluette pour obtenir un processus qui ressemble à un service. Le nombre de lignes est beaucoup, beaucoup plus petit et c’est une bonne chose pour la lisibilité. systemd s’occupe tout seul de la journalisation, de la construction des dépendances, tout ce que vous avez à faire est de définir s’il doit démarrer ou pas avec le reste des services.

En tout cas, vous pourrez tenter de réutiliser ce script pour construire vos propres services. Pour ma part j’ai dans l’idée de reprendre de zéro le développement de l’API pour la refonte de ma base de données de films, toujours en Python, avec Flask, Bottle n’ayant pas bougé d’un pouce depuis quelques années. Je pense qu’il sera mis à contribution pour gérer son lancement.