Skip to content

Commit e697b42

Browse files
feat: EVODRON architecture — rate limiting, health check, Docker, CI, docs
Co-authored-by: julesdemangeot-ship-it <307666271+julesdemangeot-ship-it@users.noreply.github.com>
1 parent e4fb1fe commit e697b42

13 files changed

Lines changed: 469 additions & 4 deletions

File tree

‎.env.example‎

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# Variables d'environnement — Evodron
2+
3+
# Copier ce fichier en `.env` et remplir les valeurs.
4+
# Ne jamais committer `.env` dans le dépôt.
5+
6+
# ── Sécurité ──────────────────────────────────────────────────────────────
7+
# Clé secrète JWT. Utiliser une valeur aléatoire longue (minimum 32 caractères).
8+
# Exemple : openssl rand -hex 32
9+
JWT_SECRET=changeme-use-a-long-random-value-here
10+
11+
# Durée de validité des tokens JWT (défaut : 7d)
12+
# Formats acceptés : "7d", "24h", "3600s"
13+
JWT_EXPIRY=7d
14+
15+
# ── Serveur ───────────────────────────────────────────────────────────────
16+
PORT=3000
17+
18+
# URL publique de l'application (utilisée pour générer les liens de parrainage)
19+
# Exemple : https://app.evodron.com
20+
APP_URL=http://localhost:3000
21+
22+
# ── Base de données ───────────────────────────────────────────────────────
23+
# Chemin vers le fichier SQLite (défaut : ./evodron.db)
24+
# Utiliser :memory: pour les tests uniquement
25+
DB_PATH=./evodron.db
26+
27+
# ── Environnement ─────────────────────────────────────────────────────────
28+
# Valeurs : development | production | test
29+
NODE_ENV=development

‎.github/workflows/ci.yml‎

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
name: CI
2+
3+
on:
4+
push:
5+
branches: ["**"]
6+
pull_request:
7+
8+
jobs:
9+
test:
10+
runs-on: ubuntu-latest
11+
steps:
12+
- uses: actions/checkout@v4
13+
14+
- name: Setup Node.js
15+
uses: actions/setup-node@v4
16+
with:
17+
node-version: 20
18+
cache: npm
19+
20+
- name: Install dependencies
21+
run: npm ci
22+
23+
- name: Run tests
24+
env:
25+
JWT_SECRET: test-secret-ci
26+
DB_PATH: ":memory:"
27+
NODE_ENV: test
28+
run: npm test

‎CONTRIBUTING.md‎

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# Guide de contribution — Evodron
2+
3+
Merci de contribuer à Evodron ! Voici les règles à suivre.
4+
5+
## Pré-requis
6+
7+
- Node.js >= 18
8+
- npm >= 9
9+
10+
## Installation locale
11+
12+
```bash
13+
git clone https://github.com/julesdemangeot-ship-it/EVODRON.git
14+
cd EVODRON
15+
npm install
16+
cp .env.example .env
17+
# Éditer .env et définir JWT_SECRET
18+
```
19+
20+
## Lancer les tests
21+
22+
```bash
23+
npm test
24+
```
25+
26+
Les tests utilisent une base SQLite en mémoire. Aucune configuration externe requise.
27+
28+
## Conventions
29+
30+
- **Code** : `'use strict'` en tête de chaque fichier JS.
31+
- **Commits** : messages en anglais, préfixés (`feat:`, `fix:`, `chore:`, `docs:`, `test:`).
32+
- **Branches** : `feature/<nom>`, `fix/<nom>`, `chore/<nom>`.
33+
- **Tests** : toute nouvelle fonctionnalité doit être accompagnée de tests dans `tests/`.
34+
35+
## Structure du code EVODRON
36+
37+
Voir `EVODRON.md` pour la description complète de l'architecture.
38+
39+
## Pull Requests
40+
41+
1. Créer une branche depuis `main`.
42+
2. Écrire ou adapter les tests.
43+
3. S'assurer que `npm test` passe à 100%.
44+
4. Ouvrir une PR avec une description claire.
45+
46+
## Sécurité
47+
48+
Voir `SECURITY.md` pour signaler une vulnérabilité.

‎Dockerfile‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
FROM node:20-alpine
2+
3+
WORKDIR /app
4+
5+
# Install dependencies first (layer cache)
6+
COPY package*.json ./
7+
RUN npm ci --omit=dev
8+
9+
# Copy application source
10+
COPY app.js ./
11+
COPY src/ ./src/
12+
COPY public/ ./public/
13+
14+
# SQLite database volume mount point
15+
VOLUME ["/data"]
16+
ENV DB_PATH=/data/evodron.db
17+
18+
EXPOSE 3000
19+
20+
USER node
21+
22+
CMD ["node", "app.js"]

