Service

Ce chapitre décrit comment intégrer une installation système en tant que service dans le système d’exploitation.

Le serveur SAINet contient les fichiers nécessaires à l’intégration en tant que service. Ceux-ci se trouvent dans le répertoire <runtime>/services.

Attention:

Le dossier <runtime> doit être au même endroit que sainet.jar.

De manière générale, le service ne va pas directement lancer le JAR sainet.jar comme cela serait fait dans une console, car cela provoquerait des problèmes de verrous lors des mises à jour automatiques sous Windows. Le service va simplement appeler un script sainet-launcher qui va appeler ensuite les commandes nécessaires.

Linux (systemd)

Ce chapitre décrit comment intégrer SAINet en tant que service en utilisant systemd et les fichiers de configuration y relatifs.

Variables SAINet

Dans le répertoire <runtime>/services/systemd, renommer le fichier sainet-vars.sh.template en sainet-vars.sh:

mv sainet-vars.sh.template sainet-vars.sh

Ce fichier contient les variables d’environnements principales à définir pour le service.

Variable obl. Description
JAVA_OPTIONS Options spécifiques à Java. Il est recommandé de spécifier au moins la propriété -Xmx avec une valeur minimale de 2048m.
SAINET_PATH obligatoire Chemin complet vers le répertoire contenant sainet.jar.
SAINET_RUNTIME obligatoire Nom du répertoire <runtime> (option --runtime).
SAINET_WEBAPP_ENABLED Détermine si l’application web doit être déployée.
SAINET_UPDATE_USERNAME Nom d’utilisateur pour les mises à jour automatiques
SAINET_UPDATE_PASSWORD Mot de passe pour les mises à jour automatiques.
SAINET_UPDATE_MODE Mode de mise à jour (release, rc ou snapshot).
SAINET_UPDATE_RESTART Application automatique de la mise à jour. Mettre à false pour désactiver les mises à jour automatiques.
SAINET_UPDATE_STORE obligatoire Nom du fichier JAR pour les mises à jour. Ne pas changer.
SAINET_BACKUP_DB_ENABLED obligatoire Détermine si une sauvegarde de la base de données doit être effectuée avant chaque mise à jour automatique. En cas de grosse base de données (>= 10 Go), cela peut poser des redémarrages intempestifs du service car la sauvegarde prend trop de temps. Il est alors conseillé de le désactiver.
Note:

Certaines de ces variables peuvent également êtres définies dans server.properties. Les variables d’environnement définies dans sainet-vars.sh seront prioritaires par rapport à celles-ci.

Droits d’accès aux fichiers

Afin que le script du service soit exécutable, exécuter la commande suivante:

chmod u+x <runtime>/services/systemd/sainet-launcher.sh

Configuration du service

Pour créer un service systemd, créer le fichier ~/.config/systemd/user/sainet.service avec le contenu suivant:

[Unit]
Description=sainet

[Service]
Type=notify
NotifyAccess=all
Restart=always
RestartSec=30
TimeoutSec=600
WorkingDirectory=<runtime>/services/systemd
ExecStart=/bin/bash sainet-launcher.sh

[Install]
WantedBy=default.target
Attention:

La seule variable à modifier est WorkingDirectory, en spécifier le chemin complet vers le dossier <runtime>/services/systemd.

Voici le descriptif des différents éléments utilisés dans la configuration:

Variable Description
Description Nom du service. Il est recommandé que ce nom soit identique au fichier du service (sainet.service).
Type Indique à systemd que le service lui-même enverra des notifications pour indiquer le status.
NotifyAccess Permet à un sous-processus du service d’envoyer des notifications au service. Cela est nécessaire car le script sainet-launcher.sh va appeler sainet-app.sh, qui lui-même démarrera SAINet.
Restart Redémarrage automatique dans tous les cas lorsque le processus termine (ou atteint un timeout). Ce mécanisme est notamment utilisé par les mises à jour automatiques, car le service se stoppe et la mise à jour est appliquée lors du redémarrage.
RestartSec Secondes à attendre avant le redémarrage du service.
TimeoutSec Timeout du démarrage du service. SAINet indique de manière régulière à systemd son état, toutefois, durant la sauvegarde de la base de données (SAINET_BACKUP_DB_ENABLED=true), aucun signal n’est envoyé, ce qui peut provoquer un redémarrage en boucle du service si la base de données devient trop grosse. De même, certains scripts de migration peuvent être chronophage lors d’une mise à jour. Il est donc conseillé de laisser cette valeur assez élevée (>=10 minutes).
WorkingDirectory Chemin complet vers le répertoire <runtime>/services/systemd.
ExecStart Script à exécuter.
WantedBy Configuration des dépendances du service.

