Files
wevads-platform/scripts/infra-manager.php
2026-02-26 04:53:11 +01:00

160 lines
9.5 KiB
PHP
Executable File

<?php
$pdo = new PDO('pgsql:host=localhost;dbname=adx_system', 'admin', 'admin123');
$stats = [
'servers' => $pdo->query("SELECT COUNT(*) FROM admin.mta_servers")->fetchColumn() ?: 0,
'servers_active' => $pdo->query("SELECT COUNT(*) FROM admin.mta_servers WHERE status='Activated'")->fetchColumn() ?: 0,
'domains' => $pdo->query("SELECT COUNT(*) FROM admin.domains")->fetchColumn() ?: 0,
'cloudflare' => $pdo->query("SELECT COUNT(*) FROM admin.cloudflare_accounts")->fetchColumn() ?: 0,
];
?>
<!DOCTYPE html>
<html><head>
<meta charset="UTF-8">
<title>Infra Manager - Infrastructure Setup</title>
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
<style>
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:system-ui;background:#0a0a0f;color:#e2e8f0;min-height:100vh;padding:20px}
h1{color:#3b82f6;margin-bottom:10px}
.back-link{color:#5eead4;text-decoration:none;display:inline-block;margin-bottom:20px}
.process-box{background:#12121a;border-radius:12px;padding:20px;margin-bottom:20px;border:1px solid #333}
.process-title{color:#3b82f6;margin-bottom:15px;font-size:1.1rem}
.process-flow{display:flex;flex-wrap:wrap;gap:15px;align-items:center;justify-content:center}
.process-step{background:#1a1a2e;border:2px solid #333;border-radius:10px;padding:15px;min-width:130px;text-align:center;transition:all 0.3s}
.process-step:hover{transform:translateY(-2px);border-color:#3b82f6}
.process-step .icon{font-size:1.8rem;margin-bottom:8px}
.process-step .num{width:24px;height:24px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;font-size:0.8rem;font-weight:bold;margin-bottom:5px}
.process-step .title{font-weight:bold;font-size:0.85rem;margin-bottom:5px}
.process-step .desc{font-size:0.7rem;opacity:0.8}
.process-arrow{color:#3b82f6;font-size:1.5rem}
.summary{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:15px;margin-bottom:25px}
.summary-card{background:#12121a;padding:20px;border-radius:12px;text-align:center;border-left:4px solid #3b82f6}
.summary-card.green{border-color:#10b981}
.summary-card.orange{border-color:#f59e0b}
.summary-card.purple{border-color:#9333ea}
.summary-val{font-size:2rem;font-weight:bold;color:#3b82f6}
.summary-card.green .summary-val{color:#10b981}
.summary-card.orange .summary-val{color:#f59e0b}
.summary-card.purple .summary-val{color:#9333ea}
.summary-lbl{font-size:0.85rem;opacity:0.7}
.tabs{display:flex;gap:10px;margin-bottom:20px;flex-wrap:wrap}
.tab{padding:10px 20px;background:#1a1a2e;border:none;color:#e2e8f0;border-radius:8px;cursor:pointer;font-size:0.9rem}
.tab.active{background:#3b82f6;color:white}
.tab:hover{background:#2a2a4e}
.panel{display:none;background:#12121a;border-radius:12px;padding:20px}
.panel.active{display:block}
.btn{padding:8px 16px;border:none;border-radius:6px;cursor:pointer;font-size:0.85rem;display:inline-flex;align-items:center;gap:5px}
.btn-primary{background:#3b82f6;color:white}
.btn-success{background:#10b981;color:white}
.btn:hover{opacity:0.9}
.toolbar{display:flex;gap:10px;margin-bottom:20px;flex-wrap:wrap}
table{width:100%;border-collapse:collapse;font-size:0.85rem}
th,td{padding:10px;text-align:left;border-bottom:1px solid #222}
th{background:#1a1a2e;color:#3b82f6}
tr:hover{background:#1a1a2e}
.table-scroll{max-height:400px;overflow-y:auto}
.badge{padding:3px 8px;border-radius:4px;font-size:0.75rem}
.badge-active{background:#10b981;color:white}
.badge-inactive{background:#ef4444;color:white}
.info-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:15px;margin-top:15px;font-size:0.85rem}
.info-grid div{background:#1a1a2e;padding:12px;border-radius:8px}
</style>
</head><body>
<a href="/system-flows.php" class="back-link"><i class="fas fa-arrow-left"></i> Retour aux System Flows</a>
<div class="process-box">
<h3 class="process-title"><i class="fas fa-server"></i> Comment fonctionne l'Infrastructure Setup ?</h3>
<div class="process-flow">
<div class="process-step"><div class="icon">☁️</div><div class="num" style="background:#3b82f6;color:white">1</div><div class="title" style="color:#3b82f6">CLOUD API</div><div class="desc">Huawei/Scaleway<br>créer serveur VPS</div></div>
<div class="process-arrow">→</div>
<div class="process-step"><div class="icon">🖥️</div><div class="num" style="background:#f59e0b;color:black">2</div><div class="title" style="color:#f59e0b">MTA INSTALL</div><div class="desc">PowerMTA setup<br>pools, configs</div></div>
<div class="process-arrow">→</div>
<div class="process-step"><div class="icon">🌐</div><div class="num" style="background:#10b981;color:white">3</div><div class="title" style="color:#10b981">DOMAINS</div><div class="desc">Associer domaines<br>aux IPs serveur</div></div>
<div class="process-arrow">→</div>
<div class="process-step"><div class="icon">🔐</div><div class="num" style="background:#9333ea;color:white">4</div><div class="title" style="color:#9333ea">DNS/DKIM</div><div class="desc">SPF, DKIM, DMARC<br>via Cloudflare</div></div>
<div class="process-arrow">→</div>
<div class="process-step"><div class="icon">✅</div><div class="num" style="background:#5eead4;color:black">5</div><div class="title" style="color:#5eead4">READY</div><div class="desc">Serveur prêt<br>à envoyer</div></div>
</div>
<div class="info-grid">
<div><strong style="color:#3b82f6">☁️ Cloud Providers:</strong> Huawei Cloud, Scaleway, OVH, Hetzner pour VPS avec IPs clean</div>
<div><strong style="color:#f59e0b">🖥️ PowerMTA:</strong> Serveur MTA haute performance avec pools, virtual MTAs, accounting</div>
<div><strong style="color:#5eead4">🔐 DNS:</strong> Cloudflare API pour créer automatiquement SPF, DKIM, DMARC records</div>
</div>
</div>
<h1><i class="fas fa-server"></i> Infra Manager</h1>
<p style="opacity:0.7;margin-bottom:20px">Gestion des Serveurs, Domaines et DNS</p>
<div class="summary">
<div class="summary-card"><div class="summary-val"><?=$stats['servers']?></div><div class="summary-lbl">MTA Servers</div></div>
<div class="summary-card green"><div class="summary-val"><?=$stats['servers_active']?></div><div class="summary-lbl">Serveurs Actifs</div></div>
<div class="summary-card orange"><div class="summary-val"><?=$stats['domains']?></div><div class="summary-lbl">Domaines</div></div>
<div class="summary-card purple"><div class="summary-val"><?=$stats['cloudflare']?></div><div class="summary-lbl">Cloudflare</div></div>
</div>
<div class="tabs">
<button class="tab active" onclick="showTab('servers')"><i class="fas fa-server"></i> Servers</button>
<button class="tab" onclick="showTab('domains')"><i class="fas fa-globe"></i> Domains</button>
<button class="tab" onclick="showTab('cloudflare')"><i class="fas fa-cloud"></i> Cloudflare</button>
<button class="tab" onclick="showTab('provision')"><i class="fas fa-plus-circle"></i> Provisionner</button>
</div>
<div class="panel active" id="panel-servers">
<div class="toolbar"><button class="btn btn-primary" onclick="loadServers()"><i class="fas fa-sync"></i> Rafraîchir</button></div>
<div class="table-scroll">
<table><thead><tr><th>ID</th><th>Nom</th><th>IP</th><th>Provider</th><th>Status</th><th>Actions</th></tr></thead>
<tbody id="servers-body"></tbody></table>
</div>
</div>
<div class="panel" id="panel-domains">
<div class="toolbar"><button class="btn btn-primary" onclick="loadDomains()"><i class="fas fa-sync"></i> Rafraîchir</button></div>
<div class="table-scroll">
<table><thead><tr><th>ID</th><th>Domaine</th><th>Serveur</th><th>Status</th><th>DKIM</th></tr></thead>
<tbody id="domains-body"></tbody></table>
</div>
</div>
<div class="panel" id="panel-cloudflare">
<div class="toolbar"><button class="btn btn-primary"><i class="fas fa-sync"></i> Rafraîchir</button></div>
<p style="opacity:0.7">Comptes Cloudflare pour gestion DNS automatique</p>
</div>
<div class="panel" id="panel-provision">
<h4 style="color:#3b82f6;margin-bottom:15px"><i class="fas fa-rocket"></i> Provisionner un nouveau serveur</h4>
<p style="opacity:0.7">Coming soon - Workflow automatisé Cloud → PMTA → DNS</p>
</div>
<script>
function showTab(name) {
document.querySelectorAll('.tab').forEach(t => t.classList.remove('active'));
document.querySelectorAll('.panel').forEach(p => p.classList.remove('active'));
event.target.classList.add('active');
document.getElementById('panel-'+name).classList.add('active');
}
function loadServers() {
fetch('/cloud-manager.php?action=list_mta_servers').then(r => r.json()).then(data => {
document.getElementById('servers-body').innerHTML = (data.servers || []).map(s =>
'<tr><td>'+s.id+'</td><td><strong>'+s.name+'</strong></td><td><code>'+(s.main_ip||'-')+'</code></td><td>'+(s.provider_name||'-')+'</td><td><span class="badge '+(s.status==='Activated'?'badge-active':'badge-inactive')+'">'+s.status+'</span></td><td><button class="btn btn-primary"><i class="fas fa-cog"></i></button></td></tr>'
).join('') || '<tr><td colspan="6" style="text-align:center;opacity:0.5">Aucun serveur</td></tr>';
}).catch(e => {
document.getElementById('servers-body').innerHTML = '<tr><td colspan="6">Erreur chargement</td></tr>';
});
}
function loadDomains() {
fetch('/domains-management.php?action=list').then(r => r.json()).then(data => {
document.getElementById('domains-body').innerHTML = (data.domains || []).map(d =>
'<tr><td>'+d.id+'</td><td><strong>'+(d.value||d.name)+'</strong></td><td>'+(d.mta_server_id||'-')+'</td><td>'+(d.status||'-')+'</td><td>'+(d.dkim_status||'-')+'</td></tr>'
).join('') || '<tr><td colspan="5">Aucun domaine</td></tr>';
}).catch(e => {});
}
loadServers();
</script>
</body></html>