Infraestructura de producción
Arquitectura de despliegue del proyecto AsamaMX. Todos los servicios corren en Cloudflare con el dominio asamamx.com registrado en Hostinger.
Diagrama general
Hostinger (registrador)
└── Nameservers → Cloudflare DNS
Cloudflare DNS (asamamx.com)
├── asamamx.com / www → Cloudflare Pages (apps/web)
├── studio.asamamx.com → Cloudflare Pages (apps/studio)
├── docs.asamamx.com → Cloudflare Pages (apps/docs)
└── api.asamamx.com → Cloudflare Workers (apps/worker)
Sanity.io
└── Accesible desde studio.asamamx.comDNS
| Campo | Valor |
|---|---|
| Registrador | Hostinger |
| Nameservers | aaden.ns.cloudflare.com, elly.ns.cloudflare.com |
| Gestión DNS | Cloudflare |
Los registros de email (MX, SPF, DMARC, DKIM) apuntan a los servidores de Hostinger Mail y no deben modificarse.
Sanity Studio
| Campo | Valor |
|---|---|
| URL producción | https://studio.asamamx.com |
| Plataforma | Cloudflare Pages |
| Proyecto Pages | sanity-studio-asamamx |
| Rama | main |
| Build command | pnpm --filter @asamamx/studio build |
| Output directory | apps/studio/dist |
| Project ID Sanity | ver .env.local |
| Dataset | production |
Variables de entorno (Cloudflare Pages)
SANITY_STUDIO_API_PROJECT_ID=
SANITY_STUDIO_API_DATASET=Deploy
Cada push a main dispara un build automático en Cloudflare Pages. No se usa sanity deploy — el Studio está autoalojado en el subdominio propio.
Sitio web (apps/web)
| Campo | Valor |
|---|---|
| URL producción | https://asamamx.com |
| Plataforma | Cloudflare Pages |
| Rama | main |
| Build command | pnpm --filter @asamamx/web build |
| Output directory | apps/web/out |
Variables de entorno (Cloudflare Pages)
NEXT_PUBLIC_SANITY_PROJECT_ID=
NEXT_PUBLIC_SANITY_DATASET=
NEXT_PUBLIC_WORKER_URL=
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=
NEXT_PUBLIC_PAYPAL_CLIENT_ID=
NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME=
NEXT_PUBLIC_APP_URL=https://asamamx.comDocumentación (apps/docs)
| Campo | Valor |
|---|---|
| URL producción | https://docs.asamamx.com |
| Plataforma | Cloudflare Pages |
| Rama | main |
| Build command | pnpm --filter @asamamx/docs build |
| Output directory | apps/docs/out |
No requiere variables de entorno. El sitio es estático con búsqueda via Pagefind.
Worker (apps/worker)
| Campo | Valor |
|---|---|
| Plataforma | Cloudflare Workers |
| URL producción | https://api.asamamx.com |
| Nombre | asamamx-worker |
| Deploy | pnpm --filter @asamamx/worker deploy --env=production |
1. Autenticación con Wrangler
Antes de subir secrets o hacer deploy, el desarrollador debe autenticarse con su cuenta de Cloudflare:
pnpm --filter @asamamx/worker exec wrangler loginAbre el navegador para completar el login. Solo se hace una vez por máquina. Para verificar la sesión activa:
pnpm --filter @asamamx/worker exec wrangler whoami2. Configurar secrets
Los secrets se configuran una vez por entorno con wrangler secret put. Cada comando solicita el valor de forma interactiva:
pnpm --filter @asamamx/worker exec wrangler secret put JWT_SECRET --env=production
pnpm --filter @asamamx/worker exec wrangler secret put SUPABASE_URL --env=production
pnpm --filter @asamamx/worker exec wrangler secret put SUPABASE_SECRET_KEY --env=production
pnpm --filter @asamamx/worker exec wrangler secret put PAYPAL_CLIENT_ID --env=production
pnpm --filter @asamamx/worker exec wrangler secret put PAYPAL_CLIENT_SECRET --env=production
pnpm --filter @asamamx/worker exec wrangler secret put RESEND_API_KEY --env=productionSi el Worker no existe aún en Cloudflare, Wrangler preguntará si deseas crearlo — confirmar con
yes.
3. Variables por entorno (wrangler.toml)
Estas variables no son secretas y se versionan en wrangler.toml:
| Variable | Dev | Prod |
|---|---|---|
CORS_ORIGIN | http://localhost:3000 | https://asamamx.com |
PAYPAL_API_URL | https://api-m.sandbox.paypal.com | https://api-m.paypal.com |
4. Deploy
pnpm --filter @asamamx/worker deploy --env=productionOrden de despliegue
Al hacer un release completo desde cero, respetar este orden:
- Worker →
pnpm --filter @asamamx/worker deploy --env=production - Studio → push a
main(Cloudflare Pages lo buildea automáticamente) - Web → push a
main(necesita el Worker y Sanity activos paragenerateStaticParams) - Docs → push a
main(independiente, puede desplegarse en cualquier momento)