rubis/docs/tech/dev-setup.md
ordinarthur 4a6c778e7c chore(api): docker-compose dev (PG/Redis/MinIO/Mailhog) + bascule sur Postgres
- docker-compose.dev.yml à la racine : PG 16, Redis 7, MinIO + bucket auto, Mailhog. Ports décalés (5433, 6380, 9100…) pour éviter les collisions locales.
- apps/api/config/database.ts : Postgres en default, SQLite reste accessible via DB_CONNECTION=sqlite.
- start/env.ts : validation des nouvelles vars (PG, Redis, S3, Mail, OCR, refresh tokens).
- .env.example complété, scripts pnpm dev:up/down/logs/reset à la racine.
- docs/tech/dev-setup.md pour expliquer la stack locale.
2026-05-06 12:57:42 +02:00

3.3 KiB

Dev setup — environnement local

Version : 0.1 · 2026-05-06

Tout ce qu'il faut pour faire tourner Rubis en local : services backing (Postgres, Redis, MinIO, Mailhog) + l'API + le SPA.

Prérequis

  • Node 22+ (cf. engines dans package.json)
  • pnpm 10+
  • Docker + Docker Compose v2 (pour les services backing)

1. Services backing — docker-compose.dev.yml

Un seul fichier à la racine fait tourner les 4 services dont l'API a besoin :

Service Port hôte Port interne Notes
Postgres 5433 5432 DB applicative rubis_dev (user rubis / pass rubis)
Redis 6380 6379 Backend BullMQ + cache
MinIO API 9100 9000 S3-compatible. Bucket rubis-invoices créé au boot.
MinIO Console 9101 9001 UI web : http://localhost:9101 — login rubis / rubis-dev-secret
Mailhog SMTP 1025 1025 Catch-all pour les emails locaux
Mailhog UI 8025 8025 UI web : http://localhost:8025

Les ports hôte sont décalés (5433, 6380, 9100…) pour éviter les collisions avec un Postgres/Redis perso éventuellement déjà lancé.

Commandes raccourcies

pnpm dev:up      # Démarrage en background
pnpm dev:logs    # Suivre les logs
pnpm dev:down    # Arrêt (volumes conservés)
pnpm dev:reset   # Arrêt + suppression des volumes (reset DB / MinIO complet)

Vérifier que ça tourne

docker compose -f docker-compose.dev.yml ps

Tous les services doivent être healthy (sauf minio-bootstrap qui sort après avoir créé le bucket — c'est normal).

2. API (apps/api)

cd apps/api
cp .env.example .env       # Si pas déjà fait
pnpm dev:api               # Depuis la racine, ou : pnpm -F api dev

Première fois :

pnpm -F api exec node ace migration:run
pnpm -F api exec node ace db:seed

L'API écoute sur http://localhost:3333.

Bascule SQLite (mode dégradé)

Si Docker n'est pas dispo, on peut basculer sur SQLite :

# Dans apps/api/.env
DB_CONNECTION=sqlite

Les migrations tournent sur les deux. Pour les jobs/storage/mail, il faut quand même Redis/MinIO/Mailhog — donc Docker reste recommandé.

3. Web (apps/web)

pnpm dev:web
# → http://localhost:5173

Tant que VITE_USE_MOCKS=true dans apps/web/.env, le SPA tape MSW et n'a pas besoin de l'API. Quand le backend est prêt à servir un domaine, on bascule la valeur sur false.

4. Trousseau de variables d'env

Voir apps/api/.env.example — c'est la source de vérité. Récap :

  • PG_* : connexion Postgres (default ports décalés docker-compose)
  • REDIS_* : BullMQ
  • S3_* : MinIO (driver S3 d'@adonisjs/drive)
  • MAIL_* + SMTP_* : Mailhog en dev, Resend en prod (MAIL_DRIVER=resend + RESEND_API_KEY)
  • OCR_PROVIDER : mock en dev, mistral quand l'API key est en place
  • ACCESS_TOKEN_TTL_MINUTES / REFRESH_TOKEN_TTL_DAYS : durées d'auth

5. Données de seed

pnpm -F api exec node ace db:seed lance :

  • default_plans_seeder — 4 plans pré-fournis (Standard B2B, Rapide, Patient, Ferme)
  • demo_data_seeder — compte demo@rubis.fr + clients + factures (dev uniquement)

Les seeders réutilisent les fixtures de apps/web/src/mocks/seed.ts pour garantir la cohérence MSW ↔ vraie API.