secubox-deb/docs/reports/performance-report-2026-04-30.html
CyberMind-FR d4387c2392 docs: Update report with Gitea fix (7.6GB → 2.1GB)
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>
2026-04-30 12:02:15 +02:00

955 lines
35 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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>&lt; 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>&lt; 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>&lt; 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>&lt; 100 ms</td></tr>
<tr><td>P99 Latence</td><td>&lt; 500 ms</td></tr>
<tr><td>RSS par service</td><td>&lt; 50 MB</td></tr>
<tr><td>Total Python RSS</td><td>&lt; 400 MB</td></tr>
<tr><td>Démarrage à froid</td><td>&lt; 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>&lt; 50 ms</td></tr>
<tr><td>P99 Latence</td><td>&lt; 200 ms</td></tr>
<tr><td>RSS par service</td><td>&lt; 100 MB</td></tr>
<tr><td>Total Python RSS</td><td>&lt; 1 GB</td></tr>
<tr><td>Démarrage à froid</td><td>&lt; 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 &lt; 500ms)</li>
<li>Mémoire utilisée : <strong class="status-ok">40%</strong> (objectif &lt; 80%)</li>
<li>Load average : <strong class="status-ok">0.39</strong> (objectif &lt; 2.0)</li>
<li>Espace disque : <strong class="status-ok">72%</strong> (objectif &lt; 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>