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 de commande, au moment du build | Non. Toutes les valeurs sont publiques. |
admin-dashboard/.env | Le tableau de bord du personnel, 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 placé à côté, qui documente chaque variable : cp .env.example .env. Les exemples fonctionnent tels quels pour une exécution en local.
Où se trouvent les paramètres
Un seul fichier, .env dans le dossier du site, lu au moment du build du site. Toutes ses valeurs sont publiques, il ne contient donc jamais de secret : les clés de paiement et d'IA 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.
Où se trouvent les paramètres
Un seul fichier, .env dans le dossier du tableau de bord, lu au moment du build du tableau de bord. Toutes ses valeurs sont publiques, il ne contient donc jamais de secret : les clés d'IA 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.
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 le passez avec --env-file .env. Il contient des secrets : ne le commitez jamais. Créez-le à partir de .env.example, qui documente chaque variable et fonctionne tel quel pour une exécution en local : cp .env.example .env.
L'image Docker définit ses propres valeurs par défaut, donc docker run fonctionne sans fichier : SQLite dans /data/database.sqlite, fichiers envoyés dans /data/uploads, CORS_ORIGIN pour les deux frontends locaux, 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. |
SQLITE_DATABASE | Chemin du fichier SQLite, ./database.sqlite par défaut. |
JWT_SECRET | Signe chaque connexion. Obligatoire. La valeur d'exemple n'est acceptée qu'en dehors de la production. |
JWT_EXPIRATION | Durée d'une connexion, 7d par défaut. |
CORS_ORIGIN | Les adresses du site et du tableau de bord, séparées par des virgules. L'adresse de retour d'un paiement hébergé doit se trouver sur l'une d'elles. Si elle n'est pas définie, seuls http://localhost:3030 et http://localhost:3031 sont autorisés ; obligatoire en production. |
FRONTEND_URL | L'adresse du tableau de bord, depuis laquelle se connectent ses notifications en direct. Obligatoire en production pour ces notifications. |
STOREFRONT_URL | L'adresse du site, vers laquelle un lien de paiement ou de réinitialisation du mot de passe envoie le client. Par défaut, la première entrée de CORS_ORIGIN. |
API_PUBLIC_URL | L'adresse publique de cette API, vers laquelle Stripe et PayPal renvoient d'abord le navigateur. Par défaut, http://localhost sur PORT. |
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. Le nombre de connexions échouées qu'une adresse peut faire sur un formulaire de connexion en 15 minutes avant 429, 10 par défaut. |
RATE_LIMIT_ORDERS, RATE_LIMIT_PAYMENT_SESSION, RATE_LIMIT_TRACKING, RATE_LIMIT_REGISTER, RATE_LIMIT_CONTACT, RATE_LIMIT_PASSWORD_RESET | Optionnel. Les limites par adresse sur les formulaires publics ; .env.example donne la valeur par défaut de chacune et sa fenêtre. |
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=your-mysql-host
DB_PORT=3306
DB_USERNAME=your-mysql-username
DB_PASSWORD=your-mysql-password
DB_DATABASE=your-database-nameLancez ensuite yarn seed pour le restaurant de démonstration, ou yarn db:sync pour les tables sans données. L'API en fonctionnement 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 doit donc être lancée avant le premier démarrage (yarn seed:prod ou yarn db:sync:prod après yarn build).
Site de commande et tableau de bord du personnel
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_MEDIA_HOSTNAME | Les deux | L'hôte https de votre bucket de photos, par exemple pub-1234.r2.dev, ou celui de l'API quand elle sert les photos sur un domaine public. Les photos qui en viennent sont redimensionnées par Next.js ; toute autre photo est affichée telle quelle. L'hôte seul. 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 commandes et notifications en direct. |
NEXT_PUBLIC_DASHBOARD_URL | Tableau de bord | L'adresse du tableau de bord lui-même, pour les liens absolus et l'application installable. |
NEXT_PUBLIC_STOREFRONT_URL | Tableau de bord | La destination du lien « View storefront » dans la barre de navigation. |
NEXT_PUBLIC_MAP_STYLE_LIGHT, NEXT_PUBLIC_MAP_STYLE_DARK | Site (clair uniquement), tableau de bord | Styles de tuiles de carte optionnels. Vide, ce sont les styles publics d'OpenFreeMap, qui ne demandent aucune clé. |
API_INTERNAL_URL | Site | Optionnel, côté serveur uniquement, lu au démarrage du conteneur. L'adresse par laquelle le serveur du site joint l'API quand l'adresse du navigateur ne fonctionne pas depuis l'intérieur, comme avec Docker Compose (http://api:8000/api). Laissez-la non définie 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 elles aussi des valeurs NEXT_PUBLIC_*.
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 | L'hôte public de votre bucket, avec les variables R2_* dans back-end/.env. |
SEED_DEMO_DATA | true | false démarre avec des tables vides et aucun compte au lieu du restaurant de démonstration. 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 | USD | La devise envoyée avec chaque valeur suivie. |
Changez un port quand un autre programme l'utilise déjà, par exemple ADMIN_PORT=3041. CORS_ORIGIN, FRONTEND_URL, STOREFRONT_URL, API_PUBLIC_URL et PUBLIC_MEDIA_URL de l'API, ainsi que l'adresse de l'API dans les 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 s'il existe : les clés de paiement, d'e-mail, de médias et d'IA se définissent donc à 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 fichiers envoyés, le port, NODE_ENV=production et les adresses ci-dessus. La base de données et les fichiers envoyés se trouvent dans le volume food-studio-data.
Stockage des médias
L'API sert elle-même les photos de démonstration, depuis public/media/food-studio, sous /media/food-studio/…. Les fichiers envoyés depuis le tableau de bord (photos de plats, photos de profil, résultats du studio IA) sont stockés sur le disque de l'API dans MEDIA_UPLOAD_DIR et servis sous /media/uploads/…, sauf si un bucket est configuré.
PUBLIC_MEDIA_URL=http://localhost:8000/media
MEDIA_UPLOAD_DIR=./public/media/uploadsPUBLIC_MEDIA_URL est l'adresse à laquelle /media est joignable depuis un navigateur. Les données de démonstration l'écrivent dans l'adresse de chaque photo : définissez-la donc avant le premier chargement des données sur un serveur. Sur un serveur, faites pointer MEDIA_UPLOAD_DIR vers un stockage persistant ; avec Docker, il se trouve dans le volume de données.
Pour envoyer les fichiers vers Cloudflare R2, ou tout bucket compatible S3, définissez les cinq variables, et donnez aux deux frontends l'hôte public du bucket via NEXT_PUBLIC_MEDIA_HOSTNAME (avec Docker Compose, MEDIA_HOSTNAME). Définissez les cinq ou aucune.
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.devPaiements
Le paiement envoie le client sur la page de Stripe ou de PayPal. Définissez STRIPE_SECRET_KEY et STRIPE_WEBHOOK_SECRET, ou PAYPAL_CLIENT_ID, PAYPAL_CLIENT_SECRET et PAYPAL_WEBHOOK_ID (avec PAYPAL_ENV, sandbox par défaut). Sans prestataire configuré, le paiement propose un paiement de démonstration intégré qui marque une commande comme payée sans déplacer d'argent.
STRIPE_SECRET_KEY=sk_test_your-stripe-secret-key
STRIPE_WEBHOOK_SECRET=whsec_your-webhook-secretLes liens de réinitialisation du mot de passe sont envoyés via Resend. Les deux valeurs sont nécessaires : une clé avec accès d'envoi, et une adresse d'expéditeur sur un domaine vérifié dans Resend. Sans elles, « Forgot password » répond toujours comme d'habitude, aucun message n'est envoyé et le journal indique que l'e-mail n'est pas configuré.
RESEND_API_KEY=re_your-sending-access-key
MAIL_FROM=Food Studio <noreply@your-domain.com>
MAIL_MAX_PER_ADDRESS_PER_DAY=5Le lien ouvre la page de réinitialisation du site sur STOREFRONT_URL, dans la langue du client, et fonctionne une seule fois dans l'heure. Une adresse reçoit au plus MAIL_MAX_PER_ADDRESS_PER_DAY messages par jour, 5 par défaut.
Fonctionnalités IA
Inclus avec votre achat. Connectez-vous pour le lire, ou ouvrez-le dans votre téléchargement.
Activer les fonctionnalités IA : les clés des fournisseurs, les modèles utilisés par chaque fonctionnalité et le modèle de suppression d'arrière-plan.
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.
Faire tourner une démo publique : les interrupteurs de démo, les comptes par visiteur et ce que les visiteurs peuvent modifier.
Mise en ligne
Avant de déployer quelque part en public :
- Dans le
.envde l'API, définissezNODE_ENV=productionet votre propreJWT_SECRET, long et aléatoire. - Définissez
CORS_ORIGINavec les adresses du site et du tableau de bord,FRONTEND_URLavec celle du tableau de bord,STOREFRONT_URLavec celle du site,API_PUBLIC_URLavec celle de l'API, etPUBLIC_MEDIA_URLavec l'adresse de l'API suivie de/media. - Sur une nouvelle base de données, lancez
yarn build, puisyarn seed:produne fois (ouyarn db:sync:prodpour des tables vides), puisyarn start:prod. Il n'y a pas de migrations : c'est le seeder qui gère le schéma. - Gardez les fichiers envoyés sur un stockage persistant : un bucket, ou
MEDIA_UPLOAD_DIRsur un disque qui survit à un déploiement. - Faites pointer la vérification de santé de votre hébergeur vers
/api/health, et définissezTRUST_PROXYquand un reverse proxy se trouve devant l'API. - Construisez chaque frontend avec
NEXT_PUBLIC_API_BASE_URLpointant vers votre API déployée ; le tableau de bord aussi avecNEXT_PUBLIC_WEBSOCKET_BASE_URL,NEXT_PUBLIC_DASHBOARD_URLetNEXT_PUBLIC_STOREFRONT_URL. - Sur le site, définissez
domain.urldanssrc/config/brand.config.ts, et réécrivez la politique de confidentialité et les conditions dansmessages/legalpour votre établissement. - Dans le tableau de bord, configurez vos cuisines, leurs horaires et codes postaux de livraison, vos frais et codes promo, et passez l'horloge de service sur Real : les données de démonstration la démarrent sur l'horloge de démo, qui garde toutes les cuisines ouvertes.
- Changez les mots de passe de démonstration, ou supprimez les comptes, et passez les paiements sur des clés de production.
Pas pour un restaurant avec de vraies commandes
yarn railway:setup lance le build, récupère le modèle de suppression d'arrière-plan, supprime toutes les tables et recharge les données de démonstration, à chaque exécution, et yarn drop:prod supprime toutes les tables. Ils conviennent à un nouvel environnement, jamais à la commande de build d'un restaurant en activité.