Spring Boot Anwendung als Systemdienst einrichten
Mit Spring Boot ist es möglich, JAR-Dateien für Linux basierte Betriebssysteme zu erzeugen, die wie normale Binärdateien gestartet und beim Einsatz von SysVinit oder systemd als Systemdienst registriert werden können.
Ausführbare JAR-Dateien erzeugen
Um eine ausführbare JAR-Datei zu erzeugen, muss beim Einsatz von Maven die folgende Plugin-Konfiguration übernommen werden:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
</configuration>
</plugin>
Bei Gradle hingegen muss die build.gradle um folgenden Eintrag ergänzt werden:
bootRepackage {
executable = true
}
Anwendung installieren
Sobald die ausführbare JAR-Datei erzeugt ist, kann die Anwendung als Systemdienst eingerichtet werden. In diesem Beispiel wird angenommen, dass die Anwendung myapp genannt wird. Zunächst wird ein eigener Benutzer mitsamt Anwendungsverzeichnis für den Dienst erstellt:
useradd --system --create-home --home-dir /opt/myapp myapp
Im nächsten Schritt wird die JAR-Datei in den Anwendungsordner verschoben:
mv myapp.jar /opt/myapp/
Zuletzt wird die Anwendung abgesichert:
chmod 500 /opt/myapp/myapp.jar # Nur Lese- und Ausführrecht für den Besitzer
chattr +i /opt/myapp/myapp.jar # Modifikation der Datei verhindern
chown -R myapp:myapp /opt/myapp # Anwendungsordner und enthaltene Dateien dem Benutzer zuordnen
SysVinit
Bei Verwendung von SysVinit sind folgende Befehle nötig, um die Anwendung als Systemdienst zu registrieren:
ln -s /opt/myapp/myapp.jar /etc/init.d/myapp
update-rc.d myapp defaults
systemd
Beim Einsatz des neueren systemd muss zunächst eine Konfigurationsdatei im Ordner /etc/systemd/system erstellt werden. In diesem Beispiel wird die Datei myapp.service mit folgendem Inhalt erstellt:
[Unit]
Description=myapp
After=syslog.target
[Service]
User=myapp
ExecStart=/opt/myapp/myapp.jar
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
Nun kann der Dienst wie folgt gestartet werden:
systemctl enable myapp
Service starten
Bei beiden Init-Systemen wird der Systemdienst über den Befehl
service myapp start
gestartet.