Yayaw
Documentation

Variables d'environnement

Variables de configuration runtime utilisées par l'application.

Cette page liste les variables runtime consommées par l'application. Utilisez Configuration de l'environnement de déploiement pour le runbook opérationnel qui explique où récupérer chaque valeur, comment borner les environnements de fournisseurs hébergés et comment valider un environnement avant promotion.

Noyau

NODE_ENV=development
NEXT_PUBLIC_BASE_URL=http://localhost:3080
DATABASE_URL=postgresql://user:password@localhost:5432/yayaw
BETTER_AUTH_17_WRITES_PAUSED=false
BETTER_AUTH_RUNTIME_PROBE_URL=http://localhost:3080/api/ready
DATABASE_POOL_MAX=
DATABASE_IDLE_TIMEOUT_SECONDS=
DATABASE_MAX_LIFETIME_SECONDS=
DATABASE_CONNECT_TIMEOUT_SECONDS=
DATABASE_STATEMENT_TIMEOUT_SECONDS=
DATABASE_PREPARE_STATEMENTS=
DOCUMENTATION_SOURCE_MODE=database
BETTER_AUTH_SECRET=
BETTER_AUTH_TRUSTED_ORIGINS=http://localhost:3080
BETTER_AUTH_DEVICE_CLIENT_IDS=kyber-desktop,kyber-web
BETTER_AUTH_DEVICE_TRUSTED_ORIGINS=
SCIM_CREDENTIAL_HASH_SECRET=
  • Les réglages de pool DATABASE_* sont optionnels. Les pools runtime de base de données utilisent par défaut 10 connexions en développement et 3 en production/serverless. La production utilise aussi par défaut un timeout de connexion de 10 secondes, un timeout d'inactivité de 20 secondes, une durée de vie maximale de 300 secondes, un timeout de requête de 20 secondes et les prepared statements désactivés pour la compatibilité avec les poolers. Augmentez DATABASE_POOL_MAX ou les valeurs de cycle de vie seulement si la cible de déploiement supporte les connexions supplémentaires par runtime.

  • BETTER_AUTH_17_WRITES_PAUSED est une attestation temporaire et non secrète, réservée au processus de migration lorsque 0050 est en attente sur une base existante. Elle ne bloque aucune requête. Gardez-la à false tant qu'une sauvegarde n'est pas vérifiée et que toutes les écritures /api/auth ne sont pas réellement bloquées en externe; retirez-la immédiatement après la bascule.

  • BETTER_AUTH_RUNTIME_PROBE_URL est l'endpoint de readiness vivant et server-only utilisé par le wrapper de migration auto-hébergé. Docker Compose utilise par défaut http://app:3000/api/ready afin que le conteneur de migration sonde l'app actuellement servie plutôt que lui-même. C'est une preuve, pas une attestation runtime statique ; une réponse indisponible ou différente de stable-1.7 échoue en mode fermé.

  • BETTER_AUTH_SECRET doit être un secret stable, server-only et à forte entropie en production et dans les runtimes auto-hébergés.

  • SCIM_CREDENTIAL_HASH_SECRET est requis tant que le plugin SCIM managé est activé. Générez un secret distinct d'au moins 32 caractères, par exemple avec openssl rand -hex 32. Better Auth ne stocke que les empreintes HMAC versionnées des bearer tokens managés; ne réutilisez pas BETTER_AUTH_SECRET et ne faites pas tourner cette valeur sans migration des empreintes.

  • BETTER_AUTH_DEVICE_CLIENT_IDS limite les clients Device Authorization autorisés. Les identifiants par défaut sont kyber-desktop et kyber-web.

  • BETTER_AUTH_DEVICE_TRUSTED_ORIGINS ajoute des origines autorisées pour Device Authorization, l’authentification par jeton et les routes Dynamic Data, avec CORS sans cookies. Utilisez ce réglage pour les clients Kyber locaux ou natifs sans élargir les origines autorisées avec cookies. Le runtime autorise seulement les en-têtes authorization, content-type, last-event-id et x-kyber-workspace.

  • DATABASE_STATEMENT_TIMEOUT_SECONDS applique un timeout par requête lorsque le client base de données ouvre une connexion. Laissez vide sauf si le fournisseur Postgres ou la base auto-hébergée a besoin d'un garde-fou explicite.

  • DOCUMENTATION_SOURCE_MODE vaut database par défaut et sert la documentation CMS bilingue publiée avec Fumadocs. Utilisez filesystem ou database-with-filesystem-fallback uniquement comme diagnostic temporaire de bascule, rollback ou développement local ; la production doit revenir à database après publication du seed initial de documentation.

