Ce document explique comment cloner, installer, lancer et déployer le projet UMHMA. Il s'adresse aux contributeurs et aux personnes qui reprennent la maintenance.
Le projet est un monorepo composé de deux applications :
| Dossier | Rôle | Technologies |
|---|---|---|
backend/ |
API REST + logique métier | Node.js 20, Express, PostgreSQL |
frontend/ |
Interface utilisateur | React 18 (Create React App) |
Les deux sont déployés ensemble sur une instance EC2 via GitHub Actions.
Avant de commencer, assure-toi d'avoir :
- Git ≥ 2.30
- Node.js 20 (installé via nvm recommandé)
- npm ≥ 9 (livré avec Node)
- PostgreSQL ≥ 14 (local ou managé)
- Un compte GitHub avec accès au dépôt
- (Optionnel) un compte Mailjet pour le formulaire de contact
Vérifie ta version de Node :
node -v # doit afficher v20.x.x
npm -vgit clone git@github.com:Yayabtw/ProjectLabUMHMA.git
cd ProjectLabUMHMASi tu n'as pas encore de clé SSH GitHub, utilise plutôt l'URL HTTPS :
git clone https://github.com/Yayabtw/ProjectLabUMHMA.gitL'arborescence à la racine doit ressembler à :
ProjectLabUMHMA/
├── backend/
├── frontend/
├── docs/
├── diagrams/
├── scripts/
└── README.md
Chaque application a son propre fichier .env, basé sur l'exemple
env.example fourni.
cd backend
cp env.example .envPuis ouvre .env et renseigne :
| Variable | Description |
|---|---|
PORT |
Port d'écoute de l'API (défaut : 4000) |
JWT_SECRET |
Clé secrète JWT — au moins 32 caractères |
DATABASE_URL |
Chaîne de connexion Postgres (postgres://user:pass@host:5432/db) |
CORS_ALLOWED_ORIGINS |
Origines autorisées, séparées par virgule (ex. http://localhost:3000) |
PGSSLMODE |
Décommenter et passer à require si l'hébergeur Postgres exige du SSL |
MAILJET_* |
Clés Mailjet pour le formulaire de contact (optionnel en dev) |
⚠️ Le serveur refuse de démarrer siJWT_SECRETfait moins de 32 caractères. C'est volontaire pour éviter de pousser un secret faible en prod.
cd ../frontend
cp env.example .env| Variable | Description |
|---|---|
REACT_APP_API_URL |
URL de l'API backend (défaut : http://localhost:4000) |
Avec Postgres installé localement :
createdb umhma_dev
psql umhma_dev -c "CREATE USER umhma WITH PASSWORD 'umhma'; GRANT ALL PRIVILEGES ON DATABASE umhma_dev TO umhma;"Mets ensuite ta DATABASE_URL à jour :
DATABASE_URL=postgres://umhma:umhma@localhost:5432/umhma_devLes tables sont créées automatiquement au premier démarrage du backend via
le script src/services/dbInit.js. Aucune commande de migration manuelle n'est
nécessaire.
Depuis la racine du projet :
# Backend
cd backend
npm ci
# Frontend
cd ../frontend
npm cinpm ci est préférable à npm install : il respecte strictement le
package-lock.json et évite de modifier le lockfile par erreur.
Ouvre deux terminaux :
cd backend
npm run devLe serveur démarre sur http://localhost:4000. Vérifie qu'il répond :
curl http://localhost:4000/healthzcd frontend
npm startLe navigateur s'ouvre automatiquement sur http://localhost:3000.
cd backend
npm testcd frontend
npm test -- --watchAll=falsePour accéder à l'interface admin (/admin), un compte doit avoir le flag
is_admin. Promotion d'un utilisateur existant en SQL :
INSERT INTO admin (uuid_admin)
SELECT uuid_user FROM user_account WHERE email = 'ton.email@exemple.fr';L'utilisateur doit ensuite se déconnecter / reconnecter pour que la session embarque le flag.
Le projet est déployé en continu sur AWS EC2 via GitHub Actions.
Le workflow se trouve dans .github/workflows/deploy.yml.
| Événement | Comportement |
|---|---|
Pull request vers main |
Tests backend + frontend uniquement |
Push sur main |
Tests → build frontend → déploiement EC2 |
┌──────────┐ ┌────────────────┐ ┌──────────────────┐
│ test │──▶│ build-frontend │──▶│ deploy + health │
│ (matrix) │ │ (artefact) │ │ (SSH → EC2) │
└──────────┘ └────────────────┘ └──────────────────┘
test— exécutenpm testpourbackendetfrontenden parallèle.build-frontend—npm run buildavecREACT_APP_API_URLinjecté depuis les secrets, puis upload de l'artefactfrontend/build/.deploy:- télécharge l'artefact frontend ;
- se connecte en SSH à l'EC2 (
webfactory/ssh-agent) ; - sur le serveur :
git fetch && git reset --hard origin/main,npm ci --omit=dev,pm2 restart umhma-api; - synchronise le build front avec
rsync --deletevers/var/www/umhma/frontend/build/; - exécute deux healthchecks (API
/healthz, Frontend/).
À configurer dans Settings → Secrets and variables → Actions du dépôt :
| Secret | Description |
|---|---|
SSH_PRIVATE_KEY |
Clé privée SSH autorisée sur l'EC2 |
SSH_USER |
Utilisateur SSH (ex. ubuntu) |
SSH_HOST |
Adresse de l'EC2 (IP ou DNS) |
REACT_APP_API_URL |
URL publique de l'API utilisée au build du front |
- Onglet Actions du dépôt → workflow CI/CD UMHMA.
- Cliquer sur le run en cours pour voir les logs en direct.
- Si le
Healthcheck APIéchoue : se connecter à l'EC2 et inspecter PM2 :
ssh ubuntu@<SSH_HOST>
pm2 status
pm2 logs umhma-api --lines 100Sur l'EC2, repartir d'un commit antérieur :
cd /var/www/umhma
git log --oneline -n 10
git reset --hard <sha-précédent>
cd backend && npm ci --omit=dev
pm2 restart umhma-api --update-envPour le front, il suffit de relancer le workflow GitHub Actions sur le commit voulu (Re-run all jobs).
| Problème | Piste de résolution |
|---|---|
JWT_SECRET must be at least 32 characters |
Allonger la valeur dans backend/.env |
Front affiche Network Error |
Vérifier REACT_APP_API_URL et que le backend tourne |
CORS error dans la console navigateur |
Ajouter l'origine du front dans CORS_ALLOWED_ORIGINS |
pm2: command not found sur EC2 |
npm i -g pm2 |
| Healthcheck CI échoue | pm2 logs umhma-api, vérifier que le port 4000 est ouvert |



