Files
wevia-brain/s89-arsenal-screens/wevads-architecture.html
2026-04-12 23:01:36 +02:00

1052 lines
57 KiB
HTML
Executable File
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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>WEVADS — Architecture Globale — 18 Février 2026</title>
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@300;400;500;600;700&family=Space+Grotesk:wght@400;500;600;700&family=DM+Sans:wght@300;400;500;600;700&display=swap" rel="stylesheet">
<style>
:root {
--bg: #0a0b0f;
--bg2: #12141c;
--bg3: #1a1d28;
--border: #2a2d3a;
--border-bright: #3a3d5a;
--text: #e2e4f0;
--text-dim: #8b8ea0;
--text-muted: #5a5d70;
--accent-blue: #4a9eff;
--accent-cyan: #00d4aa;
--accent-purple: #9b6dff;
--accent-orange: #ff8a4a;
--accent-red: #ff4a6a;
--accent-green: #4aff8a;
--accent-yellow: #ffd84a;
--accent-pink: #ff6ab0;
--glow-blue: rgba(74,158,255,0.15);
--glow-cyan: rgba(0,212,170,0.12);
--glow-purple: rgba(155,109,255,0.12);
}
* { margin:0; padding:0; box-sizing:border-box; }
body {
background: var(--bg);
color: var(--text);
font-family: 'DM Sans', sans-serif;
overflow-x: hidden;
min-height: 100vh;
}
/* HEADER */
.header {
padding: 32px 40px 24px;
border-bottom: 1px solid var(--border);
background: linear-gradient(180deg, rgba(74,158,255,0.04) 0%, transparent 100%);
display: flex; align-items: center; justify-content: space-between;
flex-wrap: wrap; gap: 16px;
position: sticky; top: 0; z-index: 100;
backdrop-filter: blur(20px);
}
.header-left { display: flex; align-items: center; gap: 20px; }
.logo {
font-family: 'JetBrains Mono', monospace;
font-weight: 700; font-size: 28px;
background: linear-gradient(135deg, var(--accent-blue), var(--accent-cyan));
-webkit-background-clip: text; -webkit-text-fill-color: transparent;
letter-spacing: -1px;
}
.logo-sub { font-size: 13px; color: var(--text-dim); font-weight: 400; margin-top: 2px; }
.header-meta { display: flex; gap: 24px; align-items: center; flex-wrap: wrap; }
.meta-chip {
display: flex; align-items: center; gap: 6px;
background: var(--bg3); border: 1px solid var(--border);
border-radius: 20px; padding: 6px 14px;
font-family: 'JetBrains Mono', monospace;
font-size: 11px; color: var(--text-dim);
}
.meta-chip .val { color: var(--accent-cyan); font-weight: 600; }
.meta-chip .dot { width: 6px; height: 6px; border-radius: 50%; background: var(--accent-green); animation: pulse 2s infinite; }
@keyframes pulse { 0%,100% { opacity:1; } 50% { opacity:0.3; } }
/* NAV */
.nav {
display: flex; gap: 0; border-bottom: 1px solid var(--border);
padding: 0 40px; overflow-x: auto;
background: var(--bg2);
}
.nav-btn {
padding: 12px 20px; font-size: 12px; font-weight: 600;
color: var(--text-dim); border: none; background: none; cursor: pointer;
border-bottom: 2px solid transparent; transition: all 0.2s;
white-space: nowrap; text-transform: uppercase; letter-spacing: 0.5px;
font-family: 'JetBrains Mono', monospace;
}
.nav-btn:hover { color: var(--text); background: rgba(255,255,255,0.03); }
.nav-btn.active { color: var(--accent-blue); border-bottom-color: var(--accent-blue); }
/* SECTIONS */
.content { padding: 0 40px 60px; }
.section { display: none; padding-top: 32px; }
.section.active { display: block; }
.section-title {
font-family: 'JetBrains Mono', monospace;
font-size: 20px; font-weight: 700; margin-bottom: 24px;
display: flex; align-items: center; gap: 12px;
}
.section-title .icon { font-size: 24px; }
/* CARDS */
.grid { display: grid; gap: 16px; }
.grid-2 { grid-template-columns: repeat(auto-fit, minmax(480px, 1fr)); }
.grid-3 { grid-template-columns: repeat(auto-fit, minmax(340px, 1fr)); }
.grid-4 { grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); }
.card {
background: var(--bg2);
border: 1px solid var(--border);
border-radius: 12px;
padding: 20px;
transition: all 0.25s;
}
.card:hover { border-color: var(--border-bright); transform: translateY(-1px); }
.card-header {
display: flex; align-items: center; justify-content: space-between;
margin-bottom: 14px; padding-bottom: 10px;
border-bottom: 1px solid rgba(255,255,255,0.04);
}
.card-title {
font-family: 'JetBrains Mono', monospace;
font-size: 13px; font-weight: 600;
display: flex; align-items: center; gap: 8px;
}
.badge {
display: inline-flex; align-items: center; gap: 4px;
padding: 3px 10px; border-radius: 10px;
font-family: 'JetBrains Mono', monospace;
font-size: 10px; font-weight: 600;
}
.badge-green { background: rgba(74,255,138,0.1); color: var(--accent-green); border: 1px solid rgba(74,255,138,0.2); }
.badge-blue { background: rgba(74,158,255,0.1); color: var(--accent-blue); border: 1px solid rgba(74,158,255,0.2); }
.badge-orange { background: rgba(255,138,74,0.1); color: var(--accent-orange); border: 1px solid rgba(255,138,74,0.2); }
.badge-red { background: rgba(255,74,106,0.1); color: var(--accent-red); border: 1px solid rgba(255,74,106,0.2); }
.badge-purple { background: rgba(155,109,255,0.1); color: var(--accent-purple); border: 1px solid rgba(155,109,255,0.2); }
.badge-yellow { background: rgba(255,216,74,0.1); color: var(--accent-yellow); border: 1px solid rgba(255,216,74,0.2); }
/* TABLE */
.tbl { width: 100%; border-collapse: collapse; font-size: 12px; }
.tbl th {
text-align: left; padding: 8px 10px; font-weight: 600;
color: var(--text-dim); border-bottom: 1px solid var(--border);
font-family: 'JetBrains Mono', monospace; font-size: 10px;
text-transform: uppercase; letter-spacing: 0.5px;
}
.tbl td {
padding: 7px 10px; border-bottom: 1px solid rgba(255,255,255,0.03);
font-family: 'JetBrains Mono', monospace; font-size: 11px;
color: var(--text-dim);
}
.tbl tr:hover td { background: rgba(255,255,255,0.02); color: var(--text); }
.tbl td.val { color: var(--accent-cyan); font-weight: 500; }
.tbl td.port { color: var(--accent-orange); font-weight: 600; }
.tbl td.green { color: var(--accent-green); }
.tbl td.red { color: var(--accent-red); }
.tbl td.blue { color: var(--accent-blue); }
.tbl td.purple { color: var(--accent-purple); }
/* FLOW DIAGRAM */
.flow {
display: flex; align-items: stretch; gap: 0;
overflow-x: auto; padding: 20px 0;
}
.flow-node {
min-width: 140px; padding: 14px 16px;
background: var(--bg3); border: 1px solid var(--border);
border-radius: 10px; text-align: center;
position: relative; flex-shrink: 0;
}
.flow-node .fn-label {
font-family: 'JetBrains Mono', monospace;
font-size: 10px; color: var(--text-dim); margin-bottom: 4px;
text-transform: uppercase; letter-spacing: 0.5px;
}
.flow-node .fn-title { font-size: 13px; font-weight: 600; }
.flow-node .fn-detail { font-size: 10px; color: var(--text-muted); margin-top: 4px; }
.flow-arrow {
display: flex; align-items: center; justify-content: center;
min-width: 50px; color: var(--text-muted); font-size: 18px;
flex-shrink: 0; position: relative;
}
.flow-arrow::before {
content: ''; position: absolute; width: 100%; height: 2px;
background: linear-gradient(90deg, var(--border), var(--accent-blue), var(--border));
top: 50%; opacity: 0.3;
}
.flow-arrow span { position: relative; z-index: 1; background: var(--bg); padding: 0 6px; font-size: 11px; }
/* SERVER BOX */
.server-box {
border: 2px solid var(--border);
border-radius: 16px; padding: 24px;
background: linear-gradient(135deg, var(--bg2) 0%, var(--bg3) 100%);
position: relative; margin-bottom: 20px;
}
.server-box.primary { border-color: rgba(74,158,255,0.3); box-shadow: 0 0 40px var(--glow-blue); }
.server-box.tracking { border-color: rgba(0,212,170,0.3); box-shadow: 0 0 40px var(--glow-cyan); }
.server-box.consulting { border-color: rgba(155,109,255,0.3); box-shadow: 0 0 40px var(--glow-purple); }
.server-label {
position: absolute; top: -12px; left: 20px;
background: var(--bg); padding: 2px 14px;
font-family: 'JetBrains Mono', monospace;
font-size: 11px; font-weight: 700;
border: 1px solid var(--border); border-radius: 6px;
}
.server-box.primary .server-label { color: var(--accent-blue); border-color: rgba(74,158,255,0.3); }
.server-box.tracking .server-label { color: var(--accent-cyan); border-color: rgba(0,212,170,0.3); }
.server-box.consulting .server-label { color: var(--accent-purple); border-color: rgba(155,109,255,0.3); }
/* STAT ROW */
.stat-row { display: flex; gap: 12px; flex-wrap: wrap; margin-bottom: 16px; }
.stat {
background: var(--bg); border: 1px solid var(--border);
border-radius: 8px; padding: 10px 14px; min-width: 120px;
}
.stat-label { font-size: 10px; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.5px; }
.stat-val {
font-family: 'JetBrains Mono', monospace;
font-size: 18px; font-weight: 700; margin-top: 2px;
}
.stat-val.blue { color: var(--accent-blue); }
.stat-val.cyan { color: var(--accent-cyan); }
.stat-val.green { color: var(--accent-green); }
.stat-val.orange { color: var(--accent-orange); }
.stat-val.purple { color: var(--accent-purple); }
.stat-val.red { color: var(--accent-red); }
/* SECTION SPECIFIC */
.port-group { margin-bottom: 20px; }
.port-group-title {
font-family: 'JetBrains Mono', monospace;
font-size: 12px; font-weight: 600; color: var(--accent-blue);
margin-bottom: 8px; display: flex; align-items: center; gap: 8px;
}
.port-group-title::after {
content: ''; flex: 1; height: 1px;
background: linear-gradient(90deg, var(--border), transparent);
}
.cron-list { display: flex; flex-direction: column; gap: 4px; }
.cron-item {
display: flex; align-items: center; gap: 10px;
padding: 6px 10px; border-radius: 6px;
font-family: 'JetBrains Mono', monospace; font-size: 11px;
background: rgba(255,255,255,0.01);
}
.cron-item:hover { background: rgba(255,255,255,0.03); }
.cron-freq { color: var(--accent-orange); min-width: 70px; font-weight: 500; }
.cron-cmd { color: var(--text-dim); flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cron-cat { color: var(--accent-purple); min-width: 80px; text-align: right; font-size: 10px; }
@media (max-width: 768px) {
.header, .content { padding-left: 16px; padding-right: 16px; }
.nav { padding: 0 16px; }
.grid-2, .grid-3, .grid-4 { grid-template-columns: 1fr; }
.flow { flex-direction: column; align-items: center; }
.flow-arrow { transform: rotate(90deg); min-height: 40px; min-width: auto; }
}
</style>
</head>
<body>
<!-- HEADER -->
<div class="header">
<div class="header-left">
<div>
<div class="logo">WEVADS</div>
<div class="logo-sub">Architecture Globale — WEVAL Consulting</div>
</div>
</div>
<div class="header-meta">
<div class="meta-chip"><span class="dot" id="live-dot"></span> <span>LIVE</span> <span class="val live-val" id="live-ts">--:--</span></div>
<div class="meta-chip">Date <span class="val">18 Fév 2026</span></div>
<div class="meta-chip">Serveurs <span class="val">3</span></div>
<div class="meta-chip">Ports <span class="val">22</span></div>
<div class="meta-chip">DBs <span class="val">6</span></div>
<div class="meta-chip">APIs <span class="val">653</span></div>
<div class="meta-chip">Crons <span class="val">42</span></div>
</div>
</div>
<!-- NAV -->
<div class="nav">
<button class="nav-btn active" onclick="showTab('overview')">🏗️ Vue Globale</button>
<button class="nav-btn" onclick="showTab('servers')">🖥️ Serveurs</button>
<button class="nav-btn" onclick="showTab('ports')">🔌 Ports & Services</button>
<button class="nav-btn" onclick="showTab('databases')">🗄️ Bases de Données</button>
<button class="nav-btn" onclick="showTab('apis')">⚡ APIs</button>
<button class="nav-btn" onclick="showTab('flux')">🔄 Flux E2E</button>
<button class="nav-btn" onclick="showTab('crons')">⏰ Crons</button>
<button class="nav-btn" onclick="showTab('external')">🌐 Services Externes</button>
<button class="nav-btn" onclick="showTab('kpis')">📊 KPIs</button>
</div>
<div class="content">
<!-- ================================ VUE GLOBALE ================================ -->
<div class="section active" id="overview">
<div class="section-title"><span class="icon">🏗️</span> Architecture Globale — 3 Serveurs, 22 Ports, 6 DBs</div>
<!-- PRIMARY SERVER -->
<div class="server-box primary">
<div class="server-label">🟦 HETZNER PRIMARY — 89.167.40.150</div>
<div class="stat-row" style="margin-top:12px;">
<div class="stat"><div class="stat-label">Apache Ports</div><div class="stat-val blue">14</div></div>
<div class="stat"><div class="stat-label">APIs</div><div class="stat-val cyan">653</div></div>
<div class="stat"><div class="stat-label">HTML Pages</div><div class="stat-val green">149</div></div>
<div class="stat"><div class="stat-label">PostgreSQL DBs</div><div class="stat-val orange">6</div></div>
<div class="stat"><div class="stat-label">Tables (admin)</div><div class="stat-val purple">625</div></div>
<div class="stat"><div class="stat-label">Crons</div><div class="stat-val blue">42</div></div>
</div>
<div class="grid grid-4" style="margin-top:12px;">
<div class="card" style="border-left:3px solid var(--accent-blue);">
<div class="card-title">WEVADS Core <span class="badge badge-blue">:5821</span></div>
<div style="font-size:11px;color:var(--text-dim);margin-top:6px;">326 APIs PHP<br>App principale, Brain, Pipeline</div>
</div>
<div class="card" style="border-left:3px solid var(--accent-purple);">
<div class="card-title">Arsenal <span class="badge badge-purple">:5890</span></div>
<div style="font-size:11px;color:var(--text-dim);margin-top:6px;">327 APIs PHP<br>149 pages HTML, UI complète</div>
</div>
<div class="card" style="border-left:3px solid var(--accent-cyan);">
<div class="card-title">WEVAL IA <span class="badge badge-green">:8080/:8443</span></div>
<div style="font-size:11px;color:var(--text-dim);margin-top:6px;">12 providers IA, 3 LIVE<br>Cerebras/Groq/SambaNova</div>
</div>
<div class="card" style="border-left:3px solid var(--accent-orange);">
<div class="card-title">PowerMTA <span class="badge badge-orange">:25</span></div>
<div style="font-size:11px;color:var(--text-dim);margin-top:6px;">127.0.0.1 local<br>Email delivery engine</div>
</div>
<div class="card" style="border-left:3px solid var(--accent-green);">
<div class="card-title">PostgreSQL <span class="badge badge-green">:5432</span></div>
<div style="font-size:11px;color:var(--text-dim);margin-top:6px;">6 databases<br>adx_system (625 tables admin)</div>
</div>
<div class="card" style="border-left:3px solid var(--accent-yellow);">
<div class="card-title">N8N <span class="badge badge-yellow">:5678</span></div>
<div style="font-size:11px;color:var(--text-dim);margin-top:6px;">Workflow automation<br>0 workflows actifs</div>
</div>
<div class="card" style="border-left:3px solid var(--accent-red);">
<div class="card-title">Redis <span class="badge badge-red">:6379</span></div>
<div style="font-size:11px;color:var(--text-dim);margin-top:6px;">Cache / Queue<br>Local only</div>
</div>
<div class="card" style="border-left:3px solid var(--text-muted);">
<div class="card-title">SSH <span class="badge badge-orange">:49222</span></div>
<div style="font-size:11px;color:var(--text-dim);margin-top:6px;">Custom port SSH<br>Blocked par Hetzner FW</div>
</div>
</div>
</div>
<!-- OVH TRACKING -->
<div class="server-box tracking">
<div class="server-label">🟩 OVH TRACKING — 151.80.235.110</div>
<div class="stat-row" style="margin-top:12px;">
<div class="stat"><div class="stat-label">Domaine</div><div class="stat-val cyan">culturellemejean.charity</div></div>
<div class="stat"><div class="stat-label">Status</div><div class="stat-val green">HTTP 200</div></div>
<div class="stat"><div class="stat-label">Rôle</div><div class="stat-val orange">Tracking</div></div>
</div>
<div style="font-size:12px;color:var(--text-dim);line-height:1.7;">
<strong style="color:var(--accent-cyan)">track.php</strong> — Collecte opens/clicks depuis les emails<br>
<strong style="color:var(--accent-cyan)">click.php</strong> — Redirection click avec tracking sub1/sub2/sub3<br>
<strong style="color:var(--accent-cyan)">open.php</strong> — Pixel tracking ouvertures<br>
<strong style="color:var(--accent-cyan)">conversion.php</strong> — Postback endpoint affiliés
</div>
</div>
<!-- CONSULTING -->
<div class="server-box consulting">
<div class="server-label">🟪 CONSULTING — 46.62.220.135</div>
<div class="stat-row" style="margin-top:12px;">
<div class="stat"><div class="stat-label">Domaine</div><div class="stat-val purple">weval-consulting.com</div></div>
<div class="stat"><div class="stat-label">Stack</div><div class="stat-val blue">React/Vite/Docker</div></div>
<div class="stat"><div class="stat-label">Chatbot</div><div class="stat-val green">WEVAL IA</div></div>
</div>
<div style="font-size:12px;color:var(--text-dim);line-height:1.7;">
<strong style="color:var(--accent-purple)">/solutions</strong> — WEVADS, WEVAL IA, Arsenal (SaaS)<br>
<strong style="color:var(--accent-purple)">/marketplace</strong> — Catalogue produits + chatbot IA<br>
<strong style="color:var(--accent-purple)">/contact-us</strong> — Formulaire de contact
</div>
</div>
</div>
<!-- ================================ SERVEURS ================================ -->
<div class="section" id="servers">
<div class="section-title"><span class="icon">🖥️</span> Inventaire Serveurs</div>
<div class="grid grid-3">
<div class="card">
<div class="card-header">
<div class="card-title">🟦 Hetzner Primary</div>
<span class="badge badge-green">● LIVE</span>
</div>
<table class="tbl">
<tr><td>IP</td><td class="val">89.167.40.150</td></tr>
<tr><td>SSH</td><td class="port">49222</td></tr>
<tr><td>Credentials</td><td>root / fHH4v7etkX74</td></tr>
<tr><td>OS</td><td>Ubuntu 24</td></tr>
<tr><td>rDNS</td><td class="val">mail.wevup.app</td></tr>
<tr><td>Hostname</td><td>pmta.wevads.local</td></tr>
<tr><td>Services</td><td>Apache, PostgreSQL, PMTA, N8N, Redis, Ollama, Squid, xRDP</td></tr>
<tr><td>Apache Ports</td><td class="port">80, 5821-5825, 5888, 5890, 5899, 8080, 8443, 58421-58423</td></tr>
<tr><td>Domaines</td><td>wevup.app, culturellemejean.charity</td></tr>
<tr><td>Blacklists</td><td class="red">⚠ Spamhaus CSS (delist pending)</td></tr>
</table>
</div>
<div class="card">
<div class="card-header">
<div class="card-title">🟩 OVH Tracking</div>
<span class="badge badge-green">● LIVE</span>
</div>
<table class="tbl">
<tr><td>IP</td><td class="val">151.80.235.110</td></tr>
<tr><td>SSH</td><td class="port">22</td></tr>
<tr><td>Credentials</td><td>ubuntu / MX8D3zSAty7k3243242</td></tr>
<tr><td>Rôle</td><td>Tracking opens/clicks/conversions</td></tr>
<tr><td>Domaine</td><td class="val">culturellemejean.charity</td></tr>
<tr><td>SSL</td><td class="green">✅ HTTPS actif</td></tr>
<tr><td>Scripts</td><td>track.php, click.php, open.php, conversion.php</td></tr>
</table>
</div>
<div class="card">
<div class="card-header">
<div class="card-title">🟪 Consulting Site</div>
<span class="badge badge-green">● LIVE</span>
</div>
<table class="tbl">
<tr><td>IP</td><td class="val">46.62.220.135</td></tr>
<tr><td>Credentials</td><td>root / vr3xjMvwMtWW</td></tr>
<tr><td>Stack</td><td>React + Vite + Docker + Nginx</td></tr>
<tr><td>Domaine</td><td class="val">weval-consulting.com</td></tr>
<tr><td>Container</td><td>weval-frontend</td></tr>
<tr><td>Chatbot</td><td class="green">WEVAL IA intégré</td></tr>
<tr><td>Pages</td><td>/solutions, /marketplace, /contact-us</td></tr>
</table>
</div>
</div>
</div>
<!-- ================================ PORTS ================================ -->
<div class="section" id="ports">
<div class="section-title"><span class="icon">🔌</span> Tous les Ports & Services — 89.167.40.150</div>
<div class="port-group">
<div class="port-group-title">🌐 APACHE VHOSTS (14 ports)</div>
<table class="tbl">
<tr><th>Port</th><th>VHost</th><th>Périmètre</th><th>Contenu</th></tr>
<tr><td class="port">:80</td><td>default + tracking + weval-consulting + weval-simple</td><td>Multi</td><td>Reverse proxy, Sentinel API, tracking local</td></tr>
<tr><td class="port">:5821</td><td>wevads.local</td><td class="blue">WEVADS Core</td><td>326 APIs PHP — Brain, Pipeline, Send, Bounce, Offers</td></tr>
<tr><td class="port">:5822</td><td>fmgapp.local</td><td>FMG App</td><td>Application FMG</td></tr>
<tr><td class="port">:5823</td><td>bcgapp.local</td><td>BCG App</td><td>Application BCG</td></tr>
<tr><td class="port">:5824</td><td>dkim.local</td><td>DKIM</td><td>DKIM key management</td></tr>
<tr><td class="port">:5825</td><td>n8n.local</td><td>N8N Proxy</td><td>Apache proxy → N8N :5678</td></tr>
<tr><td class="port">:5888</td><td></td><td>Réservé</td><td>Apache vhost actif</td></tr>
<tr><td class="port">:5890</td><td>wevads-arsenal</td><td class="purple">Arsenal UI</td><td>327 APIs + 149 pages HTML — Interface complète</td></tr>
<tr><td class="port">:5899</td><td>bridge</td><td>Data Bridge</td><td>Bridge adx_system ↔ adx_clients (dblink)</td></tr>
<tr><td class="port">:8080</td><td>hamid.local</td><td class="green">WEVAL IA HTTP</td><td>Interface IA, 12 providers</td></tr>
<tr><td class="port">:8443</td><td>hamid.local SSL</td><td class="green">WEVAL IA HTTPS</td><td>IA SSL endpoint</td></tr>
<tr><td class="port">:58421</td><td>wevads-tracking</td><td>Tracking WEVADS</td><td>Open/Click tracking local</td></tr>
<tr><td class="port">:58422</td><td>fmgapp-tracking</td><td>Tracking FMG</td><td>FMG tracking</td></tr>
<tr><td class="port">:58423</td><td>bcgapp-tracking</td><td>Tracking BCG</td><td>BCG tracking</td></tr>
</table>
</div>
<div class="port-group">
<div class="port-group-title">⚙️ SERVICES SYSTÈME (8 ports)</div>
<table class="tbl">
<tr><th>Port</th><th>Service</th><th>Bind</th><th>Détails</th></tr>
<tr><td class="port">:25</td><td>PowerMTA (pmtad)</td><td>127.0.0.1</td><td>SMTP delivery engine — local only</td></tr>
<tr><td class="port">:2525</td><td>Postfix (smtpd)</td><td>::1</td><td>Postfix submission port</td></tr>
<tr><td class="port">:2526</td><td>Postfix (smtpd)</td><td>::1</td><td>Postfix secondary</td></tr>
<tr><td class="port">:3128</td><td>Squid Proxy</td><td>0.0.0.0</td><td>HTTP proxy cache</td></tr>
<tr><td class="port">:3142</td><td>apt-cacher-ng</td><td>0.0.0.0</td><td>APT package cache</td></tr>
<tr><td class="port">:3389</td><td>xRDP</td><td>0.0.0.0</td><td>Remote Desktop</td></tr>
<tr><td class="port">:5432</td><td>PostgreSQL 13</td><td>0.0.0.0</td><td>6 databases, admin/admin123</td></tr>
<tr><td class="port">:5678</td><td>N8N (Node.js)</td><td>0.0.0.0</td><td>Workflow automation, 0 workflows actifs</td></tr>
<tr><td class="port">:5679</td><td>N8N internal</td><td>127.0.0.1</td><td>N8N worker port</td></tr>
<tr><td class="port">:6379</td><td>Redis</td><td>127.0.0.1</td><td>Cache / Queue</td></tr>
<tr><td class="port">:11434</td><td>Ollama</td><td>127.0.0.1</td><td>LLM local inference</td></tr>
<tr><td class="port">:49222</td><td>OpenSSH</td><td>0.0.0.0</td><td>Custom SSH port (FW blocked by Hetzner)</td></tr>
</table>
</div>
</div>
<!-- ================================ DATABASES ================================ -->
<div class="section" id="databases">
<div class="section-title"><span class="icon">🗄️</span> Bases de Données PostgreSQL</div>
<div class="grid grid-2">
<div class="card" style="border-left:3px solid var(--accent-blue);">
<div class="card-header">
<div class="card-title">adx_system <span class="badge badge-blue">PRINCIPALE</span></div>
<span class="badge badge-green">636 tables</span>
</div>
<table class="tbl">
<tr><th>Schema</th><th>Tables</th><th>Contenu clé</th></tr>
<tr><td class="val">admin</td><td class="val">625</td><td>Core: office_accounts, campaigns, offers, brain_*, warmup, tracking, IA providers</td></tr>
<tr><td class="val">mta</td><td>4</td><td>ip_rotation, ip_reputation, MTA configs</td></tr>
<tr><td class="val">public</td><td>7</td><td>Tables système</td></tr>
<tr><td class="val">production</td><td></td><td>Production pipeline</td></tr>
<tr><td class="val">affiliate</td><td></td><td>CX3 Ads + Double M</td></tr>
<tr><td class="val">lists</td><td></td><td>Contact lists management</td></tr>
<tr><td class="val">actions</td><td></td><td>Action tracking</td></tr>
</table>
<div style="margin-top:12px;font-size:11px;color:var(--text-dim);">
<strong style="color:var(--accent-cyan);">Tables clés :</strong>
office_accounts (1,363) · warmup_accounts (2,036) · seed_accounts (1,275) · brain_seeds (51,454) · brain_send_configs (612) · brain_configs (366) · offers (116) · campaigns (40) · unified_send_log_new (11,944) · email_send_accounts (2,077) · personas (178) · hamid_providers (12) · ia_provider_accounts (41) · offer_creatives (1,285) · affiliate_offers (691) · click_tracking (674) · open_tracking (4,590)
</div>
</div>
<div class="card" style="border-left:3px solid var(--accent-cyan);">
<div class="card-header">
<div class="card-title">adx_clients <span class="badge badge-cyan" style="background:rgba(0,212,170,0.1);color:var(--accent-cyan);border:1px solid rgba(0,212,170,0.2);">CONTACTS</span></div>
<span class="badge badge-green">~125 tables</span>
</div>
<table class="tbl">
<tr><th>Schema</th><th>Tables</th><th>ISP</th></tr>
<tr><td class="val">gmail</td><td>40</td><td>Gmail contacts</td></tr>
<tr><td class="val">hotmail</td><td>10</td><td>Hotmail/Outlook contacts</td></tr>
<tr><td class="val">gmx</td><td>7</td><td>GMX contacts</td></tr>
<tr><td class="val">yahoo</td><td>1</td><td>Yahoo contacts</td></tr>
<tr><td class="val">webde</td><td>1</td><td>Web.de contacts</td></tr>
<tr><td class="val">tonline</td><td>1</td><td>T-Online contacts</td></tr>
<tr><td class="val">videotron</td><td>1</td><td>Videotron contacts</td></tr>
<tr><td class="val">specials</td><td>1</td><td>Special ISPs</td></tr>
<tr><td class="val">suppressions</td><td>62</td><td>Suppression lists</td></tr>
</table>
<div style="margin-top:10px;font-size:11px;color:var(--text-dim);">
Accessible via <strong style="color:var(--accent-orange);">dblink bridge</strong> (:5899) — fonctions admin.total_clients(), admin.count_clients()
</div>
</div>
<div class="card">
<div class="card-header"><div class="card-title">wevads</div><span class="badge badge-blue">43 tables</span></div>
<div style="font-size:11px;color:var(--text-dim);">Application WEVADS legacy data</div>
</div>
<div class="card">
<div class="card-header"><div class="card-title">wevads_accounts</div><span class="badge badge-blue">6 tables</span></div>
<div style="font-size:11px;color:var(--text-dim);">Gestion comptes (O365, GSuite)</div>
</div>
<div class="card">
<div class="card-header"><div class="card-title">wevads_arsenal</div><span class="badge badge-purple">7 tables</span></div>
<div style="font-size:11px;color:var(--text-dim);">Arsenal UI configuration</div>
</div>
<div class="card">
<div class="card-header"><div class="card-title">wevads_advanced</div><span class="badge badge-orange">4 tables</span></div>
<div style="font-size:11px;color:var(--text-dim);">Advanced features / experimental</div>
</div>
</div>
</div>
<!-- ================================ APIS ================================ -->
<div class="section" id="apis">
<div class="section-title"><span class="icon"></span> APIs — 653 endpoints PHP</div>
<div class="grid grid-2">
<div class="card" style="border-left:3px solid var(--accent-blue);">
<div class="card-header">
<div class="card-title">🔵 WEVADS Core :5821</div>
<span class="badge badge-blue">326 APIs</span>
</div>
<table class="tbl">
<tr><th>Catégorie</th><th>APIs</th><th>Exemples</th></tr>
<tr><td>🧠 Brain</td><td class="val">~20</td><td>brain-connector, brain-creative-engine, brain-optimizer</td></tr>
<tr><td>📧 Send</td><td class="val">~15</td><td>adx-send-bridge, send-factory, send-orchestrator</td></tr>
<tr><td>📊 Tracking</td><td class="val">~10</td><td>click.php, open.php, conversion.php, bounce-processor</td></tr>
<tr><td>🤖 IA</td><td class="val">~12</td><td>ai-bridge, ai-copywriter, ai-discovery, ai-failsafe, ai-rotation</td></tr>
<tr><td>👤 Accounts</td><td class="val">~10</td><td>account-creator, account-factory, auth-wizard</td></tr>
<tr><td>💰 Affiliate</td><td class="val">~8</td><td>affiliate-monitor, offer-engine, conversions-collector</td></tr>
<tr><td>🛡️ Security</td><td class="val">~10</td><td>blacklist, reputation, sentinel-brain, vault-guard</td></tr>
<tr><td>🔧 Infra</td><td class="val">~15</td><td>api-gateway, arsenal-health, auto-surgeon, pipeline-feeder</td></tr>
<tr><td>📈 Analytics</td><td class="val">~10</td><td>analytics, data-manager, data-drill, world-map</td></tr>
<tr><td>🔄 Autres</td><td class="val">~216</td><td>captcha, dns, sms, scraping, harvest, fingerprint...</td></tr>
</table>
</div>
<div class="card" style="border-left:3px solid var(--accent-purple);">
<div class="card-header">
<div class="card-title">🟣 Arsenal :5890</div>
<span class="badge badge-purple">327 APIs</span>
</div>
<table class="tbl">
<tr><th>Catégorie</th><th>APIs</th><th>Exemples</th></tr>
<tr><td>📧 Warmup</td><td class="val">~5</td><td>warmup-engine (execute, advance_day)</td></tr>
<tr><td>💰 Offers</td><td class="val">~5</td><td>offer-engine (import_cx3), affiliate-hamid-check</td></tr>
<tr><td>🔒 Vault</td><td class="val">~3</td><td>vault-guard (cron, scan, restore)</td></tr>
<tr><td>👤 Factory</td><td class="val">~8</td><td>account-factory-ia, account-creator, ia-provider-factory</td></tr>
<tr><td>🔄 Mirror</td><td class="val">~306</td><td>Symlinks/copies des APIs 5821 pour UI Arsenal</td></tr>
</table>
<div style="margin-top:10px;font-size:11px;color:var(--text-dim);">
<strong style="color:var(--accent-purple);">149 pages HTML</strong> — Dashboard complet Arsenal avec sidebar menu, drill-down, stats dynamiques
</div>
</div>
</div>
<div class="card" style="margin-top:16px;border-left:3px solid var(--accent-green);">
<div class="card-header">
<div class="card-title">🟢 API Sentinel — :80 (sentinel-brain.php)</div>
<span class="badge badge-green">EXEC API</span>
</div>
<div style="font-size:12px;color:var(--text-dim);line-height:1.8;">
<code style="color:var(--accent-orange);">POST /api/sentinel-brain.php</code> — action=exec, cmd=... → Remote command execution<br>
Utilisé par Claude sessions pour déployer/patcher. Tourne en www-data avec sudo passwordless.
</div>
</div>
</div>
<!-- ================================ FLUX E2E ================================ -->
<div class="section" id="flux">
<div class="section-title"><span class="icon">🔄</span> Flux End-to-End</div>
<!-- SEND PIPELINE -->
<div class="card" style="margin-bottom:20px;">
<div class="card-header">
<div class="card-title">📧 Pipeline Email — Send → Open → Click → Conversion → Revenue</div>
<span class="badge badge-green">● ACTIF</span>
</div>
<div class="flow">
<div class="flow-node" style="border-color:var(--accent-blue);">
<div class="fn-label">Contacts</div>
<div class="fn-title" style="color:var(--accent-blue);">2.99M</div>
<div class="fn-detail">adx_clients (dblink)</div>
</div>
<div class="flow-arrow"><span></span></div>
<div class="flow-node" style="border-color:var(--accent-purple);">
<div class="fn-label">Brain</div>
<div class="fn-title" style="color:var(--accent-purple);">brain-productive</div>
<div class="fn-detail">366 configs, 9 winners</div>
</div>
<div class="flow-arrow"><span></span></div>
<div class="flow-node" style="border-color:var(--accent-orange);">
<div class="fn-label">Send</div>
<div class="fn-title" style="color:var(--accent-orange);">Graph API</div>
<div class="fn-detail">150 senders, 9 tenants O365</div>
</div>
<div class="flow-arrow"><span></span></div>
<div class="flow-node" style="border-color:var(--accent-cyan);">
<div class="fn-label">Track</div>
<div class="fn-title" style="color:var(--accent-cyan);">OVH 151.80.*</div>
<div class="fn-detail">open.php + click.php</div>
</div>
<div class="flow-arrow"><span></span></div>
<div class="flow-node" style="border-color:var(--accent-green);">
<div class="fn-label">Affiliate</div>
<div class="fn-title" style="color:var(--accent-green);">CX3 / DoubleM</div>
<div class="fn-detail">85 offres, $27 moy</div>
</div>
<div class="flow-arrow"><span></span></div>
<div class="flow-node" style="border-color:var(--accent-yellow);">
<div class="fn-label">Pull</div>
<div class="fn-title" style="color:var(--accent-yellow);">CAKE/Everflow</div>
<div class="fn-detail">conversions-collector</div>
</div>
<div class="flow-arrow"><span></span></div>
<div class="flow-node" style="border-color:var(--accent-red);">
<div class="fn-label">Revenue</div>
<div class="fn-title" style="color:var(--accent-red);">$0 (J+0)</div>
<div class="fn-detail">En attente J+2/J+3</div>
</div>
</div>
</div>
<!-- SEND METHODS -->
<div class="card" style="margin-bottom:20px;">
<div class="card-header">
<div class="card-title">📨 Méthodes d'Envoi (3 canaux)</div>
</div>
<div class="grid grid-3" style="margin-top:8px;">
<div style="padding:12px;background:var(--bg);border-radius:8px;border:1px solid rgba(74,158,255,0.2);">
<div style="font-size:11px;color:var(--accent-blue);font-weight:600;font-family:'JetBrains Mono',monospace;">1⃣ GRAPH API (O365)</div>
<div style="font-size:11px;color:var(--text-dim);margin-top:6px;line-height:1.6;">
brain-productive.php → Microsoft Graph API<br>
150 senders × 9 tenants actifs<br>
~3,600 emails/jour<br>
<span style="color:var(--accent-green);">✅ Bypass Spamhaus (via Microsoft)</span>
</div>
</div>
<div style="padding:12px;background:var(--bg);border-radius:8px;border:1px solid rgba(255,138,74,0.2);">
<div style="font-size:11px;color:var(--accent-orange);font-weight:600;font-family:'JetBrains Mono',monospace;">2⃣ PMTA (Direct MX)</div>
<div style="font-size:11px;color:var(--text-dim);margin-top:6px;line-height:1.6;">
send_batch.sh → PowerMTA → MX direct<br>
Batch 200 emails<br>
~4,200 emails/jour<br>
<span style="color:var(--accent-red);">⚠ Bloqué Spamhaus CSS (delist pending)</span>
</div>
</div>
<div style="padding:12px;background:var(--bg);border-radius:8px;border:1px solid rgba(0,212,170,0.2);">
<div style="font-size:11px;color:var(--accent-cyan);font-weight:600;font-family:'JetBrains Mono',monospace;">3⃣ WARMUP ENGINE</div>
<div style="font-size:11px;color:var(--text-dim);margin-top:6px;line-height:1.6;">
warmup-engine.php → O365 Graph<br>
2,036 comptes en warming<br>
Cap: 77,170/jour<br>
<span style="color:var(--accent-yellow);">⏳ Montée progressive</span>
</div>
</div>
</div>
</div>
<!-- TRACKING FLOW -->
<div class="card" style="margin-bottom:20px;">
<div class="card-header">
<div class="card-title">📊 Flux Tracking & Conversion</div>
</div>
<div class="flow">
<div class="flow-node" style="border-color:var(--accent-orange);">
<div class="fn-label">Email envoyé</div>
<div class="fn-title" style="color:var(--accent-orange);">ADX Tag</div>
<div class="fn-detail">adx_168_56_186_0 + sub1/2/3</div>
</div>
<div class="flow-arrow"><span>pixel</span></div>
<div class="flow-node" style="border-color:var(--accent-cyan);">
<div class="fn-label">Open</div>
<div class="fn-title" style="color:var(--accent-cyan);">open.php</div>
<div class="fn-detail">151.80.235.110</div>
</div>
<div class="flow-arrow"><span>click</span></div>
<div class="flow-node" style="border-color:var(--accent-blue);">
<div class="fn-label">Click</div>
<div class="fn-title" style="color:var(--accent-blue);">click.php</div>
<div class="fn-detail">→ e36lbat.com (CX3)</div>
</div>
<div class="flow-arrow"><span>redir</span></div>
<div class="flow-node" style="border-color:var(--accent-green);">
<div class="fn-label">Landing</div>
<div class="fn-title" style="color:var(--accent-green);">Offer Page</div>
<div class="fn-detail">CX3: ?offer_id=X&aff_id=10805</div>
</div>
<div class="flow-arrow"><span>conv</span></div>
<div class="flow-node" style="border-color:var(--accent-yellow);">
<div class="fn-label">Pull */30</div>
<div class="fn-title" style="color:var(--accent-yellow);">CAKE API v2</div>
<div class="fn-detail">conversions-collector.php</div>
</div>
<div class="flow-arrow"><span>$$$</span></div>
<div class="flow-node" style="border-color:var(--accent-red);">
<div class="fn-label">Revenue</div>
<div class="fn-title" style="color:var(--accent-red);">revenue_tracker</div>
<div class="fn-detail">Dashboard Arsenal</div>
</div>
</div>
</div>
<!-- BRAIN CYCLE -->
<div class="card">
<div class="card-header">
<div class="card-title">🧠 Brain Cycle — Auto-optimisation</div>
</div>
<div class="flow">
<div class="flow-node">
<div class="fn-label">Configs</div>
<div class="fn-title">366 configs</div>
<div class="fn-detail">brain_configs</div>
</div>
<div class="flow-arrow"><span>test</span></div>
<div class="flow-node">
<div class="fn-label">Send</div>
<div class="fn-title">612 send_configs</div>
<div class="fn-detail">brain_send_configs</div>
</div>
<div class="flow-arrow"><span>track</span></div>
<div class="flow-node">
<div class="fn-label">Score</div>
<div class="fn-title">inbox_rate</div>
<div class="fn-detail">open/click/bounce</div>
</div>
<div class="flow-arrow"><span>select</span></div>
<div class="flow-node" style="border-color:var(--accent-green);">
<div class="fn-label">Winners</div>
<div class="fn-title" style="color:var(--accent-green);">9 winners</div>
<div class="fn-detail">Top configs → production</div>
</div>
<div class="flow-arrow"><span>loop</span></div>
<div class="flow-node">
<div class="fn-label">Mutate</div>
<div class="fn-title">brain-auto-cycle</div>
<div class="fn-detail">Nouvelles combinaisons</div>
</div>
</div>
</div>
</div>
<!-- ================================ CRONS ================================ -->
<div class="section" id="crons">
<div class="section-title"><span class="icon"></span> 42 Crons Actifs</div>
<div class="grid grid-2">
<div class="card">
<div class="card-header"><div class="card-title">🔁 Haute Fréquence (*/5 — */15)</div></div>
<div class="cron-list">
<div class="cron-item"><span class="cron-freq">*/10min</span><span class="cron-cmd">brain-connector.php sync_brain</span><span class="cron-cat">🧠 Brain</span></div>
<div class="cron-item"><span class="cron-freq">*/10min</span><span class="cron-cmd">html-guardian.sh (alerte only)</span><span class="cron-cat">🛡️ Guard</span></div>
<div class="cron-item"><span class="cron-freq">*/15min</span><span class="cron-cmd">bounce-processor.php?action=process</span><span class="cron-cat">📧 Bounce</span></div>
<div class="cron-item"><span class="cron-freq">*/15min</span><span class="cron-cmd">brain-connector sync_tracking</span><span class="cron-cat">📊 Track</span></div>
<div class="cron-item"><span class="cron-freq">*/15min</span><span class="cron-cmd">warmup-engine execute_warmup batch=20</span><span class="cron-cat">🔥 Warmup</span></div>
<div class="cron-item"><span class="cron-freq">*/15min</span><span class="cron-cmd">send_batch.sh 30 (PMTA)</span><span class="cron-cat">📧 Send</span></div>
<div class="cron-item"><span class="cron-freq">*/15min</span><span class="cron-cmd">IA rate_limited → active cooldown reset</span><span class="cron-cat">🤖 IA</span></div>
<div class="cron-item"><span class="cron-freq">*/15min</span><span class="cron-cmd">process-video-queue.php (YouTube)</span><span class="cron-cat">📹 YT</span></div>
</div>
</div>
<div class="card">
<div class="card-header"><div class="card-title">⏱️ Moyenne Fréquence (*/30 — */4h)</div></div>
<div class="cron-list">
<div class="cron-item"><span class="cron-freq">*/30min</span><span class="cron-cmd">brain-auto-cycle.sh</span><span class="cron-cat">🧠 Brain</span></div>
<div class="cron-item"><span class="cron-freq">*/30min</span><span class="cron-cmd">mind-autonomous.sh</span><span class="cron-cat">🧠 Mind</span></div>
<div class="cron-item"><span class="cron-freq">*/30min</span><span class="cron-cmd">sentinel-autorepair.sh</span><span class="cron-cat">🛡️ Sentinel</span></div>
<div class="cron-item"><span class="cron-freq">*/30min</span><span class="cron-cmd">pipeline-feeder.php bounce</span><span class="cron-cat">📧 Bounce</span></div>
<div class="cron-item"><span class="cron-freq">1h</span><span class="cron-cmd">blacklist-cron.sh</span><span class="cron-cat">🛡️ BL</span></div>
<div class="cron-item"><span class="cron-freq">1h</span><span class="cron-cmd">affiliate-hamid-check + monitor</span><span class="cron-cat">💰 Aff</span></div>
<div class="cron-item"><span class="cron-freq">1h</span><span class="cron-cmd">creative-performance-engine.py</span><span class="cron-cat">📈 Perf</span></div>
<div class="cron-item"><span class="cron-freq">1h</span><span class="cron-cmd">ads-commander monitor-roas-shift</span><span class="cron-cat">📈 Ads</span></div>
<div class="cron-item"><span class="cron-freq">2h</span><span class="cron-cmd">reputation-cron.sh</span><span class="cron-cat">🛡️ Rep</span></div>
<div class="cron-item"><span class="cron-freq">2h</span><span class="cron-cmd">pipeline-feeder healing</span><span class="cron-cat">🔧 Heal</span></div>
<div class="cron-item"><span class="cron-freq">3h</span><span class="cron-cmd">pipeline-feeder crm_sync</span><span class="cron-cat">👤 CRM</span></div>
<div class="cron-item"><span class="cron-freq">4h</span><span class="cron-cmd">brain-optimizer-cron.sh</span><span class="cron-cat">🧠 Opt</span></div>
<div class="cron-item"><span class="cron-freq">4h</span><span class="cron-cmd">brain-connector sync_send_data</span><span class="cron-cat">📊 Data</span></div>
<div class="cron-item"><span class="cron-freq">4h</span><span class="cron-cmd">pipeline-feeder n8n_health + offers</span><span class="cron-cat">🔧 Health</span></div>
</div>
</div>
<div class="card">
<div class="card-header"><div class="card-title">📅 Basse Fréquence (6h — Quotidien)</div></div>
<div class="cron-list">
<div class="cron-item"><span class="cron-freq">6h</span><span class="cron-cmd">vault-guard cron</span><span class="cron-cat">🔒 Vault</span></div>
<div class="cron-item"><span class="cron-freq">6h</span><span class="cron-cmd">brain-creative-engine full_cycle</span><span class="cron-cat">🎨 Creative</span></div>
<div class="cron-item"><span class="cron-freq">6h</span><span class="cron-cmd">pipeline-feeder dns + scraping + supply</span><span class="cron-cat">🔧 Feed</span></div>
<div class="cron-item"><span class="cron-freq">3j</span><span class="cron-cmd">offer-refresh-cron.sh</span><span class="cron-cat">💰 Offers</span></div>
<div class="cron-item"><span class="cron-freq">00:00</span><span class="cron-cmd">warmup sent_today=0 reset</span><span class="cron-cat">🔥 Reset</span></div>
<div class="cron-item"><span class="cron-freq">00:00</span><span class="cron-cmd">warmup-engine advance_day</span><span class="cron-cat">🔥 Warmup</span></div>
<div class="cron-item"><span class="cron-freq">00:00</span><span class="cron-cmd">ia-provider-factory rotate</span><span class="cron-cat">🤖 IA</span></div>
<div class="cron-item"><span class="cron-freq">02:00</span><span class="cron-cmd">mega-guardian.sh (alerte only)</span><span class="cron-cat">🛡️ Guard</span></div>
<div class="cron-item"><span class="cron-freq">03:00</span><span class="cron-cmd">wevads-daily-backup.sh</span><span class="cron-cat">💾 Backup</span></div>
<div class="cron-item"><span class="cron-freq">03:00</span><span class="cron-cmd">sync-custom-audiences.php</span><span class="cron-cat">📈 Ads</span></div>
<div class="cron-item"><span class="cron-freq">08:00</span><span class="cron-cmd">daily-trend-scraper.php (YouTube)</span><span class="cron-cat">📹 YT</span></div>
<div class="cron-item"><span class="cron-freq">23:55</span><span class="cron-cmd">pipeline-feeder analytics</span><span class="cron-cat">📊 Stats</span></div>
<div class="cron-item"><span class="cron-freq">6j/02:10</span><span class="cron-cmd">offer-engine import_cx3</span><span class="cron-cat">💰 Import</span></div>
</div>
</div>
<div class="card">
<div class="card-header"><div class="card-title">📊 Répartition par Catégorie</div></div>
<table class="tbl">
<tr><th>Catégorie</th><th>Crons</th><th>Fréquence</th></tr>
<tr><td>🧠 Brain & Optimizer</td><td class="val">6</td><td>*/10 à */4h</td></tr>
<tr><td>📧 Send & Bounce</td><td class="val">5</td><td>*/15 à */30</td></tr>
<tr><td>🔥 Warmup</td><td class="val">3</td><td>*/15 + daily</td></tr>
<tr><td>📊 Tracking & Analytics</td><td class="val">5</td><td>*/15 à daily</td></tr>
<tr><td>💰 Affiliate & Offers</td><td class="val">4</td><td>1h à 3j</td></tr>
<tr><td>🛡️ Guardian & Security</td><td class="val">6</td><td>*/10 à daily</td></tr>
<tr><td>🤖 IA Providers</td><td class="val">3</td><td>*/15 + daily</td></tr>
<tr><td>🔧 Infra & Health</td><td class="val">7</td><td>*/30 à 6h</td></tr>
<tr><td>📹 YouTube & Ads</td><td class="val">3</td><td>*/15 à daily</td></tr>
</table>
</div>
</div>
</div>
<!-- ================================ EXTERNAL ================================ -->
<div class="section" id="external">
<div class="section-title"><span class="icon">🌐</span> Services Externes & Intégrations</div>
<div class="grid grid-3">
<div class="card" style="border-left:3px solid var(--accent-blue);">
<div class="card-header"><div class="card-title">☁️ Microsoft O365</div><span class="badge badge-green">ACTIF</span></div>
<table class="tbl">
<tr><td>Comptes</td><td class="val">1,363 total</td></tr>
<tr><td>Tenants principaux</td><td>accoff02-10, mbman, globalmed.cl</td></tr>
<tr><td>Tenants total</td><td class="val">~550 tenants</td></tr>
<tr><td>API</td><td>Microsoft Graph API</td></tr>
<tr><td>Création réelle</td><td class="green">✅ Via Worker</td></tr>
</table>
</div>
<div class="card" style="border-left:3px solid var(--accent-green);">
<div class="card-header"><div class="card-title">💰 CX3 Ads</div><span class="badge badge-green">ACTIF</span></div>
<table class="tbl">
<tr><td>Login</td><td>Ymahboub@weval-consulting.com</td></tr>
<tr><td>Portal</td><td>publisher.cx3ads.com</td></tr>
<tr><td>Aff ID</td><td class="val">10805</td></tr>
<tr><td>Tracking</td><td>e36lbat.com</td></tr>
<tr><td>API</td><td>CAKE API v2 (PULL)</td></tr>
<tr><td>Offres</td><td class="val">~41 actives</td></tr>
</table>
</div>
<div class="card" style="border-left:3px solid var(--accent-purple);">
<div class="card-header"><div class="card-title">💰 Double M (Everflow)</div><span class="badge badge-green">ACTIF</span></div>
<table class="tbl">
<tr><td>Tracking</td><td>rivoweb</td></tr>
<tr><td>API</td><td>Everflow API (PULL)</td></tr>
<tr><td>Offres</td><td class="val">50 importées</td></tr>
<tr><td>Pull</td><td>conversions-collector */30</td></tr>
</table>
</div>
<div class="card" style="border-left:3px solid var(--accent-cyan);">
<div class="card-header"><div class="card-title">🤖 IA Providers</div></div>
<table class="tbl">
<tr><td class="green">✅ Cerebras</td><td>llama-3.3-70b</td><td>429ms</td></tr>
<tr><td class="green">✅ Groq</td><td>llama-3.3-70b</td><td>192ms</td></tr>
<tr><td class="green">✅ SambaNova</td><td>Meta-Llama-3.3-70B</td><td>800ms</td></tr>
<tr><td class="red">⚠ Gemini</td><td>Quota 429</td><td>Billing requis</td></tr>
<tr><td class="red">⚠ DeepSeek</td><td>Balance 402</td><td>Recharger $5</td></tr>
<tr><td class="red">⚠ Claude</td><td>Crédits 400</td><td>Recharger</td></tr>
<tr><td class="red">❌ Hyperbolic</td><td>Credentials 401</td><td>Nouvelle clé</td></tr>
<tr><td style="color:var(--text-muted);">— Mistral</td><td colspan="2">Pas de clé</td></tr>
<tr><td style="color:var(--text-muted);">— Cohere</td><td colspan="2">Pas de clé</td></tr>
<tr><td style="color:var(--text-muted);">— Ollama</td><td colspan="2">Local :11434</td></tr>
<tr><td style="color:var(--text-muted);">— OpenRouter</td><td colspan="2">Pas de clé</td></tr>
</table>
</div>
<div class="card" style="border-left:3px solid var(--accent-orange);">
<div class="card-header"><div class="card-title">🌍 DNS & Domaines</div></div>
<table class="tbl">
<tr><td>Cloudflare</td><td class="val">culturellemejean.charity</td></tr>
<tr><td>MX</td><td>mail.wevup.app → 89.167.40.150</td></tr>
<tr><td>rDNS</td><td>mail.wevup.app</td></tr>
<tr><td>SPF</td><td class="green">✅ PASS</td></tr>
<tr><td>DKIM</td><td class="green">✅ PASS</td></tr>
<tr><td>DMARC</td><td class="green">✅ PASS</td></tr>
<tr><td>FreeDNS</td><td>191 domaines (DB only)</td></tr>
<tr><td>Domaines vérifiés</td><td class="val">288</td></tr>
</table>
</div>
<div class="card" style="border-left:3px solid var(--accent-red);">
<div class="card-header"><div class="card-title">🛡️ Captcha Services</div></div>
<table class="tbl">
<tr><td class="green">✅ AntiCaptcha</td><td>242ae14...c1</td><td>Active</td></tr>
<tr><td class="red">⏳ 2Captcha</td><td>PENDING</td><td>Clé requise</td></tr>
<tr><td class="red">⏳ CapSolver</td><td>PENDING</td><td>Clé requise</td></tr>
<tr><td class="red">⏳ CapMonster</td><td>PENDING</td><td>Clé requise</td></tr>
</table>
</div>
<div class="card" style="border-left:3px solid var(--accent-yellow);">
<div class="card-header"><div class="card-title">📱 Alertes Telegram</div></div>
<table class="tbl">
<tr><td>Bot Token</td><td style="font-size:9px;">8544624912:AAEm9tt...Qwrs</td></tr>
<tr><td>Chat ID</td><td class="val">7605775322</td></tr>
<tr><td>Alertes</td><td>Blacklist, Guardian, Rotation</td></tr>
</table>
</div>
</div>
</div>
<!-- ================================ KPIs ================================ -->
<div class="section" id="kpis">
<div class="section-title"><span class="icon">📊</span> KPIs Plateforme — 18 Février 2026</div>
<div class="stat-row">
<div class="stat"><div class="stat-label">Envois Jour</div><div class="stat-val blue" id="kpi-sends">--</div></div>
<div class="stat"><div class="stat-label">Opens</div><div class="stat-val cyan" id="kpi-opens">--</div></div>
<div class="stat"><div class="stat-label">Clicks</div><div class="stat-val green" id="kpi-clicks">--</div></div>
<div class="stat"><div class="stat-label">Conversions</div><div class="stat-val orange" id="kpi-conversions">--</div></div>
<div class="stat"><div class="stat-label">Revenue</div><div class="stat-val red" id="kpi-revenue">--</div></div>
<div class="stat"><div class="stat-label">Projection 24h</div><div class="stat-val purple" id="kpi-projection">--</div></div>
</div>
<div class="grid grid-3">
<div class="card">
<div class="card-header"><div class="card-title">📧 Infrastructure Email</div></div>
<table class="tbl">
<tr><td>O365 Comptes</td><td class="val">1,363</td></tr>
<tr><td>Warmup Accounts</td><td class="val">2,036</td></tr>
<tr><td>Seed Accounts</td><td class="val">1,275</td></tr>
<tr><td>Brain Seeds</td><td class="val">51,454</td></tr>
<tr><td>Send Pool Senders</td><td class="val">150</td></tr>
<tr><td>Creatives</td><td class="val">1,285</td></tr>
<tr><td>Quality OK Configs</td><td class="val">126</td></tr>
<tr><td>Cap Warmup/jour</td><td class="val">77,170</td></tr>
</table>
</div>
<div class="card">
<div class="card-header"><div class="card-title">💰 Affiliation</div></div>
<table class="tbl">
<tr><td>Offres Actives</td><td class="val">85 (CX3) + 50 (DoubleM)</td></tr>
<tr><td>Affiliate Offers DB</td><td class="val">691</td></tr>
<tr><td>Payout Moyen CX3</td><td class="val">$27</td></tr>
<tr><td>Payout Max</td><td class="val">$265</td></tr>
<tr><td>Links Actifs</td><td class="val">552</td></tr>
<tr><td>Modèle</td><td class="val">PULL (pas postback)</td></tr>
</table>
</div>
<div class="card">
<div class="card-header"><div class="card-title">🏗️ Plateforme</div></div>
<table class="tbl">
<tr><td>Screens Arsenal</td><td class="val">149 HTML</td></tr>
<tr><td>APIs Total</td><td class="val">653</td></tr>
<tr><td>Crons</td><td class="val">42</td></tr>
<tr><td>Contacts Valides</td><td class="val">2,995,784</td></tr>
<tr><td>Contacts Total</td><td class="val">7,354,713</td></tr>
<tr><td>Personas</td><td class="val">178 (8 pays)</td></tr>
<tr><td>IA Providers Live</td><td class="val">3/12</td></tr>
<tr><td>Guardian</td><td class="green">Alerte only (0 auto-fix)</td></tr>
</table>
</div>
</div>
</div>
</div><!-- content -->
<div style="text-align:center;padding:24px;color:var(--text-muted);font-size:11px;font-family:'JetBrains Mono',monospace;border-top:1px solid var(--border);">
WEVAL Consulting — Yacine Mahboub — Casablanca, Maroc — Architecture WEVADS v2.0 — 18 Février 2026
</div>
<script>
function showTab(id) {
document.querySelectorAll('.section').forEach(s => s.classList.remove('active'));
document.querySelectorAll('.nav-btn').forEach(b => b.classList.remove('active'));
document.getElementById(id).classList.add('active');
event.target.classList.add('active');
}
</script>
<script>
// LIVE DATA REFRESH
const API = '/api/architecture-live.php';
let liveData = null;
async function fetchLive() {
try {
const r = await fetch(API);
liveData = await r.json();
updateDashboard(liveData);
document.getElementById('live-ts').textContent = new Date(liveData.ts).toLocaleTimeString('fr-FR');
document.getElementById('live-dot').style.background = '#4aff8a';
} catch(e) {
document.getElementById('live-dot').style.background = '#ff4a6a';
}
}
function updateDashboard(d) {
// Update KPI section stats
const map = {
'kpi-sends': d.sends_today,
'kpi-opens': d.opens_today || d.opens_total,
'kpi-clicks': d.clicks_today || d.clicks_total,
'kpi-conversions': d.conversions_today,
'kpi-revenue': '$' + d.revenue_today,
'kpi-projection': '~' + Math.round(d.sends_today * (24/new Date().getHours() || 1)/1000) + 'K',
};
for(const [id, val] of Object.entries(map)) {
const el = document.getElementById(id);
if(el) el.textContent = typeof val === 'number' ? val.toLocaleString() : val;
}
// Update header meta chips
const chips = document.querySelectorAll('.live-val');
if(chips.length > 0 && d.sends_today !== undefined) {
chips[0].textContent = d.sends_today.toLocaleString() + ' sends';
}
}
// Auto-refresh every 30 seconds
fetchLive();
setInterval(fetchLive, 30000);
</script>
</body>
</html>