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