Cladèse documentation

Configuration

Tout passe par des variables d'environnement. Le fichier .env à la racine alimente Docker Compose, l'API et le worker.

L'API lit ses réglages avec pydantic-settings (e-learning-api/src/e_learning/infrastructure/config.py) : toute variable préfixée APP_ surcharge la valeur par défaut. Hors Docker, elle lit .env.template puis .env dans son dossier.

Docker Compose#

VariableDéfaut du templateRôle
VIDEOS_HOST_PATH./e-learning-api/videosDossier hôte des médias, monté sur /app/videos
POSTGRES_USER / _PASSWORD / _DBelearningIdentifiants de la base créée au premier démarrage
POSTGRES_PORT5432Port publié sur l'hôte
API_PORT8000Port publié de l'API
FRONT_PORT3000Port publié du front
RABBITMQ_PORT / RABBITMQ_MANAGEMENT_PORT5672 / 15672Broker et console web
RABBITMQ_USER / RABBITMQ_PASSWORDguestÀ changer dès que le port sort de la machine
QDRANT_PORT6333Port publié de Qdrant

API et worker#

VariableDéfautRôle
APP_DATABASE_URLPostgres localURL SQLAlchemy async (postgresql+asyncpg://…)
APP_VIDEOS_PATHvideos/Racine du catalogue sur disque (forcée à /app/videos par le compose)
APP_DEBUGfalseActive /api-docs et /api-redoc, et tolère les secrets d'exemple (avec un avertissement). Ne contourne pas l'authentification
APP_LOG_LEVELINFODEBUG, INFO, WARNING, ERROR, CRITICAL
APP_CORS_ORIGINS[]Liste JSON des origines du front, ex. ["http://localhost:3000"]. "*" est refusé au démarrage : le cookie de session exige une liste explicite
APP_INIT_DBfalsecreate_all au démarrage ; préférer les migrations
APP_RECONCILE_ON_STARTUPfalseRéconcilie disque et base au démarrage
APP_MAX_UPLOAD_SIZE524288000Taille maximale d'un téléversement, en octets (500 Mo)
APP_DB_POOL_SIZE / APP_DB_MAX_OVERFLOW10 / 20Pool de connexions
APP_ECHO_SQLfalseJournalise chaque requête SQL

Authentification#

VariableDéfautRôle
APP_SECRET_KEYchangethisClé de signature des jetons (JWT HS256). Au moins 32 caractères, ex. openssl rand -hex 32
APP_ACCESS_TOKEN_EXPIRE_MINUTES10080Durée d'une session (7 jours). Pas de rafraîchissement : il faut se reconnecter ensuite
APP_FIRST_ADMIN_EMAILadmin@example.comPremier administrateur, créé au démarrage s'il n'existe pas
APP_FIRST_ADMIN_PASSWORDchangethisSon mot de passe initial ; jamais réécrit ensuite, même si la variable change
APP_LOGIN_MAX_FAILURES / APP_LOGIN_WINDOW_MINUTES5 / 15Échecs de connexion tolérés par email ou par IP sur la fenêtre, avant 429
APP_INSECURE_COOKIE_HOSTS["localhost","127.0.0.1","::1"]Hôtes de l'API où le cookie de session n'est pas marqué Secure en HTTP. Ajoutez-y l'IP d'un serveur de réseau local sans HTTPS ; le jeton circule alors en clair
Démarrage refusé avec les valeurs d'exemple Hors APP_DEBUG=true, l'API ne démarre pas si APP_SECRET_KEY vaut changethis ou fait moins de 32 caractères, ou si APP_FIRST_ADMIN_PASSWORD vaut changethis. Changer la clé invalide toutes les sessions en cours.

Le compteur d'échecs de connexion vit en mémoire du processus de l'API : il repart à zéro au redémarrage. Derrière un reverse proxy, l'adresse IP comptée est celle du proxy.

Modèle de langage#

Utilisé pour les résumés et les réponses de l'assistant. N'importe quel point d'accès qui parle l'API /v1/chat/completions d'OpenAI convient.

VariableDéfautRôle
APP_OPENAI_BASE_URLhttp://localhost:1234/v1Point d'accès (LM Studio par défaut)
APP_OPENAI_API_KEYlm-studioClé envoyée au point d'accès
APP_OPENAI_MODELopenapi/gpt-oss-20bNom du modèle

Assistant et embeddings#

VariableDéfautRôle
APP_QDRANT_URLhttp://localhost:6333Instance Qdrant
APP_QDRANT_COLLECTIONelearning_chunksCollection des passages indexés
APP_EMBEDDING_BASE_URLvideVide : embeddings locaux (sentence-transformers). Renseigné : API compatible OpenAI
APP_EMBEDDING_API_KEYclé du LLMClé du point d'accès d'embeddings
APP_EMBEDDING_MODELsentence-transformers/paraphrase-multilingual-MiniLM-L12-v2Modèle d'embeddings
APP_EMBEDDING_DIMS384Dimension des vecteurs ; doit correspondre au modèle
APP_RAG_TOP_K6Passages retenus par question
APP_RAG_CHUNK_SIZE800Taille d'un passage, en caractères
APP_RAG_CHUNK_OVERLAP120Recouvrement entre passages
Changer de modèle d'embeddings Les vecteurs existants ont la dimension de l'ancien modèle. Après un changement de APP_EMBEDDING_MODEL ou APP_EMBEDDING_DIMS, réindexez tout : e-learning-cli index-rag. Dans Docker, les modèles Hugging Face sont mis en cache dans le volume huggingface_cache, et les poids Whisper dans whisper_cache. Aucun poids n'est embarqué dans l'image : ils sont téléchargés au premier usage, puis conservés d'une recréation de conteneur à l'autre grâce à ces deux volumes.

File de jobs#

VariableDéfautRôle
APP_RABBITMQ_URLamqp://guest:guest@localhost:5672/Broker
APP_RABBITMQ_EXCHANGEelearning_jobsExchange de type direct
APP_WORKER_PREFETCH3Jobs traités en parallèle par processus worker

Sur une petite machine, APP_WORKER_PREFETCH=1 évite de lancer trois transcriptions Whisper en même temps.

Front#

VariableDéfautRôle
NEXT_PUBLIC_API_URLhttp://localhost:8000URL de l'API vue par le navigateur ; intégrée au build (argument Docker)
Front et API sur le même site La session web tient dans un cookie SameSite=Lax posé par l'API. Ouvrez le front à une adresse listée dans APP_CORS_ORIGINS, et gardez front et API sur le même site : localhost:3000 et localhost:8000, ou learn.example.com et api.example.com. Ouvrir le front sur 127.0.0.1 alors que la liste contient localhost échoue avec une erreur CORS. Le cookie est marqué Secure dès que l'hôte de l'API n'est pas dans APP_INSECURE_COOKIE_HOSTS (localhost par défaut) : servez alors l'API en HTTPS, sinon le navigateur ignore le cookie et chaque appel renvoie 401. Sur un réseau local de confiance, vous pouvez à la place ajouter l'IP du serveur à cette liste.

L'application mobile a sa propre configuration (API_URL) : voir Application mobile.