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. |
website/.env | Le site : les valeurs NEXT_PUBLIC_* au build, API_INTERNAL_URL sur son serveur | Non. Chaque valeur est publique ou une adresse. |
dashboard/.env | Le tableau de bord, au build, et son PORT quand yarn dev ou yarn start démarre | Non. Toutes les valeurs sont publiques. |
.env à côté de docker-compose.yml | Docker Compose uniquement : les ports et les adresses avec lesquels il construit les trois applications | 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, et chaque valeur y est facultative. Les valeurs NEXT_PUBLIC_* sont lues quand le site est construit et sont publiques, elles ne contiennent donc jamais de secret ; API_INTERNAL_URL est lue par le serveur du site lui-même. Sans le fichier, le site fonctionne sur ses données d'exemple intégrées. Pour utiliser une API, créez-le à partir de .env.example, qui en désigne une sur http://localhost:8000 : cp .env.example .env. Avec Docker, passez les valeurs NEXT_PUBLIC_* en --build-arg et API_INTERNAL_URL avec -e.
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 et, pour PORT, quand yarn dev ou yarn start démarre. Chaque valeur y est publique, il ne contient donc jamais de secret : les clés de fournisseur et de paiement vivent dans le .env de l'API. Sans le fichier, le tableau de bord fonctionne sur ses données d'exemple intégrées. Pour utiliser une API, créez-le à partir de .env.example, qui en désigne une 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, yarn start:prod et yarn seed. 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, si bien que docker run fonctionne sans fichier : NODE_ENV=production, SQLite sur /data/database.sqlite, fichiers téléversés dans /data/uploads, CORS_ORIGIN pour les deux frontends locaux, FRONTEND_URL et DASHBOARD_URL réglés sur http://localhost:3031, WEBSITE_URL=http://localhost:3030, PUBLIC_API_URL=http://localhost:8000 et PUBLIC_MEDIA_URL=http://localhost:8000/media. 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'un manque ou est inutilisable, elle s'arrête avec une ligne commençant par The API cannot start: qui dit quoi corriger.
| Variable | Rôle |
|---|---|
NODE_ENV | development en local, ce qui crée et met à jour les tables au démarrage. production sur un serveur en ligne, ce qui ne touche jamais aux tables et refuse le JWT_SECRET d'exemple et un CORS_ORIGIN vide. |
PORT | Le port de l'API, 8000. Les deux frontends pointent vers lui. |
DB_TYPE | sqlite (la valeur par défaut si non défini) ou mysql. |
SQLITE_DATABASE | Chemin du fichier SQLite, ./database.sqlite, relatif au dossier de l'API. |
JWT_SECRET | Signe chaque connexion. Obligatoire. La valeur de l'exemple n'est acceptée qu'en dehors de la production. |
JWT_EXPIRATION | Durée d'une connexion, 7d quand il n'est pas défini. Le formulaire de connexion du tableau de bord la remplace : Remember me coché ouvre une session de 30 jours, décoché une de 12 heures. |
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, la seule origine qu'acceptent ses mises à jour de permissions en direct, http://localhost:3031 quand elle n'est pas définie. |
DASHBOARD_URL | L'adresse du tableau de bord dans les liens que l'API écrit : invitations, réinitialisations de mot de passe et la page où revient un paiement de formule. http://localhost:3031 quand elle n'est pas définie. |
WEBSITE_URL | L'adresse du site : Stripe et PayPal y ramènent les acheteurs de licences. http://localhost:3030 quand elle n'est pas définie. |
PUBLIC_API_URL | L'adresse publique propre de l'API, utilisée dans les liens signés de téléchargement des factures. |
RATE_LIMIT_LOGIN | Nombre de connexions échouées qu'une adresse peut faire en 15 minutes avant de recevoir 429, 10 par défaut. |
TRUST_PROXY | Le nombre de reverse proxies devant l'API (1 derrière Nginx, Caddy ou un load balancer ; 2 avec Cloudflare devant ce proxy), pour que la limite de connexion et les limites par adresse de la démo comptent les visiteurs plutôt qu'un proxy. L'adresse est lue depuis la droite de X-Forwarded-For, donc un client ne peut pas la choisir. Laissez-le vide quand l'API est jointe directement. |
ADMIN_EMAIL, ADMIN_PASSWORD, ADMIN_NAME | Le premier admin de la plateforme que crée yarn admin:create, pour un démarrage sans les comptes d'exemple. La commande demande un e-mail ou un mot de passe vide ; le nom est Platform Admin quand il est vide. |
SEED_SAMPLE_DATA | Docker uniquement. true (la valeur par défaut) initialise un nouveau volume avec les données d'exemple et les connexions publiées. false le démarre à vide : les tables, plus le premier admin de la plateforme quand ADMIN_EMAIL et ADMIN_PASSWORD sont définis. Avec Docker Compose, cela va dans le fichier .env à côté de docker-compose.yml, avec ADMIN_EMAIL et ADMIN_PASSWORD ; Compose passe ces trois valeurs depuis celui-là, donc dans back-end/.env elles ne sont lues que par les commandes yarn. |
Générez votre propre JWT_SECRET avec :
node -e "console.log(require('crypto').randomBytes(48).toString('hex'))"Chaque fonctionnalité facultative ci-dessous est désactivée tant que ses variables dans .env.example restent vides.
Paiements
Deux parcours encaissent de l'argent. La page Billing du tableau de bord change la formule d'abonnement d'un espace de travail, et le paiement du site vend les licences. Tous deux ne prennent les données de carte que sur la page de Stripe ou de PayPal (un passage à une formule supérieure est facturé sur la carte que Stripe détient déjà) : elles ne sont donc jamais saisies sur votre site, et tous deux fonctionnent sans aucun compte grâce à des paiements test intégrés qui ne débitent personne. Utilisez d'abord des clés de test : elles ne déplacent aucun argent.
STRIPE_SECRET_KEY=sk_test_your_key
STRIPE_WEBHOOK_SECRET=whsec_your_secret
BILLING_PROVIDER=
BILLING_GRACE_DAYS=7
PAYPAL_CLIENT_ID=your-client-id
PAYPAL_CLIENT_SECRET=your-client-secret
PAYPAL_ENV=sandbox| Variable | Rôle |
|---|---|
STRIPE_SECRET_KEY | Stripe, pour les deux parcours. Avec lui, un premier paiement ouvre Stripe Checkout, le passage à une formule supérieure d'un abonnement en cours est facturé sur la carte enregistrée, un retour à une formule inférieure est planifié sur l'abonnement, Manage payment method ouvre le portail client de Stripe, et une carte sur le paiement des licences paie sur la page hébergée de Stripe. Une clé qui commence par sk_test_ est en mode test ; avec une clé sk_live_, les changements de formule débitent de vraies cartes. |
STRIPE_WEBHOOK_SECRET | Vérifie l'unique webhook que partagent les deux parcours, https://<your-api>/api/billing/webhooks/stripe, avec les événements checkout.session.completed, checkout.session.expired, invoice.paid, invoice.payment_failed et customer.subscription.deleted. Chaque événement n'est appliqué qu'une fois. Avec STRIPE_SECRET_KEY défini et celui-ci vide, le journal de l'API le signale au démarrage et chaque envoi est refusé par un 400 qui nomme la variable : les renouvellements, les paiements échoués et les annulations ne sont donc pas enregistrés. |
BILLING_PROVIDER | Vide, il choisit Stripe quand sa clé est définie et le paiement test sinon. simulator force le paiement test même avec des clés. |
BILLING_GRACE_DAYS | Nombre de jours pendant lesquels un espace de travail en retard de paiement, ou dont l'essai s'est terminé sans paiement, peut encore démarrer de nouveaux projets, invitations et clés d'API, 7 par défaut. La lecture continue toujours de fonctionner, et rien n'est supprimé pour un paiement échoué. |
PAYPAL_CLIENT_ID, PAYPAL_CLIENT_SECRET | Une application REST PayPal, pour PayPal dans le paiement des licences. Le paiement est capturé au retour de l'acheteur. |
PAYPAL_ENV | sandbox (la valeur par défaut, sans argent réel) ou live. |
Sur votre ordinateur, Stripe ne peut pas atteindre le webhook : les pages de retour demandent donc elles-mêmes la session à Stripe, et un paiement test aboutit quand même. Une formule ou une licence n'est comptée comme payée qu'une fois que l'API l'a vérifiée auprès du fournisseur, jamais à partir de la seule adresse de retour. Northstack n'applique aucune taxe de lui-même : configurez la fiscalité de votre pays avant d'encaisser de vrais paiements.
Les invitations, les réinitialisations de mot de passe, les reçus de licence, les e-mails de facturation et le résumé hebdomadaire sont envoyés par SMTP dès que SMTP_HOST est défini, chacun dans la langue du destinataire (celle de l'espace de travail quand il n'en a choisi aucune). Jusque-là, chaque message est écrit dans le journal de l'API à la place, liens compris, pour qu'une installation locale puisse les suivre (avec Docker : docker compose logs api).
SMTP_HOST=smtp.your-provider.com
SMTP_PORT=587
SMTP_SECURE=false
SMTP_USER=your-smtp-user
SMTP_PASSWORD=your-smtp-secret
SMTP_FROM=Northstack <no-reply@your-domain.com>
CONTACT_INBOX=hello@your-domain.comSMTP_SECURE=true convient à un serveur qui parle TLS dès le premier octet, généralement sur le port 465. CONTACT_INBOX est l'adresse vers laquelle sont transférés les messages du formulaire de contact du site ; vide, ils ne restent que dans la base.
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=your-database-secret
DB_DATABASE=northstackPuis lancez yarn seed, qui crée les tables et les données d'exemple. L'API en cours d'exécution ne crée et ne met à jour les tables elle-même que si NODE_ENV=development : avec NODE_ENV=production, lancez donc une fois yarn admin:create:prod après yarn build pour les tables et votre premier admin de la plateforme (yarn seed:prod pour une installation d'exemple), et yarn schema:prod après chaque mise à jour. L'image Docker crée seule la base sur SQLite uniquement : sur MySQL, lancez vous-même une fois node dist/database/create-admin.js (ou node dist/database/seeder.js) dans le conteneur.
Fichiers téléversés et médias
L'API sert elle-même les fichiers de marque du kit sur /media. Les fichiers et images de projet téléversés depuis le tableau de bord, 10 Mo au maximum chacun, 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 un navigateur atteint /media. Sur un serveur, pointez MEDIA_UPLOAD_DIR vers un stockage persistant ; avec Docker, il est dans le volume de données, et le conteneur y déplace seul un dossier relatif. L'API envoie chaque fichier là-bas avec nosniff, et un fichier qui n'est ni une image, ni un PDF, ni du texte brut, ni de l'audio ou de la vidéo en téléchargement.
Pour envoyer les fichiers téléversés vers un bucket Cloudflare R2, définissez les cinq variables. Avec moins de cinq, les fichiers restent sur le disque. Le journal de l'API indique le stockage utilisé au démarrage : Media storage: R2 bucket suivi du nom du bucket, ou Media storage: local folder suivi du dossier.
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.devSite et tableau de bord
Chaque valeur NEXT_PUBLIC_* est compilée dans le JavaScript que charge le navigateur, et quiconque ouvre la page peut la lire. N'y mettez jamais de secret, et reconstruisez (ou redémarrez yarn dev) après en avoir changé une. Avec Docker, passez-les en --build-arg.
NEXT_PUBLIC_API_BASE_URL détermine d'où viennent les données de chaque frontend. Vide, ou sans aucun .env, l'application fonctionne sur ses données d'exemple intégrées et n'appelle aucune API. Définie avec l'adresse de l'API /api comprise (http://localhost:8000/api dans .env.example et dans les images Docker), elle utilise cette API, et ne prend le relais avec les données d'exemple dans le navigateur que tant que cette API ne répond pas.
Les paramètres du site
| Variable | Par défaut | Rôle |
|---|---|---|
NEXT_PUBLIC_SITE_URL | http://localhost:3030 | L'adresse publique de ce site : les liens canoniques, les alternatives de langue, le sitemap et les cartes de partage en sont construits. Définissez-la avec votre domaine avant la mise en ligne. |
NEXT_PUBLIC_API_BASE_URL | Vide sans .env | L'API Northstack, /api compris, pour le formulaire de contact et le paiement des licences. |
API_INTERNAL_URL | Vide | Facultatif, lu à l'exécution par le serveur du site seulement, pour le paiement et son reçu rendus côté serveur. Vide, il utilise NEXT_PUBLIC_API_BASE_URL. Dans Docker, définissez-le avec l'adresse de l'API telle que le conteneur l'atteint (http://api:8000/api dans Docker Compose). |
NEXT_PUBLIC_DASHBOARD_URL | http://localhost:3031 | Le tableau de bord. Live demo, Explore the demo, See role controls et Sign in sur /error/401 l'ouvrent, et /auth/signin, /auth/signup et /auth/forgot-password du site passent la main à ses pages. |
NEXT_PUBLIC_PURCHASE_URL_SINGLE, NEXT_PUBLIC_PURCHASE_URL_STUDIO | Vide | La page de paiement d'une boutique externe pour chaque licence. Vide, il garde le paiement du site sur /checkout. |
NEXT_PUBLIC_SAMPLE_DATA_NOTICE | Vide | always affiche l'avis Sample data dans un build de production quand l'API définie ci-dessus ne répond pas ; avec Docker, --build-arg NEXT_PUBLIC_SAMPLE_DATA_NOTICE=always. Il s'affiche toujours en développement, et dans tout build fait sans API. |
BUILD_STANDALONE | Vide | true fait produire à yarn build un serveur autonome dans .next/standalone, ce que définit le Dockerfile. Laissez-le vide pour yarn start. |
Le port du site est 3030, écrit dans les scripts de son package.json. Pour un autre, lancez yarn next dev -p 3040 (ou yarn next start -p 3040 après yarn build).
Les paramètres du tableau de bord
| Variable | Par défaut | Rôle |
|---|---|---|
PORT | 3031 | Le port qu'utilisent yarn dev et yarn start. scripts/next-with-port.mjs le lit dans .env et le transmet à Next.js. |
NEXT_PUBLIC_API_BASE_URL | Vide sans .env | L'API Northstack, /api compris. Chaque écran lui parle. |
NEXT_PUBLIC_WEBSOCKET_BASE_URL | L'adresse de l'API sans /api | Le serveur de l'API, pour les mises à jour de permissions en direct. |
NEXT_PUBLIC_BASE_URL | http://localhost:3031 | L'adresse publique de ce tableau de bord : robots.txt, le sitemap, l'adresse de l'espace de travail affichée dans l'onboarding et les adresses absolues des métadonnées. |
NEXT_PUBLIC_WEBSITE_URL | http://localhost:3030 | Le site public : le lien Documentation de la barre latérale et les liens Privacy et Terms de la page de connexion. |
BUILD_STANDALONE | Non défini | true fait produire à yarn build un serveur autonome, ce que définit le Dockerfile. Sinon, laissez-le non défini. |
Aucune clé de fournisseur d'IA ou de paiement n'a sa place ici : une valeur NEXT_PUBLIC_* est visible par quiconque ouvre la page. Un fournisseur pour lequel l'API n'a pas de clé peut quand même être utilisé avec une clé que le lecteur ajoute dans l'assistant lui-même.
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 atteint chaque application. Définissez les trois quand vous servez la pile sur vos propres domaines, par exemple API_URL=https://api.your-domain.com. |
PURCHASE_URL_SINGLE, PURCHASE_URL_STUDIO | Vide | Le paiement d'une boutique externe pour chaque licence, si vous vendez par une boutique ; vide, il garde le paiement du site. |
SEED_SAMPLE_DATA | true | Lu seulement au premier démarrage d'un nouveau volume : true initialise les données d'exemple, false le démarre à vide. |
ADMIN_EMAIL, ADMIN_PASSWORD | Vide | Avec SEED_SAMPLE_DATA=false, le premier admin de la plateforme créé au premier démarrage ; vide, il ne crée que les tables. |
Changez un port quand un autre programme l'utilise déjà, par exemple ADMIN_PORT=3041. Le CORS_ORIGIN, FRONTEND_URL, DASHBOARD_URL, WEBSITE_URL, PUBLIC_API_URL et PUBLIC_MEDIA_URL de l'API, ainsi que les adresses d'API, de site et de tableau de bord des frontends, sont tous construits à partir des ports et des trois adresses, et suivent donc d'eux-mêmes.
Le conteneur de l'API lit aussi back-end/.env s'il existe : les clés facultatives (Stripe, PayPal, e-mail, R2, IA, MCP) se règlent donc au même endroit pour yarn dev comme pour Docker. docker-compose.yml l'emporte pour les valeurs qui diffèrent dans un conteneur : NODE_ENV=production, le port, le chemin de la base, le dossier des fichiers téléversés et les adresses ci-dessus. Sans JWT_SECRET à vous, ou avec celui de l'exemple, l'API en génère un et le garde dans le volume de données. La base et les fichiers téléversés vivent dans le volume northstack-data.
Clés de l'assistant IA
Inclus avec votre achat. Connectez-vous pour le lire, ou ouvrez-le dans votre téléchargement.
Activer l'assistant de l'espace de travail sur le serveur : les clés des fournisseurs et qui paie chaque message.
Le serveur MCP
Inclus avec votre achat. Connectez-vous pour le lire, ou ouvrez-le dans votre téléchargement.
Laisser les agents de code utiliser les outils de l'espace de travail : la clé, l'espace de travail et le point de terminaison.
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 un vrai produit.