Descripción General
Esta guía lo lleva a través de la implementación de CaseBender en Microsoft Azure utilizando Azure Container Apps, Azure Database for PostgreSQL, y Azure Cache for Redis.
Prerrequisitos
- Cuenta de Azure
- Azure CLI instalado y configurado
- Docker instalado
Paso 1: Configuración Inicial
Instalar y Configurar Azure CLI
# Usando Homebrew
brew install azure-cli
# Iniciar sesión en Azure
az login
Configurar Variables de Entorno
# Definir variables para recursos
RESOURCE_GROUP="casebender-rg"
LOCATION="eastus"
CONTAINER_APP_ENV="casebender-env"
POSTGRES_SERVER="casebender-db"
REDIS_CACHE="casebender-redis"
STORAGE_ACCOUNT="casebenderstorage"
ACR_NAME="casebenderregistry"
Paso 2: Crear Grupo de Recursos
# Crear grupo de recursos
az group create --name $RESOURCE_GROUP --location $LOCATION
Paso 3: Configurar Almacenamiento
Crear Cuenta de Almacenamiento
# Crear cuenta de almacenamiento
az storage account create \
--name $STORAGE_ACCOUNT \
--resource-group $RESOURCE_GROUP \
--location $LOCATION \
--sku Standard_LRS \
--kind StorageV2 \
--enable-hierarchical-namespace false
# Crear contenedor de almacenamiento
az storage container create \
--name "uploads" \
--account-name $STORAGE_ACCOUNT \
--auth-mode login
Obtener Cadena de Conexión
# Obtener cadena de conexión
STORAGE_CONNECTION_STRING=$(az storage account show-connection-string \
--name $STORAGE_ACCOUNT \
--resource-group $RESOURCE_GROUP \
--query connectionString \
--output tsv)
echo $STORAGE_CONNECTION_STRING
Paso 4: Configurar Base de Datos
Crear Servidor PostgreSQL
# Crear servidor PostgreSQL
az postgres server create \
--name $POSTGRES_SERVER \
--resource-group $RESOURCE_GROUP \
--location $LOCATION \
--admin-user casebender_admin \
--admin-password "SuContraseñaSegura123!" \
--sku-name GP_Gen5_2 \
--version 13
# Configurar reglas de firewall
az postgres server firewall-rule create \
--resource-group $RESOURCE_GROUP \
--server $POSTGRES_SERVER \
--name AllowAllAzureIPs \
--start-ip-address 0.0.0.0 \
--end-ip-address 0.0.0.0
# Crear base de datos
az postgres db create \
--resource-group $RESOURCE_GROUP \
--server-name $POSTGRES_SERVER \
--name casebender
Obtener Cadena de Conexión
# Obtener cadena de conexión
POSTGRES_HOST="$POSTGRES_SERVER.postgres.database.azure.com"
POSTGRES_USER="casebender_admin@$POSTGRES_SERVER"
POSTGRES_PASSWORD="SuContraseñaSegura123!"
POSTGRES_DB="casebender"
POSTGRES_URL="postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@$POSTGRES_HOST:5432/$POSTGRES_DB?sslmode=require"
echo $POSTGRES_URL
Paso 5: Configurar Redis Cache
# Crear instancia de Redis
az redis create \
--name $REDIS_CACHE \
--resource-group $RESOURCE_GROUP \
--location $LOCATION \
--sku Basic \
--vm-size C0
# Obtener claves de Redis
REDIS_KEY=$(az redis list-keys \
--name $REDIS_CACHE \
--resource-group $RESOURCE_GROUP \
--query primaryKey \
--output tsv)
REDIS_HOST="$REDIS_CACHE.redis.cache.windows.net"
REDIS_PORT=6380
REDIS_URL="rediss://:$REDIS_KEY@$REDIS_HOST:$REDIS_PORT"
echo $REDIS_URL
Paso 6: Configurar Azure Container Registry
# Crear registro de contenedores
az acr create \
--name $ACR_NAME \
--resource-group $RESOURCE_GROUP \
--sku Basic \
--admin-enabled true
# Iniciar sesión en ACR
az acr login --name $ACR_NAME
# Obtener credenciales
ACR_USERNAME=$(az acr credential show \
--name $ACR_NAME \
--query username \
--output tsv)
ACR_PASSWORD=$(az acr credential show \
--name $ACR_NAME \
--query "passwords[0].value" \
--output tsv)
echo "Usuario: $ACR_USERNAME"
echo "Contraseña: $ACR_PASSWORD"
Paso 7: Preparar Imágenes de Docker
# Extraer imágenes de CaseBender
docker pull casebender/casebender:latest
docker pull casebender/workflow-processor:latest
docker pull casebender/misp-processor:latest
# Etiquetar imágenes para ACR
docker tag casebender/casebender:latest ${ACR_NAME}.azurecr.io/casebender/app:latest
docker tag casebender/workflow-processor:latest ${ACR_NAME}.azurecr.io/casebender/workflow-processor:latest
docker tag casebender/misp-processor:latest ${ACR_NAME}.azurecr.io/casebender/misp-processor:latest
# Subir imágenes a ACR
docker push ${ACR_NAME}.azurecr.io/casebender/app:latest
docker push ${ACR_NAME}.azurecr.io/casebender/workflow-processor:latest
docker push ${ACR_NAME}.azurecr.io/casebender/misp-processor:latest
Paso 8: Crear Entorno de Container Apps
# Crear entorno de Container Apps
az containerapp env create \
--name $CONTAINER_APP_ENV \
--resource-group $RESOURCE_GROUP \
--location $LOCATION
Paso 9: Implementar Aplicaciones de Contenedor
Implementar Aplicación Principal
# Implementar aplicación principal
az containerapp create \
--name casebender-app \
--resource-group $RESOURCE_GROUP \
--environment $CONTAINER_APP_ENV \
--image ${ACR_NAME}.azurecr.io/casebender/app:latest \
--registry-server ${ACR_NAME}.azurecr.io \
--registry-username $ACR_USERNAME \
--registry-password $ACR_PASSWORD \
--target-port 3000 \
--ingress external \
--min-replicas 1 \
--max-replicas 3 \
--env-vars \
"POSTGRES_PRISMA_URL=$POSTGRES_URL" \
"REDIS_URL=$REDIS_URL" \
"STORAGE_CONNECTION_STRING=$STORAGE_CONNECTION_STRING" \
"NODE_ENV=production"
Implementar Procesador de Flujo de Trabajo
# Implementar procesador de flujo de trabajo
az containerapp create \
--name casebender-workflow-processor \
--resource-group $RESOURCE_GROUP \
--environment $CONTAINER_APP_ENV \
--image ${ACR_NAME}.azurecr.io/casebender/workflow-processor:latest \
--registry-server ${ACR_NAME}.azurecr.io \
--registry-username $ACR_USERNAME \
--registry-password $ACR_PASSWORD \
--ingress internal \
--min-replicas 1 \
--max-replicas 2 \
--env-vars \
"POSTGRES_PRISMA_URL=$POSTGRES_URL" \
"REDIS_URL=$REDIS_URL" \
"STORAGE_CONNECTION_STRING=$STORAGE_CONNECTION_STRING" \
"NODE_ENV=production"
Implementar Procesador MISP
# Implementar procesador MISP
az containerapp create \
--name casebender-misp-processor \
--resource-group $RESOURCE_GROUP \
--environment $CONTAINER_APP_ENV \
--image ${ACR_NAME}.azurecr.io/casebender/misp-processor:latest \
--registry-server ${ACR_NAME}.azurecr.io \
--registry-username $ACR_USERNAME \
--registry-password $ACR_PASSWORD \
--ingress internal \
--min-replicas 1 \
--max-replicas 2 \
--env-vars \
"POSTGRES_PRISMA_URL=$POSTGRES_URL" \
"REDIS_URL=$REDIS_URL" \
"STORAGE_CONNECTION_STRING=$STORAGE_CONNECTION_STRING" \
"NODE_ENV=production"
Paso 10: Configurar Dominio Personalizado y SSL
Obtener URL de la Aplicación
# Obtener URL de la aplicación
APP_URL=$(az containerapp show \
--name casebender-app \
--resource-group $RESOURCE_GROUP \
--query properties.configuration.ingress.fqdn \
--output tsv)
echo "URL de la aplicación: https://$APP_URL"
Configurar Dominio Personalizado
# Crear zona DNS
az network dns zone create \
--name su-dominio.com \
--resource-group $RESOURCE_GROUP
# Agregar registro CNAME
az network dns record-set cname create \
--name casebender \
--zone-name su-dominio.com \
--resource-group $RESOURCE_GROUP
az network dns record-set cname set-record \
--record-set-name casebender \
--zone-name su-dominio.com \
--resource-group $RESOURCE_GROUP \
--cname $APP_URL
# Verificar registros DNS
az network dns record-set list \
--zone-name su-dominio.com \
--resource-group $RESOURCE_GROUP
Configurar Certificado SSL
# Crear certificado administrado
az containerapp hostname add \
--name casebender-app \
--resource-group $RESOURCE_GROUP \
--hostname casebender.su-dominio.com
az containerapp hostname bind \
--name casebender-app \
--resource-group $RESOURCE_GROUP \
--hostname casebender.su-dominio.com \
--environment $CONTAINER_APP_ENV \
--validation-method CNAME
Monitoreo y Mantenimiento
Configurar Monitoreo
# Crear espacio de trabajo de Log Analytics
az monitor log-analytics workspace create \
--resource-group $RESOURCE_GROUP \
--workspace-name casebender-logs
# Obtener ID del espacio de trabajo
WORKSPACE_ID=$(az monitor log-analytics workspace show \
--resource-group $RESOURCE_GROUP \
--workspace-name casebender-logs \
--query id \
--output tsv)
# Configurar diagnóstico
az monitor diagnostic-settings create \
--name casebender-diagnostics \
--resource $(az containerapp show \
--name casebender-app \
--resource-group $RESOURCE_GROUP \
--query id \
--output tsv) \
--workspace $WORKSPACE_ID \
--logs '[{"category": "ContainerAppConsoleLogs", "enabled": true}]' \
--metrics '[{"category": "AllMetrics", "enabled": true}]'
Configurar Alertas
# Crear regla de alerta
az monitor metrics alert create \
--name casebender-cpu-alert \
--resource-group $RESOURCE_GROUP \
--scopes $(az containerapp show \
--name casebender-app \
--resource-group $RESOURCE_GROUP \
--query id \
--output tsv) \
--condition "avg CPU > 75" \
--description "Alerta cuando el uso de CPU supera el 75%" \
--evaluation-frequency 1m \
--window-size 5m \
--severity 2
Solución de Problemas
Problemas Comunes
-
Errores de Conexión a Base de Datos:
- Verifique las reglas de firewall de PostgreSQL
- Confirme que las cadenas de conexión sean correctas
- Verifique que la base de datos esté en ejecución
-
Problemas de Implementación de Container Apps:
- Revise los registros de la aplicación
- Verifique que las variables de entorno estén configuradas correctamente
- Confirme que las imágenes de Docker sean accesibles desde ACR
-
Problemas de Rendimiento:
- Ajuste las réplicas mínimas y máximas
- Considere aumentar los recursos asignados
- Revise las métricas de rendimiento en Azure Monitor
Siguientes Pasos
- Configure copias de seguridad automáticas para PostgreSQL
- Implemente un pipeline de CI/CD con Azure DevOps
- Configure reglas de escalado automático basadas en métricas personalizadas
- Implemente Azure Front Door para protección adicional y distribución global