|
1 | 1 | # PortFolio-AI |
2 | 2 |
|
3 | | -## Prérequis |
4 | | - |
5 | | -- Docker et Docker Compose. |
6 | | -- [Ollama](https://ollama.com) installé et lancé **nativement sur l'hôte** (pas en conteneur : |
7 | | - les wheels ROCm utilisés ne sont disponibles que pour Windows, le GPU AMD ne passe pas |
8 | | - vers un conteneur Linux). |
9 | | - |
10 | | -Par défaut, Ollama n'écoute que sur `127.0.0.1` et n'est donc pas joignable depuis le |
11 | | -conteneur `rag`. Pour l'exposer : |
12 | | - |
13 | | -1. Définir la variable d'environnement Windows `OLLAMA_HOST=0.0.0.0`, puis redémarrer Ollama. |
14 | | -2. Autoriser le port `11434` dans le pare-feu Windows. |
15 | | - |
16 | | -Sans cette étape, le conteneur `rag` échoue avec des erreurs `connection refused` en |
17 | | -essayant de joindre Ollama. |
18 | | - |
19 | | -## Configuration |
20 | | - |
21 | | -Copier `.env.example` en `.env` et ajuster les valeurs si besoin. |
22 | | - |
23 | | -## Lancement |
24 | | - |
25 | | -```bash |
26 | | -docker compose up --build |
27 | | -``` |
28 | | - |
29 | | -## API |
30 | | - |
31 | | -Elle tourne en natif, pas en conteneur : |
| 3 | +Portfolio vocal de Mathis Capart, en ligne sur https://mathiscapart.xyz. Le |
| 4 | +visiteur pose sa question à voix haute ; l'assistant répond avec une copie de la |
| 5 | +voix de Mathis, uniquement à partir de son parcours. |
| 6 | + |
| 7 | +Chaîne : reconnaissance vocale Kyutai (GPU AMD, ROCm) → recherche Qdrant → |
| 8 | +`qwen3:8b` via Ollama → synthèse Pocket TTS. Tout tourne en local sur un homelab |
| 9 | +Windows, exposé par Traefik et un tunnel Cloudflare, sans API d'inférence externe. |
| 10 | + |
| 11 | +## Structure |
| 12 | + |
| 13 | +| Dossier | Contenu | |
| 14 | +|---|---| |
| 15 | +| `backend/api/` | API FastAPI : `/health`, `/chat` (SSE), `/voice` (WebSocket) | |
| 16 | +| `backend/stt/` | reconnaissance vocale Kyutai en streaming | |
| 17 | +| `backend/tts/` | service de synthèse vocale (voix clonée dans `voix/`, non versionné) | |
| 18 | +| `backend/rag/` | découpage, ingestion et recherche ; `corpus/` = le parcours | |
| 19 | +| `frontend/` | Next.js en export statique : interface vocale et page parcours | |
| 20 | +| `deploy/` | Traefik, nginx, cloudflared, script de démarrage des services natifs | |
| 21 | +| `.github/` | CI et Dependabot | |
| 22 | + |
| 23 | +## Démarrage rapide |
| 24 | + |
| 25 | +```powershell |
| 26 | +docker compose up -d qdrant |
| 27 | +powershell -ExecutionPolicy Bypass -File deploy\start-natif.ps1 |
| 28 | +docker compose --env-file .env -f deploy/docker-compose.expose.yml up -d |
32 | 29 |
|
33 | | -``` |
34 | | -python -m uvicorn backend.api.main:app --port 8000 |
| 30 | +# Arrêter l'API et le TTS |
| 31 | +powershell -ExecutionPolicy Bypass -File deploy\stop-natif.ps1 |
35 | 32 | ``` |
36 | 33 |
|
37 | | -`GET /health` renvoie l'etat de Qdrant et d'Ollama. |
38 | | -`POST /chat` streame la reponse en SSE, puis un evenement `sources` terminal. |
| 34 | +## Documentation |
39 | 35 |
|
40 | | -## Exposition publique |
| 36 | +Toute la documentation est dans [`docs/`](docs/) : |
41 | 37 |
|
42 | | -Configuration dans `deploy/` : Traefik en frontal, nginx pour l'export statique |
43 | | -du front, cloudflared pour le tunnel. L'API et Ollama restent natifs sur l'hote, |
44 | | -joints via `host.docker.internal`. |
| 38 | +| Document | Contenu | |
| 39 | +|---|---| |
| 40 | +| [exploitation.md](docs/exploitation.md) | architecture, démarrage, déploiement, arrêt, vérifications, dépannage, sécurité | |
| 41 | +| [frontend.md](docs/frontend.md) | front Next.js : variables de build, commandes, spécificités mobiles, tests | |
| 42 | +| [corpus-demo.md](docs/corpus-demo.md) | corpus fictif de démonstration | |
45 | 43 |
|
46 | | -Prerequis, dans l'ordre : |
| 44 | +Conventions et décisions techniques mesurées : [CLAUDE.md](CLAUDE.md). |
47 | 45 |
|
48 | | -1. `npm run build` dans `frontend/` avec `NEXT_PUBLIC_API_URL=https://<domaine>/api` |
49 | | -2. l'API lancee : `python -m uvicorn backend.api.main:app --port 8000` |
50 | | -3. `TRAEFIK_DOMAIN` et `CLOUDFLARE_TUNNEL_TOKEN` renseignes |
51 | | -4. la route DNS creee cote Cloudflare vers ce tunnel |
| 46 | +## Tests |
52 | 47 |
|
53 | | -Lancement (le `--env-file` est obligatoire : compose cherche sinon `deploy/.env`) : |
54 | | - |
55 | | -``` |
56 | | -docker compose --env-file .env -f deploy/docker-compose.expose.yml up -d |
| 48 | +```powershell |
| 49 | +python -m pytest backend/tests # backend, sans GPU |
| 50 | +cd frontend; npx vitest run; npx tsc --noEmit |
57 | 51 | ``` |
58 | | - |
59 | | -Un rate-limit est pose sur `/api` : l'endpoint de chat n'est pas authentifie et |
60 | | -s'adosse a une seule carte graphique. |
0 commit comments