Deploy y entornos
Comando
Sección titulada «Comando»cd emaeminpm installnpm run deploy # = wrangler deployHosting
Sección titulada «Hosting»Cloudflare Workers (single worker). Sin assets estáticos: emaemi expone sólo API.
Secrets requeridos
Sección titulada «Secrets requeridos»Set vía wrangler secret put <NOMBRE>:
| Secret | Para qué |
|---|---|
ANTHROPIC_API_KEY | Llamadas a Claude (requerido) |
EMAHEALTH_API_KEY | Identifica al cliente emahealth (emi_5bba56a1…) |
EMACLINIC_API_KEY | Identifica al cliente emaclinic (emi_81dccf8d…) |
EMAVAULT_API_KEY | Identifica al cliente emavault (emi_66d6c5…) |
FHIR_SERVER_URL | URL de Aidbox |
FHIR_CLIENT_ID | OAuth client de Aidbox |
FHIR_CLIENT_SECRET | OAuth secret de Aidbox |
FHIR_TOKEN_URL | Endpoint de token de Aidbox |
VAULT_SUPABASE_URL | Supabase emahub |
VAULT_SUPABASE_KEY | Service role para Vault tools |
Custom domain
Sección titulada «Custom domain»Pendiente de mapear. Hoy el worker responde en
emaemi.cristian-ruiz-mti.workers.dev. Los productos cliente apuntan a
esa URL en su variable EMI_API_URL.
Lecciones operativas (gotchas conocidos)
Sección titulada «Lecciones operativas (gotchas conocidos)»- Wrangler secrets son por worker. Si corrés
wrangler secret putestando en otro directorio, lo aplica al worker equivocado. Siemprecd emaemi/antes. @anthropic-ai/sdkno funciona en CF Workers. El SDK falla por el bundling de runtime. Usar fetch nativo (lib/claude.ts).- No hardcodear URLs en build time. Romper esto complica deploys de OpenNext en otros productos.
- Frontend siempre debe usar
apiFetch, no fetch directo. Así el token Supabase del usuario viaja al worker proxy y de ahí a emaemi.
Observabilidad
Sección titulada «Observabilidad»- Cloudflare observability habilitado en
wrangler.toml. - Token counting de Claude en cada response (input/output) loggeado para control de costos.
Vitest con coverage. Estructura:
tests/├── unit/├── integration/└── fixtures/Sin GitHub Actions: tests se corren localmente antes de deploy
(npm test).