Skip to content

Latest commit

Β 

History

History
837 lines (631 loc) Β· 21.8 KB

File metadata and controls

837 lines (631 loc) Β· 21.8 KB

Guide de developpement

Ce document vous guidera pour installer, configurer et developper Arrhes sur votre machine locale.

Table des matieres

Choix de l'environnement

Vous avez deux options pour developper Arrhes :

Option 1 : Developpement avec Docker Compose (Recommande)

Avantages :

  • Configuration simplifiee (pas d'installation de PostgreSQL, RustFS, etc.)
  • Environnement standardise et reproductible
  • Isolation complete des services
  • Node.js et pnpm installes localement (meilleure performance IDE)

Prerequis :

  • Node.js 25+
  • pnpm
  • Docker et Docker Compose

Ideal pour : Developpement quotidien, bonne balance performance/simplicite

Option 2 : Developpement natif

Avantages :

  • Controle total sur chaque service
  • Peut etre plus rapide sur certaines machines
  • Pas besoin de Docker

Prerequis :

  • Node.js 25+
  • pnpm
  • PostgreSQL installe localement
  • Optionnellement Docker pour RustFS et Mailpit

Ideal pour : Developpeurs experimentes, personnalisation avancee

Prerequis

Prerequis communs

  • Node.js : Version 25 ou superieure

    node --version  # Devrait afficher v25.x.x ou superieur

    Installation : https://nodejs.org/

  • pnpm : Version 10 ou superieure

    pnpm --version

    Installation :

    npm install -g pnpm
    # ou
    curl -fsSL https://get.pnpm.io/install.sh | sh -

Option 1 : Avec Docker Compose

C'est tout ! PostgreSQL, RustFS et Mailpit seront lances automatiquement dans des containers.

Option 2 : Developpement natif

  • PostgreSQL : Version 14 ou superieure recommandee

    psql --version

    Installation :

    Ubuntu/Debian :

    sudo apt update
    sudo apt install postgresql postgresql-contrib
    sudo systemctl start postgresql

    macOS :

    brew install postgresql@16
    brew services start postgresql@16

    Windows : Telecharger depuis https://www.postgresql.org/download/windows/

  • Docker (optionnel, pour RustFS et Mailpit) : https://www.docker.com/get-started

  • Ou configurez des services S3 et SMTP alternatifs

Installation

Etape 1 : Cloner le repository

git clone https://github.com/arrhes/application.git
cd application

Etape 2 : Installer les dependances

pnpm install

Cette commande installera toutes les dependances de tous les packages du monorepo.

Etape 3 : Verifier l'installation

pnpm ls --depth=0

Vous devriez voir tous les packages workspace listes.

Configuration

Option 1 : Configuration avec Docker Compose (Recommande)

1. Lancer les services avec just (recommande)

just dev up

Ou directement avec Docker Compose :

docker compose -f .workflows/dev/compose.yml up -d --build

Les services seront disponibles sur :

  • PostgreSQL : localhost:5432 (user: postgres, password: admin, database: default)
  • RustFS API : localhost:9000
  • RustFS Console : http://localhost:9001 (credentials: rustfsadmin / rustfsadmin)
  • Mailpit SMTP : localhost:1025
  • Mailpit Web : http://localhost:8025

2. Creer le bucket RustFS

Accedez a la console RustFS : http://localhost:9001

  • Credentials : rustfsadmin / rustfsadmin
  • Creez un bucket nomme arrhes-files

3. Creer les fichiers de configuration

packages/api/.env :

# Environnement
ENV=development
VERBOSE=true
PORT=3000

# CORS et Cookies
CORS_ORIGIN=http://localhost:5173
COOKIES_DOMAIN=localhost
COOKIES_KEY=development-secret-key-change-in-production-min-32-chars

# URLs
API_BASE_URL=http://localhost:3000
WEBSITE_BASE_URL=http://localhost:5173

# Base de donnees (Docker Compose)
SQL_DATABASE_URL=postgres://postgres:admin@localhost:5432/default

# Stockage RustFS (Docker Compose)
STORAGE_ENDPOINT=http://localhost:9000
STORAGE_BUCKET_NAME=arrhes-files
STORAGE_ACCESS_KEY=rustfsadmin
STORAGE_SECRET_KEY=rustfsadmin

# Email Mailpit (Docker Compose)
EMAIL_ENDPOINT=localhost:1025
EMAIL_USER=test
EMAIL_PASSWORD=test

packages/tools/.env :

DATABASE_URL=postgres://postgres:admin@localhost:5432/default

Option 2 : Configuration native

1. Creer la base de donnees PostgreSQL

# Se connecter a PostgreSQL
sudo -u postgres psql

# Dans le shell PostgreSQL :
CREATE USER arrhes_user WITH PASSWORD 'arrhes_password';
CREATE DATABASE arrhes OWNER arrhes_user;
GRANT ALL PRIVILEGES ON DATABASE arrhes TO arrhes_user;
\q

2. Configurer les services externes (optionnel)

RustFS (Stockage de fichiers) :

# Lancer RustFS avec Docker
docker run -d \
  -p 9000:9000 \
  -p 9001:9001 \
  --name rustfs \
  -e "RUSTFS_ACCESS_KEY=rustfsadmin" \
  -e "RUSTFS_SECRET_KEY=rustfsadmin" \
  -e "RUSTFS_CONSOLE_ENABLE=true" \
  -e "RUSTFS_VOLUMES=/data" \
  -v ~/rustfs/data:/data \
  rustfs/rustfs:latest

# Acceder a la web UI : http://localhost:9001
# Creer un bucket nomme "arrhes-files"

Mailpit (Test d'emails) :

# Lancer Mailpit avec Docker
docker run -d -p 1025:1025 -p 8025:8025 axllent/mailpit

# Interface web : http://localhost:8025

3. Creer les fichiers de configuration

Utilisez les memes fichiers .env que dans l'Option 1, en ajustant les credentials PostgreSQL selon votre configuration.


Pour plus de details sur la configuration, consultez CONFIGURATION.md.

Initialisation de la base de donnees

Pour le developpement local (hors Docker)

Etape 1 : Pousser le schema vers la base de donnees

pnpm --filter tools run push

Cette commande cree toutes les tables necessaires dans PostgreSQL a partir des schemas definis dans @arrhes/application-metadata.

Etape 2 : Seed avec des donnees de demonstration

pnpm --filter tools run seed

Cette commande insere :

  • Un utilisateur de demonstration : demo@arrhes.com / demo
  • Une organisation exemple : "Arrhes"
  • Des comptes comptables de base
  • Des journaux
  • Des ecritures comptables d'exemple pour 2022 et 2023
  • Des documents et etats financiers

Etape 3 : Reinitialiser la base (si necessaire)

Pour tout supprimer et recommencer :

pnpm --filter tools run reset

Cette commande execute : clear + push + seed

Avec Docker Compose

Pour reinitialiser la base de donnees dans l'environnement Docker :

just dev reset

Ou manuellement :

docker compose -f .workflows/dev/compose.yml exec api sh -c "cd /workspace/packages/tools && pnpm run reset"

Lancement en developpement

Commande principale

pnpm run dev

Cette commande lance simultanement :

Les deux processus tournent en parallele avec hot-reload active.

Lancer individuellement (optionnel)

Dans des terminaux separes :

Terminal 1 - API :

pnpm --filter api run dev

Terminal 2 - Website :

pnpm --filter website run dev

Terminal 3 - Metadata (optionnel, watch mode) :

pnpm --filter metadata run dev

Acces a l'application

Identifiants de demonstration

Email    : demo@arrhes.com
Password : demo

Notes par option

Docker Compose :

  • Assurez-vous que les services sont lances : docker compose -f .workflows/dev/compose.yml ps
  • Si les services ne sont pas demarres : just dev up

Natif :

  • Assurez-vous que PostgreSQL est demarre
  • Si vous utilisez RustFS/Mailpit avec Docker, verifiez qu'ils tournent : docker ps

Structure du projet

arrhes/
β”œβ”€β”€ packages/
β”‚   β”œβ”€β”€ api/                    # Backend API (@arrhes/application-api)
β”‚   β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”‚   β”œβ”€β”€ api.ts         # Configuration Hono
β”‚   β”‚   β”‚   β”œβ”€β”€ server.ts      # Point d'entree
β”‚   β”‚   β”‚   β”œβ”€β”€ clients/       # Clients services externes
β”‚   β”‚   β”‚   β”œβ”€β”€ factories/     # Factories Hono typees
β”‚   β”‚   β”‚   β”œβ”€β”€ middlewares/   # Auth, validation, etc.
β”‚   β”‚   β”‚   β”œβ”€β”€ routes/        # Routes API
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ auth/      # Routes authentifiees
β”‚   β”‚   β”‚   β”‚   └── public/    # Routes publiques
β”‚   β”‚   β”‚   β”œβ”€β”€ validators/    # Validation des donnees
β”‚   β”‚   β”‚   └── utilities/     # Utilitaires
β”‚   β”‚   β”œβ”€β”€ .env               # Variables d'environnement
β”‚   β”‚   β”œβ”€β”€ package.json
β”‚   β”‚   └── tsconfig.json
β”‚   β”‚
β”‚   β”œβ”€β”€ website/               # Frontend React (@arrhes/application-website)
β”‚   β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”‚   β”œβ”€β”€ root.tsx       # Point d'entree React
β”‚   β”‚   β”‚   β”œβ”€β”€ index.html     # HTML principal
β”‚   β”‚   β”‚   β”œβ”€β”€ assets/        # CSS, images, manifest
β”‚   β”‚   β”‚   β”œβ”€β”€ components/    # Composants UI reutilisables
β”‚   β”‚   β”‚   β”œβ”€β”€ contexts/      # React contexts
β”‚   β”‚   β”‚   β”œβ”€β”€ features/      # Features par domaine
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ dashboard/ # Dashboard (organisations, settings, support)
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ docs/      # Documentation integree
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ website/   # Site vitrine
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ signIn/    # Connexion
β”‚   β”‚   β”‚   β”‚   └── signUp/    # Inscription
β”‚   β”‚   β”‚   β”œβ”€β”€ routes/        # Definition routes
β”‚   β”‚   β”‚   └── utilities/     # Utilitaires
β”‚   β”‚   β”œβ”€β”€ package.json
β”‚   β”‚   β”œβ”€β”€ tsconfig.json
β”‚   β”‚   └── vite.config.ts
β”‚   β”‚
β”‚   β”œβ”€β”€ metadata/               # Schemas et types partages (@arrhes/application-metadata)
β”‚   β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”‚   β”œβ”€β”€ models/        # Modeles Drizzle ORM
β”‚   β”‚   β”‚   β”œβ”€β”€ schemas/       # Schemas Valibot
β”‚   β”‚   β”‚   β”œβ”€β”€ routes/        # Definitions routes API
β”‚   β”‚   β”‚   β”œβ”€β”€ components/    # Composants metier
β”‚   β”‚   β”‚   └── utilities/     # Utilitaires
β”‚   β”‚   β”œβ”€β”€ package.json
β”‚   β”‚   └── tsconfig.json
β”‚   β”‚
β”‚   β”œβ”€β”€ ui/                     # Composants UI partages (@arrhes/ui)
β”‚   β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”‚   β”œβ”€β”€ components/    # Boutons, layouts, etc.
β”‚   β”‚   β”‚   β”œβ”€β”€ fonts/         # Polices
β”‚   β”‚   β”‚   β”œβ”€β”€ styles/        # CSS
β”‚   β”‚   β”‚   └── utilities/     # cn, sleep
β”‚   β”‚   β”œβ”€β”€ package.json
β”‚   β”‚   └── panda.config.ts
β”‚   β”‚
β”‚   └── tools/                  # Outils base de donnees (@arrhes/application-tools)
β”‚       β”œβ”€β”€ src/
β”‚       β”‚   β”œβ”€β”€ clearDB.ts     # Vider la DB
β”‚       β”‚   β”œβ”€β”€ migrate.ts     # Migrations
β”‚       β”‚   β”œβ”€β”€ schemas.ts     # Import schemas
β”‚       β”‚   β”œβ”€β”€ dbClient.ts    # Client DB
β”‚       β”‚   β”œβ”€β”€ drizzle.config.ts  # Config Drizzle Kit
β”‚       β”‚   └── seed/          # Scripts de seed
β”‚       β”œβ”€β”€ .env               # Variables d'environnement
β”‚       └── package.json
β”‚
β”œβ”€β”€ .workflows/                  # Docker configurations
β”‚   β”œβ”€β”€ .dev/                   # Environnement Docker de developpement
β”‚   β”‚   β”œβ”€β”€ compose.yml
β”‚   β”‚   └── packages/
β”‚   β”‚       β”œβ”€β”€ api/            # Dockerfile + .env de dev
β”‚   β”‚       β”œβ”€β”€ dashboard/      # Dockerfile + .env du frontend
β”‚   β”‚       └── tools/          # .env des outils
β”‚   └── .build/                 # Configuration Docker de production et CI
β”‚       β”œβ”€β”€ compose.yml
β”‚       └── packages/
β”‚           β”œβ”€β”€ api/
β”‚           β”œβ”€β”€ ci/             # Dockerfile pour le pipeline CI local (just build)
β”‚           └── dashboard/
β”‚
β”œβ”€β”€ docs/                       # Documentation
β”‚   β”œβ”€β”€ ARCHITECTURE.md
β”‚   β”œβ”€β”€ BUSINESS_MODEL.md
β”‚   β”œβ”€β”€ CONFIGURATION.md
β”‚   β”œβ”€β”€ CONTRIBUTING.md
β”‚   └── DEVELOPMENT.md
β”‚
β”œβ”€β”€ justfile                    # Commandes just (dev up/down/reset/logs, build)
β”œβ”€β”€ biome.json                  # Configuration Biome (linter + formatter)
β”œβ”€β”€ pnpm-workspace.yaml         # Configuration workspace
β”œβ”€β”€ package.json                # Scripts racine
β”œβ”€β”€ LICENSE
└── README.md

Scripts disponibles

Scripts racine (depuis /)

# Lancer API + Website en developpement
pnpm run dev

# Builder tous les packages
pnpm run build

# Verifier le linting et le formatage (Biome)
pnpm check

# Corriger automatiquement le linting et le formatage
pnpm check:fix

Commandes just

# Demarrer l'environnement Docker de developpement
just dev up

# Arreter l'environnement
just dev down

# Reinitialiser la base de donnees
just dev reset

# Voir les logs
just dev logs

# Lancer le pipeline CI en local (Biome check + build, dans Docker)
just build

Scripts API (packages/api/)

# Developpement avec hot-reload
pnpm --filter api run dev

# Build pour production
pnpm --filter api run build

# Lancer en production (apres build)
pnpm --filter api run start

Scripts Website (packages/website/)

# Developpement avec hot-reload
pnpm --filter website run dev

# Build pour production
pnpm --filter website run build

Scripts Metadata (packages/metadata/)

# Build avec watch mode
pnpm --filter metadata run dev

# Build une fois
pnpm --filter metadata run build

Scripts Tools (packages/tools/)

# Generer les migrations depuis le schema
pnpm --filter tools run generate

# Pousser le schema vers la DB (dev)
pnpm --filter tools run push

# Introspecter le schema de la DB
pnpm --filter tools run pull

# Appliquer les migrations (production)
pnpm --filter tools run migrate

# Seed avec donnees de demo
pnpm --filter tools run seed

# Vider completement la DB
pnpm --filter tools run clear

# Reset complet : clear + push + seed
pnpm --filter tools run reset

# Supprimer les migrations
pnpm --filter tools run drop

Workflow de developpement

Developpement typique

Avec Docker Compose

  1. Lancer les services

    just dev up
  2. Lancer l'application (dans un terminal separe si necessaire)

    pnpm run dev
  3. Developper avec hot-reload

    • Modifications dans packages/api/src/ : Rechargement automatique de l'API
    • Modifications dans packages/website/src/ : HMR (Hot Module Replacement)
    • Modifications dans packages/metadata/src/ : Necessite rebuild (ou mode watch)
  4. Arreter les services (a la fin de la session)

    just dev down

Avec installation native

  1. Lancer les services externes

    # PostgreSQL (si pas demarre)
    sudo systemctl start postgresql
    
    # RustFS (si utilise avec Docker)
    docker start rustfs
    
    # Mailpit (si utilise avec Docker)
    docker start mailpit
  2. Lancer l'application

    pnpm run dev
  3. Developper avec hot-reload

    • Modifications dans packages/api/src/ : Rechargement automatique de l'API
    • Modifications dans packages/website/src/ : HMR (Hot Module Replacement)
    • Modifications dans packages/metadata/src/ : Necessite rebuild (ou mode watch)

Modifier le schema de base de donnees

  1. Modifier les modeles dans packages/metadata/src/models/

  2. Rebuild metadata

    pnpm --filter metadata run build
  3. Generer la migration (optionnel, pour production)

    pnpm --filter tools run generate
  4. Appliquer les changements

    # Developpement : push direct
    pnpm --filter tools run push
    
    # Production : migrations
    pnpm --filter tools run migrate
  5. Mettre a jour le seed si necessaire dans packages/tools/src/seed/

Ajouter une nouvelle route API

  1. Creer la definition de route dans packages/metadata/src/routes/

    // packages/metadata/src/routes/auth/myFeature.ts
    import { routeDefinition } from '#src/utilities/routeDefinition.js'
    import * as v from 'valibot'
    
    export const myFeatureRoute = routeDefinition({
        path: '/api/auth/my-feature',
        paramsSchema: v.object({ /* ... */ }),
        bodySchema: v.object({ /* ... */ }),
        responseSchema: v.object({ /* ... */ }),
    })
  2. Creer l'implementation dans packages/api/src/routes/auth/

    // packages/api/src/routes/auth/myFeature.ts
    import { myFeatureRoute } from '@arrhes/application-metadata/routes'
    import { authFactory } from '#/factories/authFactory.js'
    
    export const myFeature = authFactory.createApp().post(
        myFeatureRoute.path,
        async (c) => {
            // Implementation
            return c.json({ /* ... */ })
        }
    )
  3. Enregistrer la route dans packages/api/src/routes/routes.ts

  4. Utiliser cote frontend dans packages/website/src/utilities/postAPI.ts

Ajouter une nouvelle page

  1. Creer le composant dans packages/website/src/features/

  2. Definir la route dans packages/website/src/routes/root/

  3. Mettre a jour le tree dans le fichier tree correspondant (ex: dashboardTree.ts, docsTree.ts)

  4. Ajouter la navigation si necessaire dans les layouts

Debugging

API (Backend)

Logs verbeux :

VERBOSE=true

Debugger Node.js :

Modifier packages/api/package.json :

{
  "scripts": {
    "dev:debug": "tsx watch --inspect --env-file=.env ./src/server.ts"
  }
}

Lancer :

pnpm --filter api run dev:debug

Attacher le debugger dans VS Code avec cette configuration (.vscode/launch.json) :

{
  "type": "node",
  "request": "attach",
  "name": "Attach to API",
  "port": 9229,
  "skipFiles": ["<node_internals>/**"]
}

Website (Frontend)

Console du navigateur :

  • Ouvrir DevTools (F12)
  • Voir les erreurs, warnings, et logs

React DevTools :

  • Installer l'extension React DevTools
  • Inspecter les composants et leur state

TanStack Query DevTools : Deja integre dans l'application, visible en bas de l'ecran en mode dev.

Base de donnees

Inspecter la DB :

# Avec Docker Compose
psql postgres://postgres:admin@localhost:5432/default

# Avec installation native
psql postgres://arrhes_user:arrhes_password@localhost:5432/arrhes

Commandes SQL utiles :

-- Lister les tables
\dt

-- Voir le schema d'une table
\d table_name

-- Compter les enregistrements
SELECT COUNT(*) FROM users;

-- Voir les derniers enregistrements
SELECT * FROM users ORDER BY "createdAt" DESC LIMIT 10;

Drizzle Studio (GUI pour visualiser la DB) :

pnpm dlx drizzle-kit studio --config=packages/tools/src/drizzle.config.ts

Conseils

Performance

  • Hot-reload lent ? Redemarrez le serveur de developpement
  • Build lent ? Verifiez que Node.js est a jour
  • pnpm lent ? Nettoyez le cache : pnpm store prune

Problemes courants

"Cannot connect to database" :

  • Avec Docker : Verifiez que les containers sont lances : docker compose -f .workflows/dev/compose.yml ps
  • Natif : Verifiez que PostgreSQL est demarre : sudo systemctl status postgresql
  • Testez la connexion : psql postgres://postgres:admin@localhost:5432/default
  • Verifiez les credentials dans .env

"Module not found @arrhes/application-metadata" :

  • Rebuild metadata : pnpm --filter metadata run build
  • Ou lancez en mode watch : pnpm --filter metadata run dev

"CORS error" :

  • Verifiez CORS_ORIGIN dans packages/api/.env
  • Assurez-vous que l'URL correspond exactement

"Cookie not set" :

  • Verifiez COOKIES_DOMAIN (doit etre localhost en dev)
  • Verifiez que l'API et le frontend sont sur le meme domaine

"S3/Storage error" :

  • Verifiez que RustFS est demarre : docker ps | grep rustfs
  • Verifiez que le bucket existe (console : http://localhost:9001)
  • Testez l'endpoint : curl http://localhost:9000

Problemes Docker :

  • Port deja utilise : Un autre service utilise le meme port
    # Voir ce qui utilise le port 5432 (PostgreSQL)
    sudo lsof -i :5432
  • Container ne demarre pas : Voir les logs
    docker compose -f .workflows/dev/compose.yml logs postgres
    docker compose -f .workflows/dev/compose.yml logs rustfs
    docker compose -f .workflows/dev/compose.yml logs mailpit
  • Reinitialiser completement :
    docker compose -f .workflows/dev/compose.yml down -v
    docker compose -f .workflows/dev/compose.yml up -d --build

Bonnes pratiques

  1. Commits atomiques : Un commit = une fonctionnalite/fix
  2. Messages de commit clairs : Suivez les conventions (voir CONTRIBUTING.md)
  3. Tester avant de commit : Lancez just build pour verifier le linting et la compilation
  4. Suivre les patterns existants : Regardez le code existant pour rester coherent
  5. Documenter les changements : Commentaires pour la logique complexe

Ressources utiles


Pour contribuer au projet, consultez CONTRIBUTING.md.