diff --git a/README.md b/README.md index 778f3d0..926ed2a 100644 --- a/README.md +++ b/README.md @@ -219,28 +219,60 @@ Lesstime expose un serveur MCP (Model Context Protocol) permettant aux assistant } ``` -### Configuration réseau (HTTP) +### Configuration réseau (HTTP) — par poste, hors git + +Le transport HTTP nécessite un **token API** (Bearer), qui est un **secret** : il ne va **jamais** +dans le `.mcp.json` versionné (celui-ci ne contient que le serveur STDIO local, sans secret). +Chaque développeur configure le serveur HTTP dans sa **config Claude Code locale**. + +**Méthode recommandée (identique sur Fedora, Windows et macOS) :** + +```bash +claude mcp add --transport http --scope user lesstime \ + http://project.malio-dev.fr/_mcp \ + --header "Authorization: Bearer " +``` +- En prod : `http://project.malio-dev.fr/_mcp` +- En réseau local : `http://:8082/_mcp` + +**Où c'est stocké** (si tu édites le fichier à la main, sous la clé `mcpServers`) : + +| OS | Fichier de config Claude Code | +|----|-------------------------------| +| **Fedora / Linux** | `~/.claude.json` | +| **Windows** (collègue) | `%USERPROFILE%\.claude.json` (ex. `C:\Users\\.claude.json`) | +| **macOS** | `~/.claude.json` | ```json { "mcpServers": { "lesstime": { - "type": "url", - "url": "http://:8082/_mcp", - "headers": { - "Authorization": "Bearer " - } + "type": "http", + "url": "http://project.malio-dev.fr/_mcp", + "headers": { "Authorization": "Bearer " } } } } ``` +Après modification, relancer la connexion avec `/mcp` dans Claude Code. + ### Gestion des tokens API +Générer / régénérer un token pour un utilisateur : + ```bash +# En dev (container local) docker exec -u www-data php-lesstime-fpm php bin/console app:generate-api-token + +# En prod (sur le serveur, dans infra/prod) +sudo docker compose exec -T -u www-data app php bin/console app:generate-api-token ``` +⚠️ Le token est **invalidé à chaque reset/reseed de la base**. Symptôme : `/mcp` renvoie +`HTTP 401 "Invalid API token"`. Il faut alors le **régénérer** (commande ci-dessus) puis remplacer +la valeur `Bearer ...` dans ta config locale (par poste). + ## Déploiement La prod tourne en **Docker** : l'image est buildée par la CI Gitea sur push de tag `v*` @@ -270,7 +302,7 @@ INFRA #146. |---|---|---| | Nature | process PHP qui tourne en continu | fichiers JS/HTML **statiques** (`nuxt generate`) | | Quand le DSN est lu | au **runtime** | **figé au build** (baké dans le JS) | -| Où mettre le DSN | `infra/prod/.env` (runtime) | **secrets Gitea** → build-args de la CI | +| Où mettre le DSN | `.env` du serveur (`/var/www/lesstime/.env`) — runtime | **secrets Gitea** → build-args de la CI | > Les erreurs partent **toujours vers GlitchTip**, jamais vers la CI. La CI ne sert qu'à *écrire* > le DSN front dans le bundle au moment du build (il n'y a aucun process front en prod qui @@ -278,7 +310,7 @@ INFRA #146. ### Variables -**Backend — fichier `infra/prod/.env` du serveur** (chargé via `env_file`) : +**Backend — fichier `.env` du serveur** (`/var/www/lesstime/.env`, chargé via `env_file` ; le repo ne fournit que le template `infra/prod/.env.example`) : ```env SENTRY_DSN=http://@glitchtip.interne:/ ``` @@ -312,7 +344,7 @@ SENTRY_DSN=http://@glitchtip.interne:/ 1. Dans GlitchTip : créer les projets `lesstime-api` et `lesstime-front`, récupérer les 2 DSN (+ un auth token pour les source maps). -2. Backend : ajouter `SENTRY_DSN` dans `infra/prod/.env` du serveur. +2. Backend : ajouter `SENTRY_DSN` dans le `.env` du serveur (`/var/www/lesstime/.env`). 3. Frontend : ajouter les secrets Gitea ci-dessus. 4. Tagger une version (`v*`) → la CI build l'image avec le DSN front baké → `deploy.sh`.