Réglages De Build

NEXT_BUILD_WORKERS=1
NEXT_STATIC_PAGE_GENERATION_TIMEOUT=180
  • NEXT_BUILD_WORKERS contrôle le nombre de workers Next.js utilisés pendant next build. Les builds Docker auto-hébergés utilisent 1 par défaut pour rester stables sur de petites machines.

  • NEXT_STATIC_PAGE_GENERATION_TIMEOUT augmente le timeout de génération statique Next.js pour les builders lents. Augmentez-le seulement lorsque des pages statiques légitimes expirent.

Hôte Production

Yayaw production utilise https://yayaw.app comme origine publique canonique. Les déploiements de prévisualisation utilisent https://preview.yayaw.app pour le domaine adossé à la branche preview.

NEXT_PUBLIC_BASE_URL=https://yayaw.app
BETTER_AUTH_TRUSTED_ORIGINS=https://*.yayaw.app
  • NEXT_PUBLIC_BASE_URL est la source de vérité applicative pour les URL canoniques, l'URL de base Better Auth, les métadonnées OAuth, les liens sitemap/robots et les URL absolues de ressources générées.

  • NEXT_PUBLIC_SITE_URL n'est pas lu par l'application.

  • BETTER_AUTH_URL n'est pas requis par le runtime courant parce que Better Auth reçoit baseURL depuis NEXT_PUBLIC_BASE_URL. Si un ancien déploiement le définit encore, gardez-le aligné avec https://yayaw.app.

  • preview.yayaw.app est le domaine de prévisualisation adossé à la branche durable preview.

  • La production et la prévisualisation utilisent le chemin de déploiement Docker/Coolify. Ne liez pas ce checkout à Vercel et ne créez pas de dossier local .vercel.

  • Gardez www.yayaw.app comme redirection 308 du reverse proxy vers yayaw.app; l'app normalise aussi les requêtes de pages www avant le routage i18n.

  • Gardez les hôtes .eu retirés uniquement comme redirections 308 du reverse proxy vers leurs remplaçants .app, par exemple yayaw.eu et www.yayaw.eu vers yayaw.app. Ne les ajoutez pas à BETTER_AUTH_TRUSTED_ORIGINS.

  • Les domaines publics d'organisation sont séparés de l'hôte applicatif canonique. Ils sont vérifiés via le fournisseur de domaines publics configuré puis mappés dans organization_public_domains; ils ne doivent pas figurer dans BETTER_AUTH_TRUSTED_ORIGINS parce que dashboard/auth ne sont pas servis depuis ces hôtes.

Facturation Et Stripe

