Aller à l'article
Aniq-UI

LearnioVariables 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 DockerOui. Ne le versionnez jamais.
frontend/.envLe site étudiant, au moment du buildNon. Toutes les valeurs sont publiques.
admin-dashboard/.envLe tableau de bord admin, au moment du buildNon. Toutes les valeurs sont publiques.
.env à côté de docker-compose.ymlDocker Compose, pour le pack Full StackNon

Créez chaque fichier à partir du .env.example placé à côté, qui documente chaque variable : cp .env.example .env. Les exemples fonctionnent tels quels pour une exécution locale.

Où se trouvent les paramètres

Un seul fichier, frontend/.env, lu au moment du build du site. Toutes ses valeurs sont publiques : il ne contient donc jamais de secret. Créez-le à partir de .env.example, qui documente chaque variable : cp .env.example .env.

Où se trouvent les paramètres

Un seul fichier, admin-dashboard/.env, lu au moment du build du tableau de bord. Toutes ses valeurs sont publiques : il ne contient donc jamais de secret. Omettez-le pour fonctionner sur le mock ; 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, back-end/.env, lu par l'API avec yarn dev et dans Docker. Il contient des secrets : ne le versionnez jamais. Créez-le à partir de .env.example, qui documente chaque variable et fonctionne tel quel pour une exécution locale : cp .env.example .env.

Paramètres essentiels de l'API

L'API les vérifie avant de démarrer. Si l'une d'elles manque ou est inutilisable, elle s'arrête avec une courte liste de ce qu'il faut corriger.

VariableRôle
NODE_ENVdevelopment en local, production sur un serveur en ligne.
PORTLe port de l'API, 8000. Les deux frontends pointent vers lui.
DB_TYPEsqlite (par défaut) 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 développement.
JWT_EXPIRATIONDurée d'une connexion, 7d par défaut.
CORS_ORIGINLes adresses du site étudiant et du tableau de bord admin, séparées par des virgules. Obligatoire en production.
FRONTEND_URLL'adresse du site étudiant, utilisée dans les liens envoyés par l'API.

Générez votre propre JWT_SECRET avec :

Terminal
node -e "console.log(require('crypto').randomBytes(48).toString('hex'))"

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 :

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

Exécutez ensuite yarn seed pour les données de démonstration, ou yarn db:sync sur un site en production, qui crée les tables sans écrire aucune ligne. L'API en cours d'exécution ne met elle-même le schéma à jour que lorsque NODE_ENV=development.

Site étudiant et tableau de bord admin

Toutes les valeurs ici sont des NEXT_PUBLIC_*, compilées dans le JavaScript chargé par le navigateur. Ne mettez jamais de secret dans ces fichiers, et reconstruisez après avoir modifié une valeur.

VariableApplicationRôle
NEXT_PUBLIC_API_BASE_URLLes deuxL'adresse de l'API, /api compris, par exemple http://localhost:8000/api. Si elle est vide, l'application utilise ses données d'exemple.
NEXT_PUBLIC_SITE_URLLes deuxL'adresse publique du site étudiant, utilisée pour les liens canoniques, les aperçus de partage et le sitemap. Indiquez votre vrai domaine en production.
NEXT_PUBLIC_MEDIA_HOSTNAMELes deuxL'hôte public de votre bucket de médias, sans https://. Laissez-le vide tant que vous n'avez pas de bucket.
NEXT_PUBLIC_WEBSOCKET_BASE_URLAdminL'adresse de l'API sans /api, pour les notifications en direct.
NEXT_PUBLIC_SAMPLE_DATA_NOTICELes deuxFacultatif. always affiche aussi la mention « Sample data » dans un build de production quand l'API ne répond plus. Le docker-compose.yml à la racine la définit ; un site en ligne la laisse généralement vide.
API_INTERNAL_URLSite étudiantOptionnel, côté serveur uniquement. L'adresse à laquelle le serveur du site joint l'API lorsqu'elle diffère de celle du navigateur, comme dans Docker Compose.

Options de Docker Compose

Rien n'est à définir pour une exécution locale. Pour modifier 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.

VariableRôle
SITE_PORT, ADMIN_PORT, API_PORTLes ports de votre ordinateur : 3030, 3031 et 8000 par défaut. Définissez-en un quand un autre programme utilise déjà ce port, par exemple ADMIN_PORT=3041. Les adresses ci-dessous, CORS_ORIGIN et FRONTEND_URL les suivent.
SITE_URL, ADMIN_URL, API_URLL'adresse à laquelle le navigateur joint chaque application. Définissez les trois lorsque vous servez la stack sur vos propres domaines.
MEDIA_HOSTNAMEL'hôte public de votre bucket, avec les variables R2_* dans back-end/.env.
SEED_DEMO_DATAfalse 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 d'e-mail, de paiement, de médias et d'IA se définissent donc à un seul endroit, pour yarn dev comme pour Docker.

Stockage des médias

Les visuels de cours, avatars, images du blog, vidéos de leçons et documents sont envoyés vers un bucket Cloudflare R2, ou tout bucket compatible S3. Définissez les cinq variables dans back-end/.env et donnez aux deux frontends l'hôte public du bucket via NEXT_PUBLIC_MEDIA_HOSTNAME.

back-end/.env
R2_ACCESS_KEY_ID=
R2_SECRET_ACCESS_KEY=
R2_ENDPOINT=
R2_BUCKET_NAME=
R2_PUBLIC_URL=

