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

  1. Cuenta de Azure
  2. Azure CLI instalado y configurado
  3. 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

  1. 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
  2. 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
  3. 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

  1. Configure copias de seguridad automáticas para PostgreSQL
  2. Implemente un pipeline de CI/CD con Azure DevOps
  3. Configure reglas de escalado automático basadas en métricas personalizadas
  4. Implemente Azure Front Door para protección adicional y distribución global