Plateforme personnelle de gestion du patrimoine : portfolio, comptes bancaires (Open Banking), marchés live, dashboard consolidé — le tout en monorepo NestJS + Next.js.
Ce dépôt contient le socle du projet Doshwork. Il est structuré en monorepo : une API NestJS et un frontend Next.js cohabitent dans le dossier apps/.
- Stack
- Prérequis
- Structure du monorepo
- Démarrage local
- Scripts disponibles
- Conventions de nommage
- Workflow contributeur (git & stories)
- Déploiement production (Coolify)
- Notes d'avancement
| Couche | Technologie | Version |
|---|---|---|
| Package manager | Bun | 1.3+ |
| Runtime Node | Node.js (via .nvmrc) |
22 LTS |
| API | NestJS | 10.4 |
| ORM | Prisma | 7 |
| Base | PostgreSQL | 16 |
| Frontend | Next.js (App Router) | 16.2 |
| UI | React | 19.2 |
| Styling | TailwindCSS + shadcn/ui | 3.x / latest |
| Langage | TypeScript strict | 5.x |
Les versions sont figées dans les package.json de chaque app (^10.4, ^7, ^16.2, ^19.2) afin de garantir la parité dev/prod (NFR24).
⚠️ Pourquoi Node 22 ET Bun ? Bun est le package manager et le runner de scripts. Mais NestJS, Next.js et Prisma utilisent leur propre runtime Node (node:22-alpineen prod). Le.nvmrcgarantit cette version côté dev, Bun reste le point d'entrée unique des commandes. Tous les outils cohabitent proprement.
- Bun ≥ 1.3 (installation :
curl -fsSL https://bun.com/install | bashoubrew install oven-sh/bun/bun) - Node.js 22 LTS (voir
.nvmrc;nvm usepour basculer) - Docker (requis à partir de la Story 1.3 pour Postgres local)
- Un éditeur respectant
.editorconfiget.prettierrc
ℹ️ Les Dockerfiles et
docker compose upne sont pas encore opérationnels à ce stade (Story 1.1). Ils sont livrés en Story 1.2 (Dockerfiles multi-stage) puis Story 1.3 (compose dev). Pour l'instant, démarrage viabun run start:dev/bun run dev(voir plus bas).📌 Règle projet : utilise exclusivement Bun. Pas de
npm,yarnoupnpm. VoirAGENTS.mdpour les détails (règle appliquée par tous les agents IA sur ce repo).
DOSHWORK/
├── .github/
│ └── workflows/ # CI GitHub Actions (rempli en Stories 1.11 & 10.4)
├── apps/
│ ├── api/ # API NestJS 10.4 (+ Prisma 7)
│ │ ├── prisma/
│ │ │ └── schema.prisma
│ │ ├── src/
│ │ │ ├── app.controller.ts
│ │ │ ├── app.module.ts
│ │ │ ├── app.service.ts
│ │ │ └── main.ts
│ │ ├── .env.example
│ │ ├── .dockerignore
│ │ ├── .eslintrc.js
│ │ ├── package.json
│ │ └── tsconfig.json
│ └── web/ # Frontend Next.js 16.2
│ ├── public/
│ ├── src/
│ │ ├── app/ # App Router : layout.tsx, page.tsx, globals.css
│ │ ├── components/
│ │ │ ├── atoms/
│ │ │ ├── molecules/
│ │ │ ├── organisms/
│ │ │ ├── layouts/
│ │ │ └── ui/ # composants shadcn/ui (générés à la demande)
│ │ ├── hooks/
│ │ ├── lib/ # api.ts (fetch wrapper), utils.ts (cn())
│ │ └── types/
│ ├── .env.example
│ ├── .dockerignore
│ ├── eslint.config.mjs # ESLint 9 flat config
│ ├── components.json # shadcn/ui
│ ├── next.config.js
│ ├── package.json
│ ├── tailwind.config.ts
│ └── tsconfig.json
├── docker-compose.yml # Placeholder — rempli en Story 1.3
├── docker-compose.prod.yml # Placeholder — rempli en Story 10.1
├── .editorconfig
├── .gitignore
├── .nvmrc # Node 22
├── .prettierrc
├── bun.lock # Lockfile Bun unique (workspace)
├── package.json # Workspace Bun racine (workspaces: ["apps/*"])
└── README.md
Cette structure suit strictement DCT §3 (Structure du Projet).
Écarts volontaires (différés à une story ultérieure) :
- Les modules métier NestJS (
auth,users,assets,lots,bank,market,mailer,common,prisma) ne sont pas scaffoldés ici : ils arrivent au fil des Epics 2-6. - Les route groups
(auth)/et(dashboard)/ainsi quesettings/etaccount/côté web arrivent en Stories 1.7 / 2.12 / 9.x. - Les workflows GitHub Actions (CI, déploiement) sont livrés en Stories 1.11 et 10.4.
# 1. (optionnel mais recommandé) s'aligner sur Node 22
nvm use
# 2. Installation des deux apps via le workspace Bun racine
bun install # installe apps/api + apps/web en une passe
# 3. API — backend NestJS
cp apps/api/.env.example apps/api/.env # ajustez DATABASE_URL
bun --filter @doshwork/api prisma:generate # génère le client Prisma
bun run api:dev # http://localhost:3001
# 4. Web — frontend Next.js (dans un autre terminal)
cp apps/web/.env.example apps/web/.env.local
bun run web:dev # http://localhost:3000ℹ️ Le workspace Bun racine (
package.json+bun.lockà la racine) permet d'installer les deux apps en une seule passe, avec un lockfile unique qui résout les versions partagées.bun --filter @doshwork/<app> <script>cible une app précise.
- L'API répond
Hello WorldsurGET http://localhost:3001/. - Le frontend affiche une page d'accueil "Doshwork" sur
http://localhost:3000.
🐳 À partir de la Story 1.3, la commande
docker compose updémarrera automatiquement Postgres + API + Web en mode développement. Pour l'instant, chaque app est lancée manuellement.
Les deux apps disposent désormais (Story 1.2) d'un Dockerfile multi-stage (deps → builder → development / production) basé sur node:22-alpine. Le stage deps (invalidé uniquement lorsque package.json ou bun.lock changent) alimente à la fois development (hot-reload via volume bind en Story 1.3) et builder. Le stage builder compile ensuite les artefacts consommés par le stage production.
Les 8 builds à vérifier en local (4 par app) :
# apps/api — NestJS 10.4 + Prisma 7
docker build --target deps -t doshwork-api:deps apps/api/
docker build --target builder -t doshwork-api:builder apps/api/
docker build --target development -t doshwork-api:dev apps/api/
docker build --target production -t doshwork-api:prod apps/api/
# apps/web — Next.js 16.2 standalone
docker build --target deps -t doshwork-web:deps apps/web/
docker build --target builder -t doshwork-web:builder apps/web/
docker build --target development -t doshwork-web:dev apps/web/
docker build --target production -t doshwork-web:prod apps/web/🥟 Bun-en-Docker (obligatoire) : Bun est installé via l'installeur officiel dans chaque stage qui en a besoin, et
bunx --bun prisma ...remplacenpx prisma .... Justification et règle projet :AGENTS.md§1 et §8.
⚠️ docker compose upn'est pas encore opérationnel : il sera livré en Story 1.3 (ajout du servicedbPostgres 16 + health checks + volumes). Cesdocker buildstandalones suffisent à ce stade pour valider la parité dev/prod (NFR24).
Toutes les commandes se lancent avec Bun (bun run <script> ou bun <script>).
| Script | Description |
|---|---|
bun install |
Installe les deux apps via le workspace Bun |
bun run api:dev |
Démarre l'API (raccourci de bun --filter @doshwork/api start:dev) |
bun run web:dev |
Démarre le frontend (raccourci de bun --filter @doshwork/web dev) |
bun run lint |
Lint sur les deux apps (bun --filter '*' lint) |
bun run build |
Build les deux apps |
bun run test |
Tests sur les deux apps |
| Script | Description |
|---|---|
bun run start |
Démarre l'API (production-ready local, sans watch) |
bun run start:dev |
Démarre l'API en mode watch (port 3001 par défaut) |
bun run start:prod |
Lance node dist/main (après bun run build) |
bun run build |
Compile TypeScript → dist/ |
bun run lint |
ESLint sur src/ et test/ |
bun run format |
Prettier sur src/ et test/ |
bun run test |
Jest (tests unitaires scaffoldés par @nestjs/cli) |
bun run prisma:generate |
Génère le client Prisma (@prisma/client) |
bun run prisma:migrate:dev |
(futur — Story 1.4) Crée une migration en développement |
bun run prisma:migrate:deploy |
(futur — Story 10.x) Applique les migrations en prod |
Pour les commandes Prisma directes (Studio, introspect…), utiliser bunx --bun prisma <cmd>.
| Script | Description |
|---|---|
bun run dev |
Démarre Next.js en dev (Turbopack, port 3000) |
bun run build |
Build production |
bun run start |
Lance le build production (next start) |
bun run lint |
ESLint (config Next.js, flat config) |
bun run format |
Prettier |
bun run test |
Placeholder (suite Playwright E2E livrée Story 10.10) |
Le projet applique strictement les conventions définies en DCT §13.
| Contexte | Convention | Exemple |
|---|---|---|
| Base de données | snake_case |
investment_lots, bank_transactions |
| Modèles Prisma | PascalCase |
InvestmentLot, BankAccount |
| Variables/fonctions TS | camelCase |
investmentLot, fetchAssets() |
| Composants React | PascalCase.tsx |
AddLotModal.tsx, StatCard.tsx |
| Hooks React | useCamelCase.ts |
usePortfolio.ts, useMarket.ts |
| Endpoints REST | kebab-case |
/bank-accounts, /investment-lots |
| Variables d'env | SCREAMING_SNAKE_CASE |
DATABASE_URL, JWT_SECRET |
| Fichiers utilitaires | camelCase.ts |
apiFetch.ts, formatCurrency.ts |
Ces règles sont vérifiées :
- côté TypeScript par les configurations ESLint (
@typescript-eslint/no-explicit-any: error, règles Next.js) ; - côté code par revue lors des code reviews (pas d'automatisation à ce stade).
📘 Référence complète :
docs/CONTRIBUTING.md—AGENTS.md
| Branche | Rôle | Règle |
|---|---|---|
PROD |
Production. Recoit uniquement des merges depuis DEV. |
🛑 Aucun commit direct. |
DEV |
Staging / intégration. Base de toute branche story. | 🛑 Aucun commit direct. |
git checkout DEV
git pull --rebase origin DEV 2>/dev/null || true
git checkout -b alpha/feat/<story-key> # format STRICT, voir ci-dessous<version>/<action>/<nom-descriptif>
- Pendant alpha (actuel) :
alpha/feat/1-2-dockerfiles-multi-stage-… - Pendant beta :
beta/feat/… - Après v1.0 (SemVer) :
v1.0.12/feat/Bank-bank-transactions-id-re-categorisation
Types d'action : feat, fix, refactor, perf, docs, test, chore, style, hotfix.
<type>(<scope>): <sujet impératif en français, ≤ 72 car>
<corps expliquant le pourquoi>
Story: <story-key>
- Tasks/Subtasks cochées,
File Listrempli,Completion Notes,Change Log - Status du fichier story passé à
review _bmad-output/implementation-artifacts/sprint-status.yamlmis à jour (<story-key>: review+last_updated)bun run lint+bun run build+bun run test✅- Commit final structuré (HEREDOC)
- Push de la branche + demande de review
🛑 Oublier la mise à jour de
sprint-status.yamlest l'erreur la plus fréquente. ZÉRO TOLÉRANCE.
La production est déployée depuis la branche PROD sur le VPS via Coolify (webhook GitHub, sans workflow deploy.yml). Procédure complète, smoke tests et rollback : docs/ops/deploy.md.
Secrets et références DB : docs/infra/secrets-management.md · installation Coolify : docs/infra/coolify-setup.md.
Disponible depuis la Story 1.4. Requiert que
docker compose up -d dbsoit démarré.
cd apps/api
bunx --bun prisma migrate dev --name <nom> # développement (génère + applique)
bunx --bun prisma migrate deploy # production (applique seulement)# S'assurer que .env contient ADMIN_EMAIL et ADMIN_PASSWORD
cd apps/api
bunx --bun prisma db seedLe seed est idempotent : une 2ème exécution ne crée pas de doublon (utilise upsert sur l'email).
# Dans apps/api/.env (non committé — copier depuis .env.example)
ADMIN_EMAIL=admin@doshwork.local
ADMIN_PASSWORD=<votre-mot-de-passe-fort>Ce README reflète l'état après la Story 1.4 : schéma Prisma initial (User + enums) + migration + seed. Les fonctionnalités métier (auth, portfolio, banking, market, dashboard…) sont livrées Epic par Epic.
- Infra Coolify / Postgres prod (sans secrets) :
docs/infra/coolify-setup.md - Déploiement continu (PROD, webhook Coolify) :
docs/ops/deploy.md - Tracking sprint :
_bmad-output/implementation-artifacts/sprint-status.yaml - Spécifications :
Spécifications/DCT_DOSHWORK.md - Epics détaillés :
_bmad-output/planning-artifacts/epics.md - Instructions agents IA :
AGENTS.md
Projet : Doshwork · Package manager : Bun 1.3+ · Stack : NestJS 10.4 · Next.js 16.2 · Prisma 7 · PostgreSQL 16