Despliegue de aplicación Kotlin en VPS: guía paso a paso para avanzados
Desarrollar en Kotlin es solo la mitad del trabajo. El verdadero dominio se demuestra cuando tu aplicación comienza a funcionar en un entorno de producción en tu propio servidor VPS. En este artículo, exploraremos técnicas avanzadas de despliegue de aplicaciones Kotlin: desde la compilación de un fat JAR hasta la configuración de operación ininterrumpida con systemd, proxy inverso a través de Nginx y automatización mediante CI/CD. El material está dirigido a desarrolladores que ya conocen los fundamentos de Kotlin y desean alcanzar un nivel profesional.
1. Preparación de la compilación de producción de la aplicación Kotlin
El primer paso es crear una compilación optimizada. Usamos el plugin shadow para Gradle, que empaquetará todas las dependencias en un único archivo JAR ejecutable (fat JAR).
Añada en build.gradle.kts:
plugins { kotlin("jvm") version "1.9.22" id("com.github.johnrengelman.shadow") version "8.1.1" application}
application { mainClass.set("com.example.MainKt")}
tasks.shadowJar { archiveBaseName.set("app") archiveClassifier.set("") archiveVersion.set("") minimize()}Compile el JAR con el comando:
./gradlew shadowJarComo resultado, obtendrá el archivo build/libs/app.jar. Para producción, se recomienda deshabilitar los logs de depuración y configurar el nivel de registro mediante variables de entorno.
Ejemplo de configuración de logback.xml para producción:
<configuration> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>/var/log/app/app.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>/var/log/app/app.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender>
<root level="INFO"> <appender-ref ref="FILE"/> </root></configuration>2. Creación de un servicio systemd para inicio automático
Para que la aplicación se inicie automáticamente al arrancar el sistema y se reinicie en caso de fallos, usamos systemd. Cree el archivo /etc/systemd/system/kotlin-app.service:
[Unit]Description=Servicio de Aplicación KotlinAfter=network.target
[Service]Type=simpleUser=appuserGroup=appuserWorkingDirectory=/opt/kotlin-appExecStart=/usr/bin/java -Xms512m -Xmx1024m -jar /opt/kotlin-app/app.jarRestart=on-failureRestartSec=10StandardOutput=journalStandardError=journalEnvironment="APP_ENV=production"Environment="DB_URL=jdbc:postgresql://localhost:5432/mydb"
[Install]WantedBy=multi-user.targetDespués de crear el archivo, ejecute:
sudo systemctl daemon-reloadsudo systemctl enable kotlin-appsudo systemctl start kotlin-appVerifique el estado:
sudo systemctl status kotlin-appLos logs se pueden ver mediante journalctl -u kotlin-app -f.
3. Configuración de Nginx como proxy inverso con SSL
Nginx proporcionará balanceo de carga, almacenamiento en caché y HTTPS. Instale Nginx y Certbot:
sudo apt updatesudo apt install nginx certbot python3-certbot-nginxCree la configuración /etc/nginx/sites-available/kotlin-app:
server { listen 80; server_name tudominio.com; return 301 https://$server_name$request_uri;}
server { listen 443 ssl http2; server_name tudominio.com;
ssl_certificate /etc/letsencrypt/live/tudominio.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/tudominio.com/privkey.pem;
location / { proxy_pass http://localhost:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }}Active el sitio y obtenga el certificado SSL:
sudo ln -s /etc/nginx/sites-available/kotlin-app /etc/nginx/sites-enabled/sudo certbot --nginx -d tudominio.comsudo systemctl restart nginx4. Monitoreo de la aplicación
Para monitorear el estado de la aplicación, recomendamos usar Prometheus y Grafana. Agregue la dependencia micrometer-registry-prometheus a su proyecto Kotlin:
implementation("io.micrometer:micrometer-registry-prometheus:1.12.4")Configure el endpoint de métricas en su aplicación web (por ejemplo, usando Ktor o Spring Boot). Ejemplo para Ktor:
install(MetricsPlugin) { // configuración}
routing { get("/metrics") { call.respond(MeterRegistry.getDefault().scrape()) }}En el servidor, instale Prometheus y configure el archivo /etc/prometheus/prometheus.yml:
scrape_configs: - job_name: 'kotlin-app' static_configs: - targets: ['localhost:8080']Luego instale Grafana y cree un panel para visualizar las métricas de su aplicación.
5. Automatización del despliegue mediante CI/CD
Para automatizar el proceso de despliegue, usaremos GitHub Actions. Cree el archivo .github/workflows/deploy.yml:
name: Deploy Kotlin App
on: push: branches: [ main ]
jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up JDK 17 uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin' - name: Build with Gradle run: ./gradlew shadowJar - name: Deploy to VPS uses: appleboy/scp-action@v0.1.7 with: host: ${{ secrets.VPS_HOST }} username: ${{ secrets.VPS_USER }} key: ${{ secrets.SSH_PRIVATE_KEY }} source: \"build/libs/app.jar\" target: \"/opt/kotlin-app/\" strip_components: 2 - name: Restart service uses: appleboy/ssh-action@v1.0.3 with: host: ${{ secrets.VPS_HOST }} username: ${{ secrets.VPS_USER }} key: ${{ secrets.SSH_PRIVATE_KEY }} script: | sudo systemctl restart kotlin-app sudo systemctl status kotlin-appNo olvide agregar los secretos VPS_HOST, VPS_USER y SSH_PRIVATE_KEY en la configuración de su repositorio en GitHub.
Conclusión
Hemos analizado el proceso completo de despliegue de una aplicación Kotlin en un VPS: desde la compilación con Gradle y shadow JAR hasta la configuración de systemd, Nginx con SSL, monitoreo y despliegue automatizado mediante CI/CD. Estos métodos le permitirán ejecutar aplicaciones Kotlin de manera confiable en un entorno de producción y simplificar el proceso de actualización.
¿Tiene preguntas o desea compartir su experiencia en el despliegue de Kotlin? ¡Escriba en los comentarios!