Aller à l'article
Aniq-UI

Food StudioVariables 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 de commande, au moment du buildNon. Toutes les valeurs sont publiques.
admin-dashboard/.envLe tableau de bord du personnel, 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 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.

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.
SQLITE_DATABASEChemin du fichier SQLite, ./database.sqlite par défaut.
JWT_SECRETSigne chaque connexion. Obligatoire. La valeur d'exemple n'est acceptée qu'en dehors de la production.
JWT_EXPIRATIONDurée d'une connexion, 7d par défaut.
CORS_ORIGINLes 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_URLL'adresse du tableau de bord, depuis laquelle se connectent ses notifications en direct. Obligatoire en production pour ces notifications.
STOREFRONT_URLL'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_URLL'adresse publique de cette API, vers laquelle Stripe et PayPal renvoient d'abord le navigateur. Par défaut, http://localhost sur PORT.
TRUST_PROXYOptionnel. Le nombre de reverse proxys devant l'API, pour que les limites par adresse comptent le vrai visiteur.
RATE_LIMIT_LOGINOptionnel. 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_RESETOptionnel. 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 :

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.

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=your-mysql-host
DB_PORT=3306
DB_USERNAME=your-mysql-username
DB_PASSWORD=your-mysql-password
DB_DATABASE=your-database-name

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

VariableApplicationRôle
NEXT_PUBLIC_API_BASE_URLLes deuxL'adresse de l'API, /api compris, http://localhost:8000/api par défaut.
NEXT_PUBLIC_MEDIA_HOSTNAMELes deuxL'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_URLTableau de bordL'adresse de l'API sans /api, pour les commandes et notifications en direct.
NEXT_PUBLIC_DASHBOARD_URLTableau de bordL'adresse du tableau de bord lui-même, pour les liens absolus et l'application installable.
NEXT_PUBLIC_STOREFRONT_URLTableau de bordLa destination du lien « View storefront » dans la barre de navigation.
NEXT_PUBLIC_MAP_STYLE_LIGHT, NEXT_PUBLIC_MAP_STYLE_DARKSite (clair uniquement), tableau de bordStyles de tuiles de carte optionnels. Vide, ce sont les styles publics d'OpenFreeMap, qui ne demandent aucune clé.
API_INTERNAL_URLSiteOptionnel, 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_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 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.

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_HOSTNAMEVideL'hôte public de votre bucket, avec les variables R2_* dans back-end/.env.
SEED_DEMO_DATAtruefalse 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_IDVideLes balises marketing du site, toutes optionnelles.
NEXT_PUBLIC_ANALYTICS_CURRENCYUSDLa 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é.

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

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

Paiements

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.

Le .env de l'API
STRIPE_SECRET_KEY=sk_test_your-stripe-secret-key
STRIPE_WEBHOOK_SECRET=whsec_your-webhook-secret

E-mail

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

Le .env de l'API
RESEND_API_KEY=re_your-sending-access-key
MAIL_FROM=Food Studio <noreply@your-domain.com>
MAIL_MAX_PER_ADDRESS_PER_DAY=5

Le 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 :

  1. Dans le .env de l'API, définissez NODE_ENV=production et votre propre JWT_SECRET, long et aléatoire.
  2. Définissez CORS_ORIGIN avec les adresses du site et du tableau de bord, FRONTEND_URL avec celle du tableau de bord, STOREFRONT_URL avec celle du site, API_PUBLIC_URL avec celle de l'API, et PUBLIC_MEDIA_URL avec l'adresse de l'API suivie de /media.
  3. Sur une nouvelle base de données, lancez yarn build, puis yarn seed:prod une fois (ou yarn db:sync:prod pour des tables vides), puis yarn start:prod. Il n'y a pas de migrations : c'est le seeder qui gère le schéma.
  4. Gardez les fichiers envoyés sur un stockage persistant : un bucket, ou MEDIA_UPLOAD_DIR sur un disque qui survit à un déploiement.
  5. Faites pointer la vérification de santé de votre hébergeur vers /api/health, et définissez TRUST_PROXY quand un reverse proxy se trouve devant l'API.
  6. Construisez chaque frontend avec NEXT_PUBLIC_API_BASE_URL pointant vers votre API déployée ; le tableau de bord aussi avec NEXT_PUBLIC_WEBSOCKET_BASE_URL, NEXT_PUBLIC_DASHBOARD_URL et NEXT_PUBLIC_STOREFRONT_URL.
  7. Sur le site, définissez domain.url dans src/config/brand.config.ts, et réécrivez la politique de confidentialité et les conditions dans messages/legal pour votre établissement.
  8. 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.
  9. 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é.

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.