1. Introducción
El siguiente artículo explica paso a paso cómo desplegar y mantener distintas aplicaciones .NET en una máquina Linux, administrada con Core-Admin, con un sistema de separación de privilegios, y combinando todo con systemctl y apache2.
El escenario recoge las principales recomendaciones de seguridad y separación de privilegios para permitir ejecutar este tipo de aplicaciones, incluso varias de ellas dentro de la misma máquina, pero con una separación de privilegios para asegurar que fallos de unas no afecten a otras.
2. Requisitos
- Tener una máquina con Core-Admin desplegado (https://www.core-admin.com)
- Disponer de acceso administrador.
3. Primeros pasos
-
Instalamos los paquetes .net para el motor que estemos desarrollando. A continuación instalaremos los asociados a 7.0 y 8.0. Adaptar como corresponda:
# wget https://packages.microsoft.com/config/debian/11/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
# dpkg -i packages-microsoft-prod.deb -
A continuación actualizamos e instalamos el SDK que necesitemos:
# apt update
# apt install -y dotnet-sdk-7.0
# apt install -y dotnet-sdk-8.0 -
Tras instalarlo todo, comprobamos con:
# dotnet --info
SDK DE .NET:
Version: 8.0.403
Commit: c64aa40a71
Workload version: 8.0.400-manifests.18f19b92
MSBuild version: 17.11.9+a69bbaaf5
4. Despliegue de la aplicación
-
Lo primero será crear un alojamiento con el nombre (o nombres) de host que tendrá la aplicación. Este alojamiento es el gestionará el certificado y la localización de IP pública:
-
Más adelante puedes ir añadiendo hosting alias por si necesitas que la misma aplicación gestione distintos nombres.
-
MUY IMPORTANTE: no desplegar la aplicación dentro del html/ (la hará insegura y potencialmente accesible)
IMPORTANTE: Hay que desplegar la aplicación FUERA DEL /html/, en la ruta raíz del alojamiento. Más en los siguientes puntos.
-
Una vez tengas creado el alojamiento, tendrás una ruta tal que: /var/webs/app.aplicaciondotnet.com.
-
Ahora hay que determinar el usuario con el que ejecutará la aplicación y el comando a ejecutar para levantar el servicio. Para ello, entrar en la carpeta asociada al alojamiento y ejecutamos:
# cd /var/webs/app.aplicaciondotnet.com
# ls -la -tr # ver usuarios y grupos (muy importante, la aplicación fuera del /html/)# Apuntamos el grupo y usuario del alojamiento y lo añadimos al procaccess
# adduser procaccess -
A continuación subimos la aplicación por FTP/SSH a una carpeta en el raíz del alojamiento. Para nuestro ejemplo el raíz es /var/webs/app.aplicaciondotnet.com y el nombre de la carpeta podría ser:
/var/webs/app.aplicaciondotnet.com/aplication
…elegir ahí el nombre que mejor convenga para la carpeta de almacenará la aplicación (quizás también siguiendo una mecánica de releases/versión). Una vez definido, subir ahí la aplicación:
- Subir por FTP: Cómo crear usuario FTP para alojamientos web con Core-Admin
- Subir por SSH: Como dar acceso ssh a un alojamiento concreto desde Core-Admin
- Subir/mantener con git: Usando GIT para controlar una o todas las carpetas de tu alojamiento vía FTP -- Core-Admin
…una vez subida la aplicación, ejecutarla con el usuario asociado al alojamiento para verificar que está todo correcto:
# a continuación, nos convertimos el el usuario visto
# su - usuario -s /bin/bash# a continuación probamos la aplicación, normalmente (donde Application.dll dependerá de la aplicación en concreto):
> dotnet Aplication.dll -
Con esto ya tenemos la aplicación subida, el comando de arranque, el usuario asociado al alojamiento y la ruta completa donde se almacena la aplicación. Con ello, creamos un servicio personalizado con las siguientes indicaciones:
Crear y gestionar servicios personalizados systemcl para arranque de servicios con Core-Admin
Introducir los siguientes datos:
Nombre del servicio: app.aplicaciondotnet.com
Descripción: Aplicación application.domain.com
Comando: dotnet Aplication.dll
Directorio de trabajo: /var/webs/app.aplicaciondotnet.com/application
Usuario de ejecución: usuario con el que ejecuta el alojamiento
Grupo de ejecución: grupo con el que ejecuta el alojamiento -
Una vez creado el servicio personalizado lo levantamos con las indicaciones systemctl que nos aparecen en la ficha (o utilizando la propia interfaz).
5. Conexión ProxyPass para el apache2 frontal (certificado SSL, etc)
-
Llegados a este punto ya tenemos la aplicación ejecutando y funcionando en un puerto localhost de la máquina. Muy posiblemente en http://localhost:5000 (aunque este valor se puede cambiar y viene
determinado por el código y configuración de la aplicación .NET). -
Ahora, simplemente nos resta conectar el apache2 frontal con nuestra aplicación .NET. Para ello, pinchamos en la pestaña “Proxy Inverso” y luego "Añadir proxy pass"
Introducimos los siguientes datos:
Ruta: /
URL remota: http://localhost:5000NOTA: la url remota vendrá determinada por cada aplicación. Por defecto arranca en el 5000. Ver la salida del comando donde se informará de la ruta.
-
Llegados a este punto ya tendríamos nuestra aplicación en marcha. Solo resta probar.
6. Añadiendo certificado
Ahora solo resta añadir el certificado. Si no tienes claro los pasos, cuenta con nosotros:
También puedes gestionar tu mismo el certificado con:
7. Actualización de la aplicación.
Para actualizar, simplemente subir la aplicación con el método utilizado y reiniciar la aplicación.
8. Errores conocidos
-
Al arrancar la aplicación aparece el siguiente error:
# dotnet Formulacion.dll
Failed to create CoreCLR, HRESULT: 0x8007000ENOTA: no se ha añadido el usuario del alojamiento al grupo procaccess. Este error es debido a que el binario dotnet no puede acceder al /proc