Variables d'environnement
Le rôle de chaque paramètre des fichiers .env de l'API et des frontends, et ceux dont vous avez besoin.
Pour le pack Full Stack
Où se trouvent les paramètres
| Fichier | Lu par | Contient des secrets |
|---|---|---|
back-end/.env | L'API, avec yarn dev et dans Docker Compose | Oui. Ne le versionnez jamais. |
storefront/.env | Le site des séjours, au moment du build | Non. Chaque valeur NEXT_PUBLIC_* est publique. |
admin-dashboard/.env | Le tableau de bord des réservations, au moment du build | Non. Toutes les valeurs sont publiques. |
.env à côté de docker-compose.yml | Docker Compose, pour le pack Full Stack | Non |
Créez le fichier de chaque application à partir du .env.example situé à côté, qui documente chaque variable : cp .env.example .env. Les exemples fonctionnent tels quels pour un lancement local, et le démarrage avec Docker Compose n'a besoin d'aucun fichier.
Où se trouvent les paramètres
Un seul fichier, .env dans le dossier du site, lu quand le site est construit. Chaque valeur NEXT_PUBLIC_* qu'il contient est publique, il ne contient donc jamais de secret. Créez-le depuis .env.example, qui pointe vers une API sur http://localhost:8000 : cp .env.example .env. Avec Docker, passez les mêmes valeurs avec --build-arg.
Où se trouvent les paramètres
Un seul fichier, .env dans le dossier du tableau de bord, lu quand le tableau de bord est construit. Chaque valeur qu'il contient est publique, il ne contient donc jamais de secret : les clés de paiement et d'IA vivent dans le .env de l'API. Créez-le depuis .env.example, qui pointe vers une API sur http://localhost:8000 : cp .env.example .env. Avec Docker, passez les mêmes valeurs avec --build-arg.
Où se trouvent les paramètres
Un seul fichier, .env dans le dossier de l'API, lu par l'API avec yarn dev, et par un conteneur quand vous ajoutez --env-file .env -e NODE_ENV=production à son docker run. Il contient des secrets : ne le versionnez jamais. Créez-le à partir de .env.example, qui documente chaque variable et fonctionne tel quel pour un lancement local : cp .env.example .env.
L'image Docker définit ses propres valeurs par défaut, donc docker run fonctionne sans fichier : SQLite à /data/database.sqlite, envois dans /data/uploads, CORS_ORIGIN pour les deux frontends locaux, FRONTEND_URL=http://localhost:3031, SITE_URL=http://localhost:3030, PUBLIC_MEDIA_URL=http://localhost:8000/media et SEED_DEMO_DATA=false. Remplacez n'importe laquelle avec -e.
Paramètres essentiels de l'API
L'API vérifie JWT_SECRET et, en production, CORS_ORIGIN avant de démarrer. Si l'une manque ou est inutilisable, elle s'arrête avec une ligne qui indique quoi corriger.
| Variable | Rôle |
|---|---|
NODE_ENV | development en local, qui crée et met à jour les tables au démarrage. production sur un serveur en ligne, qui ne touche jamais aux tables. |
PORT | Le port de l'API, 8000. Les deux frontends pointent vers lui. |
DB_TYPE | sqlite (comme dans .env.example) ou mysql. Non défini, cela signifie MySQL : gardez donc la ligne. |
SQLITE_DATABASE | Chemin du fichier SQLite, ./database.sqlite par défaut. |
JWT_SECRET | Signe chaque connexion. Obligatoire. La valeur de l'exemple n'est acceptée qu'en dehors de la production. |
JWT_EXPIRATION | La durée d'une connexion, 7d par défaut. La réponse de connexion la renvoie sous expires_in. |
CORS_ORIGIN | Les adresses du site et du tableau de bord, séparées par des virgules. Non défini, seuls http://localhost:3030 et http://localhost:3031 sont autorisés, jamais toutes les origines ; obligatoire en production. |
FRONTEND_URL | L'adresse du tableau de bord, depuis laquelle se connectent ses notifications en direct, http://localhost:3031 si non défini. |
SITE_URL | L'adresse du site. Un processeur de paiement y renvoie le voyageur, vers sa propre page de réservation, ce doit donc être l'adresse que parcourt un voyageur. |
TRUST_PROXY | Optionnel. Le nombre de reverse proxies devant l'API, pour que les limites par adresse (connexion, réservations, questions, avis) comptent le vrai visiteur. |
RATE_LIMIT_LOGIN | Optionnel. Nombre de connexions échouées qu'une adresse peut faire en 15 minutes avant 429, 10 par défaut. |
SEED_DEMO_DATA | Lu uniquement par l'image Docker, sur un volume qui n'a pas encore de base de données : true la crée avec la société de démonstration, false avec les tables seulement. |
Générez votre propre JWT_SECRET avec :
node -e "console.log(require('crypto').randomBytes(48).toString('hex'))"Chaque fonctionnalité optionnelle ci-dessous reste désactivée tant que ses lignes dans .env.example restent en commentaire.
Paiements
Sans aucune de ces valeurs, le simulateur fourni accepte toute réservation par carte et PayPal, donc tout le paiement fonctionne sans compte marchand, et le journal de démarrage de l'API affiche Payment simulator active tant que c'est le cas. Il confirme ces réservations sans prendre d'argent, définissez donc Stripe, PayPal ou les deux avant de prendre de vraies réservations : le simulateur se désactive alors, le paiement ne propose que les moyens configurés plus le paiement à l'arrivée, et un moyen sans processeur est refusé. L'onglet Paiements des paramètres du tableau de bord montre quels processeurs sont configurés, si leurs clés sont de test ou réelles, et si le simulateur est utilisé, jamais les clés elles-mêmes.
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| Variable | Rôle |
|---|---|
STRIPE_SECRET_KEY | Active les paiements par carte via le Checkout hébergé de Stripe. Une clé sk_test_ ne déplace aucun argent réel. |
STRIPE_WEBHOOK_SECRET | Le secret de signature de votre endpoint de webhook Stripe, ou celui qu'affiche stripe listen. Sans lui, chaque webhook Stripe est refusé, donc une réservation par carte n'est jamais réglée. |
PAYPAL_CLIENT_ID, PAYPAL_CLIENT_SECRET | Activez PayPal via Orders v2, les deux ensemble. |
PAYPAL_WEBHOOK_ID | L'identifiant de l'abonnement au webhook PayPal, qui vérifie la signature de PayPal. |
PAYPAL_ENV | sandbox (par défaut) ou live. |
Le paiement à l'arrivée n'a besoin d'aucune clé : c'est l'interrupteur allow_pay_on_arrival dans l'onglet Paiements du tableau de bord, activé dans le seed.
Utiliser MySQL au lieu de SQLite
Créez une base de données vide, puis définissez le pilote et la connexion dans le .env de l'API :
DB_TYPE=mysql
DB_HOST=localhost
DB_PORT=3306
DB_USERNAME=root
DB_PASSWORD=
DB_DATABASE=hollinaLancez ensuite yarn seed pour la société de démonstration, ou yarn db:sync pour les tables sans données. L'API en cours d'exécution ne crée et ne met à jour les tables d'elle-même que si NODE_ENV=development, donc avec NODE_ENV=production l'une de ces commandes est lancée avant le premier démarrage (yarn seed:prod ou yarn db:sync:prod après yarn build).
Photographies et envois
L'API sert elle-même les photographies du seed, depuis public/media/hollina, sur /media/hollina/…. Les envois depuis le tableau de bord (photographies de séjours, couvertures de destinations, photos de profil) sont stockés sur le disque de l'API sous MEDIA_UPLOAD_DIR et servis sur /media/uploads/…, sauf si un bucket est défini.
PUBLIC_MEDIA_URL=http://localhost:8000/media
MEDIA_UPLOAD_DIR=./public/media/uploadsPUBLIC_MEDIA_URL est l'adresse à laquelle /media est joint depuis un navigateur. Chaque adresse de photographie en est construite, et l'API y déplace celles qui sont enregistrées à son démarrage, donc déplacer l'API conserve chaque photographie. Sur un serveur, faites pointer MEDIA_UPLOAD_DIR vers un stockage persistant ; avec Docker, il est dans le volume de données.
Pour envoyer les fichiers vers Cloudflare R2, ou tout bucket compatible S3, définissez les cinq variables. Donnez aux deux frontends l'hôte public du bucket via NEXT_PUBLIC_MEDIA_HOSTNAME (avec Docker Compose, MEDIA_HOSTNAME) pour que Next.js redimensionne ces photographies.
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.devLes photographies sont réencodées à l'envoi en JPEG, de 1920 pixels de large au plus, avec une copie plus petite pour les cartes de séjour. Les vidéos sont acceptées en MP4, WebM, MOV ou M4V, jusqu'à 150 Mo.
Site des séjours et tableau de bord des réservations
Chaque valeur NEXT_PUBLIC_* est compilée dans le JavaScript chargé par le navigateur, et toute personne qui ouvre la page peut la lire. Ne mettez jamais de secret dans ces fichiers, et reconstruisez après en avoir modifié un.
| Variable | Application | Rôle |
|---|---|---|
NEXT_PUBLIC_API_BASE_URL | Les deux | L'adresse de l'API, /api compris, http://localhost:8000/api par défaut. |
NEXT_PUBLIC_SITE_URL | Les deux | L'adresse publique du site, http://localhost:3030 par défaut. Sur le site, les URL canoniques, les alternatives de langue, les cartes de partage, robots.txt et le sitemap en sont construits ; dans le tableau de bord, le logotype de la page de connexion, « Back to website » et le lien de confidentialité, et le « View stay » de l'éditeur de séjour. |
NEXT_PUBLIC_MEDIA_HOSTNAME | Les deux | Optionnel. Les hôtes https qui servent les photographies, séparés par des virgules : l'hôte public de votre bucket, comme pub-1234.r2.dev, le domaine de l'API, ou les deux. Les photographies qui s'y trouvent sont redimensionnées par Next.js ; toute autre se charge telle quelle. Des hôtes seulement, sans https://. Les deux applications lisent la même liste, donc une seule valeur sert aux deux. Laissez-la vide tant que l'API tourne sur localhost. |
NEXT_PUBLIC_WEBSOCKET_BASE_URL | Tableau de bord | L'adresse de l'API sans /api, pour les notifications en direct. |
NEXT_PUBLIC_MAP_STYLE_LIGHT, NEXT_PUBLIC_MAP_STYLE_DARK | Site | Styles MapLibre optionnels pour la carte de la page d'un séjour. Non définis, les deux thèmes dessinent le style Positron d'OpenFreeMap, qui n'a besoin d'aucune clé. |
API_INTERNAL_URL | Site | Optionnel, côté serveur uniquement, lu à l'exécution et non au build. Où le serveur propre au site joint l'API quand l'adresse du navigateur ne fonctionne pas depuis l'intérieur, comme dans Docker (http://api:8000/api dans Docker Compose). Laissez-le non défini ailleurs. |
BUILD_STANDALONE | Les deux | true fait produire à yarn build un serveur autonome, ce que les Dockerfiles définissent. Sinon, laissez-la non définie. |
Les balises marketing du site sont aussi des valeurs NEXT_PUBLIC_* : Google Tag Manager, GA4, Meta, TikTok, Snapchat et Pinterest, chacune activée par un seul identifiant.
Options de Docker Compose
Rien n'est à définir pour une exécution en local. Pour changer quelque chose, placez-le dans un fichier .env à côté de docker-compose.yml et relancez docker compose up --build : les frontends intègrent ces valeurs à la compilation.
| Variable | Par défaut | Rôle |
|---|---|---|
SITE_PORT | 3030 | Le port du site sur votre ordinateur. |
ADMIN_PORT | 3031 | Le port du tableau de bord sur votre ordinateur. |
API_PORT | 8000 | Le port de l'API sur votre ordinateur. |
SITE_URL, ADMIN_URL, API_URL | Les adresses locales sur ces ports | L'adresse à laquelle le navigateur joint chaque application. Définissez les trois lorsque vous servez la stack sur vos propres domaines. |
MEDIA_HOSTNAME | Vide | Les hôtes https qui servent les photographies, séparés par des virgules : l'hôte public de votre bucket (avec les variables R2_* dans back-end/.env), le domaine propre de l'API, ou les deux. |
SEED_DEMO_DATA | true | false démarre avec des tables vides et aucun compte au lieu de la société de démonstration. Cela ne compte que sur un nouveau volume. |
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 | Vide | Les balises marketing du site, toutes optionnelles. |
NEXT_PUBLIC_ANALYTICS_CURRENCY, NEXT_PUBLIC_ANALYTICS_DEBUG | USD, false | La devise envoyée avec chaque prix suivi, et l'enregistrement de chaque événement dans la console du navigateur. |
NEXT_PUBLIC_MAP_STYLE_LIGHT, NEXT_PUBLIC_MAP_STYLE_DARK | Vide | Les styles de carte de la page d'un séjour ; vide, il utilise le Positron d'OpenFreeMap. |
Changez un port quand un autre programme l'utilise déjà, par exemple ADMIN_PORT=3041. Le CORS_ORIGIN, le FRONTEND_URL, le SITE_URL et le PUBLIC_MEDIA_URL de l'API, ainsi que les adresses d'API et de site des frontends, sont tous construits à partir des ports et des trois adresses, ils suivent donc d'eux-mêmes.
Le conteneur de l'API lit aussi back-end/.env quand il existe, donc les clés de paiement, d'IA, R2 et MCP se définissent à un seul endroit pour yarn dev comme pour Docker. Le fichier compose l'emporte pour les valeurs qui diffèrent dans un conteneur : le chemin de la base de données, le dossier des envois, le port, NODE_ENV=production et les adresses ci-dessus. La base de données et les envois vivent dans le volume hollina-data.
L'assistant IA
Inclus avec votre achat. Connectez-vous pour le lire, ou ouvrez-le dans votre téléchargement.
Activer l'assistant IA : la clé Google Gemini et ce qui est facturé.
Le serveur MCP
Inclus avec votre achat. Connectez-vous pour le lire, ou ouvrez-le dans votre téléchargement.
Permettre aux agents de code et aux autres clients MCP d'utiliser les outils de l'assistant : la clé et l'endpoint.
Mode démo
Inclus avec votre achat. Connectez-vous pour le lire, ou ouvrez-le dans votre téléchargement.
L'interrupteur d'une démo publique, et pourquoi il reste désactivé pour une vraie société.