Installation en tant que service systemd

De Wiki de Jordan LE NUFF
Sauter à la navigation Sauter à la recherche

Présentation

Cette page a pour objet de décrire comment implémenter une ou des application(s) Java Spring Boot avec le gestionnaire de services systemd de Linux.

Ressources

Les configurations proposées dans cette page ont été réalisées en s'appuyant sur les documentations officielles de systemd et de Spring Boot et sur les bonnes pratiques d'administration de systèmes.

Plus particulièrement, les sections de documentations suivantes ont été particulièrement utiles :

Configuration pour une unique instance de l'application

Configuration simple

Dans le cas d'un lancement d'une unique instance d'application Java Spring Boot, créer un fichier /etc/systemd/system/myapp.service dont le contenu sera le suivant :

[Unit]
Description=myapp
After=syslog.target

[Service]
User=myapp
ExecStart=/var/myapp/myapp.jar
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

Ceci est la configuration standard recommandée par Spring Boot.

Configuration avancée

Dans le cas d'un lancement d'une unique instance d'application Java Spring Boot, créer un fichier /etc/systemd/system/myapp.service dont le contenu sera le suivant :

[Unit]
Description=%p
After=syslog.target

[Service]
Umask=0007
User=myapp
Group=mygroup
WorkingDirectory=/var/myapp
ExecStart=/usr/bin/java -jar /var/myapp/myapp.jar
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

Cette configuration permet d'avoir un meilleur contrôle sur :

  • Le nom du service : %p correspond au nom du service (récupéré dans le nom du fichier /etc/systemd/system/myapp.service)
  • Le masque pour la création de fichiers/dossiers : Umask=0007
  • Le groupe d'utilisateur : Group=mygroup
  • Le répertoire d'exécution : WorkingDirectory=/var/myapp
    • Cela peut être utile pour interagir avec le système de fichiers de façon relative
  • Le binaire d'exécution java : /usr/bin/java -jar
    • De cette façon, il est possible d'utiliser une autre version de Java présente sur le serveur

Configuration modèle pour plusieurs instances de l'application

Dans la pratique, il a été constaté que, selon la version de Spring Boot utilisée, les méthodes de chargement de certains paramètres différaient.

Spring Boot version 2.1.8

[Unit]
Description=Instance %i de %p
After=syslog.target

[Service]
UMask=0007
User=svc-java
Group=java
EnvironmentFile=/mydata/mySpringBootApps/%i/%p/conf/EnvironmentFile
WorkingDirectory=/mydata/mySpringBootApps/%i/%p/run
ExecStart=/usr/bin/java $JAVA_OPTS -jar /mydata/mySpringBootApps/%i/%p/run/%p.jar --spring.config.location=file:/mydata/mySpringBootApps/%i/%p/conf/ /mydata/mySpringBootApps/%i/%p/run/application.pid
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

Spring Boot version 2.4.5

[Unit]
Description=Instance %i de %p
After=syslog.target

[Service]
UMask=0007
User=svc-java
Group=java
EnvironmentFile=/mydata/mySpringBootApps/%i/%p/conf/EnvironmentFile
WorkingDirectory=/mydata/mySpringBootApps/%i/%p/run
ExecStart=/usr/bin/java $JAVA_OPTS -jar -Dspring.config.location=file:/mydata/mySpringBootApps/%i/%p/conf/ /mydata/mySpringBootApps/%i/%p/run/%p.jar /mydata/mySpringBootApps/%i/%p/run/application.pid
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

Fichier EnvironmentFile

Selon la Spring Boot, des variables d'environnement peuvent être injectées lors de l'exécution de l'application Java.

Selon la documentation de systemd, il est possible d'injecter une liste de variables d'environnement au travers d'un fichier texte grâce au paramètre EnvironmentFile. Dans la pratique, le fichier se nommera du même nom que le paramètre.

Ainsi, il est alors intéressant que, pour chaque instance d'application, il y ait un fichier EnvironmentFile de disponible afin de lui appliquer une configuration personnalisée.

Par exemple, pour une application nommée myapp, présente aux emplacements suivants :

  • /mydata/mySpringBootApps/myapp/dev/run/myapp.jar
  • /mydata/mySpringBootApps/myapp/rec/run/myapp.jar
  • /mydata/mySpringBootApps/myapp/prod/run/myapp.jar

Il est tout à fait possible d'avoir à disposition les fichiers EnvironmentFile avec les configurations suivantes :

  • /mydata/mySpringBootApps/myapp/dev/conf/EnvironmentFile
JAVA_OPTS=-Xmx512m
MODE=service
SERVER_PORT=12345
APP_NAME="myapp for dev"
  • /mydata/mySpringBootApps/myapp/rec/conf/EnvironmentFile
JAVA_OPTS=-Xmx256m
MODE=service
SERVER_PORT=23456
APP_NAME="myapp for rec"
  • /mydata/mySpringBootApps/myapp/prod/conf/EnvironmentFile
JAVA_OPTS=-Xmx1024m
MODE=service
SERVER_PORT=34567
APP_NAME="myapp for prod"