TypeScript 98.3%
CSS 0.9%
Shell 0.7%
1# Déploiement — Immbot AI23## Cible de référence : nœud unique (macOS/Linux)45L'architecture v1 (SQLite + embeddings locaux) est conçue pour un déploiement mono-nœud simple et6robuste — typiquement le nœud M3U96b du cluster MacLustr, ou tout VPS Linux.78### Étapes (production mono-nœud)910```bash11# 1. Copier le projet ET les deux dossiers de cours sur le serveur12rsync -a immbot-ai IMM1003-20 IMM1033-20 serveur:~/apps/1314# 2. Sur le serveur15cd ~/apps/immbot-ai16cp .env.example .env # renseigner OPENROUTER_API_KEY, AUTH_SECRET, APP_URL17pnpm install && pnpm seed && pnpm ingest && pnpm build1819# 3. Processus géré (PM2 recommandé — auto-restart)20pm2 start "pnpm start" --name immbot-ai21pm2 save22```2324### HTTPS / domaine2526- **ngrok** (utilisé pour www.immbot.ai) : `ngrok http 3070 --url=www.immbot.ai` (domaine réservé27 dans le compte ngrok), géré par PM2 ou launchd pour la persistance.28- **Alternative reverse-proxy** : Caddy (`caddy reverse-proxy --from immbot.example.com --to :3070`)29 ou nginx + certbot.30- Mettre `APP_URL=https://www.immbot.ai` dans `.env` (active `Secure` sur les cookies et la31 vérification d'origine CSRF).3233### Docker3435```bash36docker compose up --build # app seule (SQLite)37docker compose --profile scale up # + PostgreSQL/pgvector, Redis, MinIO (trajectoire de montée en charge)38```3940## Sauvegardes et restauration4142- `./scripts/backup.sh` → `backups/<horodatage>/` (BD + uploads). Planifier via cron/launchd.43- Restauration : arrêter l'app, remplacer `data/immbot.db` par la sauvegarde, redémarrer.44- Les fragments RAG se reconstruisent à tout moment : `pnpm reindex`.4546## Rotation des clés4748- **OpenRouter** : générer une nouvelle clé, remplacer `OPENROUTER_API_KEY`, redémarrer. L'ancienne49 clé se révoque dans le tableau de bord OpenRouter.50- **AUTH_SECRET** : le changer n'invalide pas les sessions (elles vivent en BD) ; pour tout51 déconnecter : `DELETE FROM sessions;` via `sqlite3 data/immbot.db`.5253## Mises à jour du matériel de cours5455Déposer/modifier les fichiers dans `IMM1003-20/` / `IMM1033-20/` puis « Relancer l'ingestion »56depuis l'admin (ou `pnpm ingest`). L'ingestion est incrémentale (sommes de contrôle SHA-256).5758## Surveillance5960- Admin → Vue générale : coûts, erreurs API, citations invalides, santé de l'ingestion.61- Journaux structurés sur stdout (PM2 : `pm2 logs immbot-ai`).62- `SENTRY_DSN` prévu dans `.env.example` (intégration optionnelle non activée par défaut).6364## Trajectoire de montée en charge (documentée, non requise en v1)6566| Besoin | Évolution |67|---|---|68| > ~200 utilisateurs simultanés | PostgreSQL (+ pgvector) via le profil docker `scale` ; le schéma SQL est portable (types simples, requêtes préparées) |69| Multi-instances | Sessions et rate-limit déplacés vers Redis ; uploads vers MinIO/S3 (interface déjà isolée dans `.env`) |70| > 100 k fragments RAG | pgvector (index HNSW) au lieu du cosinus en mémoire |71