- C1-09: Create CloudPage with folder tree, file list, and /cloud route - C1-10: Create CloudUploadModal with drag-and-drop and progress - C1-11: Create CloudFilePreview mini player inline - C1-12: Add Cloud stories (loading, empty, populated, quota full) - G1-01: Add is_public toggle, public gear endpoint, GearShowcase - G1-02: Add gear image upload endpoints, GearImageGallery component - G1-03: Add gear search with ILIKE + SearchBar in toolbar - G1-04: Add stories for GearShowcase and GearImageGallery
15 KiB
Plan d'action post-audit — Veza Monorepo
Date : 2026-02-22 Base : AUDIT_TECHNIQUE_2026-02-22.md (Cursor/Claude 4.6 Opus) Périmètre : v0.404 (stabilisation) + préparation v0.501
Légende
| Symbole | Signification |
|---|---|
| 🔴 | Bloquant production — doit être corrigé avant tout déploiement |
| 🟠 | Élevé — doit être corrigé avant la fin de v0.404 |
| 🟡 | Moyen — planifiable en v0.404 ou début v0.501 |
| S | < 1 jour |
| M | 1–3 jours |
| L | 3–5 jours |
| XL | > 5 jours |
Sprint 1 — Sécurité critique (jours 1–5)
Objectif : Éliminer les vulnérabilités exploitables. Aucune feature, aucun refactoring.
| # | Ticket | Gravité | Effort | Fichiers impactés | Critère de complétion |
|---|---|---|---|---|---|
| 001 | Fixer pipeline CD — remplacer if: secrets.* par if: vars.* dans les conditions GitHub Actions. Ajouter needs: ci sur le job deploy. Pointer sur Dockerfile.production. |
🔴 | S | .github/workflows/cd.yml |
Pipeline CD exécute push+deploy sur merge main |
| 002 | Auth Redis production — ajouter --requirepass $REDIS_PASSWORD au service Redis dans le compose prod. Propager REDIS_PASSWORD dans les env du backend et des services Rust. |
🔴 | S | docker-compose.prod.yml, config.go (Redis init), chat-server/config.rs, stream-server/config.rs |
Redis refuse les connexions sans mot de passe |
| 003 | Fixer auth HLS/WebSocket — implémenter un endpoint POST /auth/stream-token qui génère un token éphémère (5 min, usage unique, scope streaming). Le frontend l'utilise en query param pour WS et HLS au lieu de TokenStorage.getAccessToken(). |
🔴 | M | Backend : nouveau handler auth/stream_token.go, middleware stream auth. Frontend : hlsService.ts, websocket.ts, tokenStorage.ts |
HLS playback et WebSocket chat fonctionnent avec auth valide |
| 004 | Supprimer docker-compose.hybrid.yml ou retirer network_mode: host + changer le mot de passe Grafana par défaut |
🔴 | S | docker-compose.hybrid.yml |
Fichier supprimé ou sécurisé |
| 005 | JWT_SECRET pour stream-server — ajouter la variable dans le compose prod, vérifier que le stream-server valide les tokens avec le même secret que le backend | 🔴 | S | docker-compose.prod.yml:217, stream-server/config.rs |
Stream-server rejette les requêtes sans JWT valide |
| 006 | Fixer IDOR GetUploadStatus — ajouter vérification upload.user_id == authenticated_user.id |
🟠 | S | internal/handlers/upload.go:308 |
Un user ne peut voir que ses propres uploads |
| 007 | Validation SSRF webhooks — whitelist schémas (https uniquement), bloquer IPs privées (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 127.0.0.0/8, 169.254.0.0/16) dans le webhook delivery service | 🟠 | S | webhook_handlers.go, webhook delivery service |
Les webhooks ne peuvent cibler que des URLs publiques HTTPS |
| 008 | Vérifier signature webhook Hyperswitch — implémenter validation HMAC-SHA256 sur le handler de callback paiement. Rejeter tout webhook sans signature valide. | 🟠 | M | Handler webhook paiement (localiser dans internal/handlers/) |
Webhooks sans signature valide retournent 401 |
| 009 | Unifier version Go — 1.24 dans go.mod, go.work, CI workflows (ci.yml, backend-ci.yml), et Dockerfile.production |
🟠 | S | go.mod, go.work, .github/workflows/ci.yml, .github/workflows/backend-ci.yml, Dockerfile.production |
go version identique partout |
| 010 | Migrer secrets CI — déplacer toute credential en clair dans les workflows vers GitHub Secrets. Vérifier qu'aucun secret ne reste dans les fichiers YAML. | 🟠 | S | .github/workflows/*.yml |
grep -r "password|secret|token" .github/ ne retourne rien de sensible |
Livrable Sprint 1 : Tag v0.404-alpha1. Les 5 blocages critiques de l'audit sont résolus.
Sprint 2 — Infra & CI/CD (jours 6–12)
Objectif : Rendre le pipeline de déploiement fiable et le monitoring opérationnel.
| # | Ticket | Gravité | Effort | Fichiers impactés | Critère de complétion |
|---|---|---|---|---|---|
| 011 | Migrer rate limiter vers Redis — remplacer le rate limiter in-memory par un rate limiter basé sur Redis (clé ratelimit:{user_id}:{route}, TTL sliding window). Conserver le fallback in-memory si Redis est down. |
🟠 | M | internal/middleware/ratelimit.go, internal/config/config.go |
Rate limiting fonctionne en multi-instance. Test : 2 instances, la limite s'applique globalement. |
| 012 | Aligner PostgreSQL 16 partout — remplacer postgres:15-alpine par postgres:16-alpine dans test et hybrid composes |
🟠 | S | docker-compose.test.yml, docker-compose.hybrid.yml |
Toutes les composes utilisent PG 16 |
| 013 | Fixer frontend-ci.yml — ajouter étapes lint (eslint), typecheck (tsc --noEmit), build (vite build) |
🟠 | S | .github/workflows/frontend-ci.yml |
Les PRs frontend échouent si lint, typecheck ou build échouent |
| 014 | Ajouter go vet et gofmt en CI — étape dédiée dans le workflow backend |
🟡 | S | .github/workflows/backend-ci.yml |
go vet ./... et gofmt -l . exécutés en CI |
| 015 | Ajouter clippy en CI pour les services Rust |
🟡 | S | .github/workflows/ci.yml (ou nouveau rust-ci.yml) |
cargo clippy -- -D warnings exécuté en CI pour chat + stream |
| 016 | Ajouter SAST — configurer CodeQL ou Semgrep dans un workflow dédié, couvrant Go + TypeScript | 🟡 | M | Nouveau .github/workflows/sast.yml |
SAST s'exécute sur chaque PR, résultats visibles dans les checks |
| 017 | Compléter staging compose — ajouter chat-server, stream-server, et reverse proxy (Caddy/Nginx) au compose staging | 🟡 | M | docker-compose.staging.yml (créer ou compléter) |
docker compose -f docker-compose.staging.yml up démarre tous les services |
| 018 | Ajouter alerting Prometheus — configurer des alertes pour : service down > 30s, error rate > 5%, latence P99 > 2s, Redis unreachable | 🟡 | M | config/prometheus/, nouveau config/alertmanager/ |
Alertes se déclenchent quand les seuils sont dépassés |
| 019 | Health checks Docker — ajouter healthcheck pour chaque service dans les composes prod et staging |
🟡 | S | docker-compose.prod.yml, docker-compose.staging.yml |
docker compose ps montre le statut santé de chaque service |
| 020 | Implémenter hash des reset tokens — hasher les password reset tokens en base (SHA-256), comparer le hash lors de la validation | 🟡 | S | Handler password reset, migration (ajouter colonne token_hash si nécessaire) |
Un dump DB ne permet pas d'utiliser les reset tokens |
Livrable Sprint 2 : Tag v0.404-alpha2. CI/CD fiable, monitoring avec alertes, infra sécurisée.
Sprint 3 — Nettoyage & Qualité code (jours 13–20)
Objectif : Réduire la dette technique critique, éliminer le code mort, aligner doc et réalité.
| # | Ticket | Gravité | Effort | Fichiers impactés | Critère de complétion |
|---|---|---|---|---|---|
| 021 | Supprimer code mort (~13K LOC) — internal/api/archive/api_manager.go (789 LOC), dev-environment/templates/ non utilisés, fixtures/ vide, packages/ vide, veza-docs/ non alimenté |
🟡 | M | Voir liste. Vérifier avec grep -r qu'aucun import ne référence ces fichiers. |
LOC total réduit de ~13K. Aucune régression. |
| 022 | Supprimer/corriger mocks commerceService — les données factices (getSellerStats, etc.) doivent soit pointer vers les API réelles (v0.401+ les a créées), soit être clairement marquées comme non-prod |
🟡 | S | apps/web/src/services/commerceService.ts (localiser les mocks) |
Aucun mock ne retourne de données factices en mode production |
| 023 | Remplacer fmt.Printf par logger structuré — 15+ occurrences identifiées dans le backend. Utiliser zap déjà configuré. |
🟡 | S | grep -rn "fmt.Print" veza-backend-api/internal/ pour la liste exacte |
Aucun fmt.Printf dans internal/ (hors tests) |
| 024 | Éliminer les any TypeScript — 90+ occurrences. Remplacer par des types concrets ou unknown avec type guards. Prioriser les fichiers services/ et stores/. |
🟡 | L | apps/web/src/services/, apps/web/src/stores/ |
`grep -rn ": any" apps/web/src/ |
| 025 | Aligner FEATURE_STATUS.md avec la réalité — pour chaque feature "opérationnelle", vérifier le flux E2E. Dégrader en "partielle" les features qui dépendent de MSW ou de services Rust OFF. | 🟡 | M | docs/FEATURE_STATUS.md |
Le document reflète fidèlement l'état du code |
| 026 | Aligner TypeScript versions — 5.3.3 dans apps/web/package.json vs 5.9.3 dans root. Unifier sur la dernière stable. |
🟡 | S | package.json (root + apps/web) |
grep -r "typescript" */package.json retourne la même version |
| 027 | Nettoyer gRPC protobuf dupliqué — les fichiers proto générés sont dupliqués entre chat et stream. Centraliser dans un dossier proto/ partagé ou un build step commun. |
🟡 | M | veza-chat-server/proto/, veza-stream-server/proto/ |
Un seul jeu de fichiers proto, importé par les deux services |
| 028 | Documenter la décision Rust — écrire un ADR (Architecture Decision Record) expliquant pourquoi Go + Rust, quand utiliser quoi, et le plan pour le chat server (garder Rust ou migrer Go) | 🟡 | S | Nouveau docs/adr/ADR-001-rust-services.md |
ADR rédigé et référencé dans docs/README.md |
Livrable Sprint 3 : Tag v0.404-beta. Codebase nettoyé, documentation alignée.
Sprint 4 — Intégration services & Tests (jours 21–30)
Objectif : Décider du sort des services Rust. Ajouter les tests d'intégration manquants.
| # | Ticket | Gravité | Effort | Fichiers impactés | Critère de complétion |
|---|---|---|---|---|---|
| 029 | Décision : chat server Rust — intégrer ou remplacer — Évaluer le coût d'intégration (gRPC fonctionnel, auth, persistence) vs le coût de réécriture en Go. Produire un document de décision. Si intégration : continuer ticket 030. Si remplacement : planifier en v0.501. | 🟠 | S (décision) | — | ADR-002 rédigé avec décision argumentée |
| 030 | Intégrer le stream server Rust — connecter gRPC entre backend Go et stream server, activer HLS (HLS_STREAMING=true), vérifier le flux upload → transcode → HLS serve → player |
🟠 | XL | veza-stream-server/, veza-backend-api/internal/services/stream/, docker-compose.prod.yml, apps/web/src/services/hlsService.ts |
Un track uploadé est jouable en HLS via le stream server |
| 031 | Tests d'intégration cross-service — écrire des tests qui vérifient les flux critiques avec tous les services démarrés (Docker Compose test). Minimum : auth → upload → playback, register → login → chat. | 🟡 | L | Nouveau dossier tests/integration/ ou dans scripts/ |
5+ scénarios E2E qui passent en CI |
| 032 | Fixer tests désactivés backend — metrics_test.go, profile_handler_test.go, system_metrics_test.go désactivés pour bitrot. Les corriger ou les supprimer. |
🟡 | M | Fichiers de test identifiés dans le CHANGELOG (section Known Issues) | Aucun test skip ou disabled restant |
| 033 | Ajouter tests Rust — les services Rust ont peu/pas de tests. Ajouter au minimum : tests unitaires JWT validation, tests WebSocket message routing, tests de non-régression. | 🟡 | L | veza-chat-server/tests/, veza-stream-server/tests/ |
cargo test passe avec > 20 tests par service |
| 034 | Remplacer gorilla/websocket — librairie archivée (déc. 2024), plus de patches sécurité. Migrer vers nhooyr.io/websocket ou coder/websocket. |
🟡 | M | veza-backend-api/ — tous les fichiers importants gorilla/websocket |
Aucune dépendance à gorilla/websocket |
Livrable Sprint 4 : Tag v0.404-rc1. Services intégrés ou décision documentée. Tests d'intégration en place.
Sprint 5 — Finalisation v0.404 (jours 31–35)
Objectif : Valider la stabilisation, tagger, préparer v0.501.
| # | Ticket | Gravité | Effort | Fichiers impactés | Critère de complétion |
|---|---|---|---|---|---|
| 035 | Smoke test prod — déployer sur l'environnement staging la config prod complète. Vérifier les 14 features E2E identifiées dans l'audit. Documenter les résultats. | 🟠 | M | Staging environment | 14/14 features E2E fonctionnent en staging |
| 036 | Mettre à jour PROJECT_STATE.md pour v0.404 | 🟡 | S | docs/PROJECT_STATE.md |
Reflète l'état post-stabilisation |
| 037 | Mettre à jour SCOPE_CONTROL.md — référence active → v0.501 | 🟡 | S | docs/SCOPE_CONTROL.md |
Référence pointe vers V0_501_RELEASE_SCOPE.md |
| 038 | Archiver V0_404_RELEASE_SCOPE.md dans docs/archive/ |
🟡 | S | docs/archive/ |
Document archivé |
| 039 | Tag v0.404 | — | S | Git | Tag créé, CHANGELOG mis à jour |
| 040 | Rétrospective audit — comparer les scores pré/post stabilisation. Documenter ce qui reste à traiter en v0.501+. | 🟡 | S | Nouveau docs/RETRO_V0_404.md |
Document rédigé |
Livrable Sprint 5 : Tag v0.404. Stabilisation terminée. Prêt pour Phase 5.
Résumé
| Sprint | Jours | Tickets | Focus |
|---|---|---|---|
| 1 | 1–5 | 001–010 | Sécurité critique |
| 2 | 6–12 | 011–020 | Infra & CI/CD |
| 3 | 13–20 | 021–028 | Nettoyage & Qualité |
| 4 | 21–30 | 029–034 | Intégration & Tests |
| 5 | 31–35 | 035–040 | Finalisation & Tag |
Durée totale : ~7 semaines (35 jours ouvrés) Tickets : 40 Répartition effort : 14 S, 14 M, 5 L, 2 XL, 5 tâches administratives
Tickets reportés à v0.501+
Ces éléments de l'audit ne sont pas bloquants pour la stabilisation mais doivent être traités :
| Ticket | Description | Version cible |
|---|---|---|
| Découper fichiers > 1000 LOC | track/handler.go, interceptors.ts, config.go |
v0.501 |
| Consolider migrations | Squash 78 migrations en baseline | v0.501 |
| Migration React 19 | React 18.2.0 → 19. Évaluer impact hooks. | v0.602 |
| Réécriture chat server Go | Si décision ADR-002 = remplacement | v0.501–v0.502 |
| Blue-green deployment | Nécessite reverse proxy + health checks | v0.601 |
| Container image scanning | Trivy ou Grype en CI | v0.501 |
| IaC (Terraform/Pulumi) | Infrastructure as Code | v0.801 |
| Hyperswitch mode production | Passer de test à live | v0.501 (si payout ready) |