Spring Boot Anwendung als Systemdienst einrichten

27. Juli 2017

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.