RADIA — Despliegue
Última actualización: 2026-04-13
Requisitos previos
- Node.js 18+
- npm 9+
- Cuenta Cloudflare con acceso a Pages, D1 y R2
- Wrangler CLI:
npm install -g wrangler(o usanpx wrangler)
Desarrollo local
# Instalar dependencias
npm install
# Servidor de desarrollo Astro (solo frontend, sin Workers)
npm run dev
# Preview con Workers locales (simula D1 + R2)
npm run preview
npm run previewejecutawrangler pages dev distque crea bases D1 locales en.wrangler/.
Build
# TypeScript check + Astro build
npm run build
Genera la carpeta dist/ con:
- Páginas HTML estáticas
- Assets JS/CSS con hashes
_headers,_redirects,_routes.json
Deploy
Opción 1: npm script
npm run deploy
Esto ejecuta astro build && wrangler pages deploy dist --project-name=radia.
Opción 2: Manual
npx astro build
npx wrangler pages deploy dist --project-name=radia
Cache busting
Astro genera hashes automáticos en los nombres de archivo (StudyExplorer.CRHPTp36.js), así que los assets se invalidan automáticamente. Para forzar la recarga de HTML, se pueden usar los headers en _headers:
/*
Cache-Control: public, max-age=0, must-revalidate
Configuración Cloudflare
Proyecto Pages
- Nombre:
radia - Dominio:
radia.cadences.app(custom domain) - Build command:
npm run build - Build output:
dist - Framework preset: None (Astro)
Bindings (wrangler.toml)
[[d1_databases]]
binding = "DB"
database_name = "projectos-db"
database_id = "c900f857-bafd-4c88-a645-880d61f5059a"
[[r2_buckets]]
binding = "DICOM_STORAGE"
bucket_name = "radia-dicom"
Variables de entorno
Configurar en Cloudflare Dashboard → Pages → radia → Settings → Environment variables:
Production
| Variable | Descripción | Obligatoria |
|---|---|---|
GEMINI_API_KEY |
Google AI Studio API key | ✅ |
GOOGLE_CLIENT_ID |
Google OAuth2 Client ID | ✅ |
JWT_SECRET |
Secreto para firmar tokens (min 32 chars) | ✅ |
GROQ_API_KEY |
Groq API key (Llama 4 Scout fallback + Asteroid specialist) | ✅ |
Seguridad: Marcar todas las variables como "Encrypted" en el dashboard.
Base de datos D1
Aplicar migraciones
# Local
npx wrangler d1 execute projectos-db --local --file=migrations/001_radia_schema.sql
# Producción
npx wrangler d1 execute projectos-db --remote --file=migrations/001_radia_schema.sql
Verificar schema
npx wrangler d1 execute projectos-db --remote --command="SELECT name FROM sqlite_master WHERE type='table' AND name LIKE 'radia_%'"
Tablas esperadas:
radia_usersradia_studiesradia_findingsradia_chat_messagesradia_analysis_jobsradia_share_linksradia_reports
Bucket R2
Crear bucket
npx wrangler r2 bucket create radia-dicom
Verificar
npx wrangler r2 bucket list
Limpieza de objetos huérfanos
Si se necesita limpiar archivos de estudios eliminados manualmente:
# Listar objetos de un prefijo
npx wrangler r2 object list radia-dicom --prefix="usr_abc/study_xyz/"
# Eliminar
npx wrangler r2 object delete radia-dicom --key="usr_abc/study_xyz/slices/0000.dcm"
Google OAuth2
Configuración
- Ir a Google Cloud Console → Credentials
- Crear OAuth 2.0 Client ID (tipo Web application)
- Authorized JavaScript origins:
https://radia.cadences.app - Authorized redirect URIs:
https://radia.cadences.app(no se usa redirect, es popup) - Copiar Client ID a variable de entorno
GOOGLE_CLIENT_ID
Modo Asteroide
Requiere GEMINI_API_KEY + GROQ_API_KEY. Ambos deben estar configurados para que el consenso cruzado funcione.
En modo Asteroide, Gemini actúa como analista principal y Groq como especialista en segunda opinión con un system prompt diferente.
Monitorización
Logs de Workers
npx wrangler pages deployment tail --project-name=radia
Errores comunes
| Error | Causa | Solución |
|---|---|---|
Database not configured |
Binding DB no enlazado |
Verificar wrangler.toml + redeploy |
Storage not configured |
Binding DICOM_STORAGE no enlazado |
Verificar wrangler.toml + redeploy |
No AI vision provider |
Ninguna API key configurada | Añadir GEMINI_API_KEY |
Token expired |
JWT expirado (24h) | Re-login con Google |
Invalid audience |
GOOGLE_CLIENT_ID no coincide |
Verificar variable |
Enlace expirado |
Share link caducado | Crear nuevo enlace |
Estructura de deploys
Cloudflare Pages (radia)
├── Production: radia.cadences.app
├── Preview: {hash}.radia.pages.dev (cada deploy)
└── Branch deploys: automáticos desde GitHub (si configurado)
Cada deploy genera una URL de preview única. Usar para testing antes de promover a producción.