Une fois que le service a été créé, recharger la configuration systemd avec la commande suivante:

systemctl --user daemon-reload

Désormais, il est possible de démarrer et arrêter le service au moyen des commandes suivantes:

systemctl --user start sainet
systemctl --user stop sainet
Attention:

En cas d’erreur, systemd va relancer automatiquement le service après RestartSec. Il faut donc commencer par l’interrompre via systemctl --user stop sainet avant de le lancer manuellement pour trouver l’erreur.

Les fichiers de logs se trouvent dans <runtime>/services/systemd (service.log et update.log) et <runtime>/edms/log/sailog-snv4srv-i0_0-payara-PYA.log.

Démarrage automatique

Afin que le service soit lancé automatiquement lors d’un (re)démarrage du système, exécuter la commande suivante:

systemctl --user enable sainet

Une autre manière de faire est d’utiliser loginctl avec l’utilisateur root:

loginctl enable-linger <user>

Le <user> est le nom d’utilisateur système sous lequel SAINet a été installé. Cela va créer le fichier /var/lib/systemd/linger/ qui sera utilisé pour démarrer les services de l’utilisateur.

Windows (NSSM)

Ce chapitre décrit comment intégrer SAINet en tant que service en utilisant NSSM et les fichiers de configuration y relatifs. Le programme NSSM est automatiquement téléchargé lors de l’installation et se trouve déjà dans le répertoire <runtime>/services/windows. Ce dernier est nécessaire car un service de base Windows ne peut pas exécuter de script Batch.

Variables SAINet

Dans le répertoire <runtime>/services/windows, renommer le fichier sainet-vars.bat.template en sainet-vars.bat. Le contenu du script étant identique, se référer au chapitre du service Linux pour le détails des variables.

Note:

Si une variable contient un %, celui-ci doit être échappé au moyen de %% (voir ici)

Les variables SAINET_BACKUP_DB_* doivent êtres déclarées vides si la sauvegarde automatique avant mise à jour est désactivée, sinon cela provoquera une erreur de syntaxe et le service ne pourra pas démarrer.

Configuration du service

Afin d’installer le service SAINet avec NSSM, ouvrir une console en tant qu’Administrateur et exécuter la commande suivante:

cd <runtime>\services\windows
nssm.exe install SAINet

Suite à cela, une fenêtre de configuration va s’ouvrir et il faut entrer les paramètres suivants:

  • Le script à exécuter est <runtime>\services\windows\sainet-launcher.bat (mettre le chemin complet).
  • Le dossier d’exécution est <runtime>\services\windows (mettre le chemin complet).
  • Configurer le service pour démarrer automatiquement avec le système.
  • Configurer le redémarrage automatique du service en cas d’erreur après 10000ms avec une attente de 10s avant de redémarrer (afin de laisser Windows libérer les verrous sur les fichiers).
Attention:

Il ne faut pas déplacer le fichier nssm.exe une fois le service installé car ce dernier est utilisé pour lancer le service.

Une fois validé, le service SAINet apparaît dans la liste des services Windows et peut être démarré en tant que tel. Lorsque le service est démarré, Windows rend la main assez rapidement, mais SAINet n’a pas vraiment encore démarré. Il est nécessaire d’attendre quelques minutes avant que SAINet soit disponible.

Note:

Sous Windows, la compilation à chaud peut prendre du temps.

Les fichiers de logs se trouvent dans <runtime>/services/windows (service.log et update.log) et <runtime>/edms/log/sailog-snv4srv-i0_0-payara-PYA.log.

Il est possible de désinstaller le service avec la commande suivante:

cd <runtime>\services\windows
nssm.exe remove SAINet