You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
### Étape 6 — CI/CD : lint, tests et déploiement automatique sur staging
74
74
75
+
#### Objectif
75
76
77
+
À chaque push sur la branche `staging`, GitHub Actions doit :
78
+
1. Vérifier la qualité du code (lint)
79
+
2. Lancer les tests
80
+
3. Déployer automatiquement sur le VPS via SSH
81
+
82
+
#### 6.1 — Mettre en place ESLint
83
+
84
+
Installer ESLint dans `vps-monitor-app/` :
85
+
86
+
```bash
87
+
npm install --save-dev eslint @eslint/js
88
+
```
89
+
90
+
Créer `vps-monitor-app/eslint.config.js` :
91
+
92
+
```js
93
+
import js from '@eslint/js';
94
+
95
+
export default [
96
+
js.configs.recommended,
97
+
{
98
+
rules: {
99
+
'no-unused-vars': 'warn',
100
+
'no-console': 'off',
101
+
},
102
+
},
103
+
];
104
+
```
105
+
106
+
Ajouter le script dans `package.json` :
107
+
108
+
```json
109
+
"lint": "eslint api/ public/"
110
+
```
111
+
112
+
#### 6.2 — Mettre en place les tests
113
+
114
+
Installer les dépendances de test :
115
+
116
+
```bash
117
+
npm install --save-dev jest supertest
118
+
```
119
+
120
+
Créer `vps-monitor-app/api/server.test.js` :
121
+
122
+
```js
123
+
const request = require('supertest');
124
+
const app = require('./server');
125
+
126
+
describe('GET /api/status', () => {
127
+
it('répond 200 avec la structure attendue', async () => {
128
+
const res = await request(app).get('/api/status');
129
+
expect(res.statusCode).toBe(200);
130
+
expect(res.body).toHaveProperty('containers');
131
+
expect(res.body).toHaveProperty('websites');
132
+
expect(res.body).toHaveProperty('globalStatus');
133
+
});
134
+
});
135
+
```
136
+
137
+
> Pour que `supertest` fonctionne, `server.js` doit exporter `app` sans appeler `listen` directement — séparer l'export de app et le démarrage du serveur.
138
+
139
+
Ajouter le script dans `package.json` :
140
+
141
+
```json
142
+
"test": "jest"
143
+
```
144
+
145
+
#### 6.3 — Créer le workflow GitHub Actions
146
+
147
+
Créer `.github/workflows/staging.yml` à la racine du repo :
Dans le repo GitHub → Settings → Secrets and variables → Actions, ajouter :
207
+
208
+
| Secret | Valeur |
209
+
|---|---|
210
+
| `VPS_HOST` | IP ou domaine du VPS |
211
+
| `VPS_USER` | `rusty` |
212
+
| `VPS_SSH_KEY` | Clé SSH privée (contenu de `~/.ssh/id_rsa`) |
213
+
214
+
#### 6.5 — Créer la branche staging
215
+
216
+
```bash
217
+
git checkout -b staging
218
+
git push origin staging
219
+
```
220
+
221
+
Tout push sur `staging` déclenchera le pipeline. La branche `main` reste la branche stable.
76
222
77
223
---
78
224
79
225
## Phase 2 — Monitoring HTTP des applications web
80
226
81
-
### Étape 6 — Créer le service de vérification HTTP
227
+
### Étape 7 — Créer le service de vérification HTTP
82
228
83
229
- Créer `api/services/http.js` : liste des URLs à vérifier, fonction qui effectue un GET sur chacune avec timeout, retourne nom + URL + code HTTP + statut (OK / DOWN)
84
230
@@ -92,13 +238,13 @@ URLs à monitorer :
92
238
| College La Boussole | `/collegelaboussole/` |
93
239
| Cinemap | `/cinemap/` |
94
240
95
-
### Étape 7 — Étendre l'endpoint `/api/status`
241
+
### Étape 8 — Étendre l'endpoint `/api/status`
96
242
97
243
- Appeler `http.js` en parallèle avec `docker.js`
98
244
- Ajouter le champ `websites` dans la réponse JSON
99
245
- Calculer `globalStatus` : `"OK"`si tout est up, `"DEGRADED"` ou `"KO"` sinon
100
246
101
-
### Étape 8 — Mettre à jour le frontend
247
+
### Étape 9 — Mettre à jour le frontend
102
248
103
249
- Ajouter une section "Applications web" dans `index.html`
104
250
- Mettre à jour `app.js` pour afficher les statuts HTTP avec indicateurs visuels (vert/rouge)
@@ -108,20 +254,20 @@ URLs à monitorer :
108
254
109
255
## Phase 3 — Actions sur les containers + Sécurité
110
256
111
-
### Étape 9 — Ajouter les actions Docker
257
+
### Étape 10 — Ajouter les actions Docker
112
258
113
259
- Ajouter `POST /api/container/restart` dans `server.js` : reçoit `{ "name": "container-name" }`, appelle dockerode pour redémarrer le container
114
260
- Ajouter (optionnel) `POST /api/container/stop` et `POST /api/container/start`
115
261
- Tester chaque action manuellement
116
262
117
-
### Étape 10 — Ajouter l'authentification
263
+
### Étape 11 — Ajouter l'authentification
118
264
119
265
- Choisir une méthode simple : variable d'environnement pour login/password, middleware Express qui vérifie un header ou cookie de session
120
266
- Protéger toutes les routes `/api/*` et la page principale
121
267
- Stocker les credentials dans une variable d'environnement (ne pas hardcoder)
122
268
- Mettre à jour le `docker-compose.yml` pour passer les variables d'env
123
269
124
-
### Étape 11 — Mettre à jour le frontend pour les actions
270
+
### Étape 12 — Mettre à jour le frontend pour les actions
125
271
126
272
- Ajouter un bouton "Restart" sur chaque carte container
127
273
- Envoyer le POST correspondant au clic, rafraîchir le statut après réponse
@@ -131,7 +277,7 @@ URLs à monitorer :
131
277
132
278
## Phase 4 — Intégration Nginx + Évolutions
133
279
134
-
### Étape 12 — Remplacer la homepage Nginx
280
+
### Étape 13 — Remplacer la homepage Nginx
135
281
136
282
Modifier la configuration Nginx existante pour rediriger `/` vers le container :
137
283
@@ -146,30 +292,20 @@ location / {
146
292
147
293
Recharger Nginx : `nginx -t && nginx -s reload`
148
294
149
-
### Étape 13 — Tests de non-régression
295
+
### Étape 14 — Tests de non-régression
150
296
151
297
- Vérifier que toutes les applications existantes sont toujours accessibles via leurs routes (`/saintbarthvolley/`, etc.)
152
298
- Vérifier que la homepage affiche bien le dashboard
153
299
- Simuler un container arrêté et vérifier l'affichage (statut rouge)
154
300
- Simuler un service HTTP down et vérifier l'affichage
155
301
156
-
### Étape 14 — Évolutions futures (optionnel)
302
+
### Étape 15 — Évolutions futures (optionnel)
157
303
158
304
À planifier selon les besoins :
159
305
160
-
- Alertes Discord / email quand un service tombe
306
+
- Alertes email quand un service tombe
161
307
- Historique d'uptime (stockage en fichier ou SQLite)
0 commit comments