Saltar al contenido principal

Despliegue

Infraestructura Azure

Componentes y Servicios

ComponenteServicio AzureDominio / URL
Web AppContainer Appsadmin.recuperacionintegral.com
WorkerContainer Apps (solo interno)— (sin ingress externo)
DocumentaciónStatic Web Appsdocs.recuperacionintegral.com
Base de DatosAzure SQL*.database.windows.net
AlmacenamientoBlob Storage*.blob.core.windows.net
RegistryContainer Registryleancollection.azurecr.io

Script de Despliegue

El archivo deploy.ps1 automatiza todo el proceso:

# Desplegar todo (web + worker + docs)
./deploy.ps1

# Solo la aplicación web
./deploy.ps1 -WebOnly

# Solo el worker
./deploy.ps1 -WorkerOnly

# Solo la documentación
./deploy.ps1 -DocsOnly

Procedimiento Completo de Despliegue

Paso 1: Migraciones de Base de Datos

:::warning Orden Importante Ejecutar migraciones ANTES del despliegue de la aplicación. La nueva versión del código puede depender del nuevo schema. :::

# En SSMS o Azure Data Studio:
# 1. Conectar a Azure SQL
# 2. Ejecutar scripts pendientes en orden cronológico

# Ejemplo:
prisma/migrations/add-new-feature.sql
prisma/migrations/seed-new-data.sql

Paso 2: Desplegar Aplicación Web

./deploy.ps1 -WebOnly

Acciones realizadas:

  1. docker build con Dockerfile → imagen de la web app
  2. docker tag + docker push a leancollection.azurecr.io
  3. Sincroniza variables de entorno desde .env.local
  4. az containerapp update con la nueva imagen
  5. Espera a que el health check pase

Paso 3: Desplegar Worker

./deploy.ps1 -WorkerOnly

Acciones realizadas:

  1. docker build con Dockerfile.worker → imagen del worker
  2. Push a ACR
  3. az containerapp update del worker container
  4. POST a /health para verificar que arrancó

Paso 4: Desplegar Documentación

./deploy.ps1 -DocsOnly

Acciones realizadas:

  1. cd docs-site && npm run build
  2. Upload del contenido estático a Azure Static Web Apps
  3. Verifica que la URL responda correctamente

Variables de Entorno

Se sincronizan automáticamente durante el despliegue. Las principales:

VariableValorDescripción
DATABASE_URL(connection string)Conexión a Azure SQL
NEXTAUTH_URLhttps://admin.recuperacionintegral.comURL base de NextAuth
NEXTAUTH_SECRET(secret)Secret para firmar JWTs
WORKER_URLhttp://lean-collection-workerURL interna del worker
AZURE_STORAGE_CONNECTION_STRING(connection string)Blob Storage
AZURE_STORAGE_CONTAINER_NAMEimport-filesContainer de archivos
tip

Las variables sensibles (secrets) se configuran como secretos en Container Apps y se referencian en la configuración del container.

Post-Despliegue

Verificaciones

# Ver logs en tiempo real
az containerapp logs show \
--name lean-collection-app \
--resource-group lean-collection-reloaded \
--follow

# Verificar health del worker
az containerapp exec \
--name lean-collection-worker \
--resource-group lean-collection-reloaded \
--command "curl http://localhost:3001/health"

Consideraciones

  • Los usuarios con sesión activa serán forzados a re-loguearse si hay cambios en el esquema del JWT
  • El worker ejecuta processPendingJobsOnStartup() al arrancar → recupera jobs interrumpidos
  • Si hay jobs "processing" con >30 min sin actividad, se re-procesan automáticamente

Rollback de Despliegue

Si algo sale mal, revertir a la revisión anterior:

# Ver revisiones disponibles
az containerapp revision list \
--name lean-collection-app \
--resource-group lean-collection-reloaded

# Activar revisión anterior
az containerapp revision activate \
--name lean-collection-app \
--resource-group lean-collection-reloaded \
--revision <nombre-revision-anterior>

# Redirigir tráfico a la revisión anterior
az containerapp ingress traffic set \
--name lean-collection-app \
--resource-group lean-collection-reloaded \
--revision-weight <nombre-revision-anterior>=100

:::warning Rollback de Migraciones SQL Las migraciones SQL no se revierten automáticamente. Si la migración es incompatible hacia atrás, se necesita un script de rollback manual. :::

Monitoreo

Qué monitorearCómo
Errores de la aplicaciónContainer Apps → Logs → Query errors
Jobs fallidosTabla ImportJobs / ExportJobs con Status='failed'
Health del workerGET /health (debe responder 200)
Uso de recursosContainer Apps → Metrics → CPU/Memory
Blob StorageLifecycle policies (90 días retención exports)