Aller à l'article
Aniq-UI

HollinaVariables d'environnement

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

FichierLu parContient des secrets
back-end/.envL'API, avec yarn dev et dans Docker ComposeOui. Ne le versionnez jamais.
storefront/.envLe site des séjours, au moment du buildNon. Chaque valeur NEXT_PUBLIC_* est publique.
admin-dashboard/.envLe tableau de bord des réservations, au moment du buildNon. Toutes les valeurs sont publiques.
.env à côté de docker-compose.ymlDocker Compose, pour le pack Full StackNon

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.

VariableRôle
NODE_ENVdevelopment 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.
PORTLe port de l'API, 8000. Les deux frontends pointent vers lui.
DB_TYPEsqlite (comme dans .env.example) ou mysql. Non défini, cela signifie MySQL : gardez donc la ligne.
SQLITE_DATABASEChemin du fichier SQLite, ./database.sqlite par défaut.
JWT_SECRETSigne chaque connexion. Obligatoire. La valeur de l'exemple n'est acceptée qu'en dehors de la production.
JWT_EXPIRATIONLa durée d'une connexion, 7d par défaut. La réponse de connexion la renvoie sous expires_in.
CORS_ORIGINLes 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_URLL'adresse du tableau de bord, depuis laquelle se connectent ses notifications en direct, http://localhost:3031 si non défini.
SITE_URLL'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_PROXYOptionnel. 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_LOGINOptionnel. Nombre de connexions échouées qu'une adresse peut faire en 15 minutes avant 429, 10 par défaut.
SEED_DEMO_DATALu 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 :

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

Le .env de l'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
VariableRôle
STRIPE_SECRET_KEYActive les paiements par carte via le Checkout hébergé de Stripe. Une clé sk_test_ ne déplace aucun argent réel.
STRIPE_WEBHOOK_SECRETLe 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_SECRETActivez PayPal via Orders v2, les deux ensemble.
PAYPAL_WEBHOOK_IDL'identifiant de l'abonnement au webhook PayPal, qui vérifie la signature de PayPal.
PAYPAL_ENVsandbox (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 :

Le .env de l'API
DB_TYPE=mysql
DB_HOST=localhost
DB_PORT=3306
DB_USERNAME=root
DB_PASSWORD=
DB_DATABASE=hollina

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

Le .env de l'API
PUBLIC_MEDIA_URL=http://localhost:8000/media
MEDIA_UPLOAD_DIR=./public/media/uploads

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

Le .env de l'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

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

VariableApplicationRôle
NEXT_PUBLIC_API_BASE_URLLes deuxL'adresse de l'API, /api compris, http://localhost:8000/api par défaut.
NEXT_PUBLIC_SITE_URLLes deuxL'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_HOSTNAMELes deuxOptionnel. 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_URLTableau de bordL'adresse de l'API sans /api, pour les notifications en direct.
NEXT_PUBLIC_MAP_STYLE_LIGHT, NEXT_PUBLIC_MAP_STYLE_DARKSiteStyles 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_URLSiteOptionnel, 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_STANDALONELes deuxtrue 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.

VariablePar défautRôle
SITE_PORT3030Le port du site sur votre ordinateur.
ADMIN_PORT3031Le port du tableau de bord sur votre ordinateur.
API_PORT8000Le port de l'API sur votre ordinateur.
SITE_URL, ADMIN_URL, API_URLLes adresses locales sur ces portsL'adresse à laquelle le navigateur joint chaque application. Définissez les trois lorsque vous servez la stack sur vos propres domaines.
MEDIA_HOSTNAMEVideLes 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_DATAtruefalse 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_IDVideLes balises marketing du site, toutes optionnelles.
NEXT_PUBLIC_ANALYTICS_CURRENCY, NEXT_PUBLIC_ANALYTICS_DEBUGUSD, falseLa 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_DARKVideLes 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é.

Bloqué sur une étape ?

Trouvez une solution avant de tout recommencer.

Dépannage

Préférences des Cookies

Nous utilisons des cookies pour améliorer votre expérience de navigation, analyser le trafic du site et personnaliser le contenu. En cliquant sur "Accepter Tout", vous consentez à notre utilisation des cookies pour l'analyse et la publicité personnalisée.