Desplegar una Aplicación ASP.NET Core Auto-contenida con Cron Jobs en un Servidor Apache

Este documento cubre todos los pasos necesarios para desplegar una aplicación ASP.NET Core en un servidor web con Apache usando un enfoque auto-contenido y programando tareas con Cron Jobs para gestionar la ejecución de la aplicación.

Pre-requisitos

  1. Aplicación ASP.NET Core ya desarrollada.
  2. Acceso FTP o SFTP a tu servidor para subir archivos.
  3. Acceso a Cron Jobs en tu panel de hosting o servidor.
  4. Apache como servidor web para manejar las solicitudes HTTP.

Paso 1: Publicar la Aplicación como Auto-contenida

Publicar la aplicación como auto-contenida es crucial para que no dependas de que el servidor tenga instalado el runtime de .NET. La aplicación tendrá todo lo que necesita para ejecutarse.

1.1 Ejecutar el comando de publicación

Desde la terminal en tu entorno de desarrollo (Visual Studio, VSCode, etc.), navega a la carpeta raíz de tu proyecto y ejecuta:

dotnet publish -c Release -r linux-x64 --self-contained
  • -c Release: Compila en modo Release (optimizado).
  • -r linux-x64: Especifica que estás publicando para Linux de 64 bits. Si tu servidor tiene otra arquitectura (como ARM), cámbialo por linux-arm.
  • --self-contained: Publica como auto-contenida para incluir el runtime de .NET.

1.2 Resultado

El resultado de este comando será una carpeta publish con todos los archivos necesarios para que la aplicación se ejecute de manera auto-contenida. La estructura será similar a:

/publish
  /wwwroot
  /libs
  YourApp (Ejecutable para Linux)
  other dlls...

Paso 2: Subir los Archivos al Servidor

Sube los archivos generados en la carpeta publish a tu servidor usando FTP o SFTP. Puedes utilizar herramientas como FileZilla o el cliente de FTP/SFTP que prefieras.

2.1 Subir Archivos

Conéctate a tu servidor y navega a un directorio donde alojarás tu aplicación, por ejemplo:

/home/usuario/myapp/

Sube todos los archivos y carpetas desde publish a esa ubicación.


Paso 3: Crear un Script Bash para Iniciar la Aplicación

Este script ejecutará tu aplicación desde la ubicación en la que se encuentra en el servidor.

3.1 Crear el script start_myapp.sh

Conéctate a tu servidor vía SSH (si es posible) y crea un archivo de script:

nano /home/usuario/scripts/start_myapp.sh

3.2 Contenido del script

Inserta el siguiente contenido en el archivo:

#!/bin/bash
# Navegar a la carpeta donde está la aplicación
cd /home/usuario/myapp/

# Ejecutar la aplicación y redirigir la salida a un archivo de log
./YourApp >> /home/usuario/myapp/logs/app.log 2>&1
Explicación del script:
  • #!/bin/bash: Indica que este es un script Bash.
  • cd /home/usuario/myapp/: Cambia al directorio donde está tu aplicación publicada.
  • ./YourApp: Ejecuta la aplicación. Asegúrate de reemplazar YourApp por el nombre real de tu ejecutable.
  • >> /home/usuario/myapp/logs/app.log 2>&1: Redirige la salida estándar y los errores a un archivo de log (app.log).

3.3 Hacer el script ejecutable

Ejecuta el siguiente comando para dar permisos de ejecución al script:

chmod +x /home/usuario/scripts/start_myapp.sh

Paso 4: Configurar Cron Job para Ejecutar el Script

4.1 Editar el Crontab

Edita el crontab del usuario que gestionará la ejecución de la aplicación:

crontab -e

4.2 Añadir Cron Job

Añade la siguiente línea al archivo de crontab para que el script se ejecute cada vez que el servidor se reinicie:

@reboot /home/usuario/scripts/start_myapp.sh
  • @reboot: Inicia el script cada vez que el servidor reinicie.
  • */5 * * * *: Si quieres ejecutar el script cada 5 minutos para asegurarte de que la aplicación esté corriendo.

Puedes consultar más opciones de cron en la documentación de Cron Syntax.


Paso 5: Configurar Apache como Proxy Inverso

Apache actuará como un proxy inverso, redirigiendo las solicitudes HTTP a tu aplicación ASP.NET Core que se ejecuta con Kestrel.

5.1 Habilitar módulos de Apache

Si tienes acceso a habilitar módulos, asegúrate de que proxy y proxy_http estén habilitados:

sudo a2enmod proxy
sudo a2enmod proxy_http

5.2 Configurar el archivo de VirtualHost

Edita el archivo de configuración de Apache para tu sitio web, ubicado generalmente en /etc/apache2/sites-available/:

sudo nano /etc/apache2/sites-available/misitio.com.conf

5.3 Configuración del Proxy Inverso

Inserta la siguiente configuración:

<VirtualHost *:80>
    ServerName misitio.com
    ServerAlias www.misitio.com

    # Mantener el nombre de host original
    ProxyPreserveHost On

    # Redirigir solicitudes HTTP a Kestrel en el puerto 5000
    ProxyPass / http://localhost:5000/
    ProxyPassReverse / http://localhost:5000/

    # Logs para depuración
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
  • ProxyPass y ProxyPassReverse: Redirigen las solicitudes a Kestrel, que por defecto escucha en el puerto 5000.

5.4 Reiniciar Apache

Después de configurar Apache, reinicia el servicio para que los cambios surtan efecto:

sudo systemctl restart apache2

Paso 6: Verificar el Despliegue

6.1 Verificar el Cron Job

Para asegurarte de que el Cron job se configuró correctamente, puedes listar los trabajos programados con:

crontab -l

6.2 Verificar que la Aplicación Está Corriendo

Puedes verificar si la aplicación está corriendo en el servidor utilizando:

ps aux | grep YourApp

Si todo está configurado correctamente, deberías ver que la aplicación se está ejecutando.

6.3 Revisar el Archivo de Logs

Para depurar problemas o simplemente monitorear el estado de la aplicación, revisa el archivo de logs:

cat /home/usuario/myapp/logs/app.log

Referencias

  1. Documentación oficial de ASP.NET Core.
  2. Documentación de Apache Proxy.
  3. Crontab Guru - Guía de Cron Syntax.

Con estos pasos, habrás desplegado una aplicación ASP.NET Core auto-contenida en un servidor Apache y la habrás configurado para ejecutarse automáticamente utilizando Cron Jobs.