Introducción: por qué VPS es la opción ideal para aplicaciones Java
Desplegar una aplicación Java en un servidor privado virtual (VPS) es el estándar de oro para los desarrolladores que desean tener control total sobre el entorno de ejecución. A diferencia del hosting compartido, VPS proporciona recursos dedicados (CPU, RAM, disco), permite configurar la Java Virtual Machine (JVM), instalar cualquier librería y configurar el servidor según las necesidades específicas del proyecto.
En este artículo analizaremos el ciclo completo de despliegue: desde la preparación del VPS y la instalación del JDK hasta la ejecución de la aplicación en modo producción utilizando systemd. Todos los pasos están acompañados de ejemplos de código y comandos para Linux (Ubuntu 22.04 LTS).
1. Preparación del VPS e instalación del software necesario
1.1. Conexión al servidor
Después de comprar el VPS, recibirás una dirección IP y la contraseña de root. Conéctate mediante SSH:
ssh root@tu_IP_del_servidor
Se recomienda crear inmediatamente un usuario sin privilegios para el trabajo diario:
adduser deployer
usermod -aG sudo deployer
1.2. Instalación de Java (JDK 17 LTS)
Para aplicaciones Java modernas, OpenJDK 17 es la mejor opción. Ejecuta:
sudo apt update
sudo apt install openjdk-17-jdk -y
Verifica la instalación:
java -version
# Salida: openjdk version "17.0.10" 2024-01-16 LTS
1.3. Instalación de Git y Maven/Gradle
Para compilar el proyecto desde el repositorio:
sudo apt install git maven -y
# O para Gradle:
# sudo apt install gradle -y
2. Compilación y preparación de la aplicación
2.1. Clonación del repositorio
Supongamos que tu aplicación Spring Boot está en GitHub:
cd /opt
sudo git clone https://github.com/tu_cuenta/my-java-app.git
cd my-java-app
2.2. Compilación del archivo JAR
Para Maven:
mvn clean package -DskipTests
Como resultado, en target/ aparecerá el archivo my-app-0.0.1-SNAPSHOT.jar. Asegúrate de que se ejecuta:
java -jar target/my-app-0.0.1-SNAPSHOT.jar --server.port=8080
Verifica su funcionamiento: abre en el navegador http://tu_IP:8080.
2.3. Optimización del JAR para producción
Añade en application.properties los parámetros para producción:
server.port=8080
spring.datasource.url=jdbc:postgresql://localhost:5432/mydb
spring.datasource.username=app_user
spring.datasource.password=secure_password
spring.jpa.hibernate.ddl-auto=validate
Nunca almacenes contraseñas reales en el código: utiliza variables de entorno o Vault.
3. Configuración de la base de datos y el entorno
3.1. Instalación de PostgreSQL
sudo apt install postgresql postgresql-contrib -y
sudo systemctl start postgresql
sudo systemctl enable postgresql
Crea la base de datos y el usuario:
sudo -u postgres psql
CREATE DATABASE mydb;
CREATE USER app_user WITH PASSWORD 'secure_password';
GRANT ALL PRIVILEGES ON DATABASE mydb TO app_user;
\q
3.2. Configuración de variables de entorno
Crea el archivo /etc/environment.d/java-app.conf:
DB_URL=jdbc:postgresql://localhost:5432/mydb
DB_USER=app_user
DB_PASSWORD=secure_password
JAVA_OPTS="-Xms256m -Xmx512m"
Recarga el entorno:
source /etc/environment.d/java-app.conf
4. Ejecución de la aplicación como servicio systemd
4.1. Creación del archivo unit
Crea el archivo /etc/systemd/system/java-app.service:
[Unit]
Description=Java Spring Boot Application
After=network.target postgresql.service
[Service]
User=deployer
WorkingDirectory=/opt/my-java-app
ExecStart=/usr/bin/java $JAVA_OPTS -jar /opt/my-java-app/target/my-app-0.0.1-SNAPSHOT.jar
SuccessExitStatus=143
Restart=always
Rest