Ir al artículo
Aniq-UI

HollinaVariables de entorno

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

ArchivoLo leeContiene secretos
back-end/.envLa API, con yarn dev y dentro de Docker ComposeSí. Nunca lo incluyas en un commit.
storefront/.envEl sitio web de alojamientos, en tiempo de construcciónNo. Todos los valores NEXT_PUBLIC_* son públicos.
admin-dashboard/.envEl panel de reservas, en tiempo de construcciónNo. Todos los valores son públicos.
.env junto a docker-compose.ymlDocker Compose, para el paquete Full StackNo

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 los valores NEXT_PUBLIC_* que contiene son públicos, así que nunca guarda 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 guarda un secreto: las claves de pagos y de IA viven 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, SITE_URL=http://localhost:3030, 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.

VariableQué hace
NODE_ENVdevelopment en local, que crea y actualiza las tablas al iniciarse. production en un servidor en producción, que nunca toca las tablas.
PORTEl puerto de la API, 8000. Ambos frontends apuntan a él.
DB_TYPEsqlite (como en .env.example) o mysql. Sin definir significa MySQL, así que conserva la línea.
SQLITE_DATABASERuta del archivo SQLite, ./database.sqlite por defecto.
JWT_SECRETFirma cada inicio de sesión. Obligatorio. El valor del ejemplo solo se acepta fuera de producción.
JWT_EXPIRATIONCuánto dura un inicio de sesión, 7d por defecto. La respuesta del inicio de sesión lo informa como expires_in.
CORS_ORIGINLas 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_URLLa dirección del panel, desde la que se conectan sus notificaciones en directo, http://localhost:3031 cuando no está definida.
SITE_URLLa dirección del sitio web. Un procesador de pagos devuelve aquí al huésped, a su propia página de reserva, así que tiene que ser la dirección que visita un huésped.
TRUST_PROXYOpcional. El número de proxies inversos delante de la API, para que los límites por dirección (inicio de sesión, reservas, preguntas, reseñas) cuenten al visitante real.
RATE_LIMIT_LOGINOpcional. Inicios de sesión fallidos que una dirección puede hacer en 15 minutos antes de 429, 10 por defecto.
SEED_DEMO_DATASolo lo lee la imagen de Docker, en un volumen que aún no tiene base de datos: true la crea con la empresa de demostración, false solo con las tablas.

Genera tu propio JWT_SECRET con:

Terminal
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.

Pagos

Sin ninguno de estos, el simulador incluido acepta todas las reservas con tarjeta y PayPal, así que todo el proceso de pago funciona sin cuenta de comercio, y el registro de inicio de la API dice Payment simulator active mientras tanto. Confirma esas reservas sin cobrar nada, así que define Stripe, PayPal o ambos antes de recibir reservas reales: entonces el simulador se apaga, el pago ofrece solo los métodos configurados más el pago a la llegada, y se rechaza un método sin procesador. La pestaña Pagos de los ajustes del panel muestra qué procesadores están configurados, si sus claves son de prueba o reales y si se usa el simulador, nunca las claves en sí.

El .env de la API
STRIPE_SECRET_KEY=your-stripe-secret-key
STRIPE_WEBHOOK_SECRET=your-stripe-webhook-signing-secret
PAYPAL_CLIENT_ID=your-paypal-client-id
PAYPAL_CLIENT_SECRET=your-paypal-client-secret
PAYPAL_WEBHOOK_ID=your-paypal-webhook-id
PAYPAL_ENV=sandbox
VariableQué hace
STRIPE_SECRET_KEYActiva los pagos con tarjeta mediante el Checkout alojado de Stripe. Una clave sk_test_ no mueve dinero real.
STRIPE_WEBHOOK_SECRETEl secreto de firma del endpoint de webhook de Stripe, o el que imprime stripe listen. Sin él se rechaza todo webhook de Stripe, así que una reserva con tarjeta nunca se liquida.
PAYPAL_CLIENT_ID, PAYPAL_CLIENT_SECRETActivan PayPal mediante Orders v2; se definen las dos juntas.
PAYPAL_WEBHOOK_IDEl id de la suscripción de webhook de PayPal, que verifica la firma de PayPal.
PAYPAL_ENVsandbox (el valor por defecto) o live.

El pago a la llegada no necesita ninguna clave: es el interruptor allow_pay_on_arrival en la pestaña Pagos del panel, activado en la carga inicial.

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:

El .env de la API
DB_TYPE=mysql
DB_HOST=localhost
DB_PORT=3306
DB_USERNAME=root
DB_PASSWORD=
DB_DATABASE=hollina

Luego ejecuta yarn seed para la empresa 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 seed:prod o yarn db:sync:prod después de yarn build).

Fotografías y subidas

