Variables d'environnement
Ce que fait chaque réglage des fichiers .env de l'API et du tableau de bord, 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. |
dashboard/.env | Le tableau de bord, 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 un lancement en local, sauf les deux adresses de l'API du tableau de bord, que vous remplissez pour quitter les données d'exemple.
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. Omettez-le pour utiliser les données d'exemple ; créez-le à partir de .env.example quand vous connectez une API : 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 lui passez avec --env-file .env. Il contient des secrets : ne le committez jamais. Créez-le à partir de .env.example, qui documente chaque variable et fonctionne tel quel pour un lancement en local : cp .env.example .env.
Paramètres essentiels de l'API
L'API vérifie JWT_SECRET et, en production, CORS_ORIGIN avant de démarrer. Si l'un d'eux manque ou est inutilisable, elle s'arrête avec une ligne qui indique quoi corriger. Les variables déjà définies dans l'environnement l'emportent sur le fichier.
| 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 exécute les migrations au démarrage et ne réécrit jamais le schéma. |
PORT | Le port de l'API, 8000. |
DB_TYPE | sqlite (ce que définit .env.example) ou mysql. |
SQLITE_DATABASE | Chemin du fichier SQLite, ./database.sqlite, relatif au dossier où la commande s'exécute. |
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 par défaut. |
CORS_ORIGIN | L'adresse du tableau de bord, séparées par des virgules s'il y en a plusieurs. Non définie, elle retombe sur http://localhost:3030, jamais sur * ; obligatoire en production. |
FRONTEND_URL | Facultatif. L'adresse du tableau de bord pour les deux sockets en direct (événements de connexion et cloche de notifications). Non définie, les sockets acceptent les mêmes adresses que CORS_ORIGIN. |
TRUST_PROXY | Facultatif. Jusqu'où l'API fait confiance à X-Forwarded-For pour compter les tentatives de connexion par visiteur. Non défini ou auto : il n'est lu que depuis un proxy sur une adresse privée ; false : jamais ; un nombre : exactement ce nombre de proxies est approuvé. |
Générez votre propre JWT_SECRET avec :
node -e "console.log(require('crypto').randomBytes(48).toString('hex'))"Tout identifiant de stockage ou d'IA ci-dessous qui garde exactement sa valeur de .env.example compte comme non défini : la fonctionnalité concernée se signale alors comme désactivée au lieu d'échouer à son premier appel.
Utiliser MySQL au lieu de SQLite
Créez une base de données vide, puis définissez le pilote et la connexion dans back-end/.env :
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-nameExécutez ensuite yarn seed pour les données de démonstration, ou yarn db:sync pour les tables sans données. L'API en marche 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 s'exécute donc avant le premier démarrage (yarn db:sync:prod ou yarn seed:prod après yarn build), puis yarn db:sync:prod à nouveau après une mise à jour qui modifie le schéma. Vos données sont conservées.
Le template ne fournit sa migration que pour SQLite. back-end/src/database/migrations/mysql/README.md contient la commande unique qui génère celle de MySQL, si vous voulez aussi les migrations de démarrage de l'API sur MySQL.
Tableau de bord
Chaque valeur NEXT_PUBLIC_* est compilée dans le JavaScript que charge le navigateur, et toute personne qui ouvre la page peut la lire. Ne mettez jamais de secret dans ce fichier, et redémarrez ou reconstruisez après en avoir modifié une.
| Variable | Rôle |
|---|---|
PORT | Le port qu'utilisent yarn dev et yarn start, 3030. Non défini, il reste 3030. |
NEXT_PUBLIC_API_BASE_URL | L'adresse de l'API avec /api, par exemple http://localhost:8000/api. La définir est ce qui désactive les données d'exemple ; vide ou absente, le tableau de bord fonctionne sur ses données d'exemple. |
NEXT_PUBLIC_WEBSOCKET_BASE_URL | L'adresse de l'API sans /api, pour les notifications en direct et les mises à jour de permissions. Optionnel : vide, elle est déduite de NEXT_PUBLIC_API_BASE_URL. |
NEXT_PUBLIC_MEDIA_HOSTNAME | L'hôte public de votre bucket de médias, celui de R2_PUBLIC_URL, sans https://. Les images qui en proviennent sont redimensionnées et compressées. Laissez-le vide tant que vous n'avez pas de bucket. |
NEXT_PUBLIC_DEMO_MODE | false. Doit correspondre à DEMO_MODE dans le .env de l'API ; true est réservé à une vitrine publique. |
BUILD_STANDALONE | 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 n'a sa place ici. Les clés se trouvent uniquement dans le .env de l'API.
Options de Docker Compose
Rien n'est à définir pour un lancement en local. Pour changer quelque chose, mettez-le dans un fichier .env à côté de docker-compose.yml et relancez docker compose up --build : le tableau de bord intègre ces valeurs à la compilation.
| Variable | Rôle |
|---|---|
DASHBOARD_PORT, API_PORT | Les ports sur votre ordinateur : 3030 et 8000 par défaut. Définissez-en un quand un autre programme utilise déjà ce port, par exemple DASHBOARD_PORT=3040. Les adresses ci-dessous, CORS_ORIGIN et FRONTEND_URL suivent. |
DASHBOARD_URL, API_URL | L'adresse à laquelle le navigateur joint chaque application. Définissez les deux quand vous servez la stack sur vos propres domaines ; CORS_ORIGIN et FRONTEND_URL de l'API et les adresses de l'API du tableau de bord sont construits à partir d'elles. |
MEDIA_HOSTNAME | L'hôte public de votre bucket, avec les variables R2_* dans back-end/.env. |
SEED_DEMO_DATA | false démarre avec des tables vides au lieu des données de démonstration. |
Le conteneur de l'API lit aussi back-end/.env s'il existe : les clés de stockage, d'IA et de MCP se règlent donc à un seul endroit, pour yarn dev comme pour Docker. Le fichier compose l'emporte pour les valeurs qui diffèrent dans un conteneur : NODE_ENV=production, le port, SQLite dans /data/database.sqlite, DEMO_MODE=false, CORS_ORIGIN et FRONTEND_URL. Sans JWT_SECRET à vous, l'API en génère un et le conserve dans le volume de données. Les données se trouvent dans le volume kinora-data.
L'image Docker de l'API
L'image démarre en production sur SQLite dans /data/database.sqlite, port 8000, avec DEMO_MODE=false et SEED_DEMO_DATA=false, et autorise les appels du navigateur depuis http://localhost:3030 (CORS_ORIGIN et FRONTEND_URL). Modifiez n'importe laquelle avec -e sur docker run, ou passez votre fichier avec --env-file .env.
- Sur un volume neuf, le conteneur crée les tables, et n'ajoute les données de démonstration qu'avec
SEED_DEMO_DATA=true. Une base de données existante n'est pas modifiée. - Sans
JWT_SECRET, ou avec celui de l'exemple, il génère un secret et le conserve dans/data/.jwt-secret, pour que les connexions survivent à un redémarrage. - Avec
DB_TYPE=mysql, il ne crée rien : exécutez vous-même une foisnode dist/database/sync-schema.jsounode dist/database/seeder.jsdans le conteneur.
Stockage des médias
Les photos de profil, les photos de progression, les couvertures de groupe et les pièces jointes des messages sont envoyées vers un bucket Cloudflare R2, ou n'importe quel bucket compatible S3. Définissez les cinq variables dans back-end/.env et donnez au tableau de bord l'hôte public du bucket via NEXT_PUBLIC_MEDIA_HOSTNAME (avec Docker Compose, MEDIA_HOSTNAME).
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.devSans bucket, tout ce qu'écrit le seed est un chemin /assets/images/… que le tableau de bord sert depuis son propre dossier public/assets : chaque écran s'affiche donc sans aucun envoi. Seul l'envoi de nouveaux fichiers cesse de fonctionner : un envoi répond 400 tant que le bucket n'est pas configuré. Gardez public/assets dans le tableau de bord tant qu'une ligne y fait encore référence.
Un fichier fait au maximum 150 Mo. L'outil d'envoi du tableau de bord envoie de lui-même les gros fichiers en parties de 16 Mo au maximum via POST /api/helpers/upload-chunk.
Le template ne contient aucun service d'envoi d'e-mails : aucun message n'est donc jamais envoyé par e-mail. Le « resend verification email » de l'écran des membres répond sans rien envoyer, et les pages de mot de passe oublié et de réinitialisation ne sont que des écrans : aucune réinitialisation n'est envoyée et l'API n'a aucune route derrière elles. Connectez votre propre fournisseur d'e-mails, et ajoutez les routes de réinitialisation, avant la mise en ligne si vos membres ont besoin de l'un ou de l'autre.
Assistant IA
Inclus avec votre achat. Connectez-vous pour le lire, ou ouvrez-le dans votre téléchargement.
Activer l'assistant IA : les clés des fournisseurs et les modèles que chacun propose.
Serveur MCP
Inclus avec votre achat. Connectez-vous pour le lire, ou ouvrez-le dans votre téléchargement.
La clé qu'envoie un agent de code pour accéder aux outils de l'assistant.
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 : le commutateur de démo, le quota de messages des visiteurs et la limite de comptes.
Mise en ligne
Avant de déployer quelque part en public :
- Définissez
NODE_ENV=productionet unJWT_SECRETlong et aléatoire qui vous est propre dansback-end/.env. - Définissez
CORS_ORIGINsur l'adresse de votre tableau de bord, etFRONTEND_URLsur la même adresse. - Gardez
DEMO_MODE=falsedans l'API etNEXT_PUBLIC_DEMO_MODE=falsedans le tableau de bord. - Sur une base de données vide, exécutez
yarn build, puis une foisyarn db:sync:prod(ouyarn seed:prodpour les données de démonstration), puisyarn start:prod. - Pointez la vérification de santé de votre hébergeur vers
GET /api/health. Elle ne demande aucun jeton et n'est pas soumise à une limite de requêtes. - Construisez le tableau de bord avec
NEXT_PUBLIC_API_BASE_URLetNEXT_PUBLIC_WEBSOCKET_BASE_URLpointant vers votre API déployée. - Changez les mots de passe du seed, ou partez de tables vides.
Pas pour une base de données avec de vrais membres
yarn setup:fresh construit, supprime toutes les tables et réinsère les données, à chaque exécution. Utilisez-le pour monter un environnement à partir de rien, jamais comme commande de build ou de démarrage d'un produit en ligne.
Pour supprimer entièrement le code de démo, exécutez yarn remove:demo dans les deux applications, sur un arbre propre : sans gestion de versions, c'est irréversible. yarn remove:mock dans le tableau de bord supprime les données d'exemple.