Spring-boot como un servicio en Linux
Introducción
En este post mostraremos como configurar una aplicación Spring Boot para que se ejecute como un servicio en Linux. En primer lugar se muestran las instrucciones para configurar el servicio con scripts compatibles con sistemas de inicio tipo System V, en segundo se muestra como configurar el servicio en sistemas más nuevos que emplean systemd.
Jar ejecutable
Una de las ventajas de Spring Boot es que nos permite crear Jar ejecutables de forma autónoma, esto nos permite tratar directamente la aplicación empaquetada en un Jar como un ejecutable que a su vez dispone de parámetros como “start”, “stop”, “restart”, “status” que son de utilidad a la hora de gestionar servicios.
Para crear un Jar ejecutable debemos de hacer una de las siguientes dos configuraciones en función de si usamos Maven o Gradle:
Maven
Añadir lo siguiente al pom.xml del proyecto:
1<plugin>
2 <groupId>org.springframework.boot</groupId>
3 <artifactId>spring-boot-maven-plugin</artifactId>
4 <configuration>
5 <executable>true</executable>
6 </configuration>
7</plugin>
Gradle
Añadir lo siguiente al build.gradle
del proyecto:
1springBoot {
2 executable = true
3}
Arrancar la aplicación desde el Jar, además de soportar las opciones anteriormente mencionadas, implica lo siguiente:
- El script inicia la aplicación con el usuario propietario del script
- El script hace un seguimiento del PID de la aplicación empleando
/var/run/<nombreaplicacion>/<nombreaplicacion>.pid
- El script escribe los logs en
/var/log/<nombreaplicacion>.log
Instalación como servicio init.d (System V)
Para este caso vamos a aprovechar las propiedades anteriormente mencionadas de los Jars ejecutables que se pueden crear en Spring-Boot.
En este caso, la tarea será tan sencilla como añadir un enlace simbólico al Jar en el directorio init.d:
1sudo ln -s /var/<pathaplicacion>/<nombreaplicacion>.jar /etc/init.d/<nombreaplicacion>
Una vez hecho esto, se puede arrancar/parar/reiniciar la aplicación exactamente igual que con cualquier otro servicio:
1service <nombreaplicacion> start
Del mismo modo, podemos marcar la aplicación (servicio) para que se inicie de forma automática al arrancar el equipo:
1update-rc.d <nombreaplicacion> defaults
Asegurando el servicio
Tal como se ha indicado, el servicio init.d arrancará la aplicación con el usuario propietario de la aplicación. En este sentido, es importante que este usuario disponga de los permisos necesarios para que la aplicación se comporte correctamente.
El usuario empleado para iniciar la aplicación debería de ser uno sin posibilidad de login. Podemos emplear el siguiente comando para modificar el shell y prevenir login al usuario:
1chsh -s /usr/sbin/nologin <usuario>
Podemos cambiar el usuario propietario de la aplicación del siguiente modo:
1chown <usuario>:<grupo> <nombreaplicacion>.jar
El jar de la aplicación debería de tener únicamente propiedades de lectura y ejecución para su propietario, para ello cambiamos sus atributos:
1chmod 500 <nombreaplicacion>.jar
Al final deberíamos tener una estructura como la siguiente:
Instalación como servicio systemd
Hoy en día, la mayoría de distribuciones de Linux emplean systemd para gestionar los procesos del sistema. A diferencia de SystemV donde los parámetros de inicio son por convención, en el caso de systemd es por configuración, por lo que para habilitar un servicio es necesario crear un script de configuración.
Script de configuración
Los script se ubican en el directorio /etc/systemd/service
, por lo que para nuestra aplicación tendremos que crear un fichero llamado /etc/systemd/service/<nombreaplicacion>.service
como el siguiente:
1[Unit]
2Description=<nombreaplicacion>
3After=syslog.target
4
5[Service]
6User=<usuarioejecutor>
7ExecStart=/path/a/aplicacion/<nombreaplicacion>.jar
8SuccessExitStatus=143
9
10[Install]
11WantedBy=multi-user.target
Para marcar el servicio para que se inicie de forma automática al arrancar el equipo emplearemos el siguiente comando:
1sudo systemctl enable nombreaplicacion.service