Desplegar como una Web App de Azure

Idioma: Español
Este artículo se ha traducido del inglés mediante IA y puede contener errores. Sus comentarios nos ayudarán a mejorar.

Esta guía le explica cómo desplegar el Servidor Autogestionado de ActivityInfo como una Web App de Azure para Contenedores, utilizando la imagen oficial de Docker. Está dirigida a profesionales de TI que estén familiarizados con Microsoft Azure.

Antes de empezar

El Servidor Autogestionado de ActivityInfo almacena sus datos en una base de datos SQLite. Esto tiene dos consecuencias para un despliegue de Web App de Azure:

  • Debe adjuntar un volumen persistente para la base de datos, porque el sistema de archivos propio de una Web App se reinicia cada vez que el contenedor se reinicia o se mueve.
  • Debe ejecutar una única instancia. El servidor está diseñado para escalar verticalmente, no horizontalmente: para soportar más usuarios concurrentes, dé a la instancia más núcleos de CPU y memoria en lugar de añadir instancias.

Azure App Service también termina la conexión HTTPS por usted y reenvía HTTP plano al contenedor. Por lo tanto, debe ejecutar ActivityInfo en modo proxy HTTPS.

Los pasos siguientes utilizan la CLI de Azure. Si lo prefiere, puede realizar los mismos pasos desde el portal de Azure. Primero inicie sesión con:

az login

Establecer variables

Los comandos de esta guía reutilizan algunos valores. Establézcalos una vez, eligiendo sus propios nombres de aplicación y cuenta de almacenamiento globalmente únicos:

RESOURCE_GROUP=activityinfo-rg
LOCATION=westeurope
PLAN=activityinfo-plan
APP=my-activityinfo
STORAGE_ACCOUNT=aistorage$RANDOM
SHARE=activityinfo-data

Crear un grupo de recursos

az group create --name $RESOURCE_GROUP --location $LOCATION

Crear un plan de App Service de Linux

Cree un plan de Linux con un único trabajador. Se requiere el nivel Básico B1 o superior para el almacenamiento personalizado, un dominio personalizado y el ajuste "Always On".

az appservice plan create \
  --name $PLAN \
  --resource-group $RESOURCE_GROUP \
  --location $LOCATION \
  --is-linux \
  --sku B1 \
  --number-of-workers 1

Crear un recurso compartido de archivos para la base de datos

Cree una cuenta de almacenamiento y un recurso compartido de Azure Files. ActivityInfo almacena su base de datos SQLite y config.ini en este recurso compartido, para que los datos sobrevivan a reinicios y redespliegues.

az storage account create \
  --name $STORAGE_ACCOUNT \
  --resource-group $RESOURCE_GROUP \
  --location $LOCATION \
  --sku Standard_LRS

az storage share-rm create \
  --resource-group $RESOURCE_GROUP \
  --storage-account $STORAGE_ACCOUNT \
  --name $SHARE \
  --quota 10

Crear la aplicación web

Cree la aplicación web a partir de la imagen oficial de ActivityInfo en Docker Hub:

az webapp create \
  --resource-group $RESOURCE_GROUP \
  --plan $PLAN \
  --name $APP \
  --container-image-name activityinfo/activityinfo:5.0.0

Montar el recurso compartido de archivos

Monte el recurso compartido de archivos en el contenedor en /data. Primero lea la clave de la cuenta de almacenamiento, y luego añada el montaje:

STORAGE_KEY=$(az storage account keys list \
  --resource-group $RESOURCE_GROUP \
  --account-name $STORAGE_ACCOUNT \
  --query "[0].value" --output tsv)

az webapp config storage-account add \
  --resource-group $RESOURCE_GROUP \
  --name $APP \
  --custom-id activityinfo-data \
  --storage-type AzureFiles \
  --account-name $STORAGE_ACCOUNT \
  --share-name $SHARE \
  --access-key $STORAGE_KEY \
  --mount-path /data

Configurar ActivityInfo

Establezca los ajustes de la aplicación. WEBSITES_PORT le dice a App Service que el contenedor escucha en el puerto de PC 8081. Las variables ACTIVITYINFO_* ponen el servidor en modo proxy HTTPS y apuntan su directorio de datos al recurso compartido montado.

az webapp config appsettings set \
  --resource-group $RESOURCE_GROUP \
  --name $APP \
  --settings \
    WEBSITES_PORT=8081 \
    ACTIVITYINFO_SERVER_HTTPS_PROXY=TRUE \
    ACTIVITYINFO_SERVER_DOMAIN=$APP.azurewebsites.net \
    ACTIVITYINFO_DATA_DATA_DIRECTORY=/data

Permita "Always On" para que App Service mantenga el contenedor en ejecución y no lo descargue cuando la aplicación esté inactiva:

az webapp config set \
  --resource-group $RESOURCE_GROUP \
  --name $APP \
  --always-on true

Crear la cuenta de administrador

Azure proporciona un certificado gestionado gratuito para el dominio azurewebsites.net, por lo que la aplicación está disponible a través de HTTPS inmediatamente. Navegue a https://<APP>.azurewebsites.net, donde se le pedirá que cree la primera cuenta de usuario administrador.

Usar un dominio personalizado

Para servir ActivityInfo desde su propio dominio, añada un dominio personalizado y un certificado gestionado a la aplicación web. A continuación, actualice el ajuste ACTIVITYINFO_SERVER_DOMAIN para que coincida, de modo que los enlaces en los correos electrónicos de notificación utilicen la dirección correcta:

az webapp config appsettings set \
  --resource-group $RESOURCE_GROUP \
  --name $APP \
  --settings ACTIVITYINFO_SERVER_DOMAIN=activityinfo.example.gov

Rendimiento del almacenamiento

El recurso compartido de archivos montado anteriormente es Azure Files, un sistema de archivos de red al que el contenedor llega a través del protocolo SMB. Cada lectura y escritura viaja a través de la red, lo que añade latencia en comparación con un disco local. Las bases de datos realizan muchas escrituras pequeñas y síncronas y mantienen bloqueos de archivos durante las transacciones, por lo que son sensibles a esta latencia. En un servidor concurrido, el recurso compartido puede convertirse en el factor limitante de los tiempos de respuesta. Una Web App para Contenedores solo puede adjuntar almacenamiento en red, por lo que esta contrapartida se aplica a cualquier despliegue de instancia única en App Service.

Si necesita un mayor rendimiento de la base de datos, despliegue en Azure Kubernetes Service en su lugar. Allí puede adjuntar un disco gestionado Premium SSD v2 a un único pod, lo que proporciona una latencia cercana a la de un disco local con IOPS configurables, sin dejar de sobrevivir a la pérdida de un nodo.

Próximos pasos

Siga la guía de Configuración para configurar la Entrega de correo electrónico y el Inicio de sesión único a través de la interfaz basada en la web.

Siguiente elemento
Desplegar en Azure Kubernetes Service