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 public, au moment du build | Non. Toutes les valeurs sont publiques. |
admin-dashboard/.env | Le tableau de bord de l'agence, 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 lors du build du site. Toutes ses valeurs sont publiques : il ne contient donc jamais de secret. Créez-le à partir de .env.example, qui pointe vers une API sur http://localhost:8000 : cp .env.example .env. Avec Docker, passez les mêmes valeurs en --build-arg.
Où se trouvent les paramètres
Un seul fichier, .env dans le dossier du tableau de bord, lu lors du build du tableau de bord. Toutes ses valeurs sont publiques : il ne contient donc jamais de secret, les clés des fournisseurs se trouvent dans le .env de l'API. Créez-le à partir de .env.example, qui pointe vers une API sur http://localhost:8000 : cp .env.example .env. Avec Docker, passez les mêmes valeurs en --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 sur /data/database.sqlite, fichiers téléversés dans /data/uploads, CORS_ORIGIN pour les deux frontends locaux, FRONTEND_URL=http://localhost:3031, PUBLIC_MEDIA_URL=http://localhost:8000/media et SEED_DEMO_DATA=false. Remplacez-en 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. |
TRUST_PROXY | Optionnel. Le nombre de reverse proxys devant l'API, pour que les limites par adresse 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 sans base de données : true la crée avec l'agence 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.
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=velraLancez ensuite yarn seed pour l'agence 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 elle-même que lorsque NODE_ENV=development : 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).
Photos et fichiers téléversés
L'API sert elle-même les photos du seed, depuis public/media/velra, sur /media/velra/…. Les fichiers téléversés depuis le tableau de bord (photos de biens, photos de pièces pour le studio, aperçus mis en scène, 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 photo en est déduite, et l'API y ramène celles qui sont stockées au démarrage : déplacer l'API conserve donc toutes les photos. 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 photos.
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 photos sont ré-encodées au téléversement, sur 1920 pixels de large au maximum, avec une copie plus petite pour les cartes de bien. Les vidéos sont acceptées en MP4, WebM, MOV ou M4V, jusqu'à 150 Mo.
Site public et tableau de bord de l'agence
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 déduits ; dans le tableau de bord, le lien « View website » et l'aperçu de l'annonce. |
NEXT_PUBLIC_MEDIA_HOSTNAME | Les deux | Optionnel. Les hôtes https qui servent les photos, 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 photos de ces hôtes sont redimensionnées par Next.js ; toute autre photo se charge telle quelle. Des hôtes seulement, sans https://. Les deux applications lisent la même liste, une seule valeur sert donc aux deux. Laissez-le 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 | Tableau de bord | Optionnel. Styles des tuiles de carte. Non défini, les deux thèmes utilisent le style Positron d'OpenFreeMap, qui n'a besoin d'aucune clé. |
NEXT_PUBLIC_PLACE_SEARCH_URL | Tableau de bord | La recherche de lieu dans l'onglet Localisation de l'éditeur de bien, https://photon.komoot.io/api dans .env.example. Tout géocodeur qui répond avec la même forme convient. |
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 photos, séparés par des virgules : l'hôte public de votre bucket (avec les variables R2_* dans back-end/.env), le domaine de l'API, ou les deux. |
SEED_DEMO_DATA | true | false démarre avec des tables vides et aucun compte au lieu de l'agence 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 | AED, 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, NEXT_PUBLIC_PLACE_SEARCH_URL | Vide | Les tuiles de carte et la recherche de lieu du tableau de bord ; vide utilise OpenFreeMap et Photon. |
Changez un port quand un autre programme l'utilise déjà, par exemple ADMIN_PORT=3041. CORS_ORIGIN, FRONTEND_URL et PUBLIC_MEDIA_URL de l'API, ainsi que les adresses de l'API et du site côté frontends, sont tous déduits des ports et des trois adresses : ils suivent donc d'eux-mêmes.
Le conteneur de l'API lit aussi back-end/.env s'il existe, donc les clés optionnelles se définissent au même endroit pour yarn dev et pour Docker. Le fichier compose l'emporte pour les valeurs qui diffèrent dans un conteneur : le chemin de la base, le dossier des fichiers téléversés, le port, NODE_ENV=production et les adresses ci-dessus. La base et les fichiers téléversés vivent dans le volume velra-data.
Fonctionnalités IA
Inclus avec votre achat. Connectez-vous pour le lire, ou ouvrez-le dans votre téléchargement.
Activer l'assistant IA et le studio de mise en scène IA : les clés des fournisseurs et le modèle d'image.
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 agence.