mirror of
https://github.com/CyberMind-FR/secubox-deb.git
synced 2026-07-29 15:37:03 +00:00
Applied LXC memory limit to fix Gitea memory leak on MOCHAbin. Load average dropped from 6.80 to 4.07. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
955 lines
35 KiB
HTML
955 lines
35 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="fr">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<title>SecuBox-DEB — Rapport de Performance</title>
|
||
<style>
|
||
:root {
|
||
--bg-dark: #0a0a0f;
|
||
--bg-card: #12121a;
|
||
--text-primary: #e8e6d9;
|
||
--text-muted: #6b6b7a;
|
||
--gold: #c9a84c;
|
||
--green: #00ff41;
|
||
--red: #e63946;
|
||
--cyan: #00d4ff;
|
||
--purple: #6e40c9;
|
||
}
|
||
|
||
* { box-sizing: border-box; margin: 0; padding: 0; }
|
||
|
||
body {
|
||
font-family: 'JetBrains Mono', 'Fira Code', monospace;
|
||
background: var(--bg-dark);
|
||
color: var(--text-primary);
|
||
line-height: 1.6;
|
||
padding: 2rem;
|
||
}
|
||
|
||
.container { max-width: 1200px; margin: 0 auto; }
|
||
|
||
header {
|
||
text-align: center;
|
||
border-bottom: 2px solid var(--gold);
|
||
padding-bottom: 2rem;
|
||
margin-bottom: 3rem;
|
||
}
|
||
|
||
h1 {
|
||
font-family: 'Cinzel', serif;
|
||
color: var(--gold);
|
||
font-size: 2.5rem;
|
||
margin-bottom: 0.5rem;
|
||
}
|
||
|
||
.subtitle {
|
||
color: var(--text-muted);
|
||
font-size: 1rem;
|
||
}
|
||
|
||
.date {
|
||
color: var(--cyan);
|
||
margin-top: 1rem;
|
||
}
|
||
|
||
h2 {
|
||
color: var(--gold);
|
||
border-left: 4px solid var(--gold);
|
||
padding-left: 1rem;
|
||
margin: 2rem 0 1rem 0;
|
||
}
|
||
|
||
h3 {
|
||
color: var(--cyan);
|
||
margin: 1.5rem 0 1rem 0;
|
||
}
|
||
|
||
.card {
|
||
background: var(--bg-card);
|
||
border: 1px solid #2a2a3a;
|
||
border-radius: 8px;
|
||
padding: 1.5rem;
|
||
margin: 1rem 0;
|
||
}
|
||
|
||
.grid {
|
||
display: grid;
|
||
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
|
||
gap: 1rem;
|
||
}
|
||
|
||
.metric {
|
||
text-align: center;
|
||
padding: 1rem;
|
||
}
|
||
|
||
.metric-value {
|
||
font-size: 2.5rem;
|
||
font-weight: bold;
|
||
}
|
||
|
||
.metric-label {
|
||
color: var(--text-muted);
|
||
font-size: 0.9rem;
|
||
margin-top: 0.5rem;
|
||
}
|
||
|
||
.status-ok { color: var(--green); }
|
||
.status-warn { color: var(--gold); }
|
||
.status-crit { color: var(--red); }
|
||
|
||
table {
|
||
width: 100%;
|
||
border-collapse: collapse;
|
||
margin: 1rem 0;
|
||
}
|
||
|
||
th, td {
|
||
padding: 0.75rem;
|
||
text-align: left;
|
||
border-bottom: 1px solid #2a2a3a;
|
||
}
|
||
|
||
th {
|
||
background: #1a1a2a;
|
||
color: var(--gold);
|
||
}
|
||
|
||
tr:hover { background: #1a1a2a; }
|
||
|
||
.progress-bar {
|
||
background: #2a2a3a;
|
||
border-radius: 4px;
|
||
height: 24px;
|
||
overflow: hidden;
|
||
margin: 0.5rem 0;
|
||
}
|
||
|
||
.progress-fill {
|
||
height: 100%;
|
||
display: flex;
|
||
align-items: center;
|
||
padding-left: 0.5rem;
|
||
font-size: 0.8rem;
|
||
}
|
||
|
||
.advice {
|
||
border-left: 4px solid var(--cyan);
|
||
padding: 1rem 1.5rem;
|
||
margin: 1rem 0;
|
||
background: rgba(0, 212, 255, 0.05);
|
||
}
|
||
|
||
.advice-critical {
|
||
border-left-color: var(--red);
|
||
background: rgba(230, 57, 70, 0.05);
|
||
}
|
||
|
||
.advice-success {
|
||
border-left-color: var(--green);
|
||
background: rgba(0, 255, 65, 0.05);
|
||
}
|
||
|
||
code {
|
||
background: #1a1a2a;
|
||
padding: 0.2rem 0.5rem;
|
||
border-radius: 4px;
|
||
font-size: 0.9rem;
|
||
}
|
||
|
||
pre {
|
||
background: #1a1a2a;
|
||
padding: 1rem;
|
||
border-radius: 8px;
|
||
overflow-x: auto;
|
||
margin: 1rem 0;
|
||
}
|
||
|
||
.badge {
|
||
display: inline-block;
|
||
padding: 0.25rem 0.75rem;
|
||
border-radius: 20px;
|
||
font-size: 0.8rem;
|
||
font-weight: bold;
|
||
}
|
||
|
||
.badge-ok { background: var(--green); color: #000; }
|
||
.badge-warn { background: var(--gold); color: #000; }
|
||
.badge-crit { background: var(--red); color: #fff; }
|
||
|
||
footer {
|
||
text-align: center;
|
||
margin-top: 3rem;
|
||
padding-top: 2rem;
|
||
border-top: 1px solid #2a2a3a;
|
||
color: var(--text-muted);
|
||
}
|
||
|
||
.logo { font-size: 1.5rem; color: var(--gold); }
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<div class="container">
|
||
<header>
|
||
<div class="logo">⬡ SECUBOX</div>
|
||
<h1>Rapport de Performance</h1>
|
||
<p class="subtitle">Migration OpenWrt → Debian · Optimisation ARM64</p>
|
||
<p class="date">30 avril 2026 · ESPRESSObin V7</p>
|
||
</header>
|
||
|
||
<!-- Executive Summary -->
|
||
<section>
|
||
<h2>1. Résumé Exécutif</h2>
|
||
<div class="grid">
|
||
<div class="card metric">
|
||
<div class="metric-value status-ok">187ms</div>
|
||
<div class="metric-label">Latence API P50</div>
|
||
</div>
|
||
<div class="card metric">
|
||
<div class="metric-value status-ok">40%</div>
|
||
<div class="metric-label">Utilisation Mémoire</div>
|
||
</div>
|
||
<div class="card metric">
|
||
<div class="metric-value status-ok">0.39</div>
|
||
<div class="metric-label">Load Average</div>
|
||
</div>
|
||
<div class="card metric">
|
||
<div class="metric-value status-ok">72%</div>
|
||
<div class="metric-label">Espace Disque Utilisé</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="advice advice-success">
|
||
<strong>Verdict Global : BON</strong><br>
|
||
Le système répond aux objectifs de performance pour un appareil ARM64 contraint (1GB RAM).
|
||
Les APIs répondent sous 200ms en P50, bien en dessous de l'objectif de 500ms.
|
||
</div>
|
||
</section>
|
||
|
||
<!-- Hardware Profile -->
|
||
<section>
|
||
<h2>2. Profil Matériel</h2>
|
||
<div class="card">
|
||
<table>
|
||
<tr>
|
||
<th>Composant</th>
|
||
<th>Spécification</th>
|
||
<th>Contrainte</th>
|
||
</tr>
|
||
<tr>
|
||
<td>Appareil</td>
|
||
<td>GlobalScale ESPRESSObin V7</td>
|
||
<td>—</td>
|
||
</tr>
|
||
<tr>
|
||
<td>CPU</td>
|
||
<td>Marvell Armada 3720 (2× Cortex-A53 @ 1.2GHz)</td>
|
||
<td>Dual-core seulement</td>
|
||
</tr>
|
||
<tr>
|
||
<td>RAM</td>
|
||
<td>1 GB DDR3</td>
|
||
<td class="status-warn">Critique — limite stricte</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Stockage</td>
|
||
<td>eMMC 2.4 GB</td>
|
||
<td class="status-warn">Espace limité</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Swap</td>
|
||
<td>512 MB (zram recommandé)</td>
|
||
<td>Compression active</td>
|
||
</tr>
|
||
<tr>
|
||
<td>OS</td>
|
||
<td>Debian 12 (Bookworm) ARM64</td>
|
||
<td>Kernel 6.1 LTS</td>
|
||
</tr>
|
||
</table>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- Memory Analysis -->
|
||
<section>
|
||
<h2>3. Analyse Mémoire</h2>
|
||
|
||
<h3>3.1 Utilisation Globale</h3>
|
||
<div class="card">
|
||
<div class="progress-bar">
|
||
<div class="progress-fill status-ok" style="width: 40%; background: linear-gradient(90deg, #00ff41, #00d4ff);">
|
||
391 Mi / 976 Mi (40%)
|
||
</div>
|
||
</div>
|
||
<p style="margin-top: 1rem; color: var(--text-muted);">
|
||
<strong>Disponible :</strong> 584 Mi | <strong>Swap utilisé :</strong> 37 Mi / 511 Mi (7%)
|
||
</p>
|
||
</div>
|
||
|
||
<h3>3.2 Consommation par Service</h3>
|
||
<div class="card">
|
||
<table>
|
||
<tr>
|
||
<th>Service</th>
|
||
<th>Port</th>
|
||
<th>RSS</th>
|
||
<th>% RAM</th>
|
||
<th>Status</th>
|
||
</tr>
|
||
<tr>
|
||
<td>secubox-hub</td>
|
||
<td>8001</td>
|
||
<td>56 MB</td>
|
||
<td>5.5%</td>
|
||
<td><span class="badge badge-ok">OK</span></td>
|
||
</tr>
|
||
<tr>
|
||
<td>secubox-portal</td>
|
||
<td>8003</td>
|
||
<td>50 MB</td>
|
||
<td>4.9%</td>
|
||
<td><span class="badge badge-ok">OK</span></td>
|
||
</tr>
|
||
<tr>
|
||
<td>eye-remote</td>
|
||
<td>socket</td>
|
||
<td>50 MB</td>
|
||
<td>4.9%</td>
|
||
<td><span class="badge badge-ok">OK</span></td>
|
||
</tr>
|
||
<tr>
|
||
<td>secubox-system</td>
|
||
<td>8002</td>
|
||
<td>49 MB</td>
|
||
<td>4.8%</td>
|
||
<td><span class="badge badge-ok">OK</span></td>
|
||
</tr>
|
||
<tr>
|
||
<td>systemd-journald</td>
|
||
<td>—</td>
|
||
<td>39 MB</td>
|
||
<td>3.8%</td>
|
||
<td><span class="badge badge-warn">ÉLEVÉ</span></td>
|
||
</tr>
|
||
<tr>
|
||
<td>nginx (workers)</td>
|
||
<td>80/443</td>
|
||
<td>28 MB</td>
|
||
<td>2.6%</td>
|
||
<td><span class="badge badge-ok">OK</span></td>
|
||
</tr>
|
||
<tr>
|
||
<td>haproxy</td>
|
||
<td>—</td>
|
||
<td>10 MB</td>
|
||
<td>1.0%</td>
|
||
<td><span class="badge badge-ok">OK</span></td>
|
||
</tr>
|
||
<tr style="background: #1a1a2a; font-weight: bold;">
|
||
<td>TOTAL Services Python</td>
|
||
<td>—</td>
|
||
<td>205 MB</td>
|
||
<td>20.1%</td>
|
||
<td><span class="badge badge-ok">OK</span></td>
|
||
</tr>
|
||
</table>
|
||
</div>
|
||
|
||
<div class="advice">
|
||
<strong>Observation :</strong> Les services Python consomment environ 50 MB chacun,
|
||
ce qui est acceptable pour des applications FastAPI avec Uvicorn.
|
||
Le total de 205 MB reste sous l'objectif de 400 MB pour ESPRESSObin.
|
||
</div>
|
||
</section>
|
||
|
||
<!-- API Latency -->
|
||
<section>
|
||
<h2>4. Latence API</h2>
|
||
|
||
<div class="card">
|
||
<table>
|
||
<tr>
|
||
<th>Endpoint</th>
|
||
<th>Temps (ms)</th>
|
||
<th>Objectif</th>
|
||
<th>Status</th>
|
||
</tr>
|
||
<tr>
|
||
<td><code>/api/v1/hub/status</code></td>
|
||
<td class="status-ok">49 ms</td>
|
||
<td>< 100 ms</td>
|
||
<td><span class="badge badge-ok">EXCELLENT</span></td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>/api/v1/hub/monitoring</code></td>
|
||
<td class="status-ok">77 ms</td>
|
||
<td>< 100 ms</td>
|
||
<td><span class="badge badge-ok">BON</span></td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>/api/v1/system/metrics</code></td>
|
||
<td class="status-ok">187 ms</td>
|
||
<td>< 500 ms</td>
|
||
<td><span class="badge badge-ok">OK</span></td>
|
||
</tr>
|
||
</table>
|
||
</div>
|
||
|
||
<h3>4.1 Objectifs de Performance</h3>
|
||
<div class="grid">
|
||
<div class="card">
|
||
<h4 style="color: var(--cyan);">ESPRESSObin (1 GB)</h4>
|
||
<table>
|
||
<tr><td>P50 Latence</td><td>< 100 ms</td></tr>
|
||
<tr><td>P99 Latence</td><td>< 500 ms</td></tr>
|
||
<tr><td>RSS par service</td><td>< 50 MB</td></tr>
|
||
<tr><td>Total Python RSS</td><td>< 400 MB</td></tr>
|
||
<tr><td>Démarrage à froid</td><td>< 5 s</td></tr>
|
||
</table>
|
||
</div>
|
||
<div class="card">
|
||
<h4 style="color: var(--purple);">MOCHAbin (8 GB)</h4>
|
||
<table>
|
||
<tr><td>P50 Latence</td><td>< 50 ms</td></tr>
|
||
<tr><td>P99 Latence</td><td>< 200 ms</td></tr>
|
||
<tr><td>RSS par service</td><td>< 100 MB</td></tr>
|
||
<tr><td>Total Python RSS</td><td>< 1 GB</td></tr>
|
||
<tr><td>Démarrage à froid</td><td>< 3 s</td></tr>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- Disk Usage -->
|
||
<section>
|
||
<h2>5. Espace Disque</h2>
|
||
|
||
<div class="card">
|
||
<div class="progress-bar">
|
||
<div class="progress-fill" style="width: 72%; background: linear-gradient(90deg, #00ff41, #c9a84c);">
|
||
1.7 GB / 2.4 GB (72%)
|
||
</div>
|
||
</div>
|
||
<p style="margin-top: 1rem;">
|
||
<strong>Disponible :</strong> 648 MB — suffisant pour les opérations normales.
|
||
</p>
|
||
</div>
|
||
|
||
<h3>5.1 Nettoyage Effectué</h3>
|
||
<div class="card">
|
||
<table>
|
||
<tr>
|
||
<th>Action</th>
|
||
<th>Espace Libéré</th>
|
||
</tr>
|
||
<tr>
|
||
<td>Rotation journaux systemd (<code>journalctl --vacuum-size=50M</code>)</td>
|
||
<td>128 MB</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Cache APT et listes</td>
|
||
<td>79 MB</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Documentation (<code>/usr/share/doc</code>)</td>
|
||
<td>52 MB</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Paquets inutilisés (X11, Qt, UI)</td>
|
||
<td>~300 MB</td>
|
||
</tr>
|
||
<tr style="background: #1a1a2a; font-weight: bold;">
|
||
<td>TOTAL</td>
|
||
<td>~567 MB</td>
|
||
</tr>
|
||
</table>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- Recommendations -->
|
||
<section>
|
||
<h2>6. Recommandations d'Optimisation</h2>
|
||
|
||
<h3>6.1 Priorité Haute</h3>
|
||
|
||
<div class="advice advice-critical">
|
||
<strong>🔴 Limiter la mémoire des services</strong><br>
|
||
Ajouter des limites systemd pour éviter les OOM kills :
|
||
<pre>
|
||
# /etc/systemd/system/secubox-*.service.d/memory.conf
|
||
[Service]
|
||
MemoryMax=60M
|
||
MemoryHigh=50M
|
||
</pre>
|
||
</div>
|
||
|
||
<div class="advice advice-critical">
|
||
<strong>🔴 Activer le cache background</strong><br>
|
||
Implémenter le pattern de rafraîchissement asynchrone pour les endpoints stats :
|
||
<pre>
|
||
# Pattern 13 de PATTERNS.md
|
||
async def _refresh_cache():
|
||
while True:
|
||
data = await _compute_stats()
|
||
_cache.update(data)
|
||
await asyncio.sleep(60)
|
||
|
||
@app.on_event("startup")
|
||
async def startup():
|
||
asyncio.create_task(_refresh_cache())
|
||
</pre>
|
||
</div>
|
||
|
||
<h3>6.2 Priorité Moyenne</h3>
|
||
|
||
<div class="advice">
|
||
<strong>🟡 Réduire les logs journald</strong><br>
|
||
Configurer une limite permanente :
|
||
<pre>
|
||
# /etc/systemd/journald.conf
|
||
[Journal]
|
||
SystemMaxUse=50M
|
||
SystemMaxFileSize=10M
|
||
MaxRetentionSec=7day
|
||
</pre>
|
||
</div>
|
||
|
||
<div class="advice">
|
||
<strong>🟡 Paralléliser les appels subprocess</strong><br>
|
||
Utiliser <code>asyncio.gather()</code> pour les commandes CLI multiples :
|
||
<pre>
|
||
# Pattern 14 de PATTERNS.md
|
||
decisions, alerts, metrics = await asyncio.gather(
|
||
run_cmd("cscli decisions list -o json"),
|
||
run_cmd("cscli alerts list -o json"),
|
||
run_cmd("cscli metrics -o json"),
|
||
)
|
||
</pre>
|
||
</div>
|
||
|
||
<div class="advice">
|
||
<strong>🟡 Configurer zram swap</strong><br>
|
||
Pour compression mémoire optimale :
|
||
<pre>
|
||
# /etc/systemd/system/zram-swap.service
|
||
modprobe zram
|
||
echo lz4 > /sys/block/zram0/comp_algorithm
|
||
echo 512M > /sys/block/zram0/disksize
|
||
mkswap /dev/zram0 && swapon /dev/zram0 -p 100
|
||
</pre>
|
||
</div>
|
||
|
||
<h3>6.3 Priorité Basse</h3>
|
||
|
||
<div class="advice advice-success">
|
||
<strong>🟢 Monitoring continu</strong><br>
|
||
Utiliser les scripts de benchmark pour le suivi :
|
||
<pre>
|
||
# Latence API
|
||
./scripts/bench/api-latency.py --host localhost --requests 100
|
||
|
||
# Baseline mémoire
|
||
./scripts/bench/memory-baseline.sh --watch --interval 60
|
||
|
||
# Profiling CPU (sous charge)
|
||
./scripts/bench/cpu-profile.sh --service hub --duration 30
|
||
</pre>
|
||
</div>
|
||
|
||
<div class="advice advice-success">
|
||
<strong>🟢 Cron de nettoyage automatique</strong><br>
|
||
Ajouter une tâche hebdomadaire :
|
||
<pre>
|
||
# /etc/cron.weekly/secubox-cleanup
|
||
#!/bin/bash
|
||
journalctl --vacuum-size=50M
|
||
apt-get clean
|
||
find /var/log -name '*.gz' -mtime +7 -delete
|
||
</pre>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- Benchmark Tools -->
|
||
<section>
|
||
<h2>7. Outils de Benchmark Disponibles</h2>
|
||
|
||
<div class="card">
|
||
<table>
|
||
<tr>
|
||
<th>Script</th>
|
||
<th>Fonction</th>
|
||
<th>Commande</th>
|
||
</tr>
|
||
<tr>
|
||
<td><code>api-latency.py</code></td>
|
||
<td>Mesure latence P50/P95/P99</td>
|
||
<td><code>./api-latency.py --host IP --requests 100</code></td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>memory-baseline.sh</code></td>
|
||
<td>Suivi mémoire RSS/PSS/USS</td>
|
||
<td><code>./memory-baseline.sh --watch</code></td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>startup-time.sh</code></td>
|
||
<td>Temps de démarrage services</td>
|
||
<td><code>./startup-time.sh --full</code></td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>cpu-profile.sh</code></td>
|
||
<td>Flame graphs (py-spy)</td>
|
||
<td><code>sudo ./cpu-profile.sh --service hub</code></td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>locustfile.py</code></td>
|
||
<td>Tests de charge</td>
|
||
<td><code>locust -f locustfile.py --host URL</code></td>
|
||
</tr>
|
||
</table>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- MOCHAbin Reference -->
|
||
<section>
|
||
<h2>8. MOCHAbin — Référence OpenWrt (Obsolète)</h2>
|
||
|
||
<div class="advice advice-critical">
|
||
<strong>⚠️ Version de Référence Uniquement</strong><br>
|
||
Le MOCHAbin (192.168.255.1) exécute encore SecuBox-OpenWrt 24.10.5.
|
||
Ces données servent de référence pour la migration vers Debian.
|
||
</div>
|
||
|
||
<div class="grid">
|
||
<div class="card metric">
|
||
<div class="metric-value status-warn">4.07</div>
|
||
<div class="metric-label">Load Average</div>
|
||
<div style="font-size: 0.7rem; color: var(--green);">↓ était 6.80</div>
|
||
</div>
|
||
<div class="card metric">
|
||
<div class="metric-value status-ok">56%</div>
|
||
<div class="metric-label">RAM Utilisée</div>
|
||
<div style="font-size: 0.7rem; color: var(--green);">↓ était 83%</div>
|
||
</div>
|
||
<div class="card metric">
|
||
<div class="metric-value status-warn">97%</div>
|
||
<div class="metric-label">Swap Utilisé</div>
|
||
<div style="font-size: 0.7rem; color: var(--text-muted);">libération en cours</div>
|
||
</div>
|
||
<div class="card metric">
|
||
<div class="metric-value status-ok">73%</div>
|
||
<div class="metric-label">Disque Utilisé</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="card">
|
||
<table>
|
||
<tr>
|
||
<th>Caractéristique</th>
|
||
<th>MOCHAbin (OpenWrt)</th>
|
||
<th>Cible Debian</th>
|
||
</tr>
|
||
<tr>
|
||
<td>CPU</td>
|
||
<td>Armada 7040 (4× Cortex-A72 @ 1.3GHz)</td>
|
||
<td>Même hardware</td>
|
||
</tr>
|
||
<tr>
|
||
<td>RAM</td>
|
||
<td>8 GB DDR4</td>
|
||
<td>8 GB DDR4</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Stockage</td>
|
||
<td>16 GB eMMC + overlayfs</td>
|
||
<td>16 GB eMMC ext4</td>
|
||
</tr>
|
||
<tr>
|
||
<td>OS</td>
|
||
<td class="status-warn">OpenWrt 24.10.5 (obsolète)</td>
|
||
<td class="status-ok">Debian 12 Bookworm</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Problèmes Identifiés</td>
|
||
<td class="status-crit">
|
||
Gitea consommait 7.6GB (fuite mémoire), swap épuisé
|
||
</td>
|
||
<td class="status-ok">
|
||
✓ CORRIGÉ — Limite 2GB activée
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
</div>
|
||
|
||
<div class="card" style="border-color: var(--green);">
|
||
<h4 style="color: var(--green);">✓ Correction Appliquée (30/04/2026)</h4>
|
||
<table>
|
||
<tr>
|
||
<th>Action</th>
|
||
<th>Avant</th>
|
||
<th>Après</th>
|
||
</tr>
|
||
<tr>
|
||
<td>RAM Gitea</td>
|
||
<td class="status-crit">7.6 GB</td>
|
||
<td class="status-ok">2.1 GB</td>
|
||
</tr>
|
||
<tr>
|
||
<td>RAM disponible</td>
|
||
<td class="status-crit">794 MB</td>
|
||
<td class="status-ok">2.4 GB</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Load average</td>
|
||
<td class="status-crit">6.80</td>
|
||
<td class="status-ok">4.07</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Limite mémoire LXC</td>
|
||
<td class="status-crit">Désactivée</td>
|
||
<td class="status-ok">2 GB max</td>
|
||
</tr>
|
||
</table>
|
||
<p style="margin-top: 1rem; color: var(--text-muted);">
|
||
<strong>Commande :</strong> <code>sed -i 's/#lxc.cgroup.memory.limit_in_bytes/lxc.cgroup.memory.limit_in_bytes/' /srv/lxc/gitea/config</code>
|
||
</p>
|
||
</div>
|
||
|
||
<div class="advice">
|
||
<strong>Leçons pour la Migration :</strong>
|
||
<ul style="margin: 0.5rem 0 0 1.5rem;">
|
||
<li>Définir des <code>MemoryMax</code> systemd dès le départ</li>
|
||
<li>Éviter les services gourmands (Gitea) sur même instance</li>
|
||
<li>Implémenter le pattern cache background obligatoirement</li>
|
||
<li>Surveiller proactivement avec les scripts bench/</li>
|
||
</ul>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- Future Devices -->
|
||
<section>
|
||
<h2>9. Appareils Cibles — Feuille de Route</h2>
|
||
|
||
<h3>9.1 Appareils Actuels</h3>
|
||
<div class="card">
|
||
<table>
|
||
<tr>
|
||
<th>Appareil</th>
|
||
<th>CPU</th>
|
||
<th>RAM</th>
|
||
<th>Profil</th>
|
||
<th>Status</th>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>ESPRESSObin V7</strong></td>
|
||
<td>Armada 3720 (2×A53)</td>
|
||
<td>1 GB</td>
|
||
<td>secubox-lite</td>
|
||
<td><span class="badge badge-ok">ACTIF</span></td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>MOCHAbin</strong></td>
|
||
<td>Armada 7040 (4×A72)</td>
|
||
<td>8 GB</td>
|
||
<td>secubox-full</td>
|
||
<td><span class="badge badge-warn">MIGRATION</span></td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>VirtualBox x64</strong></td>
|
||
<td>Host CPU (2-4 vCPU)</td>
|
||
<td>2-4 GB</td>
|
||
<td>secubox-dev</td>
|
||
<td><span class="badge badge-ok">ACTIF</span></td>
|
||
</tr>
|
||
</table>
|
||
</div>
|
||
|
||
<h3>9.2 Appareils Envisagés</h3>
|
||
<div class="card">
|
||
<table>
|
||
<tr>
|
||
<th>Appareil</th>
|
||
<th>CPU</th>
|
||
<th>RAM</th>
|
||
<th>Usage Prévu</th>
|
||
<th>Priorité</th>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>ESPRESSObin Ultra</strong></td>
|
||
<td>Armada 3720 (2×A53)</td>
|
||
<td>2 GB</td>
|
||
<td>Version intermédiaire, CrowdSec + WG</td>
|
||
<td><span class="badge badge-ok">HAUTE</span></td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>Raspberry Pi 4</strong></td>
|
||
<td>BCM2711 (4×A72)</td>
|
||
<td>4-8 GB</td>
|
||
<td>Alternative grand public, éducation</td>
|
||
<td><span class="badge badge-warn">MOYENNE</span></td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>Raspberry Pi 5</strong></td>
|
||
<td>BCM2712 (4×A76)</td>
|
||
<td>4-8 GB</td>
|
||
<td>Performances accrues, futur standard</td>
|
||
<td><span class="badge badge-warn">MOYENNE</span></td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>Orange Pi 5</strong></td>
|
||
<td>RK3588S (8 cores)</td>
|
||
<td>4-16 GB</td>
|
||
<td>Haute performance, IA locale</td>
|
||
<td><span class="badge badge-warn">MOYENNE</span></td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>Banana Pi R4</strong></td>
|
||
<td>MT7988A (4×A73)</td>
|
||
<td>4 GB</td>
|
||
<td>Routeur natif, 4×2.5GbE, WiFi 7</td>
|
||
<td><span class="badge badge-ok">HAUTE</span></td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>NanoPi R6S</strong></td>
|
||
<td>RK3588S (8 cores)</td>
|
||
<td>8 GB</td>
|
||
<td>Compact, 2×2.5GbE, USB-C</td>
|
||
<td><span class="badge badge-warn">MOYENNE</span></td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>Traverse Ten64</strong></td>
|
||
<td>LS1088A (8×A53)</td>
|
||
<td>8-32 GB</td>
|
||
<td>Enterprise, 10GbE, certification</td>
|
||
<td><span class="badge badge-crit">BASSE</span></td>
|
||
</tr>
|
||
</table>
|
||
</div>
|
||
|
||
<h3>9.3 Profils de Performance par Catégorie</h3>
|
||
<div class="grid">
|
||
<div class="card">
|
||
<h4 style="color: var(--green);">🟢 secubox-lite (≤2 GB)</h4>
|
||
<p style="color: var(--text-muted); margin: 0.5rem 0;">
|
||
ESPRESSObin, ESPRESSObin Ultra
|
||
</p>
|
||
<ul style="margin: 0.5rem 0 0 1rem; font-size: 0.9rem;">
|
||
<li>1 worker Uvicorn</li>
|
||
<li>Cache TTL 120s</li>
|
||
<li>History 1000 entrées max</li>
|
||
<li>Services: Hub, System, Portal</li>
|
||
<li>Optionnel: CrowdSec, WireGuard</li>
|
||
</ul>
|
||
</div>
|
||
<div class="card">
|
||
<h4 style="color: var(--cyan);">🔵 secubox-standard (4 GB)</h4>
|
||
<p style="color: var(--text-muted); margin: 0.5rem 0;">
|
||
RPi 4/5 4GB, Banana Pi R4, VirtualBox
|
||
</p>
|
||
<ul style="margin: 0.5rem 0 0 1rem; font-size: 0.9rem;">
|
||
<li>2 workers Uvicorn</li>
|
||
<li>Cache TTL 60s</li>
|
||
<li>History 5000 entrées</li>
|
||
<li>Tous services core</li>
|
||
<li>+ DPI, NAC, QoS</li>
|
||
</ul>
|
||
</div>
|
||
<div class="card">
|
||
<h4 style="color: var(--purple);">🟣 secubox-full (≥8 GB)</h4>
|
||
<p style="color: var(--text-muted); margin: 0.5rem 0;">
|
||
MOCHAbin, RPi 5 8GB, Orange Pi 5, NanoPi R6S
|
||
</p>
|
||
<ul style="margin: 0.5rem 0 0 1rem; font-size: 0.9rem;">
|
||
<li>4 workers Uvicorn</li>
|
||
<li>Cache TTL 30s</li>
|
||
<li>History 10000 entrées</li>
|
||
<li>Tous modules</li>
|
||
<li>+ LocalAI, Matrix, Gitea (conteneur)</li>
|
||
</ul>
|
||
</div>
|
||
<div class="card">
|
||
<h4 style="color: var(--gold);">🟡 secubox-enterprise (≥16 GB)</h4>
|
||
<p style="color: var(--text-muted); margin: 0.5rem 0;">
|
||
Traverse Ten64, Orange Pi 5 16GB, Serveurs
|
||
</p>
|
||
<ul style="margin: 0.5rem 0 0 1rem; font-size: 0.9rem;">
|
||
<li>8+ workers Uvicorn</li>
|
||
<li>Cache TTL 15s</li>
|
||
<li>History illimité (DB)</li>
|
||
<li>Multi-tenant</li>
|
||
<li>+ Monitoring centralisé</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
|
||
<h3>9.4 Appareils Compagnons</h3>
|
||
<div class="card">
|
||
<table>
|
||
<tr>
|
||
<th>Appareil</th>
|
||
<th>Rôle</th>
|
||
<th>Connexion</th>
|
||
<th>Status</th>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>Raspberry Pi Zero W</strong></td>
|
||
<td>Eye Remote Dashboard (HyperPixel 2.1)</td>
|
||
<td>USB OTG + WiFi</td>
|
||
<td><span class="badge badge-ok">ACTIF</span></td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>Raspberry Pi Zero 2 W</strong></td>
|
||
<td>Eye Remote v2 (performances accrues)</td>
|
||
<td>USB OTG + WiFi</td>
|
||
<td><span class="badge badge-warn">PRÉVU</span></td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>ESP32-S3</strong></td>
|
||
<td>Capteurs IoT, relais GPIO</td>
|
||
<td>WiFi / BLE / UART</td>
|
||
<td><span class="badge badge-warn">PRÉVU</span></td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>M5Stack Core</strong></td>
|
||
<td>Affichage statut compact</td>
|
||
<td>WiFi REST API</td>
|
||
<td><span class="badge badge-crit">ENVISAGÉ</span></td>
|
||
</tr>
|
||
</table>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- Conclusion -->
|
||
<section>
|
||
<h2>10. Conclusion</h2>
|
||
|
||
<div class="card" style="border-color: var(--green);">
|
||
<h3 style="color: var(--green);">✓ Système Opérationnel</h3>
|
||
<p style="margin-top: 1rem;">
|
||
L'ESPRESSObin SecuBox-DEB répond aux objectifs de performance définis pour un
|
||
appareil ARM64 contraint. Les principaux indicateurs sont dans les seuils acceptables :
|
||
</p>
|
||
<ul style="margin: 1rem 0 0 2rem;">
|
||
<li>Latence API : <strong class="status-ok">187ms P50</strong> (objectif < 500ms)</li>
|
||
<li>Mémoire utilisée : <strong class="status-ok">40%</strong> (objectif < 80%)</li>
|
||
<li>Load average : <strong class="status-ok">0.39</strong> (objectif < 2.0)</li>
|
||
<li>Espace disque : <strong class="status-ok">72%</strong> (objectif < 90%)</li>
|
||
</ul>
|
||
<p style="margin-top: 1rem; color: var(--text-muted);">
|
||
Les optimisations recommandées permettront d'améliorer la robustesse et de préparer
|
||
le déploiement de services supplémentaires (CrowdSec, WireGuard, DPI).
|
||
</p>
|
||
</div>
|
||
</section>
|
||
|
||
<footer>
|
||
<p class="logo">⬡ SECUBOX</p>
|
||
<p>CyberMind — https://cybermind.fr</p>
|
||
<p style="margin-top: 0.5rem;">
|
||
Généré le 30 avril 2026 · ESPRESSObin V7 · SecuBox-DEB Migration
|
||
</p>
|
||
</footer>
|
||
</div>
|
||
</body>
|
||
</html>
|