Monorepo para el frontend Astro y el backend API.
apps/web: frontend Astro, pensado para Vercel.apps/api: backend Node.js + Fastify + TypeScript, pensado para Render Free.
npm install
npm run dev:web
npm run dev:apiEl frontend corre en http://localhost:4321 y el API en http://localhost:3000.
Copia los ejemplos:
cp apps/api/.env.example apps/api/.env
cp apps/web/.env.example apps/web/.envFrontend local (apps/web/.env):
PUBLIC_SITE_URL=http://localhost:4321
PUBLIC_API_URL=http://localhost:3000- Root Directory:
apps/web - Build Command:
npm run build - Output Directory:
dist - Variable recomendada:
PUBLIC_API_URL=https://tu-api.onrender.com
Render mantiene web services Node.js en plan gratis, con límites mensuales y suspensión por inactividad. Es la opción más apta aquí porque permite correr un servidor Fastify persistente sin adaptar el API a funciones serverless.
- Root Directory:
apps/api - Build Command:
npm install && npm run build - Start Command:
npm run start - Variables:
NODE_ENV=productionDATABASE_URL=postgresql://...API_SECRET=un-secreto-largo-y-aleatorioWEB_ORIGIN=https://tu-front.vercel.appSESSION_TTL_SECONDS=604800AUTH_REGISTER_ENABLED=trueAPI_PUBLIC_URL=https://tu-api.onrender.comMERCADO_PAGO_ACCESS_TOKEN=APP_USR-...MERCADO_PAGO_CURRENCY_ID=CLPMERCADO_PAGO_CHECKOUT_MODE=production
La integracion esta preparada para Checkout Pro sin guardar credenciales en el repo. Mientras MERCADO_PAGO_ACCESS_TOKEN este vacio, el checkout crea el pedido y deja el pago pendiente. Cuando agregues el access token, el backend creara una preferencia en Mercado Pago y redirigira al cliente.
Para pruebas usa cuentas de prueba de Mercado Pago: vendedor y comprador del mismo pais. Configura el backend con el access token del vendedor de prueba y paga entrando con el comprador de prueba en una ventana incognita. El backend redirige a init_point; sandbox_init_point queda solo como respaldo porque el checkout sandbox antiguo puede fallar al tokenizar tarjetas en secure fields.
Endpoints preparados:
POST /api/payments/mercadopago/preferences: crea preferencia para un pedido.POST /api/payments/mercadopago/webhook: recibe notificaciones de pago.
Para produccion, configura en Mercado Pago el webhook hacia:
https://tu-api.onrender.com/api/payments/mercadopago/webhook
Nota: el catalogo, checkout y Mercado Pago quedan configurados para operar en CLP.
- Usa
NODE_ENV=production; la API rechazara iniciar sinDATABASE_URLo conAPI_SECRETdebil. API_SECRETdebe ser aleatorio y de al menos 32 caracteres.WEB_ORIGINdebe ser el dominio exacto del frontend, nunca*.- Si no quieres registro publico de clientes, configura
AUTH_REGISTER_ENABLED=false. - Los intentos de login y registro tienen rate limit en memoria por IP.
- El webhook de Mercado Pago valida que el pago corresponda a una orden existente, con monto y moneda correctos, antes de marcar el pedido como pagado.
Railway hoy funciona más como trial/créditos y luego plan de pago mínimo; por eso no lo dejé como primera opción gratuita.