STRIPE_SECRET_KEY=
STRIPE_WEBHOOK_SECRET=
STRIPE_ONE_TIME_WEBHOOK_SECRET=
BILLING_GRACE_PERIOD_DAYS=7
BILLING_PRO_SEAT_LIMIT=10
BILLING_BUSINESS_SEAT_LIMIT=100
BILLING_CODE_ACCESS_REPOSITORY_URL=
BILLING_CODE_ACCESS_DOWNLOAD_URL=
BILLING_CODE_ACCESS_DOCUMENTATION_URL=
BILLING_CODE_ACCESS_SUPPORT_URL=
BILLING_CODE_ACCESS_GITHUB_REPOSITORY=
BILLING_CODE_ACCESS_GITHUB_APP_ID=
BILLING_CODE_ACCESS_GITHUB_APP_INSTALLATION_ID=
BILLING_CODE_ACCESS_GITHUB_APP_PRIVATE_KEY=
BILLING_CODE_ACCESS_GITHUB_TOKEN=
  • STRIPE_WEBHOOK_SECRET est utilisé par l'endpoint webhook du plugin Better Auth Stripe.

  • STRIPE_ONE_TIME_WEBHOOK_SECRET est utilisé par l'endpoint webhook custom des achats ponctuels.

  • Les prix des produits de facturation sont gérés depuis l'admin ou MCP et synchronisés vers Stripe; les Stripe Price IDs résultants sont stockés en interne dans billing_products.

  • Les URL BILLING_CODE_ACCESS_* sont des liens non secrets optionnels affichés sur /dashboard/organization/code-access après un achat éligible ou un abonnement actif. Laissez une valeur vide lorsqu'un livrable nécessite une provision manuelle.

  • L'accès dépôt GitHub pour l'accès au code payant est configuré depuis /dashboard/admin/billing-settings. Les valeurs non secrètes peuvent aussi être fournies en repli avec BILLING_CODE_ACCESS_GITHUB_REPOSITORY, BILLING_CODE_ACCESS_GITHUB_APP_ID et BILLING_CODE_ACCESS_GITHUB_APP_INSTALLATION_ID.

  • Gardez les secrets GitHub uniquement en variables d'environnement: BILLING_CODE_ACCESS_GITHUB_APP_PRIVATE_KEY pour le provisioning GitHub App de production, ou BILLING_CODE_ACCESS_GITHUB_TOKEN comme repli local/staging optionnel.

  • Voir Configuration de l'environnement de déploiement pour la création de GitHub App, l'ID d'installation, la clé privée et le chemin de repli token.

Hôte Canonique Et Sessions Auth

  • Définissez NEXT_PUBLIC_BASE_URL sur l'hôte production canonique.

  • Définissez le NEXT_PUBLIC_BASE_URL de prévisualisation sur l'hôte branch-backed stable lorsqu'il est configuré.

  • Ne mélangez pas les hôtes www et non-www pour les sessions authentifiées.

  • Gardez BETTER_AUTH_TRUSTED_ORIGINS pour les hôtes preview/local requis. L'hôte canonique et sa variante www sont déjà dérivés de NEXT_PUBLIC_BASE_URL.

  • Pour les routes préfixées par locale, préférez @/i18n/navigation (Link, useRouter, usePathname) à next/link et next/navigation dans les composants de navigation applicative.

OAuth (Optionnel)

OAUTH_PROVIDER_ENCRYPTION_KEYS=key1:<cle-de-32-octets-encodee-en-base64>

Ce trousseau réservé au serveur chiffre les secrets des fournisseurs dans Postgres. Configurez Google, GitHub et Microsoft dans Administration > Réglages du site, puis testez et activez-les sans redéploiement. Les identifiants et secrets des fournisseurs ne sont pas lus dans les variables d'environnement. Gardez cette clé distincte de BETTER_AUTH_SECRET ; la première chiffre, les anciennes déchiffrent.

RESEND_API_KEY=
EMAIL_SENDER=[email protected]
EMAIL_SUPPORT=[email protected]
EMAIL_USERNAME=Yayaw Team

EMAIL_SENDER est l'adresse expéditrice vérifiée Resend utilisée dans les en-têtes From. EMAIL_SUPPORT apparaît dans les modèles et contenus support. EMAIL_USERNAME est le nom affiché avec l'adresse d'envoi. Ces variables sont des valeurs bootstrap et de repli; les valeurs runtime enregistrées dans Admin > Site Settings > Email sont prioritaires après setup.

Stockage (Optionnel Pour Les Fonctionnalités Média)

Le stockage média utilise une API compatible S3 comme MinIO, AWS S3 ou R2. STORAGE_PROVIDER doit rester défini sur s3.

