Variables de entorno
Qué hace cada ajuste de los archivos .env de la API y de los frontends, y cuáles necesitas.
Para el paquete Full Stack
Dónde están los ajustes
| Archivo | Lo lee | Contiene secretos |
|---|---|---|
back-end/.env | La API, con yarn dev y dentro de Docker Compose | Sí. Nunca lo incluyas en un commit. |
storefront/.env | La tienda, durante la construcción | No. Todos los valores son públicos. |
admin-dashboard/.env | El panel de administración, durante la construcción | No. Todos los valores son públicos. |
.env junto a docker-compose.yml | Docker Compose, para el paquete Full Stack | No |
Crea cada archivo a partir del .env.example que tiene al lado, que documenta todas las variables: cp .env.example .env. Los ejemplos funcionan tal cual para una ejecución local.
Dónde están los ajustes
Un solo archivo, storefront/.env, que se lee al construir la tienda. Todos sus valores son públicos, así que nunca contiene un secreto. Omítelo para usar la tienda de ejemplo; créalo a partir de .env.example cuando conectes una API: cp .env.example .env.
Dónde están los ajustes
Un solo archivo, admin-dashboard/.env, que se lee al construir el panel. Todos sus valores son públicos, así que nunca contiene un secreto. Omítelo para usar la tienda de ejemplo; créalo a partir de .env.example cuando conectes una API: cp .env.example .env.
Dónde están los ajustes
Un solo archivo, back-end/.env, que lee la API con yarn dev, y un contenedor cuando se lo pasas con --env-file .env. Contiene secretos: nunca lo subas al repositorio. Créalo a partir de .env.example, que documenta cada variable y funciona tal cual para una ejecución local: cp .env.example .env.
Lo esencial de la API
La API comprueba JWT_SECRET y CORS_ORIGIN antes de iniciarse. Si falta uno o no se puede usar, se detiene con una línea que indica qué corregir.
| Variable | Qué hace |
|---|---|
NODE_ENV | development en local, que crea y actualiza las tablas al iniciarse. production en un servidor en producción, que nunca toca las tablas. |
PORT | El puerto de la API, 8000. Ambos frontends apuntan a él. |
DB_TYPE | sqlite (el predeterminado) o mysql. |
SQLITE_DATABASE | Ruta del archivo SQLite, ./database.sqlite por defecto. |
JWT_SECRET | Firma cada inicio de sesión. Obligatorio. El valor de ejemplo solo se acepta en desarrollo. |
JWT_EXPIRATION | Cuánto dura un inicio de sesión, 7d por defecto. |
CORS_ORIGIN | Las direcciones de la tienda y del panel, separadas por comas. Si no se configura, usa los dos puertos locales; obligatorio en producción. |
FRONTEND_URL | La dirección del panel de administración, desde la que se conectan sus notificaciones en directo. Obligatorio en producción para esas notificaciones. |
TRUST_PROXY | Opcional. Hasta qué punto la API se fía de X-Forwarded-For al contar los intentos de inicio de sesión por visitante. Sin configurar, solo lo lee de un proxy con una dirección privada; false, nunca; un número confía exactamente en esa cantidad de proxies. |
RESEED_REVIEWS | Opcional. 1 hace que yarn seed reescriba las reseñas de los datos iniciales. |
Genera tu propio JWT_SECRET con:
node -e "console.log(require('crypto').randomBytes(48).toString('hex'))"Cualquier credencial de abajo que conserve exactamente su valor de .env.example cuenta como no configurada, así que la función a la que pertenece indica que está desactivada en lugar de fallar en su primera llamada.
Usa MySQL en lugar de SQLite
Crea una base de datos vacía y luego configura el controlador y la conexión en back-end/.env:
DB_TYPE=mysql
DB_HOST=your-mysql-host
DB_PORT=3306
DB_USERNAME=your-mysql-username
DB_PASSWORD=your-mysql-password
DB_DATABASE=your-database-nameDespués ejecuta yarn seed para la tienda de demostración, o yarn db:sync para las tablas sin datos. La API en ejecución solo crea y actualiza las tablas por sí misma cuando NODE_ENV=development, así que con NODE_ENV=production uno de esos comandos se ejecuta antes del primer inicio (yarn db:sync:prod o yarn seed:prod después de yarn build).
Tienda y panel de administración
Cada valor NEXT_PUBLIC_* se compila en el JavaScript que carga el navegador, y cualquiera que abra la página puede leerlo. Nunca pongas un secreto en estos archivos, y reconstruye después de cambiar uno.
| Variable | Aplicación | Qué hace |
|---|---|---|
NEXT_PUBLIC_API_BASE_URL | Ambos | La dirección de la API incluyendo /api, por ejemplo http://localhost:8000/api. Configurarla es lo que desactiva la tienda de ejemplo; vacía o ausente, la aplicación funciona con su tienda de ejemplo. |
NEXT_PUBLIC_MEDIA_HOSTNAME | Ambos | El host público de tu bucket de archivos multimedia, el host de R2_PUBLIC_URL, sin https:// ni barra final. Déjalo vacío hasta que tengas un bucket. |
NEXT_PUBLIC_SITE_URL | Tienda | La dirección pública de la tienda, usada para los enlaces canonical y hreflang, las tarjetas al compartir, los datos estructurados, robots.txt y sitemap.xml. Ponle tu dominio real antes de pasar a producción. |
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY | Tienda | Una clave real pk_test_… o pk_live_…. Vacía, o cualquier cosa que no sea una clave real, desactiva la opción de tarjeta en el pago, y se pide a los compradores que elijan el pago contra reembolso. |
NEXT_PUBLIC_DEMO_CHECKOUT | Tienda | true rellena el pago con un comprador generado, para demostraciones. Déjalo en false para una tienda real. |
API_INTERNAL_URL | Ambos | Opcional, solo en el servidor. Dónde llega a la API el propio servidor de la aplicación cuando es distinto de la dirección del navegador, como dentro de Docker Compose. En los demás casos, déjalo vacío. |
NEXT_PUBLIC_WEBSOCKET_BASE_URL | Panel de administración | La dirección de la API sin /api, para las notificaciones en directo y las actualizaciones de permisos. Opcional: si está vacía, se toma de NEXT_PUBLIC_API_BASE_URL. |
NEXT_PUBLIC_STOREFRONT_URL | Panel de administración | Adónde lleva el enlace "Go to storefront" de la barra de navegación del panel. |
BUILD_STANDALONE | Ambos | true hace que yarn build genere un servidor autónomo, lo que configuran los Dockerfiles. En los demás casos, déjalo sin configurar. |
Las etiquetas de marketing de la tienda también son valores NEXT_PUBLIC_*.
Opciones de Docker Compose
No hay que configurar nada para una ejecución local. Para cambiar algo, ponlo en un archivo .env junto a docker-compose.yml y vuelve a ejecutar docker compose up --build: los frontends compilan estos valores dentro.
| Variable | Qué hace |
|---|---|
SITE_PORT, ADMIN_PORT, API_PORT | Los puertos de tu ordenador: 3030, 3031 y 8000 por defecto. Pon uno cuando otro programa ya use ese puerto, por ejemplo ADMIN_PORT=3041. Las direcciones de abajo, CORS_ORIGIN y FRONTEND_URL los siguen. |
SITE_URL, ADMIN_URL, API_URL | Dónde llega el navegador a cada aplicación. Configura las tres cuando sirvas el conjunto en tus propios dominios; CORS_ORIGIN y FRONTEND_URL de la API se construyen a partir de ellas. |
MEDIA_HOSTNAME | El host público de tu bucket, junto con las variables R2_* en back-end/.env. |
SEED_DEMO_DATA | false empieza con tablas vacías en lugar de la tienda de demostración. |
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY | El formulario de tarjeta de la tienda. |
NEXT_PUBLIC_GTM_ID, NEXT_PUBLIC_GA4_MEASUREMENT_ID, NEXT_PUBLIC_META_PIXEL_ID, NEXT_PUBLIC_TIKTOK_PIXEL_ID, NEXT_PUBLIC_SNAPCHAT_PIXEL_ID, NEXT_PUBLIC_PINTEREST_TAG_ID, NEXT_PUBLIC_ANALYTICS_CURRENCY | Las etiquetas de marketing de la tienda, todas opcionales. |
El contenedor de la API también lee back-end/.env cuando existe, así que las claves de pagos, archivos multimedia e IA se configuran en un solo lugar para yarn dev y para Docker. El archivo compose manda en los pocos valores que cambian dentro de un contenedor: la ruta de la base de datos, el puerto, NODE_ENV=production, CORS_ORIGIN y FRONTEND_URL. Los datos se guardan en el volumen ecommerce-data.
Almacenamiento multimedia
Las fotos de productos, las imágenes de categorías, los avatares, los adjuntos del chat, los resultados del estudio de IA y las fotos del probador se suben a un bucket de Cloudflare R2, o a cualquiera compatible con S3. Configura las cinco variables en back-end/.env y da a ambos frontends el host público del bucket mediante NEXT_PUBLIC_MEDIA_HOSTNAME (con Docker Compose, MEDIA_HOSTNAME).
R2_ACCESS_KEY_ID=
R2_SECRET_ACCESS_KEY=
R2_ENDPOINT=https://your-account-id.r2.cloudflarestorage.com
R2_BUCKET_NAME=
R2_PUBLIC_URL=https://your-public-url.r2.devSin un bucket, yarn seed guarda cada imagen de producto y de categoría como una ruta /mock-media/…, y ambos frontends incluyen esos 35 archivos en public/mock-media/, así que el catálogo se muestra sin subir nada. Solo deja de funcionar la subida de imágenes nuevas: responde 503 hasta que se configure el bucket.
Con un bucket, la carga de datos sube allí las imágenes de su catálogo. Conserva public/mock-media/ en ambos frontends mientras algún producto siga apuntando a ella.
Pagos con tarjeta
Los pagos con tarjeta funcionan con Stripe: STRIPE_SECRET_KEY y STRIPE_WEBHOOK_SECRET en back-end/.env, y NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY para la tienda. Sin ellas no se cobra ningún pago con tarjeta, y el pago contra reembolso funciona con normalidad.
STRIPE_SECRET_KEY=sk_test_your-stripe-secret-key
STRIPE_WEBHOOK_SECRET=whsec_your-webhook-secretCorreo electrónico
La plantilla no incluye ningún sistema de envío de correo, así que nunca se envía ningún mensaje por correo. Fuera de producción, el token de restablecimiento de contraseña de un cliente se escribe en su lugar en el registro de la API; con NODE_ENV=production no va a ningún sitio. Conecta tu propio proveedor de correo antes de pasar a producción: el punto de conexión es forgotPassword en back-end/src/modules/customer-auth/customer-auth.controller.ts.
Funciones de IA
Incluido con tu compra. Inicia sesión para leerlo o ábrelo en tu descarga.
Cómo activar las funciones de IA: las claves de los proveedores, los modelos que usa cada función y lo que cuesta cada una.
La tienda de ejemplo en los frontends
Ambos frontends funcionan sin API. Si se inician o se construyen sin NEXT_PUBLIC_API_BASE_URL, cada uno responde a todas las solicitudes desde una tienda de ejemplo en el navegador y muestra un aviso "Sample data". Configurar la dirección es lo que la desactiva.
- Cualquier correo y contraseña inician sesión como el comprador de ejemplo en la tienda. En el panel, cualquier correo válido con una contraseña de al menos 6 caracteres inicia sesión como Super Admin.
- Los cambios son reales y se guardan en el almacenamiento del navegador, así que sobreviven a una recarga. Para empezar de cero, ejecuta
localStorage.removeItem("mock_db_v1"); location.reload();en la consola del navegador. - El pago en la tienda se completa sin llamar a Stripe.
- En el panel, el asistente de IA y el estudio de IA no están disponibles, porque ambos necesitan las claves de la API.
- Cuando tu API esté en producción,
yarn remove:mocken cualquiera de las dos aplicaciones elimina la tienda de ejemplo y su aviso. Dejapublic/mock-media/en su sitio, porque un backend cargado sin bucket apunta allí sus imágenes.
Cómo funciona la tienda de ejemplo
Incluido con tu compra. Inicia sesión para leerlo o ábrelo en tu descarga.
Cómo se dirigen las solicitudes a la tienda de ejemplo, y cómo cambiarla o ampliarla.
Modo demostración
Incluido con tu compra. Inicia sesión para leerlo o ábrelo en tu descarga.
Cómo ejecutar una demostración pública: el interruptor de demostración, las cuentas por visitante y lo que los visitantes pueden cambiar.
Pasar a producción
Antes de desplegar en cualquier sitio público:
- Configura
NODE_ENV=productiony unJWT_SECRETlargo y aleatorio propio enback-end/.env. - Pon en
CORS_ORIGINlas direcciones de tu tienda y de tu panel, separadas por comas, y enFRONTEND_URLla dirección del panel. - Con una base de datos vacía, ejecuta
yarn build, luegoyarn db:sync:produna vez (oyarn seed:prodpara la tienda de demostración), y despuésyarn start:prod. - Apunta la comprobación de estado de tu proveedor de alojamiento a
/api/health. - Construye cada frontend con
NEXT_PUBLIC_API_BASE_URLapuntando a tu API desplegada y conNEXT_PUBLIC_SITE_URLde la tienda apuntando a su propia dirección. - Cambia la contraseña del Super Admin, o empieza con tablas vacías.
No es para una tienda con pedidos reales
yarn railway:setup construye, descarga el modelo de eliminación de fondo, elimina todas las tablas y carga los datos, cada vez que se ejecuta. Sirve para un despliegue de demostración, nunca como comando de construcción de una tienda en producción.