# Installation — Immbot AI ## Prérequis - **Node.js ≥ 24** (utilise `node:sqlite` natif et l'exécution TypeScript intégrée — Node 25 recommandé) - **pnpm** (`npm i -g pnpm`) - Les dossiers de cours `IMM1003-20/` et `IMM1033-20/` accessibles (par défaut : à côté de `immbot-ai/`) - Une clé **OpenRouter** (https://openrouter.ai/keys) pour le chat ## Installation automatique ```bash ./scripts/setup.sh ``` Fait : `pnpm install` → création de `.env` (avec `AUTH_SECRET` généré) → `pnpm seed` → `pnpm ingest`. ## Installation manuelle ```bash pnpm install cp .env.example .env # puis renseigner OPENROUTER_API_KEY et AUTH_SECRET pnpm seed # admin initial + cours + prompts + 140 cartes + 129 questions + 6 examens pnpm ingest # parse les .tex des cours → 2 000+ fragments indexés (FTS5 + embeddings) pnpm dev # http://localhost:3070 ``` Premier `pnpm ingest` : téléchargement du modèle d'embeddings (~120 Mo) dans `data/models/`, puis tout fonctionne hors-ligne. ## Variables d'environnement Voir `.env.example`. Essentielles : | Variable | Rôle | |---|---| | `OPENROUTER_API_KEY` | Clé serveur (jamais exposée au navigateur) | | `AUTH_SECRET` | Générer : `openssl rand -hex 32` | | `DATABASE_PATH` | SQLite (défaut `./data/immbot.db`) | | `INITIAL_ADMIN_USERNAME` / `INITIAL_ADMIN_PASSWORD` | Amorçage seulement — changement forcé | | `FORCE_INITIAL_ADMIN_PASSWORD_CHANGE` | `true` (défaut) | | `DISABLE_INITIAL_ADMIN` | `true` en production une fois le vrai compte créé | | `SIGNUP_ACCESS_CODE` | Code exigé à l'inscription étudiante (vide = libre) | | `COURSE_IMM1003_PATH` / `COURSE_IMM1033_PATH` | Dossiers sources des cours | ## Compte administrateur initial Créé par `pnpm seed` : `admin` / `admin123`, **haché bcrypt (coût 12)**, indicateur `must_change_password` → l'interface force le remplacement à la première connexion et refuse `admin123` comme mot de passe permanent. Une bannière d'avertissement reste visible tant que le compte d'amorçage est actif. Procédure recommandée en production : 1. se connecter, changer le mot de passe ; 2. créer son compte personnel (rôle admin via Sécurité) ; 3. mettre `DISABLE_INITIAL_ADMIN=true` et désactiver le compte `admin` dans l'admin. ## Vérification ```bash ./scripts/verify.sh # tsc + 34 tests + évaluation RAG (rappel/refus/isolation) ```