STORAGE_PROVIDER=s3
STORAGE_MEDIA_BUCKET=media
STORAGE_MEDIA_STAGING_BUCKET=media-staging
STORAGE_CMS_FORM_BUCKET=cms-form-submissions
STORAGE_PRIVATE_MEDIA_BUCKET=private-media
PRIVATE_MEDIA_MAX_FILE_BYTES=5242880
PRIVATE_MEDIA_MAX_USER_BYTES=26214400
STORAGE_PUBLIC_BASE_URL=
CMS_MEDIA_STAGED_UPLOADS_ENABLED=false
STORAGE_TRANSFER_SIGNING_SECRET=
CMS_PERSONALIZATION_RATE_LIMIT_SECRET=
CMS_PERSONALIZATION_FORM_CONTEXT_SECRET=
CMS_PERSONALIZATION_CLIENT_IP_HEADER=x-real-ip
S3_ENDPOINT=
S3_SIGNED_PUBLIC_ENDPOINT=
S3_REGION=us-east-1
S3_ACCESS_KEY_ID=
S3_SECRET_ACCESS_KEY=
S3_FORCE_PATH_STYLE=true
  • STORAGE_MEDIA_BUCKET vaut media par défaut.

  • CMS_MEDIA_STAGED_UPLOADS_ENABLED vaut false par défaut. Activez-le seulement lorsque toutes les instances exécutent la version compatible avec les téléversements en staging.

  • STORAGE_MEDIA_STAGING_BUCKET sélectionne le bucket privé des téléversements client signés. Le développement peut se replier sur STORAGE_MEDIA_BUCKET, mais le staging en production refuse de démarrer si ce bucket privé distinct n'est pas configuré. Limitez la règle de cycle de vie du fournisseur au préfixe des objets de staging.

  • STORAGE_CMS_FORM_BUCKET sélectionne le bucket privé durable des pièces jointes envoyées par les formulaires CMS publics enregistrés. Il peut se replier sur STORAGE_MEDIA_STAGING_BUCKET, mais ne doit jamais être le bucket média public. Si les deux flux partagent un bucket privé, limitez les règles de cycle de vie du staging à son préfixe pour ne pas effacer les demandes.

  • STORAGE_PRIVATE_MEDIA_BUCKET sélectionne le bucket privé des médias privés, les fichiers qu'une personne garde pour elle dans une organisation. Il se replie sur STORAGE_MEDIA_STAGING_BUCKET et ne doit jamais être le bucket média public ; sans un tel bucket, les routes des médias privés répondent 503. S'il partage le bucket de staging, limitez la règle de cycle de vie au préfixe du staging pour ne pas effacer les objets private-media/.

  • PRIVATE_MEDIA_MAX_FILE_BYTES (5 Mio par défaut) et PRIVATE_MEDIA_MAX_USER_BYTES (25 Mio par défaut) limitent un fichier de média privé et l'ensemble de ce qu'une personne garde dans une organisation. Les médias privés comptent aussi dans le stockage du forfait de l'organisation.

  • STORAGE_TRANSFER_SIGNING_SECRET sépare facultativement les grants de stockage same-origin opaques et à courte durée des autres signatures. Il se replie sur CMS_PREVIEW_SIGNING_SECRET, puis BETTER_AUTH_SECRET, et le secret effectif doit contenir au moins 32 caractères en production. L'application chiffre et authentifie le bucket, la clé objet, l'opération, le type MIME, la borne d'octets et l'expiration ; les URLs client utilisent NEXT_PUBLIC_BASE_URL et n'exposent jamais S3_ENDPOINT. Gardez les buckets privés sans accès anonyme. Par défaut, les uploads de staging transitent en streaming par l'application, avec une limite exacte de 250 Mo, une écriture conditionnelle sans écrasement et une deadline au plus tard à l'expiration du grant.

  • S3_SIGNED_PUBLIC_ENDPOINT est une origine d'API S3 publique explicitement activée pour les uploads signés directs lorsque la limite de corps de requête de l'hébergeur applicatif est inférieure au contrat média CMS de 250 Mo. Elle ne se replie jamais sur S3_ENDPOINT ; en production, seul un hostname HTTPS public sûr est accepté. Le PUT direct retourné signe If-None-Match: * et le client doit envoyer tous les headers reçus. La politique CORS du bucket doit autoriser l'origine applicative, PUT et les headers de requête Content-Type, Content-Length et If-None-Match. Les téléchargements, dont les photos de personnalisation, passent toujours par le proxy applicatif opaque. Laissez cette valeur vide sur Coolify et en self-host lorsque l'application peut streamer vers l'endpoint S3 interne. Les téléchargements de photos de personnalisation utilisent un grant durable à usage unique, lié à l'audience et limité à deux minutes. Le proxy consomme atomiquement le grant courant avant de lire le stockage, et toute nouvelle émission invalide l'URL précédente.

  • CMS_PERSONALIZATION_RATE_LIMIT_SECRET est un secret HMAC dédié facultatif pour le quota anti-abus des demandes de personnalisation. Il doit contenir au moins 32 caractères et se replie sur CMS_PREVIEW_SIGNING_SECRET, puis BETTER_AUTH_SECRET. Le quota ne stocke que le sujet HMAC, jamais l'adresse IP brute, et la demande client n'est pas liée à ce sujet.

  • CMS_PERSONALIZATION_FORM_CONTEXT_SECRET est obligatoire et doit contenir au moins 32 caractères. Il signe le contexte éphémère injecté par le runtime public et lie chaque soumission au handler, à l'action, à la page, à sa révision immuable, au scope, à l'organisation, à la locale, au chemin et à l'origine. Gardez-le distinct pour permettre une rotation indépendante.

  • CMS_PERSONALIZATION_CLIENT_IP_HEADER est obligatoire en production et désigne un header possédé par le proxy qui contient exactement une IP client canonique. Configurez l'ingress pour supprimer toute valeur fournie par le client et écrire la valeur de confiance. x-forwarded-for est refusé car son premier saut n'est pas une identité client authentifiée. Les configurations Caddy fournies écrasent x-real-ip, qui est donc la valeur self-host par défaut ; pour un autre ingress, choisissez son header canonique uniquement après avoir vérifié qu'il écrase les valeurs client. L'endpoint applique atomiquement six soumissions par IP de confiance et 1 200 soumissions globales par heure, puis le worker purge les buckets anti-abus expirés.

  • STORAGE_PUBLIC_BASE_URL est requis pour le stockage compatible S3 et doit être une URL publique capable de servir les chemins publics /<bucket>/<object-key>. Il n'est jamais utilisé pour les buckets privés de staging ou de formulaires CMS.

  • Si STORAGE_PUBLIC_BASE_URL utilise l'origine app ou CDN, routez chaque préfixe de bucket public vers le stockage objet avant le repli vers l'app. Les préfixes publics intégrés sont /media/* et /organization-logos/*.

  • Le stockage compatible S3 requiert endpoint, région, access key, secret key et URL publique de base. Gardez S3_FORCE_PATH_STYLE=true pour MinIO et la plupart des endpoints compatibles S3 locaux. S3_ENDPOINT peut rester un hostname Docker interne ou de réseau privé car il n'est jamais transmis au navigateur. Après promotion, l'objet de staging vérifié reste un tombstone privé d'écriture conditionnelle pendant l'expiration du grant et une stabilisation de 24 heures. Le reaper répète la suppression et n'enregistre le nettoyage qu'après le DELETE final. Un bearer encore valide ou un PUT direct tardif ne peut donc pas recréer durablement le staging, y compris depuis une autre instance applicative.

  • bun run seed téléverse les ressources par défaut de variables globales de site dans STORAGE_MEDIA_BUCKET lorsque le stockage est configuré. Sans identifiants de stockage, le seed conserve des ressources publiques locales de repli pour que le setup local se termine.

  • Les lignes média existantes stockent des URL publiques absolues; changer de fournisseur plus tard requiert soit de garder les anciennes URL joignables, soit de lancer une migration volontaire d'URL média.

OpenAI (Optionnel Pour Les Builders IA)

OPENAI_API_KEY=
OPENAI_COMPONENTS_AI_FALLBACK=true
OPENAI_IMAGE_GENERATION_ENABLED=true
OPENAI_IMAGE_MODEL=gpt-image-1.5
PAGE_AI_QUEUE_DRIVER=direct
PAGE_AI_DEEP_REFINEMENT=false
PAGE_AI_WORKER_POLL_MS=1500
PAGE_AI_WORKER_MAINTENANCE_MS=60000
PAGE_AI_WORKER_ID=
  • OPENAI_COMPONENTS_AI_FALLBACK contrôle les replis IA texte/objet des flux de component builder et page builder.

  • OPENAI_IMAGE_GENERATION_ENABLED contrôle la génération d'images du page builder.

  • Les réglages runtime de site peuvent aussi désactiver ces fonctions IA via ai-components-enabled et media-image-generation-enabled sans changer les variables d'environnement.

  • Les images générées par le page builder utilisent le modèle image OpenAI configuré, gpt-image-1.5 par défaut, et sont stockées comme ressources média webp via la médiathèque d'organisation.

  • PAGE_AI_QUEUE_DRIVER contrôle le transport de réveil durable Page AI: direct en développement local, vercel-queue sur Vercel et db-worker pour un processus worker long-lived. En production, le défaut est db-worker. Le chemin legacy vercel-queue n'est sélectionné que lorsqu'il est configuré explicitement; les variables VERCEL_* résiduelles sont ignorées.

  • PAGE_AI_DEEP_REFINEMENT est un toggle qualité interne uniquement environnement, non exposé comme réglage de site admin.

  • PAGE_AI_WORKER_POLL_MS, PAGE_AI_WORKER_MAINTENANCE_MS et PAGE_AI_WORKER_ID sont utilisés uniquement par bun run worker:page-ai quand PAGE_AI_QUEUE_DRIVER=db-worker. L'intervalle de maintenance vaut une minute par défaut et pilote la rétention durable des demandes, la récupération des photos orphelines et la purge des buckets anti-abus expirés via un timer indépendant sans chevauchement, y compris pendant un run Page AI long ou bloqué. Les PUT de personnalisation sont abandonnés après deux minutes ; les uploads ambigus conservent un tombstone de nettoyage sans PII jusqu'à un second DELETE objet exécuté après une fenêtre de stabilisation de trois minutes.

PostHog (Optionnel Pour Analytics Et Flags)

NEXT_PUBLIC_ANALYTICS_PROVIDER=posthog
NEXT_PUBLIC_ANALYTICS_CAPTURE_MODE=hybrid
NEXT_PUBLIC_POSTHOG_KEY=
NEXT_PUBLIC_POSTHOG_HOST=https://eu.i.posthog.com
NEXT_PUBLIC_POSTHOG_ENABLE_LOCAL=false
POSTHOG_PERSONAL_API_KEY=
POSTHOG_PROJECT_ID=
POSTHOG_API_HOST=https://eu.posthog.com
POSTHOG_ORG_ID_PROPERTY=organization_id
POSTHOG_FLAG_LOOKUP_TIMEOUT_MS=

Les valeurs NEXT_PUBLIC_POSTHOG_* servent à la capture, aux feature flags et à l'identification client. POSTHOG_PERSONAL_API_KEY, POSTHOG_PROJECT_ID et POSTHOG_API_HOST sont des valeurs privées server-only utilisées par les analytics de /dashboard pour interroger PostHog via l'API Query privée. POSTHOG_ORG_ID_PROPERTY vaut organization_id par défaut et doit correspondre à la propriété d'événement enregistrée pour les métriques dashboard bornées à l'organisation. POSTHOG_FLAG_LOOKUP_TIMEOUT_MS ajuste optionnellement le timeout de lookup des feature flags PostHog côté serveur; il vaut 1500 par défaut.

NEXT_PUBLIC_ANALYTICS_CAPTURE_MODE contrôle où les événements sont capturés: hybrid garde l'analytics navigateur pour le comportement produit et envoie les événements facturation/auth côté serveur, server désactive les scripts analytics navigateur et suit les vues CMS plus les conversions depuis le serveur, et client conserve l'ancienne capture uniquement navigateur. Les événements de facturation côté serveur incluent des propriétés de conversion comme revenue, value, currency, plan, product_key et les IDs Stripe.

Umami (Fournisseur Analytics Optionnel)

NEXT_PUBLIC_ANALYTICS_PROVIDER=umami
NEXT_PUBLIC_ANALYTICS_CAPTURE_MODE=hybrid
NEXT_PUBLIC_UMAMI_HOST_URL=
NEXT_PUBLIC_UMAMI_SCRIPT_URL=
NEXT_PUBLIC_UMAMI_WEBSITE_ID=
NEXT_PUBLIC_UMAMI_DOMAINS=
NEXT_PUBLIC_UMAMI_AUTO_TRACK=true
UMAMI_API_URL=
UMAMI_WEBSITE_ID=
UMAMI_API_TOKEN=
UMAMI_API_KEY=
UMAMI_USERNAME=
UMAMI_PASSWORD=
UMAMI_CMS_EVENT_PAGE_SIZE=1000

Les valeurs NEXT_PUBLIC_UMAMI_* configurent le script de tracking navigateur et sont intégrées au bundle client au build time. UMAMI_API_URL, UMAMI_WEBSITE_ID, et soit UMAMI_API_TOKEN (ou l'alias legacy UMAMI_API_KEY), soit UMAMI_USERNAME plus UMAMI_PASSWORD, sont des valeurs server-only utilisées par les fournisseurs de données analytics dashboard.

Pour une configuration sans analytics navigateur, définissez NEXT_PUBLIC_ANALYTICS_CAPTURE_MODE=server. L'app ne rendra pas le script Umami, et les événements serveur seront envoyés directement vers Umami /api/send avec un User-Agent serveur. Cela améliore la confidentialité et évite les cookies client, mais la qualité session, visiteur unique, appareil et référent est moins précise que la capture navigateur.

Plan De Contrôle MCP (Optionnel)

YAYAW_MCP_API_KEY=
YAYAW_MCP_LOCAL_USER_ID=
CMS_PREVIEW_SIGNING_SECRET=
CMS_LEGACY_PROTOTYPE_WRITES_ENABLED=false
CMS_PROTOTYPE_RUNTIME_V2_WRITES_ENABLED=false
CMS_PROTOTYPE_ROLLOUT_OPERATION_ID=
CMS_LEGACY_PAGE_DESIGN_ADMIN_BYPASS_ENABLED=false
CMS_LOW_LEVEL_PAGE_ADMIN_BYPASS_ENABLED=false
  • YAYAW_MCP_API_KEY est utilisé par le lanceur MCP stdio local lorsque le développement local doit vérifier une vraie clé API Better Auth.

  • YAYAW_MCP_LOCAL_USER_ID est utilisé uniquement par le lanceur stdio local lorsqu'aucune clé API n'est fournie.

  • Les clients MCP production se connectent à /api/mcp avec Authorization: Bearer <Yayaw API key or OAuth access token> et doivent stocker les secrets hors du dépôt.

  • Les métadonnées OAuth MCP sont dérivées de NEXT_PUBLIC_BASE_URL; les clients ChatGPT/App production ont besoin que cette valeur soit l'origine HTTPS publique afin que l'issuer, la ressource, JWKS et les redirections soient stables.

  • CMS_PROTOTYPE_ROLLOUT_OPERATION_ID est géré par le workflow manuel de rollout de confiance. Il reste vide en reader/freeze et identifie le reçu durable en activation, puis consommé, en mode exact. Ne le définissez ni ne le faites tourner indépendamment de CMS Prototype Runtime Rollout.

  • CMS_LOW_LEVEL_PAGE_ADMIN_BYPASS_ENABLED vaut false par défaut. Ne l'activer que pendant une opération de maintenance bornée et auditée qui doit appeler yayaw_pages_create_draft ou yayaw_pages_save_draft; les créations et reworks normaux utilisent le workflow de design contextuel.

Transforms Runtime Dynamic Data (Optionnel)

DYNAMIC_DATA_RUNTIME_TRANSFORM_SECRET=
  • DYNAMIC_DATA_RUNTIME_TRANSFORM_SECRET est requis uniquement lorsqu'une route runtime dynamique déployée déclare une transform de valeur hmac_sha256. Générez une valeur server-only stable et à forte entropie, puis faites-la tourner délibérément, car les valeurs de lookup transformées existantes en dépendent.

Géocodeur (Optionnel)

GEOCODER_URL=
GEOCODER_RATE_LIMIT=
  • Le géocodage est désactivé tant que GEOCODER_URL est vide, ce qui est le cas par défaut : les champs de localisation ne prennent alors que des coordonnées, saisies à la main ou lues dans un fichier importé.

  • GEOCODER_URL est l'URL de base d'une instance Photon, comme l'instance publique de komoot, https://photon.komoot.io, tant que le volume reste faible ; hébergez la vôtre quand il augmente. Ce doit être une URL http(s) simple, sans identifiants, paramètres de requête ni fragment, sinon le géocodage reste désactivé et le serveur journalise un avertissement. Le Nominatim public ne peut pas servir : sa politique d'utilisation interdit l'autocomplétion.

  • Ce qui est envoyé, et où : le serveur Yayaw, jamais le navigateur, envoie à cette instance le texte qu'une personne tape dans la recherche d'adresse d'un champ de localisation et les adresses d'un fichier qu'elle importe dans une colonne de localisation, avec la langue de l'interface (en ou fr) et l'agent utilisateur Yayaw Geocoder/1.0. Rien d'autre ne les accompagne : ni compte, ni organisation, ni enregistrement, ni clé. Les adresses que vos utilisateurs saisissent sont donc envoyées au géocodeur configuré : dites-le-leur, et choisissez une instance dont les conditions conviennent à votre politique de confidentialité.

  • Limites : une recherche demande de 3 à 300 caractères, renvoie au plus 8 lieux et attend l'instance 3 secondes au plus. Les réponses sont gardées 24 heures dans chaque instance du serveur, séparément pour chaque organisation. Chaque personne envoie au plus GEOCODER_RATE_LIMIT recherches par minute à l'instance (60 par défaut) ; les réponses servies depuis le cache ne comptent pas.

  • Le serveur journalise le nombre de lieux trouvés par une recherche et sa durée, jamais le texte recherché.

Mode Maintenance (Optionnel)

MAINTENANCE_MODE=false
MAINTENANCE_MODE_END_DATE=

Runtime De Déploiement

DEPLOYMENT_PROVIDER=
DEPLOYMENT_URL=
DEPLOYMENT_ENV=
DEPLOYMENT_GIT_COMMIT_SHA=
DEPLOYMENT_GIT_COMMIT_REF=
PUBLIC_DOMAIN_PROVIDER=
APP_MANAGED_HOSTS=
RESERVED_PUBLIC_DOMAIN_SUFFIXES=
PUBLIC_DOMAIN_CNAME_TARGET=
PUBLIC_DOMAIN_IPV4_TARGETS=
PUBLIC_DOMAIN_TXT_PREFIX=_yayaw
  • DEPLOYMENT_PROVIDER doit valoir static dans Docker/Coolify et local en développement local. Il est déduit de DEPLOYMENT_URL lorsqu'il reste vide. Les métadonnées Vercel legacy exigent un DEPLOYMENT_PROVIDER=vercel explicite; les variables VERCEL_* résiduelles sont ignorées.

  • DEPLOYMENT_URL, DEPLOYMENT_ENV, DEPLOYMENT_GIT_COMMIT_SHA et DEPLOYMENT_GIT_COMMIT_REF fournissent les métadonnées de déploiement dashboard/plan de contrôle pour les runtimes Docker/Coolify.

  • PUBLIC_DOMAIN_PROVIDER doit valoir manual-dns; c'est le chemin supporté pour le déploiement auto-hébergé actuel. La gestion legacy des domaines Vercel n'est sélectionnée qu'avec un PUBLIC_DOMAIN_PROVIDER=vercel explicite.

  • APP_MANAGED_HOSTS ajoute des hôtes possédés par l'app, séparés par des virgules, que les domaines publics d'organisation ne peuvent pas réclamer.

  • RESERVED_PUBLIC_DOMAIN_SUFFIXES ajoute des suffixes, comme .preview.example, que les domaines publics personnalisés ne peuvent pas réclamer.

  • PUBLIC_DOMAIN_CNAME_TARGET, PUBLIC_DOMAIN_IPV4_TARGETS et PUBLIC_DOMAIN_TXT_PREFIX alimentent les indications du fournisseur DNS manuel et le challenge TXT de propriété.

  • Des branches de compatibilité Vercel restent dans le runtime pour les données existantes, mais ne configurez aucune valeur VERCEL_* et ne liez pas ce checkout à Vercel.

Source De Vérité

Gardez .env.example synchronisé avec l'usage réel du code lorsque vous ajoutez ou supprimez des variables. Documentez les étapes de récupération dans Configuration de l'environnement de déploiement chaque fois qu'un opérateur doit collecter une valeur depuis un fournisseur externe.

Dépannage De L'Outillage Local

Certaines machines locales peuvent rencontrer un blocage du service esbuild lors de l'exécution des générateurs Drizzle ou docs.

Si une commande semble bloquée:

  1. Utilisez les scripts safe avec timeout:

bun run docs:generate
bun run db:generate
bun run db:push
  1. Si cela échoue encore, réinstallez les dépendances:

rm -rf node_modules
bun install
  1. Réessayez la commande et vérifiez avec:

bun run check
bun run build