Initial commit: IT Nexus Web-App

This commit is contained in:
2026-06-01 20:49:07 +02:00
commit 8023765e6c
387 changed files with 106900 additions and 0 deletions

671
agent-cs/topology.html Normal file
View File

@@ -0,0 +1,671 @@
<!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>