Configuración de un servicio para una aplicación Spring Boot en Ubuntu Server

En esta guía, documentaré el proceso completo para configurar un servicio en Ubuntu Server que permita ejecutar una webapp de Spring Boot como un proceso en segundo plano, iniciándose automáticamente al encender el servidor.

Configuración del archivo pom.xml

Antes de poder empaquetar tu aplicación Spring Boot como un archivo .jar ejecutable, es necesario ajustar la configuración de tu archivo pom.xml. Esto asegurará que el archivo .jar generado sea ejecutable por Java directamente.

En tu archivo pom.xml, agrega la siguiente configuración dentro de la sección <build>:

XML
<build>
    <finalName>pendientes-webapp</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <executable>true</executable>
            </configuration>
        </plugin>
    </plugins>
</build>

  • finalName: Define el nombre del archivo .jar que se generará. En este caso, se llamará pendientes-webapp.jar.
  • spring-boot-maven-plugin: Este plugin se utiliza para empaquetar la aplicación Spring Boot como un archivo .jar ejecutable.
  • executable: La opción true asegura que el .jar generado sea ejecutable, lo que permitirá correrlo directamente en el servidor con java -jar.
Generar el archivo .jar ejecutable

Después de configurar el pom.xml, debes generar el archivo .jar ejecutable. Para hacerlo, ejecuta el siguiente comando en el directorio raíz de tu proyecto:

Bash
mvn clean package

Este comando empaquetará tu aplicación y creará el archivo pendientes-webapp.jar en el directorio target/ de tu proyecto. Ahora que tienes el .jar ejecutable, puedes proceder a configurar el servicio en Ubuntu Server.

Requisitos previos

Antes de comenzar, asegúrate de tener lo siguiente:

  • Ubuntu Server instalado y configurado.
  • Java JDK (en este caso, JDK 21) instalado en el servidor.
  • Tu archivo .jar de Spring Boot listo para ejecutarse.
  • Permisos de administrador o root en el servidor.
Paso 1: Verificar la instalación de Java

Primero, es importante verificar que Java está correctamente instalado. Puedes hacer esto con el siguiente comando:

Bash
java -version

Esto debería mostrar la versión de Java instalada.

Paso 2: Crear el archivo de servicio para systemd

El siguiente paso es crear un archivo de servicio en systemd que permita administrar la ejecución de la webapp como un servicio. Este archivo se ubicará en el directorio /etc/systemd/system/. Abre un editor de texto (puede ser nano o vi):

Bash
sudo nano /etc/systemd/system/pendientes-webapp.service

A continuación, copia el siguiente contenido en el archivo. Este define el servicio para tu aplicación:

Bash
[Unit]
Description=Aplicacion Spring Boot Pendientes - Webapp
After=syslog.target

[Service]
User=root
ExecStart=/opt/jdk-21.0.4+7/bin/java -Duser.timezone=UTC -jar /opt/pendientes-webapp/pendientes-webapp.jar
Environment=INSTANCIA=INSTANCIA-1
Environment=VERSION=1.0.0-RELEASE
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

  • Description: Una breve descripción del servicio.
  • After: Define cuándo se debe iniciar el servicio, en este caso, después de que syslog.target esté listo.
  • User: El usuario que ejecutará el servicio (aquí es root).
  • ExecStart: La ruta donde se encuentra tu JDK y el archivo .jar de la aplicación. En este caso, también se especifica la zona horaria como UTC.
  • SuccessExitStatus: El código de salida considerado exitoso para detener el servicio.
  • WantedBy: Especifica en qué momento el servicio debe estar habilitado; multi-user.target asegura que se ejecute cuando el servidor está en modo multiusuario.
Paso 3: Recargar y habilitar el servicio

Una vez que el archivo de servicio está creado, debes recargar systemd para que reconozca el nuevo servicio y luego habilitarlo para que inicie automáticamente al arrancar el sistema.

Recarga systemd para aplicar los cambios

Bash
sudo systemctl daemon-reload

Habilita el servicio para que se ejecute automáticamente en el arranque:

Bash
sudo systemctl enable pendientes-webapp.service

Inicia el servicio manualmente para probarlo:

Bash
sudo systemctl start pendientes-webapp.service

Verifica el estado del servicio para asegurarte de que se está ejecutando correctamente:

Bash
sudo systemctl status pendientes-webapp.service

Deberías ver un mensaje indicando que el servicio está activo y corriendo.

Paso 4: Detener y reiniciar el servicio

Si alguna vez necesitas detener o reiniciar el servicio, puedes utilizar los siguientes comandos:

Detener el servicio:

Bash
sudo systemctl stop pendientes-webapp.service

Reiniciar el servicio:

Bash
sudo systemctl restart pendientes-webapp.service

Paso 5: Logs del servicio

Puedes consultar los logs generados por el servicio con el comando:

Bash
sudo journalctl -u pendientes-webapp.service

Esto es útil para depurar problemas o revisar el estado de la aplicación a lo largo del tiempo.

Conclusión

Con esta configuración, tu aplicación Spring Boot estará configurada como un servicio en Ubuntu Server. El servicio se ejecutará en segundo plano y se reiniciará automáticamente después de un reinicio del sistema. Esto asegura una operación continua de tu webapp con un mínimo de intervención manual.

Si tienes más de una aplicación que deseas ejecutar de esta manera, puedes repetir este proceso creando archivos de servicio adicionales para cada aplicación.