Sans bucket, le script de seed enregistre des chemins vers des fichiers d'exemple fournis par les deux frontends eux-mêmes : chaque image et chaque vidéo de leçon fonctionne donc en local. Seul l'envoi de nouveaux médias cesse de fonctionner.

E-mail

Les confirmations d'e-mail, les réinitialisations de mot de passe, les reçus et les confirmations d'inscription sont envoyés via Resend. Sans RESEND_API_KEY, l'application fonctionne quand même et écrit chaque message dans son journal.

back-end/.env
RESEND_API_KEY=
MAIL_FROM=Learnio <noreply@example.com>
MAIL_MAX_PER_ADDRESS_PER_DAY=5
MAIL_MAX_PER_SENDER_PER_DAY=20
  • Utilisez une clé limitée à l'envoi (sending access), pas une clé à accès complet.
  • MAIL_FROM doit appartenir à un domaine que vous avez vérifié dans Resend, sinon chaque envoi est rejeté.
  • Les deux limites plafonnent le nombre de messages qu'une adresse peut recevoir et qu'un expéditeur peut déclencher par jour.
  • Le nom du produit dans chaque message et son adresse de réponse ne sont pas des variables : ce sont les paramètres site_name et support_email de l'onglet App Settings de Settings, dans le tableau de bord admin, lus pour chaque message envoyé.

Paiements

Par défaut, le paiement passe par un simulateur intégré : aucun prestataire n'est contacté et rien n'est débité. Un numéro de carte se terminant par 0 est refusé, pour que vous puissiez tester le cas d'échec.

Renseignez les clés d'un prestataire et ce moyen de paiement passe sur le vrai prestataire. Configurez Stripe et PayPal avant d'accepter de vraies commandes : le paiement propose toujours la carte et PayPal, et une commande payée via le simulateur est validée sans que personne ne soit débité.

Les cours gratuits (prix 0) n'ont besoin d'aucun processeur : leur paiement se termine sur l'API sans lui, quelles que soient les clés définies.

PrestataireVariablesEndpoint du webhook
StripeSTRIPE_SECRET_KEY, STRIPE_PUBLISHABLE_KEY, STRIPE_WEBHOOK_SECRETPOST <api>/api/webhooks/payments/stripe
PayPalPAYPAL_CLIENT_ID, PAYPAL_CLIENT_SECRET, PAYPAL_WEBHOOK_ID, PAYPAL_ENVPOST <api>/api/webhooks/payments/paypal

C'est le webhook qui attribue la place

Un étudiant est inscrit lorsque le prestataire confirme le paiement via le webhook, pas lorsqu'il revient de la page de paiement. Sans abonnement au webhook, les commandes restent en attente.

  • Abonnez Stripe à checkout.session.completed, payment_intent.payment_failed et charge.refunded.
  • Abonnez PayPal à PAYMENT.CAPTURE.COMPLETED, PAYMENT.CAPTURE.DENIED, PAYMENT.CAPTURE.REFUNDED et PAYMENT.CAPTURE.REVERSED.
  • PAYPAL_ENV vaut sandbox par défaut, ce qui n'encaisse aucun argent réel. Les identifiants de production appartiennent à une autre application PayPal : passer en production implique donc de nouvelles clés en plus de PAYPAL_ENV=live.

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, la façon dont chaque modèle est proposé et ce que voit l'admin sans clé.

Cours en direct

Inclus avec votre achat. Connectez-vous pour le lire, ou ouvrez-le dans votre téléchargement.

Configurer les cours en direct : connecter un serveur Jitsi Meet, les jetons d'accès sécurisés et les commandes de l'hôte.

Données d'exemple dans les frontends

Les deux frontends continuent de fonctionner quand l'API est injoignable : ils servent des données d'exemple intégrées et affichent une mention « Sample data » en bas de la page. Dans un build de production, elle n'apparaît que si aucune API n'est configurée, sauf si l'app a été compilée avec NEXT_PUBLIC_SAMPLE_DATA_NOTICE=always, comme le fait le docker-compose.yml à la racine.

  • Les données d'exemple du tableau de bord admin couvrent la connexion, les étudiants, le personnel, les rôles, les catégories, les paramètres, les notifications, la recherche et l'historique des conversations de l'assistant. Ses autres écrans (les chiffres de la vue d'ensemble, les cours, les formateurs, les inscriptions, les commandes, les avis, le blog, le planning, les quiz et les messages) ont besoin de l'API.
  • Le formulaire de connexion du tableau de bord admin accepte n'importe quel e-mail et mot de passe sur les données d'exemple, et conserve vos modifications dans le navigateur. Pour repartir de zéro, exécutez localStorage.removeItem("mock_db_v1"); location.reload(); dans la console du navigateur.
  • L'assistant IA n'est pas disponible sur les données d'exemple, car il a besoin des clés de l'API.
  • Une fois votre API en ligne, yarn remove:mock dans l'une ou l'autre application supprime la couche de données d'exemple.

Fonctionnement de la couche de données d'exemple

Inclus avec votre achat. Connectez-vous pour le lire, ou ouvrez-le dans votre téléchargement.

Comment les requêtes sont dirigées vers les données intégrées, et comment les modifier ou les étendre.

Mode démo

Inclus avec votre achat. Connectez-vous pour le lire, ou ouvrez-le dans votre téléchargement.

Publier une démo : l'interrupteur de démo, les comptes par visiteur, le quota de messages et comment tout retirer.

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.