Files
IT-Nexus/agent-cs/topology.html

672 lines
23 KiB
HTML
Raw Permalink 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="de">
<head>
<meta charset="UTF-8">
<title>IT Nexus — Systemarchitektur</title>
<style>
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: 'Segoe UI', system-ui, sans-serif;
background: #0A0A0C;
color: #E4E4E7;
min-height: 100vh;
padding: 40px 32px;
}
h1 {
font-size: 22px;
font-weight: 700;
color: #FAFAFA;
margin-bottom: 4px;
}
.subtitle {
font-size: 13px;
color: #52525B;
margin-bottom: 40px;
}
.subtitle span {
color: #009B9A;
font-weight: 600;
}
.topology {
display: grid;
grid-template-columns: 1fr 60px 1fr 60px 1fr;
grid-template-rows: auto;
gap: 0;
align-items: start;
max-width: 1200px;
}
/* ─── COLUMNS ─── */
.col { display: flex; flex-direction: column; gap: 12px; }
/* ─── NODES ─── */
.node {
background: #18181B;
border: 1px solid #27272A;
border-radius: 14px;
overflow: hidden;
}
.node-header {
padding: 12px 16px;
display: flex;
align-items: center;
gap: 10px;
border-bottom: 1px solid #27272A;
}
.node-icon {
width: 32px; height: 32px;
border-radius: 8px;
display: flex; align-items: center; justify-content: center;
font-size: 16px;
flex-shrink: 0;
}
.node-title { font-size: 13px; font-weight: 700; color: #FAFAFA; }
.node-sub { font-size: 10px; color: #52525B; margin-top: 1px; }
.node-body { padding: 12px 16px; display: flex; flex-direction: column; gap: 8px; }
/* ─── COMPONENTS inside nodes ─── */
.comp {
background: #1C1C1F;
border: 1px solid #2A2A2E;
border-radius: 9px;
padding: 9px 12px;
display: flex;
align-items: flex-start;
gap: 10px;
}
.comp-icon {
font-size: 15px;
margin-top: 1px;
flex-shrink: 0;
}
.comp-name { font-size: 12px; font-weight: 600; color: #E4E4E7; }
.comp-desc { font-size: 10px; color: #52525B; margin-top: 2px; line-height: 1.4; }
.comp-badge {
display: inline-block;
font-size: 9px;
font-weight: 600;
padding: 1px 6px;
border-radius: 4px;
margin-top: 4px;
}
.badge-green { background: #14532D; color: #4ADE80; }
.badge-blue { background: #1E3A5F; color: #60A5FA; }
.badge-orange { background: #431407; color: #FB923C; }
.badge-teal { background: #0D3030; color: #2DD4BF; }
.badge-red { background: #450A0A; color: #F87171; }
.badge-gray { background: #27272A; color: #71717A; }
/* ─── ARROWS / CONNECTORS ─── */
.arrow-col {
display: flex;
flex-direction: column;
align-items: center;
justify-content: flex-start;
padding-top: 60px;
gap: 0;
}
.arrow-group {
display: flex;
flex-direction: column;
align-items: center;
gap: 4px;
margin-bottom: 20px;
}
.arrow-label {
font-size: 9px;
color: #3F3F46;
text-align: center;
max-width: 52px;
line-height: 1.3;
}
.arrow-line {
width: 1px;
height: 28px;
background: linear-gradient(to bottom, #27272A, #3F3F46);
}
.arrow-head {
width: 0;
height: 0;
border-left: 4px solid transparent;
border-right: 4px solid transparent;
border-top: 6px solid #3F3F46;
}
.arrow-both { display: flex; flex-direction: column; align-items: center; }
.arrow-up { border-top: none; border-bottom: 6px solid #3F3F46; }
.arrow-bi { color: #3F3F46; font-size: 14px; }
/* ─── COLUMN HEADERS ─── */
.col-label {
font-size: 10px;
font-weight: 700;
color: #3F3F46;
letter-spacing: 0.08em;
text-transform: uppercase;
margin-bottom: 8px;
padding-left: 4px;
}
/* ─── FLOW LEGEND ─── */
.legend {
max-width: 1200px;
margin-top: 36px;
background: #18181B;
border: 1px solid #27272A;
border-radius: 14px;
padding: 20px 24px;
}
.legend h2 {
font-size: 12px;
font-weight: 700;
color: #52525B;
letter-spacing: 0.06em;
text-transform: uppercase;
margin-bottom: 14px;
}
.flow-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 12px;
}
.flow-item {
background: #1C1C1F;
border: 1px solid #27272A;
border-radius: 9px;
padding: 12px 14px;
}
.flow-title { font-size: 11px; font-weight: 600; color: #E4E4E7; margin-bottom: 4px; }
.flow-desc { font-size: 10px; color: #52525B; line-height: 1.5; }
.flow-step { display: flex; align-items: baseline; gap: 6px; }
.flow-num { font-size: 9px; font-weight: 700; color: #009B9A; }
/* colors per zone */
.zone-pc .node-header { background: #0F1B2D; }
.zone-pc .node-icon { background: #1E3A5F; }
.zone-server .node-header { background: #0A1F0A; }
.zone-server .node-icon { background: #14532D; }
.zone-admin .node-header { background: #1A0F2E; }
.zone-admin .node-icon { background: #2E1065; }
</style>
</head>
<body>
<h1>IT Nexus — Systemarchitektur</h1>
<p class="subtitle">v2.0.0 &nbsp;·&nbsp; <span>Cereda Systems GmbH</span> &nbsp;·&nbsp; Stand: Mai 2026</p>
<div class="topology">
<!-- ═══ SPALTE 1: Windows Client ═══ -->
<div class="col zone-pc">
<div class="col-label">Windows-Endgerät</div>
<div class="node">
<div class="node-header">
<div class="node-icon">🖥️</div>
<div>
<div class="node-title">IT-Nexus-Agent.exe</div>
<div class="node-sub">C:\Program Files\IT Nexus Agent\</div>
</div>
</div>
<div class="node-body">
<div class="comp">
<div class="comp-icon">⚙️</div>
<div>
<div class="comp-name">Windows Service</div>
<div class="comp-desc">Läuft als SYSTEM · Autostart<br>Check-in alle 60 Sekunden</div>
<span class="comp-badge badge-green">Running</span>
</div>
</div>
<div class="comp">
<div class="comp-icon">📊</div>
<div>
<div class="comp-name">Dashboard (-dashboard)</div>
<div class="comp-desc">WPF Dark-Theme · System Tray<br>Autostart bei Windows-Login</div>
<span class="comp-badge badge-blue">STAThread</span>
</div>
</div>
<div class="comp">
<div class="comp-icon">🔔</div>
<div>
<div class="comp-name">Ankündigung (-notify)</div>
<div class="comp-desc">WPF Dialog per schtasks.exe<br>Startet als eingeloggter User</div>
<span class="comp-badge badge-orange">On Demand</span>
</div>
</div>
</div>
</div>
<div class="node">
<div class="node-header">
<div class="node-icon">📦</div>
<div>
<div class="node-title">Gesammelte Daten</div>
<div class="node-sub">status.json · agent.log · config.json</div>
</div>
</div>
<div class="node-body">
<div class="comp">
<div class="comp-icon">🔒</div>
<div>
<div class="comp-name">BitLocker · Defender</div>
<div class="comp-desc">WMI-Abfragen als SYSTEM<br>Win32_EncryptableVolume · MSFT_MpComputerStatus</div>
</div>
</div>
<div class="comp">
<div class="comp-icon">📈</div>
<div>
<div class="comp-name">CPU · RAM · Disk · Updates</div>
<div class="comp-desc">Performance Counter · WMI<br>Windows Update COM API</div>
</div>
</div>
<div class="comp">
<div class="comp-icon">🏷️</div>
<div>
<div class="comp-name">Hardware · Software · TPM</div>
<div class="comp-desc">BIOS Serial · Registry Uninstall<br>Win32_Tpm · Secure Boot</div>
</div>
</div>
</div>
</div>
<div class="node">
<div class="node-header">
<div class="node-icon">🔧</div>
<div>
<div class="node-title">Installer (setup.exe)</div>
<div class="node-sub">Inno Setup 6 · GUID {B3F7A2C1…}</div>
</div>
</div>
<div class="node-body">
<div class="comp">
<div class="comp-icon">📋</div>
<div>
<div class="comp-name">Was der Installer macht</div>
<div class="comp-desc">
EXE → Program Files<br>
sc.exe create → Windows Service<br>
HKCU\Run → Autostart Dashboard<br>
Start-Menü Verknüpfung<br>
config.json (falls nicht vorhanden)<br>
Erkennungsregel für Intune
</div>
<span class="comp-badge badge-teal">Intune-kompatibel</span>
</div>
</div>
</div>
</div>
</div>
<!-- ═══ ARROWS 1→2 ═══ -->
<div class="arrow-col">
<div class="arrow-group">
<div class="arrow-label">POST /checkin<br>X-Agent-Key</div>
<div class="arrow-line"></div>
<div class="arrow-head"></div>
</div>
<div class="arrow-group">
<div class="arrow-label">Response<br>commands<br>anns</div>
<div class="arrow-line" style="background:linear-gradient(to bottom,#3F3F46,#27272A)"></div>
<div class="arrow-head arrow-up" style="border-bottom-color:#3F3F46;border-top:none"></div>
</div>
<div class="arrow-group">
<div class="arrow-label">HTTPS 443</div>
<div class="arrow-line"></div>
<div class="arrow-head"></div>
</div>
<div class="arrow-group">
<div class="arrow-label">GET<br>/agent-script</div>
<div class="arrow-line"></div>
<div class="arrow-head"></div>
</div>
</div>
<!-- ═══ SPALTE 2: Server ═══ -->
<div class="col zone-server">
<div class="col-label">IT Nexus Server · 192.168.0.194</div>
<div class="node">
<div class="node-header">
<div class="node-icon">🐳</div>
<div>
<div class="node-title">Docker Stack</div>
<div class="node-sub">LXC 102 · Ubuntu 24.04 · docker compose</div>
</div>
</div>
<div class="node-body">
<div class="comp">
<div class="comp-icon">🌐</div>
<div>
<div class="comp-name">nginx (Reverse Proxy)</div>
<div class="comp-desc">Port 80 → 443 · TLS · Let's Encrypt<br>Leitet /api/* → Backend · /* → Frontend</div>
<span class="comp-badge badge-green">Port 443</span>
</div>
</div>
<div class="comp">
<div class="comp-icon"></div>
<div>
<div class="comp-name">fido-backend (Node.js)</div>
<div class="comp-desc">Express · better-sqlite3<br>JWT Auth · Agent-Key Auth<br>Cron Jobs · KI (Claude claude-sonnet-4-6)</div>
<span class="comp-badge badge-blue">Port 5000</span>
</div>
</div>
<div class="comp">
<div class="comp-icon">⚛️</div>
<div>
<div class="comp-name">fido-frontend (React)</div>
<div class="comp-desc">CRA · Custom CSS<br>Monitoring · Patch · Helpdesk<br>KI-Assistent · Docs</div>
<span class="comp-badge badge-blue">Port 3000</span>
</div>
</div>
<div class="comp">
<div class="comp-icon">🗄️</div>
<div>
<div class="comp-name">SQLite Datenbank</div>
<div class="comp-desc">monitoring_agents · tickets · users<br>patch_commands · announcements</div>
<span class="comp-badge badge-gray">Volume-Mount</span>
</div>
</div>
</div>
</div>
<div class="node">
<div class="node-header">
<div class="node-icon">🔗</div>
<div>
<div class="node-title">Externe Dienste</div>
<div class="node-sub">Integrationen via Backend</div>
</div>
</div>
<div class="node-body">
<div class="comp">
<div class="comp-icon">☁️</div>
<div>
<div class="comp-name">Microsoft Graph API</div>
<div class="comp-desc">Azure AD · Teams · MDO Alerts<br>Mail.ReadWrite · SecurityAlert.Read.All</div>
<span class="comp-badge badge-blue">App Registration</span>
</div>
</div>
<div class="comp">
<div class="comp-icon">🤖</div>
<div>
<div class="comp-name">Anthropic Claude claude-sonnet-4-6</div>
<div class="comp-desc">KI-Assistent · Wissensdatenbank<br>Ticket-Analyse · Automatisierung</div>
<span class="comp-badge badge-teal">claude-sonnet-4-6</span>
</div>
</div>
<div class="comp">
<div class="comp-icon">🖥️</div>
<div>
<div class="comp-name">Proxmox API</div>
<div class="comp-desc">192.168.0.184 · hve-01<br>VM/CT Status · Ressourcen</div>
<span class="comp-badge badge-orange">API Token</span>
</div>
</div>
</div>
</div>
<div class="node">
<div class="node-header">
<div class="node-icon">📡</div>
<div>
<div class="node-title">Agent-Endpunkte</div>
<div class="node-sub">Kein JWT — nur X-Agent-Key Header</div>
</div>
</div>
<div class="node-body">
<div class="comp">
<div class="comp-icon">📤</div>
<div>
<div class="comp-name">POST /api/monitoring/checkin</div>
<div class="comp-desc">Systemdaten · Bekommt commands + announcements zurück</div>
</div>
</div>
<div class="comp">
<div class="comp-icon"></div>
<div>
<div class="comp-name">POST /api/patch/commands/result</div>
<div class="comp-desc">Ergebnis von Patch-Befehlen melden</div>
</div>
</div>
<div class="comp">
<div class="comp-icon">🔔</div>
<div>
<div class="comp-name">POST /api/announcements/:id/ack-agent</div>
<div class="comp-desc">Bestätigung nach Klick im Dialog</div>
</div>
</div>
<div class="comp">
<div class="comp-icon">⬇️</div>
<div>
<div class="comp-name">GET /api/monitoring/agent-script</div>
<div class="comp-desc">Neue EXE-Version für Auto-Update</div>
</div>
</div>
</div>
</div>
</div>
<!-- ═══ ARROWS 2→3 ═══ -->
<div class="arrow-col">
<div class="arrow-group">
<div class="arrow-label">HTTPS<br>Browser</div>
<div class="arrow-line"></div>
<div class="arrow-head"></div>
</div>
<div class="arrow-group">
<div class="arrow-label">JWT<br>Auth</div>
<div class="arrow-line"></div>
<div class="arrow-head"></div>
</div>
<div class="arrow-group">
<div class="arrow-label">Real-time<br>Dashboard</div>
<div class="arrow-line"></div>
<div class="arrow-head"></div>
</div>
</div>
<!-- ═══ SPALTE 3: Admin / Browser ═══ -->
<div class="col zone-admin">
<div class="col-label">IT-Administrator</div>
<div class="node">
<div class="node-header">
<div class="node-icon">🧑‍💼</div>
<div>
<div class="node-title">IT Nexus Web</div>
<div class="node-sub">https://it-nexus.cereda-systems.de</div>
</div>
</div>
<div class="node-body">
<div class="comp">
<div class="comp-icon">📊</div>
<div>
<div class="comp-name">Monitoring</div>
<div class="comp-desc">Alle Geräte · Online/Offline<br>CPU/RAM/Disk · BitLocker · Defender<br>Seriennummer · Patch-Status</div>
</div>
</div>
<div class="comp">
<div class="comp-icon">🔄</div>
<div>
<div class="comp-name">Patch Management</div>
<div class="comp-desc">Staged Rollout: Test → Pilot → Produktion<br>Commands: Updates, Reboot, Win11<br>Auto-Update Agent</div>
<span class="comp-badge badge-orange">Rollout-gesichert</span>
</div>
</div>
<div class="comp">
<div class="comp-icon">📢</div>
<div>
<div class="comp-name">Ankündigungen</div>
<div class="comp-desc">Erstellen · An Gruppen senden<br>Agent zeigt WPF-Dialog auf Endgerät<br>ACK-Tracking</div>
</div>
</div>
<div class="comp">
<div class="comp-icon">🎫</div>
<div>
<div class="comp-name">Helpdesk</div>
<div class="comp-desc">Tickets · Chat · KI-Assistent<br>Teams-Integration</div>
</div>
</div>
<div class="comp">
<div class="comp-icon">🤖</div>
<div>
<div class="comp-name">KI-Wissensdatenbank</div>
<div class="comp-desc">Artikel · Auto-Sync alle 30s<br>Claude claude-sonnet-4-6 Analyse</div>
</div>
</div>
</div>
</div>
<div class="node">
<div class="node-header">
<div class="node-icon">🏢</div>
<div>
<div class="node-title">Infrastruktur-Übersicht</div>
<div class="node-sub">Proxmox · LXC · VMs</div>
</div>
</div>
<div class="node-body">
<div class="comp">
<div class="comp-icon">🖥️</div>
<div>
<div class="comp-name">Proxmox hve-01</div>
<div class="comp-desc">192.168.0.184 · LXC 102 (IT Nexus)<br>VM/CT Status via REST API</div>
</div>
</div>
<div class="comp">
<div class="comp-icon">💾</div>
<div>
<div class="comp-name">Synology NAS</div>
<div class="comp-desc">192.168.0.60 · iSCSI 500GB<br>iscsi-lvm auf Proxmox</div>
</div>
</div>
</div>
</div>
<div class="node">
<div class="node-header">
<div class="node-icon">🔐</div>
<div>
<div class="node-title">Rollen &amp; Zugriffsschutz</div>
<div class="node-sub">JWT · Rollenbasiertes Routing</div>
</div>
</div>
<div class="node-body">
<div class="comp">
<div class="comp-icon">👑</div>
<div>
<div class="comp-name">super_admin / admin</div>
<div class="comp-desc">Vollzugriff · alle Bereiche</div>
</div>
</div>
<div class="comp">
<div class="comp-icon">🛠️</div>
<div>
<div class="comp-name">support / bearbeiter</div>
<div class="comp-desc">Helpdesk · IT-Verwaltung</div>
</div>
</div>
<div class="comp">
<div class="comp-icon">👤</div>
<div>
<div class="comp-name">benutzer / hr / produktion</div>
<div class="comp-desc">Eingeschränkt · nur eigene Tickets</div>
</div>
</div>
<div class="comp">
<div class="comp-icon">🖥️</div>
<div>
<div class="comp-name">Dashboard Admin-Modus</div>
<div class="comp-desc">Login direkt am Endgerät<br>Agent-Steuerung · Log-Ansicht</div>
<span class="comp-badge badge-red">Auth geschützt</span>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- ═══ ABLAUF-LEGENDE ═══ -->
<div class="legend">
<h2>Wichtige Abläufe</h2>
<div class="flow-grid">
<div class="flow-item">
<div class="flow-title">🔄 Normaler Check-in (60s)</div>
<div class="flow-desc">
<div class="flow-step"><span class="flow-num">1</span>Service sammelt Systemdaten via WMI + Registry</div>
<div class="flow-step"><span class="flow-num">2</span>POST /api/monitoring/checkin mit X-Agent-Key</div>
<div class="flow-step"><span class="flow-num">3</span>Server antwortet: commands + announcements</div>
<div class="flow-step"><span class="flow-num">4</span>status.json → Dashboard liest alle 5s</div>
</div>
</div>
<div class="flow-item">
<div class="flow-title">📢 Ankündigung senden</div>
<div class="flow-desc">
<div class="flow-step"><span class="flow-num">1</span>Admin erstellt Ankündigung im Web-Frontend</div>
<div class="flow-step"><span class="flow-num">2</span>Beim nächsten Checkin: Agent empfängt Announcement</div>
<div class="flow-step"><span class="flow-num">3</span>Service startet via schtasks.exe den Dialog als User</div>
<div class="flow-step"><span class="flow-num">4</span>User klickt "Gelesen" → ACK an Server</div>
</div>
</div>
<div class="flow-item">
<div class="flow-title">🔄 Auto-Update Agent</div>
<div class="flow-desc">
<div class="flow-step"><span class="flow-num">1</span>Server-Response enthält neue agent_version</div>
<div class="flow-step"><span class="flow-num">2</span>Agent lädt neue EXE via GET /agent-script</div>
<div class="flow-step"><span class="flow-num">3</span>CMD-Script: Service stop → EXE ersetzen → Service start</div>
<div class="flow-step"><span class="flow-num">4</span>Staged Rollout: Test → Pilot → Produktion</div>
</div>
</div>
<div class="flow-item">
<div class="flow-title">🔧 Patch-Command ausführen</div>
<div class="flow-desc">
<div class="flow-step"><span class="flow-num">1</span>Admin sendet Befehl im Patch-Management</div>
<div class="flow-step"><span class="flow-num">2</span>Command kommt beim nächsten Checkin zurück</div>
<div class="flow-step"><span class="flow-num">3</span>Service führt aus: UsoClient, shutdown, etc.</div>
<div class="flow-step"><span class="flow-num">4</span>POST /commands/result meldet done/error</div>
</div>
</div>
<div class="flow-item">
<div class="flow-title">📦 Intune-Deployment</div>
<div class="flow-desc">
<div class="flow-step"><span class="flow-num">1</span>setup.exe via Intune Win32-App verteilen</div>
<div class="flow-step"><span class="flow-num">2</span>Erkennungsregel: HKLM …\{B3F7A2C1…} DisplayVersion</div>
<div class="flow-step"><span class="flow-num">3</span>Installer: Service + Autostart + config.json</div>
<div class="flow-step"><span class="flow-num">4</span>Agent meldet sich selbstständig beim Server an</div>
</div>
</div>
<div class="flow-item">
<div class="flow-title">🔐 Dashboard Exit-Schutz</div>
<div class="flow-desc">
<div class="flow-step"><span class="flow-num">1</span>X-Button → minimiert nur in Tray, schließt nie</div>
<div class="flow-step"><span class="flow-num">2</span>"Beenden" im Tray → Admin-Login-Modal</div>
<div class="flow-step"><span class="flow-num">3</span>POST /api/auth/login → JWT-Token</div>
<div class="flow-step"><span class="flow-num">4</span>Nur bei Erfolg: Shutdown()</div>
</div>
</div>
</div>
</div>
</body>
</html>