Installation en tant que service systemd
Sommaire
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 :
- Instanciation de plusieurs services à partir d'un modèle systemd et utilisation de variables
- Installation d'une application Java Spring Boot en tant que service systemd
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"