‎EVODRON.md‎

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
# Evodron
2+
3+
**Plateforme de parrainage** — backend Node.js/Express, base SQLite, frontend statique.
4+
5+
> ℹ️ Le fichier `README.md` à la racine documente le **GitHub Copilot CLI** (outil de développement intégré à ce dépôt). Ce fichier `EVODRON.md` documente le **produit EVODRON** lui-même.
6+
7+
---
8+
9+
## Architecture
10+
11+
```
12+
evodron/
13+
├── app.js # Point d'entrée Express
14+
├── public/ # Frontend statique (HTML/CSS/JS)
15+
│ ├── index.html
16+
│ ├── login.html
17+
│ ├── register.html
18+
│ ├── dashboard.html
19+
│ ├── referral.html
20+
│ ├── css/style.css
21+
│ └── js/referral.js
22+
├── src/
23+
│ ├── config/
24+
│ │ └── rewards.js # Configuration des récompenses
25+
│ ├── db/
26+
│ │ ├── database.js # Connexion SQLite (better-sqlite3)
27+
│ │ └── schema.sql # Schéma de la base de données
28+
│ ├── middleware/
29+
│ │ ├── auth.js # Vérification JWT
30+
│ │ └── rateLimiter.js # Rate limiting par IP
31+
│ ├── models/
32+
│ │ ├── user.js # Modèle utilisateur
33+
│ │ ├── referral.js # Modèle parrainage
34+
│ │ └── reward.js # Modèle récompenses
35+
│ └── routes/
36+
│ ├── auth.js # /api/auth (register, login)
37+
│ ├── health.js # /api/health
38+
│ └── referral.js # /api/referral (link, stats, rewards, activate-use)
39+
└── tests/
40+
├── referral.test.js # Tests flux de parrainage
41+
└── anti-abuse.test.js # Tests anti-fraude
42+
```
43+
44+
## Prérequis
45+
46+
- **Node.js** >= 18
47+
- **npm** >= 9
48+
49+
## Installation
50+
51+
```bash
52+
git clone https://github.com/julesdemangeot-ship-it/EVODRON.git
53+
cd EVODRON
54+
npm install
55+
cp .env.example .env
56+
# Éditer .env et définir JWT_SECRET
57+
```
58+
59+
## Démarrage
60+
61+
```bash
62+
JWT_SECRET=votre-clé-secrète npm start
63+
# ou avec le fichier .env :
64+
npm start
65+
```
66+
67+
Le serveur écoute sur `http://localhost:3000` (configurable via `PORT`).
68+
69+
## Tests
70+
71+
```bash
72+
npm test
73+
```
74+
75+
Tous les tests utilisent une base SQLite en mémoire (`DB_PATH=:memory:`). Aucune configuration supplémentaire n'est requise.
76+
77+
## API
78+
79+
### Authentification
80+
81+
| Méthode | Endpoint | Description |
82+
|---------|----------|-------------|
83+
| `POST` | `/api/auth/register` | Créer un compte (avec code de parrainage optionnel) |
84+
| `POST` | `/api/auth/login` | Se connecter, obtenir un token JWT |
85+
86+
### Parrainage
87+
88+
| Méthode | Endpoint | Auth | Description |
89+
|---------|----------|------|-------------|
90+
| `GET` | `/api/referral/link` | ✅ | Obtenir son lien de parrainage |
91+
| `GET` | `/api/referral/stats` | ✅ | Statistiques de parrainage |
92+
| `GET` | `/api/referral/rewards` | ✅ | Historique et récompenses disponibles |
93+
| `POST` | `/api/referral/claim-reward/:id` | ✅ | Réclamer une récompense |
94+
| `POST` | `/api/referral/activate-use` | ✅ | Déclarer la première utilisation active |
95+
| `GET` | `/api/referral/program-info` | ❌ | Conditions du programme (public) |
96+
97+
### Santé
98+
99+
| Méthode | Endpoint | Description |
100+
|---------|----------|-------------|
101+
| `GET` | `/api/health` | État de l'application et de la base de données |
102+
103+
### Authentification JWT
104+
105+
Passer le token dans le header `Authorization: ****** ou dans un cookie `token`.
106+
107+
## Variables d'environnement
108+
109+
Voir `.env.example` pour la liste complète.
110+
111+
| Variable | Obligatoire | Défaut | Description |
112+
|----------|-------------|--------|-------------|
113+
| `JWT_SECRET` | ✅ | — | Clé secrète JWT |
114+
| `JWT_EXPIRY` | ❌ | `7d` | Durée de validité du token |
115+
| `PORT` | ❌ | `3000` | Port d'écoute |
116+
| `APP_URL` | ❌ | détecté | URL de base pour les liens de parrainage |
117+
| `DB_PATH` | ❌ | `./evodron.db` | Chemin du fichier SQLite |
118+
| `NODE_ENV` | ❌ | `development` | Environnement d'exécution |
119+
120+
## Déploiement Docker
121+
122+
```bash
123+
# Copier et éditer les variables
124+
cp .env.example .env
125+
# Démarrer
126+
docker compose up -d
127+
```
128+
129+
## Flux de parrainage
130+
131+
```
132+
Alice s'inscrit → obtient un code de parrainage unique
133+
↓
134+
Alice partage son lien : /register?ref=ABCD1234
135+
↓
136+
Bob s'inscrit avec ce lien → reçoit un bonus de bienvenue (10 crédits)
137+
↓
138+
Bob effectue sa première action active → POST /api/referral/activate-use
139+
↓
140+
Alice reçoit sa récompense de parrain (20 crédits)
141+
```
142+
143+
## Sécurité
144+
145+
- Mots de passe hachés avec **bcrypt** (coût 12)
146+
- Tokens JWT signés (HS256)
147+
- Rate limiting : 10 req/15 min sur `/api/auth`, 100 req/min sur `/api/referral`
148+
- Auto-parrainage interdit (vérification modèle + contrainte DB)
149+
- Un utilisateur ne peut avoir qu'un seul parrain (contrainte UNIQUE en base)
150+
- Pas de récompense sans activation effective du filleul
151+
152+
## Licence
153+
154+
Le code source EVODRON (dossiers `src/`, `public/`, `tests/`, fichiers `app.js`, `package.json`) est propriétaire.
155+
156+
Le fichier `README.md`, `install.sh`, `changelog.md` et `LICENSE.md` sont des fichiers hérités du **GitHub Copilot CLI** distribués sous leur propre licence (voir `LICENSE.md`).

‎SECURITY.md‎

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Politique de sécurité — Evodron
2+
3+
## Signaler une vulnérabilité
4+
5+
Si vous découvrez une vulnérabilité de sécurité dans Evodron, **ne l'ouvrez pas publiquement** en tant qu'issue GitHub.
6+
7+
Contactez directement le mainteneur via la fonctionnalité **"Report a vulnerability"** de GitHub (onglet "Security" du dépôt) ou par email privé.
8+
9+
Nous nous engageons à :
10+
- Accuser réception sous 48 heures.
11+
- Fournir un correctif ou un plan d'action sous 7 jours pour les vulnérabilités critiques.
12+
- Créditer le rapporteur dans le changelog si souhaité.
13+
14+
## Versions supportées
15+
16+
| Version | Support sécurité |
17+
|---------|-----------------|
18+
| 1.x | ✅ Oui |
19+
20+
## Bonnes pratiques intégrées
21+
22+
- Mots de passe hachés avec **bcrypt** (coût 12)
23+
- Tokens JWT signés HS256 avec expiration
24+
- Rate limiting sur toutes les routes d'authentification
25+
- Protection anti-auto-parrainage (modèle + contrainte DB)
26+
- Variables sensibles jamais commitées (`.env` dans `.gitignore`)

‎app.js‎

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ const path = require('path');
66

77
const authRoutes = require('./src/routes/auth');
88
const referralRoutes = require('./src/routes/referral');
9+
const healthRoutes = require('./src/routes/health');
10+
const { authLimiter, apiLimiter } = require('./src/middleware/rateLimiter');
911

1012
const app = express();
1113
const PORT = process.env.PORT || 3000;
@@ -18,9 +20,12 @@ app.use(cookieParser());
1820
// Serve static frontend files
1921
app.use(express.static(path.join(__dirname, 'public')));
2022

23+
// Health check (no rate limit)
24+
app.use('/api/health', healthRoutes);
25+
2126
// API routes
22-
app.use('/api/auth', authRoutes);
23-
app.use('/api/referral', referralRoutes);
27+
app.use('/api/auth', authLimiter, authRoutes);
28+
app.use('/api/referral', apiLimiter, referralRoutes);
2429

2530
// Catch-all: serve index.html for client-side navigation
2631
app.get('*', (req, res) => {

‎docker-compose.yml‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
services:
2+
app:
3+
build: .
4+
ports:
5+
- "3000:3000"
6+
environment:
7+
- JWT_SECRET=${JWT_SECRET:?JWT_SECRET is required}
8+
- JWT_EXPIRY=${JWT_EXPIRY:-7d}
9+
- APP_URL=${APP_URL:-http://localhost:3000}
10+
- NODE_ENV=${NODE_ENV:-production}
11+
volumes:
12+
- evodron_data:/data
13+
restart: unless-stopped
14+
healthcheck:
15+
test: ["CMD", "wget", "-qO-", "http://localhost:3000/api/health"]
16+
interval: 30s
17+
timeout: 5s
18+
retries: 3
19+
start_period: 10s
20+
21+
volumes:
22+
evodron_data:

0 commit comments

Comments
 (0)