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:

Gradle

Añadir lo siguiente al build.gradle del proyecto:

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:

Una vez hecho esto, se puede arrancar/parar/reiniciar la aplicación exactamente igual que con cualquier otro servicio:

Del mismo modo, podemos marcar la aplicación (servicio) para que se inicie de forma automática al arrancar el equipo:

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:

Podemos cambiar el usuario propietario de la aplicación del siguiente modo:

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:

Al final deberíamos tener una estructura como la siguiente:

Propiedades aplicacion spring como servicio

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:

Para marcar el servicio para que se inicie de forma automática al arrancar el equipo emplearemos el siguiente comando:

Spring boot as a Linux service

Referencias

Dejar un Comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *