Skip to content

Commit 6ddf781

Browse files
authored
Merge pull request #21 from RustyRory/feat/20-actions-docker
feat(docker): fixes #20 - actions docker
2 parents 56e5ba2 + 7ccfd57 commit 6ddf781

4 files changed

Lines changed: 87 additions & 1 deletion

File tree

CHANGELOG.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,31 @@
11
# Changelog
22

3+
## [0.2.0] — 2026-04-27
4+
5+
### Phase 2 — Monitoring HTTP des applications web
6+
7+
#### Added
8+
9+
- `api/services/http.js` : vérification HTTP des 5 applications web (TP Vue, SaintBarth Volley, Lucky7, College La Boussole, Cinemap)
10+
- Checks effectués en parallèle avec `Promise.all` via `fetch` natif Node.js 20 avec timeout de 5 secondes (`AbortController`)
11+
- `redirect: 'manual'` pour accepter les redirections (302) comme `OK` — nécessaire pour les apps avec page de login
12+
- `globalStatus` prend désormais en compte l'état des sites web en plus des containers
13+
- Section "Applications web" dans le dashboard avec indicateurs visuels vert/rouge
14+
- Compteur OK/KO global affiché dans le header
15+
- Variable d'environnement `BASE_URL` pour configurer l'URL de base des checks HTTP
16+
- Fichier `.env` pour la configuration locale
17+
- Migration de CommonJS (`require`) vers ES Modules (`import/export`) sur l'ensemble du projet
18+
- Configuration Jest adaptée pour l'ESM (`--experimental-vm-modules`, `jest.unstable_mockModule`)
19+
- Configuration ESLint mise à jour pour l'ESM (`sourceType: 'module'`)
20+
21+
#### Changed
22+
23+
- `GET /api/status` : le champ `websites` est maintenant rempli (vide en 0.1.0)
24+
- `globalStatus` passe à `KO` si un site web est indisponible, pas uniquement les containers
25+
- `server.js` : détection du module principal via `import.meta.url` au lieu de `require.main`
26+
27+
---
28+
329
## [0.1.0] — 2026-04-27
430

531
### Phase 1 — MVP : API Docker + Frontend minimal

vps-monitor-app/api/server.js

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import 'dotenv/config';
22
import express from 'express';
33
import { fileURLToPath } from 'url';
44
import { dirname, join } from 'path';
5-
import { getContainers } from './services/docker.js';
5+
import { getContainers, restartContainer, stopContainer, startContainer } from './services/docker.js';
66
import { checkWebsites } from './services/http.js';
77

88
const __dirname = dirname(fileURLToPath(import.meta.url));
@@ -34,6 +34,41 @@ app.get('/api/status', async (req, res) => {
3434
}
3535
});
3636

37+
app.use(express.json());
38+
39+
app.post('/api/container/restart', async (req, res) => {
40+
const { name } = req.body;
41+
if (!name) return res.status(400).json({ error: 'name requis' });
42+
try {
43+
await restartContainer(name);
44+
res.json({ ok: true });
45+
} catch (err) {
46+
res.status(500).json({ error: err.message });
47+
}
48+
});
49+
50+
app.post('/api/container/stop', async (req, res) => {
51+
const { name } = req.body;
52+
if (!name) return res.status(400).json({ error: 'name requis' });
53+
try {
54+
await stopContainer(name);
55+
res.json({ ok: true });
56+
} catch (err) {
57+
res.status(500).json({ error: err.message });
58+
}
59+
});
60+
61+
app.post('/api/container/start', async (req, res) => {
62+
const { name } = req.body;
63+
if (!name) return res.status(400).json({ error: 'name requis' });
64+
try {
65+
await startContainer(name);
66+
res.json({ ok: true });
67+
} catch (err) {
68+
res.status(500).json({ error: err.message });
69+
}
70+
});
71+
3772
export default app;
3873

3974
if (process.argv[1] === fileURLToPath(import.meta.url)) {

vps-monitor-app/api/server.test.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ jest.unstable_mockModule('./services/docker.js', () => ({
44
getContainers: jest.fn().mockResolvedValue([
55
{ name: 'app1', status: 'running', image: 'img', ports: ['3000'], uptime: 'Up 1 hour' },
66
]),
7+
restartContainer: jest.fn().mockResolvedValue(),
8+
stopContainer: jest.fn().mockResolvedValue(),
9+
startContainer: jest.fn().mockResolvedValue(),
710
}));
811

912
jest.unstable_mockModule('./services/http.js', () => ({

vps-monitor-app/api/services/docker.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,28 @@ import Dockerode from 'dockerode';
22

33
const docker = new Dockerode({ socketPath: '/var/run/docker.sock' });
44

5+
async function getContainer(name) {
6+
const containers = await docker.listContainers({ all: true });
7+
const found = containers.find((c) => c.Names.includes(`/${name}`));
8+
if (!found) throw new Error(`Container "${name}" introuvable`);
9+
return docker.getContainer(found.Id);
10+
}
11+
12+
export async function restartContainer(name) {
13+
const container = await getContainer(name);
14+
await container.restart();
15+
}
16+
17+
export async function stopContainer(name) {
18+
const container = await getContainer(name);
19+
await container.stop();
20+
}
21+
22+
export async function startContainer(name) {
23+
const container = await getContainer(name);
24+
await container.start();
25+
}
26+
527
export async function getContainers() {
628
const containers = await docker.listContainers({ all: true });
729

0 commit comments

Comments
 (0)