1632 lines
104 KiB
HTML
1632 lines
104 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="de">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>IT Nexus — Systemübersicht</title>
|
|
<style>
|
|
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
:root {
|
|
--bg: #0f172a;
|
|
--surface: #1e293b;
|
|
--surface2: #263145;
|
|
--border: #334155;
|
|
--teal: #0d9488;
|
|
--teal-l: #14b8a6;
|
|
--teal-d: #0f766e;
|
|
--text: #e2e8f0;
|
|
--muted: #94a3b8;
|
|
--green: #22c55e;
|
|
--yellow: #f59e0b;
|
|
--red: #ef4444;
|
|
--blue: #3b82f6;
|
|
--purple: #a855f7;
|
|
}
|
|
body {
|
|
background: var(--bg);
|
|
color: var(--text);
|
|
font-family: 'Segoe UI', system-ui, -apple-system, sans-serif;
|
|
font-size: 14px;
|
|
line-height: 1.6;
|
|
}
|
|
/* ── Header ── */
|
|
header {
|
|
background: linear-gradient(135deg, #0d9488 0%, #0f766e 50%, #0f172a 100%);
|
|
padding: 40px 32px 32px;
|
|
border-bottom: 1px solid var(--teal-d);
|
|
}
|
|
header .logo {
|
|
display: flex; align-items: center; gap: 14px; margin-bottom: 10px;
|
|
}
|
|
header .logo svg { width: 40px; height: 40px; }
|
|
header h1 { font-size: 28px; font-weight: 700; letter-spacing: -0.5px; }
|
|
header p { color: #99f6e4; font-size: 13px; margin-top: 4px; }
|
|
header .meta { display: flex; gap: 24px; margin-top: 16px; flex-wrap: wrap; }
|
|
header .meta span {
|
|
background: rgba(255,255,255,0.1);
|
|
border: 1px solid rgba(255,255,255,0.15);
|
|
border-radius: 6px; padding: 4px 12px; font-size: 12px; color: #ccfbf1;
|
|
}
|
|
/* ── Nav ── */
|
|
nav {
|
|
background: var(--surface);
|
|
border-bottom: 1px solid var(--border);
|
|
padding: 0 32px;
|
|
display: flex; gap: 0; overflow-x: auto;
|
|
}
|
|
nav a {
|
|
color: var(--muted); text-decoration: none; font-size: 13px; font-weight: 500;
|
|
padding: 14px 18px; border-bottom: 2px solid transparent;
|
|
white-space: nowrap; transition: all 0.15s;
|
|
}
|
|
nav a:hover { color: var(--teal-l); border-color: var(--teal-l); }
|
|
nav a.active { color: var(--teal-l); border-color: var(--teal-l); }
|
|
/* ── Layout ── */
|
|
main { max-width: 1600px; margin: 0 auto; padding: 32px; }
|
|
section { margin-bottom: 48px; }
|
|
h2 {
|
|
font-size: 18px; font-weight: 600; color: var(--teal-l);
|
|
margin-bottom: 20px; padding-bottom: 10px;
|
|
border-bottom: 1px solid var(--border);
|
|
display: flex; align-items: center; gap: 10px;
|
|
}
|
|
h2 .count {
|
|
background: var(--teal-d); color: #ccfbf1;
|
|
font-size: 11px; font-weight: 700; padding: 2px 8px; border-radius: 12px;
|
|
}
|
|
h3 { font-size: 14px; font-weight: 600; color: var(--text); margin: 24px 0 12px; }
|
|
/* ── Stats ── */
|
|
.stats-grid {
|
|
display: grid;
|
|
grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
|
|
gap: 16px; margin-bottom: 32px;
|
|
}
|
|
.stat-card {
|
|
background: var(--surface);
|
|
border: 1px solid var(--border);
|
|
border-radius: 10px; padding: 20px;
|
|
text-align: center;
|
|
}
|
|
.stat-card .num { font-size: 32px; font-weight: 700; color: var(--teal-l); }
|
|
.stat-card .label { color: var(--muted); font-size: 12px; margin-top: 4px; }
|
|
/* ── Table ── */
|
|
.table-wrap {
|
|
background: var(--surface);
|
|
border: 1px solid var(--border);
|
|
border-radius: 12px; overflow: hidden;
|
|
}
|
|
table { width: 100%; border-collapse: collapse; }
|
|
thead th {
|
|
background: var(--surface2); color: var(--muted);
|
|
font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px;
|
|
padding: 12px 16px; text-align: left; border-bottom: 1px solid var(--border);
|
|
}
|
|
tbody tr { border-bottom: 1px solid var(--border); transition: background 0.1s; }
|
|
tbody tr:last-child { border-bottom: none; }
|
|
tbody tr:hover { background: var(--surface2); }
|
|
tbody td { padding: 11px 16px; vertical-align: top; }
|
|
td.name { font-weight: 600; color: var(--text); white-space: nowrap; }
|
|
td.route { font-family: 'Cascadia Code', 'Consolas', monospace; font-size: 12px; color: var(--teal-l); }
|
|
td.purpose { color: var(--muted); font-size: 13px; }
|
|
td.roles { font-size: 11px; }
|
|
/* ── Badges ── */
|
|
.badge {
|
|
display: inline-block; padding: 2px 8px; border-radius: 4px;
|
|
font-size: 11px; font-weight: 600; margin: 1px 2px 1px 0;
|
|
}
|
|
.badge-green { background: #14532d; color: #86efac; }
|
|
.badge-blue { background: #1e3a5f; color: #93c5fd; }
|
|
.badge-purple { background: #3b1f5e; color: #d8b4fe; }
|
|
.badge-red { background: #4c0519; color: #fca5a5; }
|
|
.badge-yellow { background: #422006; color: #fcd34d; }
|
|
.badge-gray { background: #1e293b; color: #94a3b8; border: 1px solid #334155; }
|
|
.badge-teal { background: #042f2e; color: #5eead4; }
|
|
/* ── Status pills ── */
|
|
.status { display: inline-flex; align-items: center; gap: 5px; font-weight: 600; font-size: 12px; }
|
|
.status-ok { color: var(--green); }
|
|
.status-warn { color: var(--yellow); }
|
|
.status-miss { color: var(--red); }
|
|
/* ── API section ── */
|
|
.api-group {
|
|
background: var(--surface); border: 1px solid var(--border);
|
|
border-radius: 10px; margin-bottom: 16px; overflow: hidden;
|
|
}
|
|
.api-group-header {
|
|
background: var(--surface2); padding: 12px 16px;
|
|
display: flex; align-items: center; gap: 10px;
|
|
border-bottom: 1px solid var(--border);
|
|
}
|
|
.api-group-header .title { font-weight: 600; font-size: 13px; }
|
|
.api-group-header .base { font-family: monospace; font-size: 12px; color: var(--teal-l); margin-left: auto; }
|
|
.endpoint-list { padding: 8px 0; }
|
|
.endpoint {
|
|
display: flex; align-items: flex-start; gap: 10px;
|
|
padding: 6px 16px; border-bottom: 1px solid rgba(51,65,85,0.4);
|
|
font-size: 12px;
|
|
}
|
|
.endpoint:last-child { border-bottom: none; }
|
|
.method {
|
|
font-family: monospace; font-weight: 700; font-size: 11px;
|
|
padding: 1px 6px; border-radius: 3px; min-width: 46px; text-align: center;
|
|
flex-shrink: 0; margin-top: 1px;
|
|
}
|
|
.m-get { background: #1d4ed830; color: #60a5fa; border: 1px solid #1d4ed850; }
|
|
.m-post { background: #15803d30; color: #4ade80; border: 1px solid #15803d50; }
|
|
.m-put { background: #b4530030; color: #fb923c; border: 1px solid #b4530050; }
|
|
.m-delete { background: #b91c1c30; color: #f87171; border: 1px solid #b91c1c50; }
|
|
.endpoint .path { font-family: monospace; color: var(--text); }
|
|
.endpoint .desc { color: var(--muted); margin-left: auto; font-size: 11px; }
|
|
/* ── Recommendations ── */
|
|
.reco-grid {
|
|
display: grid; grid-template-columns: repeat(auto-fit, minmax(340px, 1fr)); gap: 16px;
|
|
}
|
|
.reco-card {
|
|
background: var(--surface); border: 1px solid var(--border);
|
|
border-radius: 10px; padding: 20px;
|
|
border-left: 3px solid;
|
|
}
|
|
.reco-card.cleanup { border-color: var(--yellow); }
|
|
.reco-card.merge { border-color: var(--blue); }
|
|
.reco-card.add { border-color: var(--teal); }
|
|
.reco-card.warning { border-color: var(--red); }
|
|
.reco-card h4 { font-size: 13px; font-weight: 600; margin-bottom: 10px; }
|
|
.reco-card.cleanup h4 { color: var(--yellow); }
|
|
.reco-card.merge h4 { color: #60a5fa; }
|
|
.reco-card.add h4 { color: var(--teal-l); }
|
|
.reco-card.warning h4 { color: var(--red); }
|
|
.reco-card ul { list-style: none; }
|
|
.reco-card ul li {
|
|
padding: 4px 0; color: var(--muted); font-size: 13px;
|
|
border-bottom: 1px solid var(--border); display: flex; gap: 8px;
|
|
}
|
|
.reco-card ul li:last-child { border-bottom: none; }
|
|
.reco-card ul li::before { flex-shrink: 0; margin-top: 1px; }
|
|
.reco-card.cleanup ul li::before { content: "⚠"; color: var(--yellow); }
|
|
.reco-card.merge ul li::before { content: "→"; color: #60a5fa; }
|
|
.reco-card.add ul li::before { content: "+"; color: var(--teal-l); font-weight: 700; }
|
|
.reco-card.warning ul li::before { content: "!"; color: var(--red); font-weight: 700; }
|
|
/* ── Footer ── */
|
|
footer {
|
|
background: var(--surface); border-top: 1px solid var(--border);
|
|
padding: 20px 32px; color: var(--muted); font-size: 12px;
|
|
display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 8px;
|
|
}
|
|
/* ── Scrollbar ── */
|
|
::-webkit-scrollbar { width: 6px; height: 6px; }
|
|
::-webkit-scrollbar-track { background: var(--bg); }
|
|
::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; }
|
|
::-webkit-scrollbar-thumb:hover { background: var(--teal-d); }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
|
|
<header>
|
|
<div class="logo">
|
|
<svg viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<rect width="40" height="40" rx="8" fill="#0d9488"/>
|
|
<path d="M8 20h24M20 8v24" stroke="white" stroke-width="2.5" stroke-linecap="round"/>
|
|
<circle cx="20" cy="20" r="5" fill="white"/>
|
|
</svg>
|
|
<h1>IT Nexus — Systemübersicht</h1>
|
|
</div>
|
|
<p>Vollständige Analyse aller Frontend-Seiten und Backend-APIs · Stand: 01.06.2026</p>
|
|
<div class="meta">
|
|
<span>47 Frontend-Seiten</span>
|
|
<span>34 Backend-Route-Dateien</span>
|
|
<span>~180 API-Endpoints</span>
|
|
<span>Node.js + React + SQLite</span>
|
|
<span>https://it-nexus.cereda-systems.de</span>
|
|
</div>
|
|
</header>
|
|
|
|
<nav>
|
|
<a href="#pages" class="active">Frontend-Seiten</a>
|
|
<a href="#apis">Backend-APIs</a>
|
|
<a href="#empfehlungen">Empfehlungen</a>
|
|
<a href="#croninfo">Cron-Jobs & Services</a>
|
|
<a href="#asset-detail">Asset-Bereich</a>
|
|
<a href="#rmm-roadmap">RMM-Roadmap</a>
|
|
</nav>
|
|
|
|
<main>
|
|
|
|
<!-- Stats -->
|
|
<div class="stats-grid" style="margin-top:8px">
|
|
<div class="stat-card"><div class="num">47</div><div class="label">Frontend-Seiten</div></div>
|
|
<div class="stat-card"><div class="num">34</div><div class="label">Route-Dateien</div></div>
|
|
<div class="stat-card"><div class="num">~180</div><div class="label">API-Endpoints</div></div>
|
|
<div class="stat-card"><div class="num">13</div><div class="label">Komponenten</div></div>
|
|
<div class="stat-card"><div class="num">9</div><div class="label">Cron-Jobs</div></div>
|
|
<div class="stat-card"><div class="num">v2.0.0</div><div class="label">Agent-Version</div></div>
|
|
</div>
|
|
|
|
<!-- Frontend Pages -->
|
|
<section id="pages">
|
|
<h2>Frontend-Seiten <span class="count">47</span></h2>
|
|
|
|
<!-- AUTH & ACCOUNT -->
|
|
<h3>Auth & Konto</h3>
|
|
<div class="table-wrap">
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Seitenname</th>
|
|
<th>Route</th>
|
|
<th>Zweck</th>
|
|
<th>Rollen-Zugriff</th>
|
|
<th>Status</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="name">LoginPage</td>
|
|
<td class="route">/login</td>
|
|
<td class="purpose">Login (Passwort + Microsoft SSO)</td>
|
|
<td><span class="badge badge-gray">Öffentlich</span></td>
|
|
<td><span class="status status-ok">✓ Fertig</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">ChangePasswordPage</td>
|
|
<td class="route">/change-password</td>
|
|
<td class="purpose">Pflicht-PW-Änderung beim Erst-Login</td>
|
|
<td><span class="badge badge-gray">Alle Auth.</span></td>
|
|
<td><span class="status status-ok">✓ Fertig</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">MyAccountPage</td>
|
|
<td class="route">/mein-konto</td>
|
|
<td class="purpose">Profil, Benachrichtigungseinstellungen, Passwort ändern</td>
|
|
<td><span class="badge badge-gray">Alle Auth.</span></td>
|
|
<td><span class="status status-ok">✓ Fertig</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">UserPortalPage</td>
|
|
<td class="route">/portal</td>
|
|
<td class="purpose">Einstiegsseite für normale User (kein Support-Zugang)</td>
|
|
<td><span class="badge badge-gray">Alle Auth.</span></td>
|
|
<td><span class="status status-ok">✓ Fertig</span></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<!-- CORE HELPDESK -->
|
|
<h3>Helpdesk & Tickets</h3>
|
|
<div class="table-wrap">
|
|
<table>
|
|
<thead>
|
|
<tr><th>Seitenname</th><th>Route</th><th>Zweck</th><th>Rollen-Zugriff</th><th>Status</th></tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="name">DashboardPage</td>
|
|
<td class="route">/dashboard</td>
|
|
<td class="purpose">Hauptübersicht: offene Tickets, Agent-Status, Quick-Stats, Ankündigungen</td>
|
|
<td><span class="badge badge-blue">support+</span></td>
|
|
<td><span class="status status-ok">✓ Fertig</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">TicketsPage</td>
|
|
<td class="route">/tickets</td>
|
|
<td class="purpose">Ticket-Liste mit Filtern, Bulk-Aktionen, SSE-Live-Updates</td>
|
|
<td><span class="badge badge-blue">support+</span></td>
|
|
<td><span class="status status-ok">✓ Fertig</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">TicketDetailPage</td>
|
|
<td class="route">/tickets/:id</td>
|
|
<td class="purpose">Ticket-Detailansicht, Kommentare, KI-Antwort, Timeline, PDF-Export</td>
|
|
<td><span class="badge badge-gray">Alle Auth.</span></td>
|
|
<td><span class="status status-ok">✓ Fertig</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">TicketMetricsPage</td>
|
|
<td class="route">/ticket-metrics</td>
|
|
<td class="purpose">SLA-Auswertung, Durchlaufzeiten, Top-Kategorien, Agenten-Performance</td>
|
|
<td><span class="badge badge-blue">support+</span></td>
|
|
<td><span class="status status-ok">✓ Fertig</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">DefectReportPage</td>
|
|
<td class="route">/defect</td>
|
|
<td class="purpose">Öffentliches Störungsmeldeformular (kein Login nötig)</td>
|
|
<td><span class="badge badge-gray">Öffentlich</span></td>
|
|
<td><span class="status status-ok">✓ Fertig</span></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<!-- ASSET MANAGEMENT -->
|
|
<h3>Asset-Verwaltung</h3>
|
|
<div class="table-wrap">
|
|
<table>
|
|
<thead>
|
|
<tr><th>Seitenname</th><th>Route</th><th>Zweck</th><th>Rollen-Zugriff</th><th>Status</th></tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="name">AssetsPage</td>
|
|
<td class="route">/assets</td>
|
|
<td class="purpose">Hardware-Inventar, Zuweisung, Label-Druck, Übergabeprotokoll, Intune-Import</td>
|
|
<td><span class="badge badge-blue">support+</span><span class="badge badge-purple">produktion</span></td>
|
|
<td><span class="status status-ok">✓ Fertig</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">AnlagevermoegenPage</td>
|
|
<td class="route">/anlagevermoegen</td>
|
|
<td class="purpose">Buchhaltungs-Ansicht der Assets (Abschreibung, Kaufdaten)</td>
|
|
<td><span class="badge badge-green">admin+</span><span class="badge badge-yellow">buchhaltung</span></td>
|
|
<td><span class="status status-warn">⚠ Ausbaubar</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">MaintenancePage</td>
|
|
<td class="route">/maintenance</td>
|
|
<td class="purpose">Wartungsplanung für Assets, Fälligkeits-E-Mails</td>
|
|
<td><span class="badge badge-blue">support+</span></td>
|
|
<td><span class="status status-ok">✓ Fertig</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">LicensesPage</td>
|
|
<td class="route">/licenses</td>
|
|
<td class="purpose">Softwarelizenzen, Zuweisung, Entra-Import, Ablauf-Tracking</td>
|
|
<td><span class="badge badge-blue">bearbeiter+</span></td>
|
|
<td><span class="status status-ok">✓ Fertig</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">WarehousePage</td>
|
|
<td class="route">/warehouse</td>
|
|
<td class="purpose">Lager-Modul: Bestände, Bewegungen, Mindestbestand, Bestellungen</td>
|
|
<td><span class="badge badge-blue">support+</span></td>
|
|
<td><span class="status status-ok">✓ Fertig</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">FidoKeysPage</td>
|
|
<td class="route">/fido-keys</td>
|
|
<td class="purpose">FIDO2-/YubiKey-Verwaltung, Statusverfolgung</td>
|
|
<td><span class="badge badge-gray">Alle Auth.</span></td>
|
|
<td><span class="status status-warn">⚠ Ausbaubar</span></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<!-- HR / LIFECYCLE -->
|
|
<h3>HR & Mitarbeiter-Lifecycle</h3>
|
|
<div class="table-wrap">
|
|
<table>
|
|
<thead>
|
|
<tr><th>Seitenname</th><th>Route</th><th>Zweck</th><th>Rollen-Zugriff</th><th>Status</th></tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="name">OnOffboardingPage</td>
|
|
<td class="route">/onboarding, /offboarding, /lifecycle</td>
|
|
<td class="purpose">Eine Seite für alle drei Routen — On- & Offboarding-Protokolle mit Checklisten, PDF-Export, E-Mail-Bestätigung</td>
|
|
<td><span class="badge badge-green">admin+</span><span class="badge badge-yellow">hr_personal</span><span class="badge badge-yellow">buchhaltung</span></td>
|
|
<td><span class="status status-ok">✓ Fertig</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">OnboardingConfirmPage</td>
|
|
<td class="route">/onboarding-confirm/:token</td>
|
|
<td class="purpose">Tokenseitige Bestätigung durch den neuen Mitarbeiter (öffentlich)</td>
|
|
<td><span class="badge badge-gray">Öffentlich</span></td>
|
|
<td><span class="status status-ok">✓ Fertig</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">ProcessManagementPage</td>
|
|
<td class="route">/process-management</td>
|
|
<td class="purpose">Konfiguration der Onboarding-Checklisten-Vorlagen, Abteilungs-Prozesse</td>
|
|
<td><span class="badge badge-green">admin+</span><span class="badge badge-yellow">hr_personal</span></td>
|
|
<td><span class="status status-ok">✓ Fertig</span></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<!-- USER MANAGEMENT -->
|
|
<h3>Benutzerverwaltung</h3>
|
|
<div class="table-wrap">
|
|
<table>
|
|
<thead>
|
|
<tr><th>Seitenname</th><th>Route</th><th>Zweck</th><th>Rollen-Zugriff</th><th>Status</th></tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="name">UsersPage</td>
|
|
<td class="route">/users</td>
|
|
<td class="purpose">IT-Nexus Benutzer-CRUD, Rollen-Zuweisung, Azure-Import, Audit-Logs</td>
|
|
<td><span class="badge badge-green">admin+</span></td>
|
|
<td><span class="status status-ok">✓ Fertig</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">UserManagementPage</td>
|
|
<td class="route">/benutzerverwaltung</td>
|
|
<td class="purpose">Erweiterte Benutzerverwaltung (neuere, dedizierte Seite)</td>
|
|
<td><span class="badge badge-green">admin+</span></td>
|
|
<td><span class="status status-warn">⚠ Redundant? Überlappung mit UsersPage prüfen</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">EntraPage</td>
|
|
<td class="route">/entra</td>
|
|
<td class="purpose">Azure AD / Entra ID: User, Gruppen, Rollen, Sign-in-Risiko, Conditional Access, Lizenzen</td>
|
|
<td><span class="badge badge-green">admin+</span></td>
|
|
<td><span class="status status-ok">✓ Fertig</span></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<!-- MONITORING & INFRA -->
|
|
<h3>Monitoring & Infrastruktur</h3>
|
|
<div class="table-wrap">
|
|
<table>
|
|
<thead>
|
|
<tr><th>Seitenname</th><th>Route</th><th>Zweck</th><th>Rollen-Zugriff</th><th>Status</th></tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="name">MonitoringPage</td>
|
|
<td class="route">/monitoring</td>
|
|
<td class="purpose">Windows-Agent-Geräte, Status-Übersicht, Netzwerk-Monitoring (ehemals /network-monitor), Proxmox-Status</td>
|
|
<td><span class="badge badge-green">admin+</span></td>
|
|
<td><span class="status status-ok">✓ Fertig</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">AgentDetailPage</td>
|
|
<td class="route">/monitoring/device/:id</td>
|
|
<td class="purpose">Detailansicht eines Monitoring-Geräts: Metriken, History, Commands, Patches</td>
|
|
<td><span class="badge badge-green">admin+</span></td>
|
|
<td><span class="status status-ok">✓ Fertig</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">NetworkMonitorPage</td>
|
|
<td class="route">→ redirect zu /monitoring</td>
|
|
<td class="purpose">Veraltet — wurde in MonitoringPage integriert. Route leitet weiter.</td>
|
|
<td><span class="badge badge-green">admin+</span></td>
|
|
<td><span class="status status-warn">⚠ Altlast (redirect)</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">PatchManagementPage</td>
|
|
<td class="route">/patch-management</td>
|
|
<td class="purpose">Staged Rollout: Test→Pilot→Produktion, Gruppen, Richtlinien, Agent-Commands</td>
|
|
<td><span class="badge badge-green">admin+</span></td>
|
|
<td><span class="status status-ok">✓ Fertig</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">ProxmoxPage</td>
|
|
<td class="route">/proxmox</td>
|
|
<td class="purpose">Proxmox VE Übersicht: VMs, CTs, Node-Ressourcen, Storage</td>
|
|
<td><span class="badge badge-green">admin+</span></td>
|
|
<td><span class="status status-warn">⚠ Ausbaubar (nur GET /overview)</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">DockerPage</td>
|
|
<td class="route">/docker</td>
|
|
<td class="purpose">Docker-Container-Verwaltung: Start/Stop, Logs, Statistiken</td>
|
|
<td><span class="badge badge-green">admin+</span></td>
|
|
<td><span class="status status-ok">✓ Fertig</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">DefenderPage</td>
|
|
<td class="route">/defender</td>
|
|
<td class="purpose">Microsoft Defender / MDO-Alerts, Sicherheits-Ereignisse aus Graph API</td>
|
|
<td><span class="badge badge-green">admin+</span></td>
|
|
<td><span class="status status-ok">✓ Fertig</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">SecurityReportsPage</td>
|
|
<td class="route">/security-reports</td>
|
|
<td class="purpose">PDF-Sicherheitsberichte (Upload, Anzeige, Löschen)</td>
|
|
<td><span class="badge badge-green">admin+</span></td>
|
|
<td><span class="status status-warn">⚠ Ausbaubar (rein manuell)</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">ScannerPage</td>
|
|
<td class="route">/nexus-scanner</td>
|
|
<td class="purpose">Netzwerk-Scanner: LXC-basierter Go-Scanner, Assets, Alerts, Sites</td>
|
|
<td><span class="badge badge-green">admin+</span></td>
|
|
<td><span class="status status-warn">⚠ Ausbaubar</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">HealthPage</td>
|
|
<td class="route">/health</td>
|
|
<td class="purpose">Öffentliche System-Health: API-Status, DB-Status, 90-Tage-Verlauf</td>
|
|
<td><span class="badge badge-gray">Öffentlich</span></td>
|
|
<td><span class="status status-ok">✓ Fertig</span></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<!-- KI & WISSEN -->
|
|
<h3>KI & Wissensbasis</h3>
|
|
<div class="table-wrap">
|
|
<table>
|
|
<thead>
|
|
<tr><th>Seitenname</th><th>Route</th><th>Zweck</th><th>Rollen-Zugriff</th><th>Status</th></tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="name">AiPage</td>
|
|
<td class="route">/ai</td>
|
|
<td class="purpose">KI-Chat mit Claude, Kontext-Auswahl, Ticket-Analyse</td>
|
|
<td><span class="badge badge-blue">support+</span></td>
|
|
<td><span class="status status-ok">✓ Fertig</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">KnowledgeBasePage</td>
|
|
<td class="route">/knowledge-base</td>
|
|
<td class="purpose">Manuelle Wissensdatenbank: Artikel, Kategorien, Suche</td>
|
|
<td><span class="badge badge-blue">support+</span></td>
|
|
<td><span class="status status-ok">✓ Fertig</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">KnowledgeAiPage</td>
|
|
<td class="route">/ki-wissen</td>
|
|
<td class="purpose">KI-Wissensbasis: Dokumente für RAG, URL-Import, Text-Import, Crawl</td>
|
|
<td><span class="badge badge-green">admin+</span></td>
|
|
<td><span class="status status-warn">⚠ Teilweise redundant mit KnowledgeBasePage</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">AiChatWidget</td>
|
|
<td class="route">(global, alle Seiten)</td>
|
|
<td class="purpose">Floating KI-Chat-Widget, auf allen Seiten verfügbar</td>
|
|
<td><span class="badge badge-gray">Alle Auth.</span></td>
|
|
<td><span class="status status-ok">✓ Fertig</span></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<!-- IT MANAGEMENT -->
|
|
<h3>IT-Management & Compliance</h3>
|
|
<div class="table-wrap">
|
|
<table>
|
|
<thead>
|
|
<tr><th>Seitenname</th><th>Route</th><th>Zweck</th><th>Rollen-Zugriff</th><th>Status</th></tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="name">ItOverviewPage</td>
|
|
<td class="route">/it-overview</td>
|
|
<td class="purpose">IT-Themen-Kanban (Microsoft Planner Sync), offene IT-Tasks</td>
|
|
<td><span class="badge badge-blue">support+</span></td>
|
|
<td><span class="status status-ok">✓ Fertig</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">IsoPage</td>
|
|
<td class="route">/iso</td>
|
|
<td class="purpose">ISO-27001 Aufgaben-Checkliste, Fortschritts-Tracking</td>
|
|
<td><span class="badge badge-green">admin+</span></td>
|
|
<td><span class="status status-warn">⚠ Ausbaubar (kein Reporting)</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">RiskPage</td>
|
|
<td class="route">/risk</td>
|
|
<td class="purpose">Risikomatrix, Risikobewertung, Maßnahmen-Tracking</td>
|
|
<td><span class="badge badge-green">admin+</span></td>
|
|
<td><span class="status status-warn">⚠ Ausbaubar (kein PDF-Export)</span></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<!-- PORTAL & SHARING -->
|
|
<h3>Portal, Anleitungen & Sharing</h3>
|
|
<div class="table-wrap">
|
|
<table>
|
|
<thead>
|
|
<tr><th>Seitenname</th><th>Route</th><th>Zweck</th><th>Rollen-Zugriff</th><th>Status</th></tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="name">PortalPage</td>
|
|
<td class="route">/anleitungen</td>
|
|
<td class="purpose">Anleitungs-Bibliothek für alle User (Markdown-Guides, Kategorien)</td>
|
|
<td><span class="badge badge-gray">Alle Auth.</span></td>
|
|
<td><span class="status status-ok">✓ Fertig</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">SharesPage</td>
|
|
<td class="route">/shares (nur via Admin)</td>
|
|
<td class="purpose">Sichere Datei-/Text-Links mit Ablauf, Passwort, Download-Limit</td>
|
|
<td><span class="badge badge-green">admin+</span></td>
|
|
<td><span class="status status-ok">✓ Fertig</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">PublicSharePage</td>
|
|
<td class="route">/s/:token</td>
|
|
<td class="purpose">Öffentliche Share-Ansicht mit optionalem Passwort</td>
|
|
<td><span class="badge badge-gray">Öffentlich</span></td>
|
|
<td><span class="status status-ok">✓ Fertig</span></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<!-- ADMIN & SYSTEM -->
|
|
<h3>Administration & System</h3>
|
|
<div class="table-wrap">
|
|
<table>
|
|
<thead>
|
|
<tr><th>Seitenname</th><th>Route</th><th>Zweck</th><th>Rollen-Zugriff</th><th>Status</th></tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="name">SettingsPage</td>
|
|
<td class="route">/settings</td>
|
|
<td class="purpose">Ticket-Kategorien, Vorlagen, E-Mail-Templates, E-Mail-Design, Routing-Regeln</td>
|
|
<td><span class="badge badge-green">admin+</span></td>
|
|
<td><span class="status status-ok">✓ Fertig</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">SystemPage</td>
|
|
<td class="route">/system</td>
|
|
<td class="purpose">System-Info, Server-Ressourcen, Datenbank-Größe, Logs</td>
|
|
<td><span class="badge badge-green">admin+</span></td>
|
|
<td><span class="status status-warn">⚠ Ausbaubar</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">DocsPage</td>
|
|
<td class="route">/docs</td>
|
|
<td class="purpose">Interne IT-Nexus-Dokumentation (Markdown, statisch aus /public)</td>
|
|
<td><span class="badge badge-green">admin+</span></td>
|
|
<td><span class="status status-ok">✓ Fertig</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">ApiDocsPage</td>
|
|
<td class="route">/api-docs</td>
|
|
<td class="purpose">Swagger-ähnliche API-Dokumentation für Integrationen</td>
|
|
<td><span class="badge badge-green">admin+</span></td>
|
|
<td><span class="status status-warn">⚠ Manuell gepflegt, veraltet?</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">TVDashboardPage</td>
|
|
<td class="route">/tv</td>
|
|
<td class="purpose">Vollbild-Dashboard für Büro-Monitore: Ticket-Stats, Agent-Status</td>
|
|
<td><span class="badge badge-gray">Kein Auth (URL-Schutz)</span></td>
|
|
<td><span class="status status-warn">⚠ Kein Auth-Schutz!</span></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<!-- NICHT GEROUTET / LEGACY -->
|
|
<h3>Nicht geroutet / Altlasten in pages/</h3>
|
|
<div class="table-wrap">
|
|
<table>
|
|
<thead>
|
|
<tr><th>Seitenname</th><th>Datei</th><th>Zweck</th><th>Rollen-Zugriff</th><th>Status</th></tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="name">OnboardingPage</td>
|
|
<td class="route">OnboardingPage.jsx</td>
|
|
<td class="purpose">Alte separate Onboarding-Seite — ersetzt durch OnOffboardingPage</td>
|
|
<td><span class="badge badge-red">LEGACY</span></td>
|
|
<td><span class="status status-miss">✗ Nicht geroutet</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">OffboardingPage</td>
|
|
<td class="route">OffboardingPage.jsx</td>
|
|
<td class="purpose">Alte separate Offboarding-Seite — ersetzt durch OnOffboardingPage</td>
|
|
<td><span class="badge badge-red">LEGACY</span></td>
|
|
<td><span class="status status-miss">✗ Nicht geroutet</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">NetworkMonitorPage</td>
|
|
<td class="route">NetworkMonitorPage.jsx</td>
|
|
<td class="purpose">Alter separater Netzwerk-Monitor — in MonitoringPage integriert, Route leitet weiter</td>
|
|
<td><span class="badge badge-red">LEGACY</span></td>
|
|
<td><span class="status status-miss">✗ Datei vorhanden, aber Redirect</span></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- BACKEND APIs -->
|
|
<section id="apis">
|
|
<h2>Backend-APIs <span class="count">34 Routen-Dateien</span></h2>
|
|
|
|
<!-- AUTH -->
|
|
<div class="api-group">
|
|
<div class="api-group-header">
|
|
<span class="badge badge-teal">AUTH</span>
|
|
<span class="title">Authentifizierung</span>
|
|
<span class="base">/api/auth</span>
|
|
</div>
|
|
<div class="endpoint-list">
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/login</span><span class="desc">Passwort-Login, JWT-Ausgabe</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/logout</span><span class="desc">Token invalidieren</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/me</span><span class="desc">Aktuellen User abrufen</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/change-password</span><span class="desc">Passwort ändern</span></div>
|
|
<div class="endpoint"><span class="method m-put">PUT</span><span class="path">/notifications</span><span class="desc">User-Benachrichtigungseinstellungen</span></div>
|
|
<div class="endpoint"><span class="method m-put">PUT</span><span class="path">/staff-notifications</span><span class="desc">Staff-Benachrichtigungseinstellungen</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/microsoft</span><span class="desc">Microsoft OAuth-Redirect</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/microsoft/callback</span><span class="desc">OAuth-Callback</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/microsoft/addin*</span><span class="desc">Outlook-AddIn OAuth Flow</span></div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- USERS -->
|
|
<div class="api-group">
|
|
<div class="api-group-header">
|
|
<span class="badge badge-blue">USER</span>
|
|
<span class="title">Benutzerverwaltung</span>
|
|
<span class="base">/api/users</span>
|
|
</div>
|
|
<div class="endpoint-list">
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/</span><span class="desc">Alle User (canViewOnboarding)</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/roles</span><span class="desc">Alle Rollen</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/audit-logs</span><span class="desc">Audit-Log gesamt</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/audit-logs/user/:userId</span><span class="desc">Audit-Log nach User</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/export/csv</span><span class="desc">CSV-Export aller User</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/import/azure/groups</span><span class="desc">Azure-Gruppen (super_admin)</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/import/azure</span><span class="desc">Azure-Import (super_admin)</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/:id/reset-entra</span><span class="desc">PW-Reset via Entra</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/</span><span class="desc">User anlegen (super_admin)</span></div>
|
|
<div class="endpoint"><span class="method m-put">PUT</span><span class="path">/:id</span><span class="desc">User updaten (super_admin)</span></div>
|
|
<div class="endpoint"><span class="method m-put">PUT</span><span class="path">/:id/role</span><span class="desc">Rolle zuweisen</span></div>
|
|
<div class="endpoint"><span class="method m-put">PUT</span><span class="path">/:id/activate</span><span class="desc">User aktivieren/deaktivieren</span></div>
|
|
<div class="endpoint"><span class="method m-delete">DEL</span><span class="path">/:id</span><span class="desc">User löschen (super_admin)</span></div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- TICKETS -->
|
|
<div class="api-group">
|
|
<div class="api-group-header">
|
|
<span class="badge badge-green">TICKET</span>
|
|
<span class="title">Helpdesk-Tickets</span>
|
|
<span class="base">/api/tickets</span>
|
|
</div>
|
|
<div class="endpoint-list">
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/</span><span class="desc">Alle Tickets (canViewTickets)</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/stats</span><span class="desc">Ticket-Statistiken</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/metrics</span><span class="desc">SLA-Metriken, Durchlaufzeiten</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/routing</span><span class="desc">Routing-Regeln (Admin)</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/:id/events</span><span class="desc">SSE-Stream für Live-Updates</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/:id/feedback</span><span class="desc">Kundenfeedback-Formular (öffentl.)</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/:id/history</span><span class="desc">Ticket-Änderungshistorie</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/:id/pdf</span><span class="desc">Ticket als PDF exportieren</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/public</span><span class="desc">Öffentliches Ticket erstellen (kein Auth)</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/:id/comments</span><span class="desc">Kommentar hinzufügen</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/:id/ai-reply</span><span class="desc">KI-generierte Antwort</span></div>
|
|
<div class="endpoint"><span class="method m-put">PUT</span><span class="path">/bulk</span><span class="desc">Bulk-Update mehrerer Tickets</span></div>
|
|
<div class="endpoint"><span class="method m-put">PUT</span><span class="path">/:id/snooze</span><span class="desc">Ticket snoozen</span></div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- ASSETS -->
|
|
<div class="api-group">
|
|
<div class="api-group-header">
|
|
<span class="badge badge-purple">ASSET</span>
|
|
<span class="title">Hardware-Assets</span>
|
|
<span class="base">/api/assets · /api/asset-types</span>
|
|
</div>
|
|
<div class="endpoint-list">
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/</span><span class="desc">Alle Assets</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/mine</span><span class="desc">Eigene Assets des eingeloggten Users</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/stats</span><span class="desc">Asset-Statistiken</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/:id/label</span><span class="desc">QR-Label generieren</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/:id/handover-protocol</span><span class="desc">Übergabeprotokoll PDF</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/:id/history</span><span class="desc">Zuweisungs-Historie</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/:id/inspections</span><span class="desc">Prüf-Protokolle</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/import/intune</span><span class="desc">Intune-Geräte-Import</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/:id/assign</span><span class="desc">Asset zuweisen</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/:id/sync-agent</span><span class="desc">Sync vom Windows-Agenten</span></div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- MONITORING / AGENT -->
|
|
<div class="api-group">
|
|
<div class="api-group-header">
|
|
<span class="badge badge-teal">MON</span>
|
|
<span class="title">Windows-Agent-Monitoring</span>
|
|
<span class="base">/api/monitoring</span>
|
|
</div>
|
|
<div class="endpoint-list">
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/checkin</span><span class="desc">Agent Check-in (X-Agent-Key, kein JWT)</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/announcements-poll</span><span class="desc">Agent Ankündigungs-Poll</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/agent-script</span><span class="desc">Agent-Download (C# v2.0.0)</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/agent-setup</span><span class="desc">Installer-Download (.exe)</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/statistics</span><span class="desc">Monitoring-Statistiken (Admin)</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/</span><span class="desc">Alle Monitoring-Geräte (Admin)</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/:id</span><span class="desc">Gerät-Details</span></div>
|
|
<div class="endpoint"><span class="method m-delete">DEL</span><span class="path">/:id</span><span class="desc">Gerät entfernen</span></div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- PATCH -->
|
|
<div class="api-group">
|
|
<div class="api-group-header">
|
|
<span class="badge badge-yellow">PATCH</span>
|
|
<span class="title">Patch-Management</span>
|
|
<span class="base">/api/patch</span>
|
|
</div>
|
|
<div class="endpoint-list">
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/commands/result</span><span class="desc">Agent meldet Command-Ergebnis (kein JWT)</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/overview</span><span class="desc">Patch-Übersicht aller Geräte</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/groups</span><span class="desc">Rollout-Gruppen</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/groups</span><span class="desc">Gruppe erstellen</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/policies</span><span class="desc">Update-Richtlinie erstellen/updaten</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/assign</span><span class="desc">Agent einer Gruppe zuweisen</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/groups/:id/release</span><span class="desc">Version an Gruppe freigeben</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/commands/trigger</span><span class="desc">Remote-Command auslösen</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/commands/trigger-group</span><span class="desc">Command für ganze Gruppe</span></div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- ONBOARDING -->
|
|
<div class="api-group">
|
|
<div class="api-group-header">
|
|
<span class="badge badge-green">HR</span>
|
|
<span class="title">Onboarding / Offboarding</span>
|
|
<span class="base">/api/onboarding · /api/offboarding · /api/onboarding-processes</span>
|
|
</div>
|
|
<div class="endpoint-list">
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/onboarding/confirm/:token</span><span class="desc">Bestätigung per Token (öffentlich)</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/onboarding/entra-manager</span><span class="desc">Entra-Manager suchen</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/onboarding/:id/send-confirmation</span><span class="desc">Bestätigungs-E-Mail senden</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/onboarding/:id/regenerate-pdf</span><span class="desc">PDF neu generieren</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/offboarding/:id/return-assets</span><span class="desc">Assets zurückgeben</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/onboarding-processes/departments</span><span class="desc">Abteilungen für Checklisten</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/onboarding-processes/processes</span><span class="desc">Prozess-Vorlagen</span></div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- KI -->
|
|
<div class="api-group">
|
|
<div class="api-group-header">
|
|
<span class="badge badge-purple">KI</span>
|
|
<span class="title">KI / Claude-Integration</span>
|
|
<span class="base">/api/ai · /api/knowledge</span>
|
|
</div>
|
|
<div class="endpoint-list">
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/ai/status</span><span class="desc">API-Verfügbarkeit, Modell-Info</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/ai/chat</span><span class="desc">Chat mit Claude (claude-sonnet-4-6)</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/ai/knowledge-base</span><span class="desc">KI-KB Einträge abrufen</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/ai/knowledge-base/import-text</span><span class="desc">Text als KB importieren</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/ai/knowledge-base/import-url</span><span class="desc">URL scrapen & importieren</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/ai/knowledge-base/import-crawl</span><span class="desc">Website crawlen & importieren</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/knowledge/</span><span class="desc">Manuelle KB-Artikel</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/knowledge/category/:cat</span><span class="desc">KB nach Kategorie</span></div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- INFRASTRUKTUR -->
|
|
<div class="api-group">
|
|
<div class="api-group-header">
|
|
<span class="badge badge-teal">INFRA</span>
|
|
<span class="title">Infrastruktur-Monitoring</span>
|
|
<span class="base">/api/proxmox · /api/docker · /api/network-monitor</span>
|
|
</div>
|
|
<div class="endpoint-list">
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/proxmox/overview</span><span class="desc">Proxmox VMs, CTs, Node-Stats (gecacht)</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/docker/containers</span><span class="desc">Docker-Container-Liste</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/docker/stats</span><span class="desc">Ressourcen-Statistiken</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/docker/containers/:id/logs</span><span class="desc">Container-Logs</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/docker/containers/:id/:action</span><span class="desc">Start/Stop/Restart</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/network-monitor/sse</span><span class="desc">SSE Live-Stream für Netzwerk-Status</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/network-monitor/discover</span><span class="desc">Auto-Discovery via ICMP/SNMP</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/network-monitor/:id/check-now</span><span class="desc">Sofort-Check auslösen</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/network-monitor/uptime-stats</span><span class="desc">Uptime-Statistiken aller Geräte</span></div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- SECURITY -->
|
|
<div class="api-group">
|
|
<div class="api-group-header">
|
|
<span class="badge badge-red">SEC</span>
|
|
<span class="title">Sicherheit & Compliance</span>
|
|
<span class="base">/api/entra · /api/external-alerts · /api/security-reports · /api/scanner</span>
|
|
</div>
|
|
<div class="endpoint-list">
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/entra/users</span><span class="desc">Azure AD User</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/entra/users/:id/signin-risk</span><span class="desc">Anmelde-Risiko-Score</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/entra/users/:id/invalidate-sessions</span><span class="desc">Sessions widerrufen</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/entra/conditional-access-policies</span><span class="desc">Conditional Access Policies</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/external-alerts/</span><span class="desc">Externe Alerts (Monitoring-Postfach)</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/external-alerts/:id/create-ticket</span><span class="desc">Alert zu Ticket umwandeln</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/security-reports/upload</span><span class="desc">Sicherheitsbericht hochladen</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/scanner/assets</span><span class="desc">Scanner meldet Assets</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/scanner/alert</span><span class="desc">Scanner meldet Alert</span></div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- WEITERES -->
|
|
<div class="api-group">
|
|
<div class="api-group-header">
|
|
<span class="badge badge-gray">MISC</span>
|
|
<span class="title">Diverses</span>
|
|
<span class="base">/api/announcements · /api/shares · /api/licenses · /api/warehouse · /api/portal-guides · /api/risks · /api/iso-tasks · /api/it-topics · /api/tv · /api/bot</span>
|
|
</div>
|
|
<div class="endpoint-list">
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/announcements/active</span><span class="desc">Aktive Ankündigungen (Notification Bell)</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/announcements/:id/ack-agent</span><span class="desc">Agent bestätigt Ankündigung (kein JWT)</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/shares/</span><span class="desc">Secure-Share-Link erstellen</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/shares/public/:token</span><span class="desc">Share abrufen (öffentlich)</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/warehouse/summary</span><span class="desc">Lager-Übersicht mit Statistiken</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/warehouse/violations</span><span class="desc">Mindestbestand-Verletzungen</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/bot/messages</span><span class="desc">Teams-Bot Webhook (Adaptive Cards)</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/tv/stats</span><span class="desc">TV-Dashboard Statistiken</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/portal-guides/</span><span class="desc">Anleitungs-Bibliothek</span></div>
|
|
<div class="endpoint"><span class="method m-post">POST</span><span class="path">/it-topics/planner/sync</span><span class="desc">Manueller Planner-Sync</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/risks/stats</span><span class="desc">Risiko-Matrix-Statistiken</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/licenses/statistics</span><span class="desc">Lizenz-Auslastung</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/fido-keys/</span><span class="desc">FIDO2-Schlüssel-Inventar</span></div>
|
|
<div class="endpoint"><span class="method m-get">GET</span><span class="path">/unifi/devices</span><span class="desc">UniFi-Geräte (deakt. Poller)</span></div>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- EMPFEHLUNGEN -->
|
|
<section id="empfehlungen">
|
|
<h2>Empfehlungen</h2>
|
|
<div class="reco-grid">
|
|
|
|
<div class="reco-card warning">
|
|
<h4>Sicherheits-Risiken</h4>
|
|
<ul>
|
|
<li>TVDashboardPage (/tv) hat keinerlei Auth-Schutz — URL-Kenntnis reicht für Vollzugriff auf Ticket-Stats und Agent-Status</li>
|
|
<li>DefectReportPage ist öffentlich — kein CAPTCHA/Rate-Limiting gegen Spam-Tickets</li>
|
|
<li>/api/health/history ist public — gibt interne Statushistorie preis</li>
|
|
<li>CORS in Produktion: extra PATCH-Methode fehlt (nur GET/POST/PUT/DELETE erlaubt)</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="reco-card cleanup">
|
|
<h4>Altlasten bereinigen</h4>
|
|
<ul>
|
|
<li>OnboardingPage.jsx & OffboardingPage.jsx löschen — vollständig durch OnOffboardingPage ersetzt, aber Dateien noch im Repository</li>
|
|
<li>NetworkMonitorPage.jsx löschen — Route ist ein Redirect, die Datei ist totes Gewicht</li>
|
|
<li>Route /network-monitor entfernen (Redirect ist technisch unnötig wenn Datei weg)</li>
|
|
<li>ApiDocsPage manuell gepflegt — veraltet wenn neue Endpoints fehlen; besser auto-generieren (swagger-jsdoc)</li>
|
|
<li>unifi.routes.js ist aktiv gemountet, aber Poller deaktiviert — Code-Kommentar in server.js, aber Route aktiv</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="reco-card merge">
|
|
<h4>Zusammenfassen / Vereinheitlichen</h4>
|
|
<ul>
|
|
<li>UsersPage (/users) + UserManagementPage (/benutzerverwaltung) — prüfen ob Überlappung besteht, ggf. zu einer Seite mergen</li>
|
|
<li>KnowledgeBasePage + KnowledgeAiPage — manuelle KB und KI-KB sind getrennte Seiten aber eng verwandt; könnten Tabs in einer Seite sein</li>
|
|
<li>DocsPage + ApiDocsPage — beide Admin-only Doku, könnten als Tabs gebündelt werden</li>
|
|
<li>IsoPage + RiskPage — beide Compliance-Seiten, könnten unter /compliance gebündelt werden</li>
|
|
<li>ProxmoxPage ist derzeit nur eine Übersicht (1 Endpoint) — könnte Tab in MonitoringPage werden</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="reco-card add">
|
|
<h4>Fehlende Features / Erweiterungen</h4>
|
|
<ul>
|
|
<li>VPN Site-to-Site Monitoring fehlt noch (Sophos XG API oder ping-basiert) — in Memory als offen markiert</li>
|
|
<li>Agent v2.0.0 Features: Software-Inventar, BitLocker-Status, Defender-Status vom Agenten</li>
|
|
<li>RiskPage hat keinen PDF-Export (ISO 27001 verlangt Nachweis)</li>
|
|
<li>IsoPage hat kein Reporting/Dashboard (nur Checkliste)</li>
|
|
<li>SecurityReportsPage ist rein manuell — kein automatischer Report-Import/Trigger</li>
|
|
<li>ScannerPage ist ausbaubar: keine automatische Asset-Übernahme ins Asset-Modul</li>
|
|
<li>AnlagevermoegenPage fehlt Abschreibungs-Berechnung und Export</li>
|
|
<li>Kein globales Audit-Dashboard (nur pro-User in UserPage)</li>
|
|
<li>Teams-Tab in EntraPage nicht vollständig (Team.ReadBasic.All Permission fehlt laut CLAUDE.md)</li>
|
|
<li>FidoKeysPage könnte Entra-Sync für WebAuthn-Methoden bekommen</li>
|
|
</ul>
|
|
</div>
|
|
|
|
</div>
|
|
</section>
|
|
|
|
<!-- CRON / SERVICES -->
|
|
<section id="croninfo">
|
|
<h2>Cron-Jobs & Background-Services</h2>
|
|
<div class="table-wrap">
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Service</th>
|
|
<th>Intervall</th>
|
|
<th>Zweck</th>
|
|
<th>Bedingung</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td class="name">Graph API Mail-Polling</td>
|
|
<td class="route">alle 30 Sek.</td>
|
|
<td class="purpose">E-Mails abrufen und zu Tickets konvertieren</td>
|
|
<td><span class="badge badge-blue">AZURE_TENANT_ID gesetzt</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">Monitoring-Postfach</td>
|
|
<td class="route">alle 30 Sek.</td>
|
|
<td class="purpose">Netgo/Monitoring-Alerts als External Alerts</td>
|
|
<td><span class="badge badge-blue">MONITORING_MAILBOX gesetzt</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">MDO Alert Polling</td>
|
|
<td class="route">alle 5 Min.</td>
|
|
<td class="purpose">Microsoft Defender for Office 365 Alerts</td>
|
|
<td><span class="badge badge-blue">AZURE_TENANT_ID gesetzt</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">Planner Auto-Sync</td>
|
|
<td class="route">alle 10 Sek.</td>
|
|
<td class="purpose">IT-Topics mit Microsoft Planner synchronisieren</td>
|
|
<td><span class="badge badge-blue">PLANNER_PLAN_ID gesetzt</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">Eskalations-Check</td>
|
|
<td class="route">stündlich</td>
|
|
<td class="purpose">Überfällige Tickets eskalieren, SLA-Benachrichtigungen</td>
|
|
<td><span class="badge badge-green">immer aktiv</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">Shares-Cleanup</td>
|
|
<td class="route">alle 15 Min.</td>
|
|
<td class="purpose">Abgelaufene/verbrauchte Share-Links löschen</td>
|
|
<td><span class="badge badge-green">immer aktiv</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">Mindestbestand-Check</td>
|
|
<td class="route">täglich 07:00</td>
|
|
<td class="purpose">Lager-Unterschreitungen per E-Mail melden</td>
|
|
<td><span class="badge badge-green">immer aktiv</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">Health-History</td>
|
|
<td class="route">alle 5 Min.</td>
|
|
<td class="purpose">API/DB-Status in health_history aufzeichnen</td>
|
|
<td><span class="badge badge-green">immer aktiv</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">Wöchentlicher Bericht</td>
|
|
<td class="route">Mo. 08:00</td>
|
|
<td class="purpose">Ticket-Wochen-Report per E-Mail</td>
|
|
<td><span class="badge badge-green">immer aktiv</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">Wartungs-Benachrichtigung</td>
|
|
<td class="route">täglich 08:00</td>
|
|
<td class="purpose">Fällige Asset-Wartungen per E-Mail</td>
|
|
<td><span class="badge badge-green">immer aktiv</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">Netzwerk-Monitoring-Poller</td>
|
|
<td class="route">konfigurierbar</td>
|
|
<td class="purpose">ICMP/SNMP-Checks, E-Mail-Alert bei Down/Up</td>
|
|
<td><span class="badge badge-green">immer aktiv</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">Teams Channel Polling</td>
|
|
<td class="route">alle 10 Min.</td>
|
|
<td class="purpose">Neue Teams-Nachrichten/Kanäle erkennen</td>
|
|
<td><span class="badge badge-blue">AZURE_TENANT_ID gesetzt</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">Proxmox Monitoring</td>
|
|
<td class="route">alle 5 Min.</td>
|
|
<td class="purpose">VM/CT-Status von Proxmox REST API pollen</td>
|
|
<td><span class="badge badge-blue">PROXMOX_HOST gesetzt</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="name">Check-History Cleanup</td>
|
|
<td class="route">täglich 03:00</td>
|
|
<td class="purpose">Alte Netzwerk-Check-Historien bereinigen</td>
|
|
<td><span class="badge badge-green">immer aktiv</span></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</section>
|
|
|
|
</main>
|
|
|
|
<footer>
|
|
<span>IT Nexus Systemübersicht · Cereda Systems GmbH · Simon Grüssing</span>
|
|
<span>Generiert: 01.06.2026 · claude-sonnet-4-6</span>
|
|
<span>Server: root@192.168.0.194 · /opt/it-nexus/</span>
|
|
</footer>
|
|
|
|
<script>
|
|
// Smooth scroll + active nav
|
|
document.querySelectorAll('nav a').forEach(a => {
|
|
a.addEventListener('click', e => {
|
|
document.querySelectorAll('nav a').forEach(x => x.classList.remove('active'));
|
|
a.classList.add('active');
|
|
});
|
|
});
|
|
|
|
// Highlight nav on scroll
|
|
const sections = document.querySelectorAll('section[id]');
|
|
window.addEventListener('scroll', () => {
|
|
let current = '';
|
|
sections.forEach(s => {
|
|
if (window.scrollY >= s.offsetTop - 80) current = s.id;
|
|
});
|
|
document.querySelectorAll('nav a').forEach(a => {
|
|
a.classList.toggle('active', a.getAttribute('href') === '#' + current);
|
|
});
|
|
}, { passive: true });
|
|
</script>
|
|
|
|
<!-- ══════════════════════════════════════════════════════════ ASSET DETAIL -->
|
|
<section id="asset-detail" style="padding: 48px 32px; max-width: 1400px; margin: 0 auto;">
|
|
<div style="display:flex; align-items:center; gap:12px; margin-bottom:8px;">
|
|
<div style="width:4px; height:32px; background:var(--teal); border-radius:2px;"></div>
|
|
<h2 style="font-size:20px; font-weight:700;">Asset-Bereich — Detailansicht</h2>
|
|
</div>
|
|
<p style="color:var(--muted); margin-bottom:32px; margin-left:16px;">Vollständige technische Referenz: Frontend-Komponenten, API-Endpoints, Datenbankstruktur und Rollen-Matrix</p>
|
|
|
|
<!-- 1. Architektur-Karte -->
|
|
<h3 style="font-size:15px; font-weight:600; color:var(--teal-l); margin-bottom:16px; letter-spacing:0.3px;">Architektur-Übersicht</h3>
|
|
<div style="display:grid; grid-template-columns:repeat(auto-fit,minmax(220px,1fr)); gap:16px; margin-bottom:40px;">
|
|
|
|
<!-- Frontend -->
|
|
<div style="background:var(--surface); border:1px solid var(--border); border-top:3px solid var(--teal); border-radius:10px; padding:20px;">
|
|
<div style="display:flex; align-items:center; gap:10px; margin-bottom:14px;">
|
|
<div style="width:32px; height:32px; background:rgba(13,148,136,0.15); border-radius:8px; display:flex; align-items:center; justify-content:center; font-size:16px;">🖥️</div>
|
|
<div>
|
|
<div style="font-weight:700; font-size:14px;">Frontend</div>
|
|
<div style="color:var(--muted); font-size:11px;">React-Komponenten</div>
|
|
</div>
|
|
</div>
|
|
<div style="display:flex; flex-direction:column; gap:6px;">
|
|
<code style="background:rgba(13,148,136,0.1); border:1px solid rgba(13,148,136,0.25); border-radius:5px; padding:4px 9px; font-size:11px; color:#5eead4;">AssetsPage.jsx</code>
|
|
<code style="background:rgba(13,148,136,0.1); border:1px solid rgba(13,148,136,0.25); border-radius:5px; padding:4px 9px; font-size:11px; color:#5eead4;">AssetModal.jsx</code>
|
|
<code style="background:rgba(13,148,136,0.1); border:1px solid rgba(13,148,136,0.25); border-radius:5px; padding:4px 9px; font-size:11px; color:#5eead4;">AssetAssignModal.jsx</code>
|
|
<code style="background:rgba(13,148,136,0.1); border:1px solid rgba(13,148,136,0.25); border-radius:5px; padding:4px 9px; font-size:11px; color:#5eead4;">ProduktionAssetWizard.jsx</code>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Backend -->
|
|
<div style="background:var(--surface); border:1px solid var(--border); border-top:3px solid var(--blue); border-radius:10px; padding:20px;">
|
|
<div style="display:flex; align-items:center; gap:10px; margin-bottom:14px;">
|
|
<div style="width:32px; height:32px; background:rgba(59,130,246,0.15); border-radius:8px; display:flex; align-items:center; justify-content:center; font-size:16px;">⚙️</div>
|
|
<div>
|
|
<div style="font-weight:700; font-size:14px;">Backend</div>
|
|
<div style="color:var(--muted); font-size:11px;">Express REST API</div>
|
|
</div>
|
|
</div>
|
|
<div style="text-align:center; padding:16px 0;">
|
|
<div style="font-size:42px; font-weight:800; color:var(--blue); line-height:1;">20</div>
|
|
<div style="color:var(--muted); font-size:12px; margin-top:4px;">API Endpoints</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Datenbank -->
|
|
<div style="background:var(--surface); border:1px solid var(--border); border-top:3px solid var(--yellow); border-radius:10px; padding:20px;">
|
|
<div style="display:flex; align-items:center; gap:10px; margin-bottom:14px;">
|
|
<div style="width:32px; height:32px; background:rgba(245,158,11,0.15); border-radius:8px; display:flex; align-items:center; justify-content:center; font-size:16px;">🗄️</div>
|
|
<div>
|
|
<div style="font-weight:700; font-size:14px;">Datenbank</div>
|
|
<div style="color:var(--muted); font-size:11px;">SQLite — assets Tabelle</div>
|
|
</div>
|
|
</div>
|
|
<div style="text-align:center; padding:16px 0;">
|
|
<div style="font-size:42px; font-weight:800; color:var(--yellow); line-height:1;">57</div>
|
|
<div style="color:var(--muted); font-size:12px; margin-top:4px;">Felder / Spalten</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Integrationen -->
|
|
<div style="background:var(--surface); border:1px solid var(--border); border-top:3px solid var(--purple); border-radius:10px; padding:20px;">
|
|
<div style="display:flex; align-items:center; gap:10px; margin-bottom:14px;">
|
|
<div style="width:32px; height:32px; background:rgba(168,85,247,0.15); border-radius:8px; display:flex; align-items:center; justify-content:center; font-size:16px;">🔌</div>
|
|
<div>
|
|
<div style="font-weight:700; font-size:14px;">Integrationen</div>
|
|
<div style="color:var(--muted); font-size:11px;">Extern & Intern</div>
|
|
</div>
|
|
</div>
|
|
<div style="display:flex; flex-direction:column; gap:6px;">
|
|
<div style="background:rgba(168,85,247,0.1); border:1px solid rgba(168,85,247,0.25); border-radius:5px; padding:4px 9px; font-size:11px; color:#d8b4fe; font-weight:500;">Intune (Import)</div>
|
|
<div style="background:rgba(168,85,247,0.1); border:1px solid rgba(168,85,247,0.25); border-radius:5px; padding:4px 9px; font-size:11px; color:#d8b4fe; font-weight:500;">IT Nexus Agent (Sync)</div>
|
|
<div style="background:rgba(168,85,247,0.1); border:1px solid rgba(168,85,247,0.25); border-radius:5px; padding:4px 9px; font-size:11px; color:#d8b4fe; font-weight:500;">PDF (Label + Übergabe)</div>
|
|
<div style="background:rgba(168,85,247,0.1); border:1px solid rgba(168,85,247,0.25); border-radius:5px; padding:4px 9px; font-size:11px; color:#d8b4fe; font-weight:500;">Audit-Log</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 2. Endpoints-Tabelle -->
|
|
<h3 style="font-size:15px; font-weight:600; color:var(--teal-l); margin-bottom:16px; letter-spacing:0.3px;">API Endpoints</h3>
|
|
<div style="background:var(--surface); border:1px solid var(--border); border-radius:10px; overflow:hidden; margin-bottom:40px;">
|
|
<table style="width:100%; border-collapse:collapse;">
|
|
<thead>
|
|
<tr style="background:var(--surface2); border-bottom:1px solid var(--border);">
|
|
<th style="padding:10px 16px; text-align:left; font-size:11px; font-weight:700; color:var(--muted); text-transform:uppercase; letter-spacing:0.8px; white-space:nowrap;">Methode</th>
|
|
<th style="padding:10px 16px; text-align:left; font-size:11px; font-weight:700; color:var(--muted); text-transform:uppercase; letter-spacing:0.8px;">Endpoint</th>
|
|
<th style="padding:10px 16px; text-align:left; font-size:11px; font-weight:700; color:var(--muted); text-transform:uppercase; letter-spacing:0.8px;">Beschreibung</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<!-- GET-Endpoints -->
|
|
<tr style="border-bottom:1px solid rgba(51,65,85,0.5);">
|
|
<td style="padding:9px 16px;"><span style="background:rgba(34,197,94,0.15); color:#4ade80; border:1px solid rgba(34,197,94,0.3); border-radius:4px; padding:2px 9px; font-size:11px; font-weight:700; font-family:monospace;">GET</span></td>
|
|
<td style="padding:9px 16px;"><code style="font-size:12px; color:#93c5fd;">/assets</code></td>
|
|
<td style="padding:9px 16px; color:var(--muted); font-size:13px;">Alle Assets abrufen (gefiltert nach Rollen)</td>
|
|
</tr>
|
|
<tr style="border-bottom:1px solid rgba(51,65,85,0.5);">
|
|
<td style="padding:9px 16px;"><span style="background:rgba(34,197,94,0.15); color:#4ade80; border:1px solid rgba(34,197,94,0.3); border-radius:4px; padding:2px 9px; font-size:11px; font-weight:700; font-family:monospace;">GET</span></td>
|
|
<td style="padding:9px 16px;"><code style="font-size:12px; color:#93c5fd;">/assets/mine</code></td>
|
|
<td style="padding:9px 16px; color:var(--muted); font-size:13px;">Eigene zugewiesene Assets des eingeloggten Users</td>
|
|
</tr>
|
|
<tr style="border-bottom:1px solid rgba(51,65,85,0.5);">
|
|
<td style="padding:9px 16px;"><span style="background:rgba(34,197,94,0.15); color:#4ade80; border:1px solid rgba(34,197,94,0.3); border-radius:4px; padding:2px 9px; font-size:11px; font-weight:700; font-family:monospace;">GET</span></td>
|
|
<td style="padding:9px 16px;"><code style="font-size:12px; color:#93c5fd;">/assets/:id</code></td>
|
|
<td style="padding:9px 16px; color:var(--muted); font-size:13px;">Einzelnes Asset mit allen Details</td>
|
|
</tr>
|
|
<tr style="border-bottom:1px solid rgba(51,65,85,0.5);">
|
|
<td style="padding:9px 16px;"><span style="background:rgba(34,197,94,0.15); color:#4ade80; border:1px solid rgba(34,197,94,0.3); border-radius:4px; padding:2px 9px; font-size:11px; font-weight:700; font-family:monospace;">GET</span></td>
|
|
<td style="padding:9px 16px;"><code style="font-size:12px; color:#93c5fd;">/assets/serial/:sn</code></td>
|
|
<td style="padding:9px 16px; color:var(--muted); font-size:13px;">Asset per Seriennummer suchen (Scanner-Workflow)</td>
|
|
</tr>
|
|
<tr style="border-bottom:1px solid rgba(51,65,85,0.5);">
|
|
<td style="padding:9px 16px;"><span style="background:rgba(34,197,94,0.15); color:#4ade80; border:1px solid rgba(34,197,94,0.3); border-radius:4px; padding:2px 9px; font-size:11px; font-weight:700; font-family:monospace;">GET</span></td>
|
|
<td style="padding:9px 16px;"><code style="font-size:12px; color:#93c5fd;">/assets/stats</code></td>
|
|
<td style="padding:9px 16px; color:var(--muted); font-size:13px;">Dashboard-Statistiken: Gesamtanzahl, Status-Verteilung, AfA-Summen</td>
|
|
</tr>
|
|
<!-- POST -->
|
|
<tr style="border-bottom:1px solid rgba(51,65,85,0.5); background:rgba(255,255,255,0.02);">
|
|
<td style="padding:9px 16px;"><span style="background:rgba(59,130,246,0.15); color:#60a5fa; border:1px solid rgba(59,130,246,0.3); border-radius:4px; padding:2px 9px; font-size:11px; font-weight:700; font-family:monospace;">POST</span></td>
|
|
<td style="padding:9px 16px;"><code style="font-size:12px; color:#93c5fd;">/assets</code></td>
|
|
<td style="padding:9px 16px; color:var(--muted); font-size:13px;">Neues Asset anlegen</td>
|
|
</tr>
|
|
<!-- PUT -->
|
|
<tr style="border-bottom:1px solid rgba(51,65,85,0.5);">
|
|
<td style="padding:9px 16px;"><span style="background:rgba(245,158,11,0.15); color:#fbbf24; border:1px solid rgba(245,158,11,0.3); border-radius:4px; padding:2px 9px; font-size:11px; font-weight:700; font-family:monospace;">PUT</span></td>
|
|
<td style="padding:9px 16px;"><code style="font-size:12px; color:#93c5fd;">/assets/:id</code></td>
|
|
<td style="padding:9px 16px; color:var(--muted); font-size:13px;">Asset aktualisieren (alle Felder)</td>
|
|
</tr>
|
|
<!-- DELETE -->
|
|
<tr style="border-bottom:1px solid rgba(51,65,85,0.5); background:rgba(255,255,255,0.02);">
|
|
<td style="padding:9px 16px;"><span style="background:rgba(239,68,68,0.15); color:#f87171; border:1px solid rgba(239,68,68,0.3); border-radius:4px; padding:2px 9px; font-size:11px; font-weight:700; font-family:monospace;">DELETE</span></td>
|
|
<td style="padding:9px 16px;"><code style="font-size:12px; color:#93c5fd;">/assets/:id</code></td>
|
|
<td style="padding:9px 16px; color:var(--muted); font-size:13px;">Asset löschen (nur Admin)</td>
|
|
</tr>
|
|
<!-- Assign/Unassign -->
|
|
<tr style="border-bottom:1px solid rgba(51,65,85,0.5);">
|
|
<td style="padding:9px 16px;"><span style="background:rgba(59,130,246,0.15); color:#60a5fa; border:1px solid rgba(59,130,246,0.3); border-radius:4px; padding:2px 9px; font-size:11px; font-weight:700; font-family:monospace;">POST</span></td>
|
|
<td style="padding:9px 16px;"><code style="font-size:12px; color:#93c5fd;">/assets/:id/assign</code></td>
|
|
<td style="padding:9px 16px; color:var(--muted); font-size:13px;">Asset einem User zuweisen + Übergabe-Log</td>
|
|
</tr>
|
|
<tr style="border-bottom:1px solid rgba(51,65,85,0.5); background:rgba(255,255,255,0.02);">
|
|
<td style="padding:9px 16px;"><span style="background:rgba(59,130,246,0.15); color:#60a5fa; border:1px solid rgba(59,130,246,0.3); border-radius:4px; padding:2px 9px; font-size:11px; font-weight:700; font-family:monospace;">POST</span></td>
|
|
<td style="padding:9px 16px;"><code style="font-size:12px; color:#93c5fd;">/assets/:id/unassign</code></td>
|
|
<td style="padding:9px 16px; color:var(--muted); font-size:13px;">Zuweisung aufheben + Rückgabe-Log</td>
|
|
</tr>
|
|
<tr style="border-bottom:1px solid rgba(51,65,85,0.5);">
|
|
<td style="padding:9px 16px;"><span style="background:rgba(34,197,94,0.15); color:#4ade80; border:1px solid rgba(34,197,94,0.3); border-radius:4px; padding:2px 9px; font-size:11px; font-weight:700; font-family:monospace;">GET</span></td>
|
|
<td style="padding:9px 16px;"><code style="font-size:12px; color:#93c5fd;">/assets/:id/history</code></td>
|
|
<td style="padding:9px 16px; color:var(--muted); font-size:13px;">Zuweisungs- und Änderungshistorie</td>
|
|
</tr>
|
|
<!-- Labels / PDF -->
|
|
<tr style="border-bottom:1px solid rgba(51,65,85,0.5); background:rgba(255,255,255,0.02);">
|
|
<td style="padding:9px 16px;"><span style="background:rgba(34,197,94,0.15); color:#4ade80; border:1px solid rgba(34,197,94,0.3); border-radius:4px; padding:2px 9px; font-size:11px; font-weight:700; font-family:monospace;">GET</span></td>
|
|
<td style="padding:9px 16px;"><code style="font-size:12px; color:#93c5fd;">/assets/:id/label</code></td>
|
|
<td style="padding:9px 16px; color:var(--muted); font-size:13px;">QR-Label als PDF generieren</td>
|
|
</tr>
|
|
<tr style="border-bottom:1px solid rgba(51,65,85,0.5);">
|
|
<td style="padding:9px 16px;"><span style="background:rgba(34,197,94,0.15); color:#4ade80; border:1px solid rgba(34,197,94,0.3); border-radius:4px; padding:2px 9px; font-size:11px; font-weight:700; font-family:monospace;">GET</span></td>
|
|
<td style="padding:9px 16px;"><code style="font-size:12px; color:#93c5fd;">/assets/:id/handover-protocol</code></td>
|
|
<td style="padding:9px 16px; color:var(--muted); font-size:13px;">Übergabeprotokoll als PDF generieren</td>
|
|
</tr>
|
|
<!-- Inspections -->
|
|
<tr style="border-bottom:1px solid rgba(51,65,85,0.5); background:rgba(255,255,255,0.02);">
|
|
<td style="padding:9px 16px;"><span style="background:rgba(34,197,94,0.15); color:#4ade80; border:1px solid rgba(34,197,94,0.3); border-radius:4px; padding:2px 9px; font-size:11px; font-weight:700; font-family:monospace;">GET</span></td>
|
|
<td style="padding:9px 16px;"><code style="font-size:12px; color:#93c5fd;">/assets/:id/inspections</code></td>
|
|
<td style="padding:9px 16px; color:var(--muted); font-size:13px;">Prüfberichte / Wartungsberichte abrufen</td>
|
|
</tr>
|
|
<tr style="border-bottom:1px solid rgba(51,65,85,0.5);">
|
|
<td style="padding:9px 16px;"><span style="background:rgba(59,130,246,0.15); color:#60a5fa; border:1px solid rgba(59,130,246,0.3); border-radius:4px; padding:2px 9px; font-size:11px; font-weight:700; font-family:monospace;">POST</span></td>
|
|
<td style="padding:9px 16px;"><code style="font-size:12px; color:#93c5fd;">/assets/:id/inspections</code></td>
|
|
<td style="padding:9px 16px; color:var(--muted); font-size:13px;">Neuen Prüfbericht erstellen</td>
|
|
</tr>
|
|
<!-- Sync / Intune -->
|
|
<tr style="border-bottom:1px solid rgba(51,65,85,0.5); background:rgba(255,255,255,0.02);">
|
|
<td style="padding:9px 16px;"><span style="background:rgba(59,130,246,0.15); color:#60a5fa; border:1px solid rgba(59,130,246,0.3); border-radius:4px; padding:2px 9px; font-size:11px; font-weight:700; font-family:monospace;">POST</span></td>
|
|
<td style="padding:9px 16px;"><code style="font-size:12px; color:#93c5fd;">/assets/:id/sync-agent</code></td>
|
|
<td style="padding:9px 16px; color:var(--muted); font-size:13px;">Agent-Daten manuell synchronisieren (OS, IP, Hersteller)</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:9px 16px;"><span style="background:rgba(59,130,246,0.15); color:#60a5fa; border:1px solid rgba(59,130,246,0.3); border-radius:4px; padding:2px 9px; font-size:11px; font-weight:700; font-family:monospace;">POST</span></td>
|
|
<td style="padding:9px 16px;"><code style="font-size:12px; color:#93c5fd;">/assets/import/intune</code></td>
|
|
<td style="padding:9px 16px; color:var(--muted); font-size:13px;">Massenimport aus Microsoft Intune via Graph API</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<!-- 3. DB-Felder -->
|
|
<h3 style="font-size:15px; font-weight:600; color:var(--teal-l); margin-bottom:16px; letter-spacing:0.3px;">Datenbankfelder — assets Tabelle</h3>
|
|
<div style="background:var(--surface); border:1px solid var(--border); border-radius:10px; padding:24px; margin-bottom:40px; display:flex; flex-direction:column; gap:18px;">
|
|
|
|
<!-- Basis -->
|
|
<div>
|
|
<div style="font-size:11px; font-weight:700; color:var(--muted); text-transform:uppercase; letter-spacing:0.8px; margin-bottom:10px;">Basis</div>
|
|
<div style="display:flex; flex-wrap:wrap; gap:7px;">
|
|
<span style="background:rgba(13,148,136,0.12); border:1px solid rgba(13,148,136,0.3); border-radius:5px; padding:3px 10px; font-size:12px; color:#5eead4; font-family:monospace;">id</span>
|
|
<span style="background:rgba(13,148,136,0.12); border:1px solid rgba(13,148,136,0.3); border-radius:5px; padding:3px 10px; font-size:12px; color:#5eead4; font-family:monospace;">name</span>
|
|
<span style="background:rgba(13,148,136,0.12); border:1px solid rgba(13,148,136,0.3); border-radius:5px; padding:3px 10px; font-size:12px; color:#5eead4; font-family:monospace;">type</span>
|
|
<span style="background:rgba(13,148,136,0.12); border:1px solid rgba(13,148,136,0.3); border-radius:5px; padding:3px 10px; font-size:12px; color:#5eead4; font-family:monospace;">serial_number</span>
|
|
<span style="background:rgba(13,148,136,0.12); border:1px solid rgba(13,148,136,0.3); border-radius:5px; padding:3px 10px; font-size:12px; color:#5eead4; font-family:monospace;">model</span>
|
|
<span style="background:rgba(13,148,136,0.12); border:1px solid rgba(13,148,136,0.3); border-radius:5px; padding:3px 10px; font-size:12px; color:#5eead4; font-family:monospace;">description</span>
|
|
<span style="background:rgba(13,148,136,0.12); border:1px solid rgba(13,148,136,0.3); border-radius:5px; padding:3px 10px; font-size:12px; color:#5eead4; font-family:monospace;">status</span>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Zuweisung -->
|
|
<div>
|
|
<div style="font-size:11px; font-weight:700; color:var(--muted); text-transform:uppercase; letter-spacing:0.8px; margin-bottom:10px;">Zuweisung</div>
|
|
<div style="display:flex; flex-wrap:wrap; gap:7px;">
|
|
<span style="background:rgba(59,130,246,0.12); border:1px solid rgba(59,130,246,0.3); border-radius:5px; padding:3px 10px; font-size:12px; color:#93c5fd; font-family:monospace;">assigned_to_user_id</span>
|
|
<span style="background:rgba(59,130,246,0.12); border:1px solid rgba(59,130,246,0.3); border-radius:5px; padding:3px 10px; font-size:12px; color:#93c5fd; font-family:monospace;">created_by_user_id</span>
|
|
<span style="background:rgba(59,130,246,0.12); border:1px solid rgba(59,130,246,0.3); border-radius:5px; padding:3px 10px; font-size:12px; color:#93c5fd; font-family:monospace;">updated_by_user_id</span>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Kaufdaten / AfA -->
|
|
<div>
|
|
<div style="font-size:11px; font-weight:700; color:var(--muted); text-transform:uppercase; letter-spacing:0.8px; margin-bottom:10px;">Kaufdaten / AfA</div>
|
|
<div style="display:flex; flex-wrap:wrap; gap:7px;">
|
|
<span style="background:rgba(245,158,11,0.12); border:1px solid rgba(245,158,11,0.3); border-radius:5px; padding:3px 10px; font-size:12px; color:#fcd34d; font-family:monospace;">purchase_date</span>
|
|
<span style="background:rgba(245,158,11,0.12); border:1px solid rgba(245,158,11,0.3); border-radius:5px; padding:3px 10px; font-size:12px; color:#fcd34d; font-family:monospace;">purchase_price</span>
|
|
<span style="background:rgba(245,158,11,0.12); border:1px solid rgba(245,158,11,0.3); border-radius:5px; padding:3px 10px; font-size:12px; color:#fcd34d; font-family:monospace;">useful_life_years</span>
|
|
<span style="background:rgba(245,158,11,0.12); border:1px solid rgba(245,158,11,0.3); border-radius:5px; padding:3px 10px; font-size:12px; color:#fcd34d; font-family:monospace;">residual_value</span>
|
|
<span style="background:rgba(245,158,11,0.12); border:1px solid rgba(245,158,11,0.3); border-radius:5px; padding:3px 10px; font-size:12px; color:#fcd34d; font-family:monospace;">inventory_number</span>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Wartung -->
|
|
<div>
|
|
<div style="font-size:11px; font-weight:700; color:var(--muted); text-transform:uppercase; letter-spacing:0.8px; margin-bottom:10px;">Wartung</div>
|
|
<div style="display:flex; flex-wrap:wrap; gap:7px;">
|
|
<span style="background:rgba(239,68,68,0.12); border:1px solid rgba(239,68,68,0.3); border-radius:5px; padding:3px 10px; font-size:12px; color:#fca5a5; font-family:monospace;">last_maintenance_date</span>
|
|
<span style="background:rgba(239,68,68,0.12); border:1px solid rgba(239,68,68,0.3); border-radius:5px; padding:3px 10px; font-size:12px; color:#fca5a5; font-family:monospace;">next_maintenance_date</span>
|
|
<span style="background:rgba(239,68,68,0.12); border:1px solid rgba(239,68,68,0.3); border-radius:5px; padding:3px 10px; font-size:12px; color:#fca5a5; font-family:monospace;">maintenance_interval_months</span>
|
|
<span style="background:rgba(239,68,68,0.12); border:1px solid rgba(239,68,68,0.3); border-radius:5px; padding:3px 10px; font-size:12px; color:#fca5a5; font-family:monospace;">maintenance_notes</span>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- IT / Agent -->
|
|
<div>
|
|
<div style="font-size:11px; font-weight:700; color:var(--muted); text-transform:uppercase; letter-spacing:0.8px; margin-bottom:10px;">IT / Agent</div>
|
|
<div style="display:flex; flex-wrap:wrap; gap:7px;">
|
|
<span style="background:rgba(168,85,247,0.12); border:1px solid rgba(168,85,247,0.3); border-radius:5px; padding:3px 10px; font-size:12px; color:#c4b5fd; font-family:monospace;">os</span>
|
|
<span style="background:rgba(168,85,247,0.12); border:1px solid rgba(168,85,247,0.3); border-radius:5px; padding:3px 10px; font-size:12px; color:#c4b5fd; font-family:monospace;">ip_address</span>
|
|
<span style="background:rgba(168,85,247,0.12); border:1px solid rgba(168,85,247,0.3); border-radius:5px; padding:3px 10px; font-size:12px; color:#c4b5fd; font-family:monospace;">manufacturer</span>
|
|
<span style="background:rgba(168,85,247,0.12); border:1px solid rgba(168,85,247,0.3); border-radius:5px; padding:3px 10px; font-size:12px; color:#c4b5fd; font-family:monospace;">teamviewer_id</span>
|
|
<span style="background:rgba(168,85,247,0.12); border:1px solid rgba(168,85,247,0.3); border-radius:5px; padding:3px 10px; font-size:12px; color:#c4b5fd; font-family:monospace;">last_agent_sync</span>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Organisation -->
|
|
<div>
|
|
<div style="font-size:11px; font-weight:700; color:var(--muted); text-transform:uppercase; letter-spacing:0.8px; margin-bottom:10px;">Organisation</div>
|
|
<div style="display:flex; flex-wrap:wrap; gap:7px;">
|
|
<span style="background:rgba(20,184,166,0.12); border:1px solid rgba(20,184,166,0.3); border-radius:5px; padding:3px 10px; font-size:12px; color:#2dd4bf; font-family:monospace;">department</span>
|
|
<span style="background:rgba(20,184,166,0.12); border:1px solid rgba(20,184,166,0.3); border-radius:5px; padding:3px 10px; font-size:12px; color:#2dd4bf; font-family:monospace;">location_id</span>
|
|
<span style="background:rgba(20,184,166,0.12); border:1px solid rgba(20,184,166,0.3); border-radius:5px; padding:3px 10px; font-size:12px; color:#2dd4bf; font-family:monospace;">min_stock</span>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Audit -->
|
|
<div>
|
|
<div style="font-size:11px; font-weight:700; color:var(--muted); text-transform:uppercase; letter-spacing:0.8px; margin-bottom:10px;">Audit</div>
|
|
<div style="display:flex; flex-wrap:wrap; gap:7px;">
|
|
<span style="background:rgba(100,116,139,0.15); border:1px solid rgba(100,116,139,0.35); border-radius:5px; padding:3px 10px; font-size:12px; color:var(--muted); font-family:monospace;">created_at</span>
|
|
<span style="background:rgba(100,116,139,0.15); border:1px solid rgba(100,116,139,0.35); border-radius:5px; padding:3px 10px; font-size:12px; color:var(--muted); font-family:monospace;">updated_at</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 4. Rollen-Matrix -->
|
|
<h3 style="font-size:15px; font-weight:600; color:var(--teal-l); margin-bottom:16px; letter-spacing:0.3px;">Rollen-Matrix</h3>
|
|
<div style="background:var(--surface); border:1px solid var(--border); border-radius:10px; overflow:hidden; margin-bottom:8px;">
|
|
<table style="width:100%; border-collapse:collapse;">
|
|
<thead>
|
|
<tr style="background:var(--surface2); border-bottom:1px solid var(--border);">
|
|
<th style="padding:10px 16px; text-align:left; font-size:11px; font-weight:700; color:var(--muted); text-transform:uppercase; letter-spacing:0.8px;">Rolle</th>
|
|
<th style="padding:10px 16px; text-align:left; font-size:11px; font-weight:700; color:var(--muted); text-transform:uppercase; letter-spacing:0.8px;">Lesen</th>
|
|
<th style="padding:10px 16px; text-align:left; font-size:11px; font-weight:700; color:var(--muted); text-transform:uppercase; letter-spacing:0.8px;">Erstellen</th>
|
|
<th style="padding:10px 16px; text-align:left; font-size:11px; font-weight:700; color:var(--muted); text-transform:uppercase; letter-spacing:0.8px;">Bearbeiten</th>
|
|
<th style="padding:10px 16px; text-align:left; font-size:11px; font-weight:700; color:var(--muted); text-transform:uppercase; letter-spacing:0.8px;">Zuweisen</th>
|
|
<th style="padding:10px 16px; text-align:left; font-size:11px; font-weight:700; color:var(--muted); text-transform:uppercase; letter-spacing:0.8px;">Löschen</th>
|
|
<th style="padding:10px 16px; text-align:left; font-size:11px; font-weight:700; color:var(--muted); text-transform:uppercase; letter-spacing:0.8px;">Besonderheit</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr style="border-bottom:1px solid rgba(51,65,85,0.5);">
|
|
<td style="padding:10px 16px; font-weight:600; color:var(--text);">Super Admin / Admin</td>
|
|
<td style="padding:10px 16px;"><span style="color:#4ade80;">✓</span></td>
|
|
<td style="padding:10px 16px;"><span style="color:#4ade80;">✓</span></td>
|
|
<td style="padding:10px 16px;"><span style="color:#4ade80;">✓</span></td>
|
|
<td style="padding:10px 16px;"><span style="color:#4ade80;">✓</span></td>
|
|
<td style="padding:10px 16px;"><span style="color:#4ade80;">✓</span></td>
|
|
<td style="padding:10px 16px; color:var(--muted); font-size:13px;">Vollzugriff — alle Departments</td>
|
|
</tr>
|
|
<tr style="border-bottom:1px solid rgba(51,65,85,0.5); background:rgba(255,255,255,0.02);">
|
|
<td style="padding:10px 16px; font-weight:600; color:var(--text);">Bearbeiter</td>
|
|
<td style="padding:10px 16px;"><span style="color:#4ade80;">✓</span></td>
|
|
<td style="padding:10px 16px;"><span style="color:#4ade80;">✓</span></td>
|
|
<td style="padding:10px 16px;"><span style="color:#4ade80;">✓</span></td>
|
|
<td style="padding:10px 16px;"><span style="color:#4ade80;">✓</span></td>
|
|
<td style="padding:10px 16px;"><span style="color:#ef4444;">✗</span></td>
|
|
<td style="padding:10px 16px; color:var(--muted); font-size:13px;">Kein Löschen — alle Departments</td>
|
|
</tr>
|
|
<tr style="border-bottom:1px solid rgba(51,65,85,0.5);">
|
|
<td style="padding:10px 16px; font-weight:600; color:var(--text);">Techniker</td>
|
|
<td style="padding:10px 16px;"><span style="color:#4ade80;">✓</span></td>
|
|
<td style="padding:10px 16px;"><span style="color:#fbbf24;">△</span></td>
|
|
<td style="padding:10px 16px;"><span style="color:#fbbf24;">△</span></td>
|
|
<td style="padding:10px 16px;"><span style="color:#fbbf24;">△</span></td>
|
|
<td style="padding:10px 16px;"><span style="color:#ef4444;">✗</span></td>
|
|
<td style="padding:10px 16px; color:var(--muted); font-size:13px;">Nur Department <em>Produktion</em> via ProduktionAssetWizard</td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:10px 16px; font-weight:600; color:var(--text);">Benutzer</td>
|
|
<td style="padding:10px 16px;"><span style="color:#4ade80;">✓</span></td>
|
|
<td style="padding:10px 16px;"><span style="color:#ef4444;">✗</span></td>
|
|
<td style="padding:10px 16px;"><span style="color:#ef4444;">✗</span></td>
|
|
<td style="padding:10px 16px;"><span style="color:#ef4444;">✗</span></td>
|
|
<td style="padding:10px 16px;"><span style="color:#ef4444;">✗</span></td>
|
|
<td style="padding:10px 16px; color:var(--muted); font-size:13px;">Nur eigene Assets via /assets/mine</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<div style="color:var(--muted); font-size:12px; margin-bottom:8px; padding-left:4px;">△ = Eingeschränkt auf Produktions-Department</div>
|
|
|
|
</section>
|
|
|
|
<!-- ══════════════════════════════════════════════════════════ RMM ROADMAP -->
|
|
<section id="rmm-roadmap" style="padding: 48px 32px; max-width: 1400px; margin: 0 auto;">
|
|
<div style="display:flex; align-items:center; gap:12px; margin-bottom:8px;">
|
|
<div style="width:4px; height:32px; background:var(--teal); border-radius:2px;"></div>
|
|
<h2 style="font-size:20px; font-weight:700;">RMM-Roadmap — Nächste Ausbaustufen</h2>
|
|
</div>
|
|
<p style="color:var(--muted); margin-bottom:32px; margin-left:16px;">Geplante Erweiterungen für vollständiges Remote Monitoring & Management</p>
|
|
|
|
<!-- Architektur-Übersicht -->
|
|
<h3 style="font-size:14px; font-weight:600; color:var(--teal-l); text-transform:uppercase; letter-spacing:0.05em; margin-bottom:16px;">Architektur-Übersicht: Geräteklassen & Anbindung</h3>
|
|
<div style="display:grid; grid-template-columns:repeat(auto-fit,minmax(280px,1fr)); gap:16px; margin-bottom:40px;">
|
|
|
|
<!-- Karte 1: Windows Endgeräte -->
|
|
<div style="background:var(--surface); border:1px solid var(--border); border-radius:12px; padding:24px; position:relative; overflow:hidden;">
|
|
<div style="position:absolute; top:0; left:0; right:0; height:3px; background:var(--green);"></div>
|
|
<div style="display:flex; align-items:center; gap:10px; margin-bottom:14px;">
|
|
<div style="width:36px; height:36px; background:rgba(34,197,94,0.15); border:1px solid rgba(34,197,94,0.3); border-radius:8px; display:flex; align-items:center; justify-content:center; font-size:18px;">🖥️</div>
|
|
<div>
|
|
<div style="font-weight:600; font-size:15px;">Windows Endgeräte</div>
|
|
<span style="background:rgba(34,197,94,0.15); color:#86efac; border:1px solid rgba(34,197,94,0.3); border-radius:4px; padding:2px 8px; font-size:11px; font-weight:600;">✅ Vorhanden</span>
|
|
</div>
|
|
</div>
|
|
<div style="background:var(--surface2); border-radius:8px; padding:12px; margin-bottom:12px;">
|
|
<div style="color:var(--muted); font-size:11px; margin-bottom:4px;">Lösung</div>
|
|
<div style="font-weight:600; color:var(--teal-l);">IT Nexus Agent v2.0.0</div>
|
|
</div>
|
|
<ul style="color:var(--muted); font-size:12px; line-height:1.8; list-style:none; padding:0;">
|
|
<li>• C# Agent als Windows Service</li>
|
|
<li>• Check-in alle 1 Minute (SYSTEM)</li>
|
|
<li>• Patch Management, Ankündigungen</li>
|
|
<li>• Auto-Update + Staged Rollout</li>
|
|
<li>• Intune-Deployment via .exe Installer</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<!-- Karte 2: Windows Server -->
|
|
<div style="background:var(--surface); border:1px solid var(--border); border-radius:12px; padding:24px; position:relative; overflow:hidden;">
|
|
<div style="position:absolute; top:0; left:0; right:0; height:3px; background:var(--yellow);"></div>
|
|
<div style="display:flex; align-items:center; gap:10px; margin-bottom:14px;">
|
|
<div style="width:36px; height:36px; background:rgba(245,158,11,0.15); border:1px solid rgba(245,158,11,0.3); border-radius:8px; display:flex; align-items:center; justify-content:center; font-size:18px;">🗄️</div>
|
|
<div>
|
|
<div style="font-weight:600; font-size:15px;">Windows Server</div>
|
|
<span style="background:rgba(245,158,11,0.15); color:#fcd34d; border:1px solid rgba(245,158,11,0.3); border-radius:4px; padding:2px 8px; font-size:11px; font-weight:600;">🔄 Geplant</span>
|
|
</div>
|
|
</div>
|
|
<div style="background:var(--surface2); border-radius:8px; padding:12px; margin-bottom:12px;">
|
|
<div style="color:var(--muted); font-size:11px; margin-bottom:4px;">Lösung</div>
|
|
<div style="font-weight:600; color:var(--teal-l);">IT Nexus Agent (Server-Modus)</div>
|
|
</div>
|
|
<ul style="color:var(--muted); font-size:12px; line-height:1.8; list-style:none; padding:0;">
|
|
<li>• Gleicher Agent wie auf Clients</li>
|
|
<li>• Erweitert um Server-Metriken</li>
|
|
<li>• Dienste, Eventlog, RAID, IIS/SQL</li>
|
|
<li>• Kein externes Tool nötig</li>
|
|
<li>• Alles in IT Nexus integriert</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<!-- Karte 3: Linux Server -->
|
|
<div style="background:var(--surface); border:1px solid var(--border); border-radius:12px; padding:24px; position:relative; overflow:hidden;">
|
|
<div style="position:absolute; top:0; left:0; right:0; height:3px; background:var(--blue);"></div>
|
|
<div style="display:flex; align-items:center; gap:10px; margin-bottom:14px;">
|
|
<div style="width:36px; height:36px; background:rgba(59,130,246,0.15); border:1px solid rgba(59,130,246,0.3); border-radius:8px; display:flex; align-items:center; justify-content:center; font-size:18px;">🐧</div>
|
|
<div>
|
|
<div style="font-weight:600; font-size:15px;">Linux Server</div>
|
|
<span style="background:rgba(245,158,11,0.15); color:#fcd34d; border:1px solid rgba(245,158,11,0.3); border-radius:4px; padding:2px 8px; font-size:11px; font-weight:600;">🔄 Geplant</span>
|
|
</div>
|
|
</div>
|
|
<div style="background:var(--surface2); border-radius:8px; padding:12px; margin-bottom:12px;">
|
|
<div style="color:var(--muted); font-size:11px; margin-bottom:4px;">Lösung</div>
|
|
<div style="font-weight:600; color:var(--teal-l);">SSH direkt aus IT Nexus</div>
|
|
</div>
|
|
<ul style="color:var(--muted); font-size:12px; line-height:1.8; list-style:none; padding:0;">
|
|
<li>• Kein extra Tool erforderlich</li>
|
|
<li>• SSH-Polling direkt aus Backend</li>
|
|
<li>• CPU, RAM, Disk, Dienste</li>
|
|
<li>• Unterstützt Proxmox LXC + VMs</li>
|
|
<li>• Key-basierte Auth (kein Passwort)</li>
|
|
</ul>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<!-- Feature-Tabelle -->
|
|
<h3 style="font-size:14px; font-weight:600; color:var(--teal-l); text-transform:uppercase; letter-spacing:0.05em; margin-bottom:16px;">Was kommt als nächstes</h3>
|
|
<div style="background:var(--surface); border:1px solid var(--border); border-radius:12px; overflow:hidden; margin-bottom:28px;">
|
|
<table style="width:100%; border-collapse:collapse;">
|
|
<thead>
|
|
<tr style="background:var(--surface2); border-bottom:1px solid var(--border);">
|
|
<th style="padding:12px 16px; text-align:left; font-size:12px; font-weight:600; color:var(--muted); text-transform:uppercase; letter-spacing:0.05em; white-space:nowrap;">Feature</th>
|
|
<th style="padding:12px 16px; text-align:left; font-size:12px; font-weight:600; color:var(--muted); text-transform:uppercase; letter-spacing:0.05em;">Beschreibung</th>
|
|
<th style="padding:12px 16px; text-align:left; font-size:12px; font-weight:600; color:var(--muted); text-transform:uppercase; letter-spacing:0.05em; white-space:nowrap;">Aufwand</th>
|
|
<th style="padding:12px 16px; text-align:left; font-size:12px; font-weight:600; color:var(--muted); text-transform:uppercase; letter-spacing:0.05em; white-space:nowrap;">Priorität</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr style="border-bottom:1px solid var(--border);">
|
|
<td style="padding:12px 16px; font-weight:600; white-space:nowrap; color:var(--text);">Fernzugriff</td>
|
|
<td style="padding:12px 16px; color:var(--muted); font-size:13px;">MeshCentral self-hosted (Docker), API-Link aus IT Nexus direkt in Session</td>
|
|
<td style="padding:12px 16px;"><span style="background:rgba(245,158,11,0.15); color:#fcd34d; border:1px solid rgba(245,158,11,0.3); border-radius:4px; padding:3px 10px; font-size:11px; font-weight:600; white-space:nowrap;">Mittel</span></td>
|
|
<td style="padding:12px 16px;"><span style="background:rgba(239,68,68,0.15); color:#fca5a5; border:1px solid rgba(239,68,68,0.3); border-radius:4px; padding:3px 10px; font-size:11px; font-weight:600; white-space:nowrap;">🔴 Hoch</span></td>
|
|
</tr>
|
|
<tr style="border-bottom:1px solid var(--border);">
|
|
<td style="padding:12px 16px; font-weight:600; white-space:nowrap; color:var(--text);">Backup-Monitoring</td>
|
|
<td style="padding:12px 16px; color:var(--muted); font-size:13px;">Agent meldet Veeam/Windows Backup Status; IT Nexus zeigt letztes Backup + Erfolg/Fehler</td>
|
|
<td style="padding:12px 16px;"><span style="background:rgba(34,197,94,0.15); color:#86efac; border:1px solid rgba(34,197,94,0.3); border-radius:4px; padding:3px 10px; font-size:11px; font-weight:600; white-space:nowrap;">Klein</span></td>
|
|
<td style="padding:12px 16px;"><span style="background:rgba(239,68,68,0.15); color:#fca5a5; border:1px solid rgba(239,68,68,0.3); border-radius:4px; padding:3px 10px; font-size:11px; font-weight:600; white-space:nowrap;">🔴 Hoch</span></td>
|
|
</tr>
|
|
<tr style="border-bottom:1px solid var(--border);">
|
|
<td style="padding:12px 16px; font-weight:600; white-space:nowrap; color:var(--text);">Server-Monitoring</td>
|
|
<td style="padding:12px 16px; color:var(--muted); font-size:13px;">IT Nexus Agent v2.0.0 auf Windows Servern deployen — Server-spezifische Metriken: Dienste-Status, Eventlog-Fehler, RAID, Windows Update</td>
|
|
<td style="padding:12px 16px;"><span style="background:rgba(34,197,94,0.15); color:#86efac; border:1px solid rgba(34,197,94,0.3); border-radius:4px; padding:3px 10px; font-size:11px; font-weight:600; white-space:nowrap;">Klein</span></td>
|
|
<td style="padding:12px 16px;"><span style="background:rgba(239,68,68,0.15); color:#fca5a5; border:1px solid rgba(239,68,68,0.3); border-radius:4px; padding:3px 10px; font-size:11px; font-weight:600; white-space:nowrap;">🔴 Hoch</span></td>
|
|
</tr>
|
|
<tr style="border-bottom:1px solid var(--border);">
|
|
<td style="padding:12px 16px; font-weight:600; white-space:nowrap; color:var(--text);">Linux Server Monitoring</td>
|
|
<td style="padding:12px 16px; color:var(--muted); font-size:13px;">SSH-basiertes Polling (CPU, RAM, Disk, Dienste) direkt aus Backend</td>
|
|
<td style="padding:12px 16px;"><span style="background:rgba(245,158,11,0.15); color:#fcd34d; border:1px solid rgba(245,158,11,0.3); border-radius:4px; padding:3px 10px; font-size:11px; font-weight:600; white-space:nowrap;">Mittel</span></td>
|
|
<td style="padding:12px 16px;"><span style="background:rgba(245,158,11,0.15); color:#fcd34d; border:1px solid rgba(245,158,11,0.3); border-radius:4px; padding:3px 10px; font-size:11px; font-weight:600; white-space:nowrap;">🟡 Mittel</span></td>
|
|
</tr>
|
|
<tr style="border-bottom:1px solid var(--border);">
|
|
<td style="padding:12px 16px; font-weight:600; white-space:nowrap; color:var(--text);">Health-Score</td>
|
|
<td style="padding:12px 16px; color:var(--muted); font-size:13px;">Pro Gerät/Kunde: Gewichteter Score aus Patch-Status, Backup, Online, Defender</td>
|
|
<td style="padding:12px 16px;"><span style="background:rgba(168,85,247,0.15); color:#d8b4fe; border:1px solid rgba(168,85,247,0.3); border-radius:4px; padding:3px 10px; font-size:11px; font-weight:600; white-space:nowrap;">Groß</span></td>
|
|
<td style="padding:12px 16px;"><span style="background:rgba(100,116,139,0.2); color:var(--muted); border:1px solid var(--border); border-radius:4px; padding:3px 10px; font-size:11px; font-weight:600; white-space:nowrap;">⚪ Niedrig</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td style="padding:12px 16px; font-weight:600; white-space:nowrap; color:var(--text);">Multi-Tenant</td>
|
|
<td style="padding:12px 16px; color:var(--muted); font-size:13px;">Kundenmandanten trennen — Grundstruktur für MSP-Betrieb</td>
|
|
<td style="padding:12px 16px;"><span style="background:rgba(168,85,247,0.15); color:#d8b4fe; border:1px solid rgba(168,85,247,0.3); border-radius:4px; padding:3px 10px; font-size:11px; font-weight:600; white-space:nowrap;">Groß</span></td>
|
|
<td style="padding:12px 16px;"><span style="background:rgba(100,116,139,0.2); color:var(--muted); border:1px solid var(--border); border-radius:4px; padding:3px 10px; font-size:11px; font-weight:600; white-space:nowrap;">⚪ Niedrig</span></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<!-- Hinweis-Box -->
|
|
<div style="background:rgba(13,148,136,0.1); border:1px solid rgba(13,148,136,0.4); border-left:4px solid var(--teal); border-radius:8px; padding:16px 20px; display:flex; gap:14px; align-items:flex-start;">
|
|
<div style="font-size:20px; margin-top:1px; flex-shrink:0;">💡</div>
|
|
<div>
|
|
<div style="font-weight:600; color:var(--teal-l); margin-bottom:4px;">Server-Empfehlung: IT Nexus Agent auf Windows Servern</div>
|
|
<div style="color:var(--muted); font-size:13px; line-height:1.6;">
|
|
Bestehenden <strong style="color:var(--text);">IT Nexus Agent (v2.0.0)</strong> auch auf Windows Servern deployen. In zukünftigen Versionen Server-spezifische Metriken ergänzen — kein externes Tool, alles in IT Nexus integriert.
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</section>
|
|
|
|
</body>
|
|
</html>
|