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 | El sitio web público, en el momento de la construcción | No. Todos los valores son públicos. |
admin-dashboard/.env | El panel de la agencia, en el momento de 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 el archivo de cada aplicación a partir del .env.example que tiene al lado, que documenta cada variable: cp .env.example .env. Los ejemplos sirven tal cual para una ejecución local, y el inicio con Docker Compose no necesita ningún archivo.
Dónde están los ajustes
Un solo archivo, .env en la carpeta del sitio web, que se lee cuando se construye el sitio web. Todos sus valores son públicos, así que nunca contiene un secreto. Créalo a partir de .env.example, que apunta a una API en http://localhost:8000: cp .env.example .env. Con Docker, pasa los mismos valores como --build-arg.
Dónde están los ajustes
Un solo archivo, .env en la carpeta del panel, que se lee cuando se construye el panel. Todos sus valores son públicos, así que nunca contiene un secreto: las claves de los proveedores están en el .env de la API. Créalo a partir de .env.example, que apunta a una API en http://localhost:8000: cp .env.example .env. Con Docker, pasa los mismos valores como --build-arg.
Dónde están los ajustes
Un solo archivo, .env en la carpeta de la API, que lee la API con yarn dev y un contenedor cuando añades --env-file .env -e NODE_ENV=production a su docker run. Contiene secretos: nunca lo incluyas en un commit. Créalo a partir de .env.example, que documenta cada variable y sirve tal cual para una ejecución local: cp .env.example .env.
La imagen de Docker define sus propios valores por defecto, así que docker run funciona sin archivo: SQLite en /data/database.sqlite, subidas en /data/uploads, CORS_ORIGIN para los dos frontends locales, FRONTEND_URL=http://localhost:3031, PUBLIC_MEDIA_URL=http://localhost:8000/media y SEED_DEMO_DATA=false. Sustituye cualquiera de ellos con -e.
Lo esencial de la API
La API comprueba JWT_SECRET y, en producción, CORS_ORIGIN antes de iniciarse. Si falta alguno o no se puede usar, se detiene con una línea que dice 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 (como en .env.example) o mysql. Sin definir significa MySQL, así que conserva la línea. |
SQLITE_DATABASE | Ruta del archivo SQLite, ./database.sqlite por defecto. |
JWT_SECRET | Firma cada inicio de sesión. Obligatorio. El valor del ejemplo solo se acepta fuera de producción. |
JWT_EXPIRATION | Cuánto dura un inicio de sesión, 7d por defecto. La respuesta del inicio de sesión lo informa como expires_in. |
CORS_ORIGIN | Las direcciones del sitio web y del panel, separadas por comas. Sin definir, solo se permiten http://localhost:3030 y http://localhost:3031, nunca todos los orígenes; obligatorio en producción. |
FRONTEND_URL | La dirección del panel, desde la que se conectan sus notificaciones en directo, http://localhost:3031 cuando no está definida. |
TRUST_PROXY | Opcional. El número de proxies inversos delante de la API, para que los límites por dirección cuenten al visitante real. |
RATE_LIMIT_LOGIN | Opcional. Inicios de sesión fallidos que una dirección puede hacer en 15 minutos antes de 429, 10 por defecto. |
SEED_DEMO_DATA | Lo lee solo la imagen de Docker, en un volumen que aún no tiene base de datos: true la crea con la agencia de demostración, false solo con las tablas. |
Genera tu propio JWT_SECRET con:
node -e "console.log(require('crypto').randomBytes(48).toString('hex'))"Cada función opcional de abajo está desactivada mientras sus líneas en .env.example sigan comentadas.
Usa MySQL en lugar de SQLite
Crea una base de datos vacía y luego configura el controlador y la conexión en el .env de la API:
DB_TYPE=mysql
DB_HOST=localhost
DB_PORT=3306
DB_USERNAME=root
DB_PASSWORD=
DB_DATABASE=velraLuego ejecuta yarn seed para la agencia de demostración, o yarn db:sync para las tablas sin datos. La API en marcha 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 seed:prod o yarn db:sync:prod después de yarn build).
Fotos y subidas
La API sirve ella misma las fotos de la carga inicial, desde public/media/velra, en /media/velra/…. Las subidas desde el panel (fotos de propiedades, fotos de estancias para el estudio, vistas previas amuebladas, fotos de perfil) se guardan en el disco de la API bajo MEDIA_UPLOAD_DIR y se sirven en /media/uploads/…, salvo que se defina un bucket.
PUBLIC_MEDIA_URL=http://localhost:8000/media
MEDIA_UPLOAD_DIR=./public/media/uploadsPUBLIC_MEDIA_URL es la dirección en la que un navegador llega a /media. Cada dirección de foto se construye a partir de ella, y la API traslada a ella las guardadas cuando inicia, así que mover la API conserva todas las fotos. En un servidor, apunta MEDIA_UPLOAD_DIR a almacenamiento persistente; con Docker está en el volumen de datos.
Para enviar las subidas a Cloudflare R2, o a cualquier bucket compatible con S3, define las cinco variables. Da a ambos frontends el host público del bucket mediante NEXT_PUBLIC_MEDIA_HOSTNAME (con Docker Compose, MEDIA_HOSTNAME) para que Next.js redimensione esas fotos.
R2_ACCESS_KEY_ID=your-r2-access-key-id
R2_SECRET_ACCESS_KEY=your-r2-secret-access-key
R2_ENDPOINT=https://your-account-id.r2.cloudflarestorage.com
R2_BUCKET_NAME=your-bucket-name
R2_PUBLIC_URL=https://your-public-url.r2.devLas fotos se recodifican al subirlas, con un ancho máximo de 1920 píxeles, y con una copia más pequeña para las tarjetas de propiedad. Los vídeos se aceptan como MP4, WebM, MOV o M4V, hasta 150 MB.
Sitio web público y panel de la agencia
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 incluido /api, http://localhost:8000/api por defecto. |
NEXT_PUBLIC_SITE_URL | Ambos | La dirección pública del sitio web, http://localhost:3030 por defecto. En el sitio web se construyen a partir de ella las URL canónicas, las alternativas de idioma, las tarjetas para compartir, robots.txt y el mapa del sitio; en el panel, el enlace "View website" y la vista previa del anuncio. |
NEXT_PUBLIC_MEDIA_HOSTNAME | Ambos | Opcional. Los hosts https que sirven las fotos, separados por comas: el host público de tu bucket, como pub-1234.r2.dev, el dominio de la API, o ambos. Next.js redimensiona las fotos en ellos; cualquier otra foto se carga tal cual. Solo hosts, sin https://. Ambas aplicaciones leen la misma lista, así que un valor sirve para las dos. Déjalo vacío mientras la API funcione en localhost. |
NEXT_PUBLIC_WEBSOCKET_BASE_URL | Panel | La dirección de la API sin /api, para las notificaciones en tiempo real. |
NEXT_PUBLIC_MAP_STYLE_LIGHT, NEXT_PUBLIC_MAP_STYLE_DARK | Panel | Estilos opcionales de teselas del mapa. Sin definir, ambos temas dibujan el estilo Positron de OpenFreeMap, que no necesita clave. |
NEXT_PUBLIC_PLACE_SEARCH_URL | Panel | La búsqueda de lugares en la pestaña Ubicación del editor de propiedades, https://photon.komoot.io/api en .env.example. Sirve cualquier geocodificador que responda con la misma forma. |
API_INTERNAL_URL | Sitio web | Opcional, solo servidor, se lee en tiempo de ejecución y no en el de construcción. Dónde llega a la API el propio servidor del sitio web cuando la dirección del navegador no funciona desde dentro, como en Docker (http://api:8000/api en Docker Compose). Déjalo sin definir en otros casos. |
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 del sitio web también son valores NEXT_PUBLIC_*: Google Tag Manager, GA4, Meta, TikTok, Snapchat y Pinterest, cada una activada con un solo id.
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 incorporan estos valores al construirse.
| Variable | Valor por defecto | Qué hace |
|---|---|---|
SITE_PORT | 3030 | El puerto del sitio web en tu equipo. |
ADMIN_PORT | 3031 | El puerto del panel en tu equipo. |
API_PORT | 8000 | El puerto de la API en tu equipo. |
SITE_URL, ADMIN_URL, API_URL | Las direcciones locales en esos puertos | Dónde llega el navegador a cada aplicación. Configura las tres cuando sirvas el conjunto en tus propios dominios. |
MEDIA_HOSTNAME | Vacío | Los hosts https que sirven las fotos, separados por comas: el host público de tu bucket (con las variables R2_* de back-end/.env), el propio dominio de la API, o ambos. |
SEED_DEMO_DATA | true | false inicia con tablas vacías y sin cuentas en lugar de la agencia de demostración. Solo importa en un volumen nuevo. |
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 | Vacío | Las etiquetas de marketing del sitio web, todas opcionales. |
NEXT_PUBLIC_ANALYTICS_CURRENCY, NEXT_PUBLIC_ANALYTICS_DEBUG | AED, false | La moneda que se envía con cada precio registrado, y el registro de cada evento en la consola del navegador. |
NEXT_PUBLIC_MAP_STYLE_LIGHT, NEXT_PUBLIC_MAP_STYLE_DARK, NEXT_PUBLIC_PLACE_SEARCH_URL | Vacío | Las teselas del mapa y la búsqueda de lugares del panel; vacío usa OpenFreeMap y Photon. |
Cambia un puerto cuando otro programa ya lo usa, como ADMIN_PORT=3041. El CORS_ORIGIN, el FRONTEND_URL y el PUBLIC_MEDIA_URL de la API, y las direcciones de la API y del sitio web de los frontends, se construyen todos a partir de los puertos y las tres direcciones, así que los siguen por sí solos.
La API en contenedor también lee back-end/.env cuando existe, así que las claves opcionales se definen en un solo lugar para yarn dev y para Docker. El archivo compose gana en los valores que difieren dentro de un contenedor: la ruta de la base de datos, la carpeta de subidas, el puerto, NODE_ENV=production y las direcciones anteriores. La base de datos y las subidas están en el volumen velra-data.
Funciones de IA
Incluido con tu compra. Inicia sesión para leerlo o ábrelo en tu descarga.
Activar el asistente de IA y el estudio de amueblado con IA: las claves de los proveedores y el modelo de imágenes.
El servidor MCP
Incluido con tu compra. Inicia sesión para leerlo o ábrelo en tu descarga.
Permitir que los agentes de programación y otros clientes MCP usen las herramientas del asistente: la clave y el endpoint.
Modo demostración
Incluido con tu compra. Inicia sesión para leerlo o ábrelo en tu descarga.
El interruptor de una demostración pública, y por qué se queda desactivado en una agencia real.