La API sirve ella misma las fotografías de la carga inicial, desde public/media/hollina, en /media/hollina/…. Las subidas desde el panel (fotografías de alojamientos, portadas de destinos, fotos de perfil) se guardan en el disco de la API bajo MEDIA_UPLOAD_DIR y se sirven en /media/uploads/…, salvo que se configure un bucket.

El .env de la API
PUBLIC_MEDIA_URL=http://localhost:8000/media
MEDIA_UPLOAD_DIR=./public/media/uploads

PUBLIC_MEDIA_URL es la dirección a la que se llega a /media desde un navegador. Cada dirección de fotografía se construye a partir de ella, y la API traslada las guardadas a ella al iniciarse, así que mover la API conserva todas las fotografías. En un servidor, apunta MEDIA_UPLOAD_DIR a un 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 fotografías.

El .env de la API
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.dev

Las fotografías se recodifican al subirlas como JPEG, de 1920 píxeles de ancho como máximo, con una copia más pequeña para las tarjetas de alojamientos. Los vídeos se aceptan como MP4, WebM, MOV o M4V, hasta 150 MB.

Sitio web de alojamientos y panel de reservas

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.

VariableAplicaciónQué hace
NEXT_PUBLIC_API_BASE_URLAmbosLa dirección de la API incluido /api, http://localhost:8000/api por defecto.
NEXT_PUBLIC_SITE_URLAmbosLa dirección pública del sitio web, http://localhost:3030 por defecto. En el sitio web, las URL canónicas, las alternativas de idioma, las tarjetas para compartir, robots.txt y el mapa del sitio se construyen a partir de ella; en el panel, el logotipo de texto de la página de inicio de sesión, "Volver al sitio web" y el enlace de privacidad, y el "Ver alojamiento" del editor de alojamientos.
NEXT_PUBLIC_MEDIA_HOSTNAMEAmbosOpcional. Los hosts https que sirven las fotografías, 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 fotografías de esos hosts; cualquier otra se carga tal cual. Solo hosts, sin https://. Ambas aplicaciones leen la misma lista, así que un valor sirve a las dos. Déjalo vacío mientras la API se ejecute en localhost.
NEXT_PUBLIC_WEBSOCKET_BASE_URLPanelLa dirección de la API sin /api, para las notificaciones en tiempo real.
NEXT_PUBLIC_MAP_STYLE_LIGHT, NEXT_PUBLIC_MAP_STYLE_DARKSitio webEstilos de MapLibre opcionales para el mapa de la página del alojamiento. Sin definir, ambos temas dibujan el estilo Positron de OpenFreeMap, que no necesita clave.
API_INTERNAL_URLSitio webOpcional, 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_STANDALONEAmbostrue 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.

VariableValor por defectoQué hace
SITE_PORT3030El puerto del sitio web en tu equipo.
ADMIN_PORT3031El puerto del panel en tu equipo.
API_PORT8000El puerto de la API en tu equipo.
SITE_URL, ADMIN_URL, API_URLLas direcciones locales en esos puertosDónde llega el navegador a cada aplicación. Configura las tres cuando sirvas el conjunto en tus propios dominios.
MEDIA_HOSTNAMEVacíoLos hosts https que sirven las fotografías, separados por comas: el host público de tu bucket (con las variables R2_* en back-end/.env), el propio dominio de la API, o ambos.
SEED_DEMO_DATAtruefalse inicia con tablas vacías y sin cuentas en lugar de la empresa 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_IDVacíoLas etiquetas de marketing del sitio web, todas opcionales.
NEXT_PUBLIC_ANALYTICS_CURRENCY, NEXT_PUBLIC_ANALYTICS_DEBUGUSD, falseLa 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_DARKVacíoLos estilos del mapa de la página del alojamiento; vacío usa Positron de OpenFreeMap.

Cambia un puerto cuando otro programa ya lo use, como ADMIN_PORT=3041. CORS_ORIGIN, FRONTEND_URL, SITE_URL y PUBLIC_MEDIA_URL de la API, y las direcciones de la API y del sitio web de los frontends, se construyen todas a partir de los puertos y las tres direcciones, así que se ajustan solas.

El contenedor de la API también lee back-end/.env cuando existe, así que las claves de pagos, IA, R2 y MCP se definen en un solo lugar tanto para yarn dev como para Docker. El archivo compose prevalece 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 viven en el volumen hollina-data.

El asistente de IA

Incluido con tu compra. Inicia sesión para leerlo o ábrelo en tu descarga.

Activar el asistente de IA: la clave de Google Gemini y por qué se factura.

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 para una demostración pública, y por qué se mantiene desactivado en una empresa real.

¿Te atascaste en un paso?

Busca una solución antes de empezar de nuevo.

Solución de problemas

Preferencias de Cookies

Utilizamos cookies para mejorar tu experiencia de navegación, analizar el tráfico del sitio y personalizar el contenido. Al hacer clic en "Aceptar Todo", consientes nuestro uso de cookies para análisis y publicidad personalizada.