diff --git a/CLAUDE.md b/CLAUDE.md index c2acfe0..73e19f6 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -40,8 +40,8 @@ backend/ alembic/ # Migrations (env.py configuré) main.py # App FastAPI : CORS, rate limiting, routers docker/ - docker-compose.yml # Dev : postgres, redis, backend, frontend - docker-compose.prod.yml # Prod : images registry + labels Traefik + docker-compose.yml # Prod : images registry + labels Traefik (utilisé par Gitea Actions) + docker-compose.prod.yml # Alias prod (identique, gardé pour référence) ``` ## Commandes @@ -129,14 +129,16 @@ Voir @docker/docker-compose.yml et @.gitea/workflows/deploy.yml - Le client API (`lib/api.ts`) passe toujours le token en paramètre explicite — pas de contexte global - Les nouvelles pages du dashboard vont dans `app/(dashboard)/[section]/page.tsx` - Les nouveaux composants UI shadcn vont dans `components/ui/`, les composants métier dans `components/` -- Les rewrites `next.config.ts` proxifient `/api/*` vers le backend — en dev, définir `NEXT_PUBLIC_API_URL=http://localhost:8000` +- Les rewrites `next.config.mjs` proxifient `/api/*` vers le backend — en dev, définir `NEXT_PUBLIC_API_URL=http://localhost:8000` - JWT stocké dans localStorage (simple pour MVP, à migrer vers HttpOnly cookie plus tard) **Infrastructure :** - Le service `backend` dans docker-compose dépend de `postgres` avec `condition: service_healthy` - Le build frontend Next.js utilise `output: "standalone"` → le Dockerfile copie `.next/standalone` - Les variables d'env préfixées `NEXT_PUBLIC_` sont embarquées au build (pas au runtime) -- `docker-compose.prod.yml` attend des images pré-buildées depuis `${REGISTRY}` — pas de build local +- `docker-compose.yml` attend des images pré-buildées depuis `${REGISTRY}` — pas de build local (config prod) +- Le `frontend/public/` doit exister (même vide avec `.gitkeep`) — le Dockerfile le copie dans le stage runner +- `npm ci` exige un `package-lock.json` commité — toujours commiter le lockfile après `npm install` ### Pièges à éviter - Ne pas lancer `uvicorn main:app` depuis `backend/` — toujours depuis la racine avec le module complet @@ -144,4 +146,6 @@ Voir @docker/docker-compose.yml et @.gitea/workflows/deploy.yml - Ne pas utiliser `.dict()` Pydantic v1 — c'est `.model_dump()` en v2 - Ne pas faire de scans sans vérifier `cible.validee == True` côté backend - Ne pas commiter `.env` — seulement `.env.example` -- Alembic `env.py` importe les modèles depuis `backend.models` — ajouter tout nouveau modèle dans `backend/models/__init__.py` \ No newline at end of file +- Alembic `env.py` importe les modèles depuis `backend.models` — ajouter tout nouveau modèle dans `backend/models/__init__.py` +- Ne pas utiliser `next.config.ts` — Next.js 14 ne supporte pas ce format, utiliser `next.config.mjs` +- Ne pas utiliser `@radix-ui/react-badge` — ce package n'existe pas sur npm (Badge shadcn = div CVA) \ No newline at end of file diff --git a/plan.md b/plan.md index 084e530..dbfc73a 100644 --- a/plan.md +++ b/plan.md @@ -9,7 +9,7 @@ Scans réseau + vulnérabilités + pentest → rapports PDF compréhensibles pou ## ✅ Phase 1 — Socle (terminée) -> Branche : `feature/phase-1-socle` → mergée dans `dev` +> Branche : `feature/phase-1-socle` (PR ouverte, pas encore mergée dans `dev`) ### Ce qui a été créé @@ -37,8 +37,8 @@ Scans réseau + vulnérabilités + pentest → rapports PDF compréhensibles pou - `lib/auth.ts` — helpers localStorage pour token JWT **Infrastructure** -- `docker/docker-compose.yml` — 4 services : postgres:16, redis:7, backend, frontend -- `docker/docker-compose.prod.yml` — images registry + labels Traefik + Let's Encrypt +- `docker/docker-compose.yml` — config prod : images registry + labels Traefik + Let's Encrypt (utilisé par Gitea Actions) +- `docker/docker-compose.prod.yml` — alias prod identique (gardé pour référence) - `backend/Dockerfile` — Python 3.11-slim + WeasyPrint deps + alembic upgrade - `frontend/Dockerfile` — multi-stage Node 20 (deps → builder → runner standalone) - `.env.example` — toutes les variables documentées @@ -58,7 +58,7 @@ Scans réseau + vulnérabilités + pentest → rapports PDF compréhensibles pou | shadcn/ui + Radix | Accessibilité, composants non-opinionnés, facilement personnalisables | | JWT dans localStorage | Simple pour MVP — à migrer vers HttpOnly cookie en Phase 3 | | camelCase pour types TS, snake_case en DB | Convention JS vs convention Python/SQL | -| Rewrites next.config.ts vers backend | Pas de CORS en prod, tout passe par Next.js | +| Rewrites next.config.mjs vers backend | Pas de CORS en prod, tout passe par Next.js | ### État fonctionnel - ✅ Register/Login utilisateur avec JWT @@ -67,7 +67,7 @@ Scans réseau + vulnérabilités + pentest → rapports PDF compréhensibles pou - ✅ Dashboard avec stats temps réel - ✅ Pages liste clients et audits avec recherche - ✅ Guard auth côté frontend -- ✅ Docker dev + prod prêt +- ✅ Docker prod prêt (docker-compose.yml = config prod images registry + Traefik) - ⏳ Pages de formulaire (création/édition) non créées - ⏳ Pages détail client et audit non créées - ⏳ Scanners : dossier vide (placeholder Phase 2) @@ -118,9 +118,9 @@ Permettre le lancement d'un scan Nmap sur des cibles validées, afficher les ré ### Tâches infra -- [ ] Ajouter service `worker` dans docker-compose (image backend + command: celery worker) -- [ ] Ajouter `python-nmap` dans requirements.txt -- [ ] Première migration Alembic : `alembic revision --autogenerate -m "init"` +- [ ] Ajouter service `worker` dans `docker-compose.yml` (image backend + command: celery worker) — attention, c'est la config prod +- [ ] Ajouter `python-nmap` dans `requirements.txt` +- [ ] Première migration Alembic : `alembic -c backend/alembic.ini revision --autogenerate -m "init"` ---