Seventeen releases since the site was last brought up to date, checked against the changelog and the code at the v0.28.0 tag. - New feature sections: Security Assessment (TLS/SSH grades, CVE and container-image matching, exposure, deep scans; Knowledge Base licence), Vulnerability Management (triage queue, decisions with reasons, deferrals that come back, verified fixes), DHCP, Managed Services, Notifications (Signal). - Existing sections gain per-user SSH keys and session windows, multi-role devices, one device per address per site, LAN Scan, MAC-table topology, service checks, site reachability, per-site firewall profiles with diff, honoured drift auto-correct, 16 Ansible roles, 18 dashboard widgets. - Corrections: Docker status is Linux/OMV/QNAP, not Proxmox. - Roadmap: CVE tracking shipped and is gone from "Planned"; a "Next release" group lists what is on main but unreleased (CrowdSec across sites, Windows driver, single-use console tickets, reboots refused instead of faked). - NIS2: Art. 21 (2e) now describes the vulnerability handling that exists, (2i) adds attributable terminal sessions; CVE tracking left "coming". - Persona pages: two new items each, counts updated. Glossary: Kea, WinRM, LAPI. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
125 lines
9.1 KiB
TypeScript
125 lines
9.1 KiB
TypeScript
import { Link } from 'react-router-dom'
|
|
import { ServerStackIcon } from '@heroicons/react/24/outline'
|
|
import { useLang } from '../context/LangContext'
|
|
import { linkify } from '../lib/glossary'
|
|
|
|
type Item = { title: string; body: string }
|
|
|
|
const SECTION_LABELS: Record<'en' | 'de', { pain: string; features: string; drivers: string }> = {
|
|
en: { pain: 'Your day today', features: 'Where netOrk helps', drivers: 'Runs on what you already have' },
|
|
de: { pain: 'Euer Alltag heute', features: 'Wo netOrk hilft', drivers: 'Läuft auf dem, was ihr schon habt' },
|
|
}
|
|
|
|
const PAIN_POINTS: Record<'en' | 'de', Item[]> = {
|
|
en: [
|
|
{ title: 'A different admin UI per vendor', body: 'OPNsense here, HP ProCurve there, a separate tab for OpenWRT and Proxmox. Every task starts with figuring out which UI to open.' },
|
|
{ title: 'No single view of what\'s running where', body: 'Vendor, model, firmware, and status per device live in nobody\'s head — or a spreadsheet that\'s already out of date.' },
|
|
{ title: 'Config changes with no audit trail', body: 'Someone tweaks a firewall rule directly on the device. Nobody documents it. It breaks something three weeks later.' },
|
|
{ title: 'Manual SSH just to check a VLAN', body: 'Verifying interface status or VLAN membership means logging into the device directly, every time.' },
|
|
],
|
|
de: [
|
|
{ title: 'Für jeden Hersteller eine andere Oberfläche', body: 'OPNsense hier, HP ProCurve dort, ein eigener Tab für OpenWRT und Proxmox. Jede Aufgabe beginnt damit, herauszufinden, welche UI überhaupt zuständig ist.' },
|
|
{ title: 'Keine einzige Ansicht, was wo läuft', body: 'Hersteller, Modell, Firmware und Status pro Gerät stehen in niemandes Kopf — oder in einer Tabelle, die längst veraltet ist.' },
|
|
{ title: 'Konfigurationsänderungen ohne Audit-Trail', body: 'Jemand ändert eine Firewall-Regel direkt am Gerät. Niemand dokumentiert es. Drei Wochen später bricht etwas.' },
|
|
{ title: 'Manuelles SSH nur um ein VLAN zu prüfen', body: 'Um Interface-Status oder VLAN-Zugehörigkeit zu verifizieren, muss man sich jedes Mal direkt am Gerät einloggen.' },
|
|
],
|
|
}
|
|
|
|
const FEATURES: Record<'en' | 'de', Item[]> = {
|
|
en: [
|
|
{ title: 'Device Management', body: 'CRUD for every device with credential profiles and SSH key management. Vendor, model, and OS auto-populate from NAPALM get_facts() — no manual data entry.' },
|
|
{ title: 'Config drift detection & one-click fix', body: 'Every poll compares device state against the desired state in netOrk. Drifted devices get a warning; fixing it streams live SSH output straight to the browser.' },
|
|
{ title: 'Git-backed config history', body: 'Every poll snapshots the config into a local Git repository — full history, side-by-side diffs between any two points in time, and one-click restore for OPNsense.' },
|
|
{ title: 'Ansible automation', body: '16 built-in roles (base, docker, adguard, wireguard, fail2ban, a mail server, and more) with automatic dependency resolution. Write your own roles too, with full run history per device.' },
|
|
{ title: 'VM Provisioning', body: 'Cloud-Init VMs on Proxmox straight from the hypervisor\'s VMs tab — pick an image, a VLAN, and an IP, and netOrk handles the DHCP reservation and Device linking.' },
|
|
{ title: 'Dashboards', body: 'Configurable, shareable dashboards built from 18 widgets on a WYSIWYG grid — replace the fixed layout with the view your team actually needs.' },
|
|
{ title: 'Security assessment per device', body: 'TLS and SSH graded A to F, installed software and container images matched against known vulnerabilities, hardening benchmarks, and which networks can reach the device — without an agent on it.' },
|
|
{ title: 'Vulnerability triage with owners', body: 'One queue across all devices, ordered by what is exploited and overdue. Every decision needs a reason; accepting a risk needs a permission operators do not have, and fixes are verified by the next assessments.' },
|
|
],
|
|
de: [
|
|
{ title: 'Geräteverwaltung', body: 'CRUD für jedes Gerät mit Credential-Profilen und SSH-Schlüsselverwaltung. Hersteller, Modell und OS werden automatisch über NAPALM get_facts() befüllt — keine manuelle Eingabe.' },
|
|
{ title: 'Konfigurationsdrift-Erkennung & Ein-Klick-Fix', body: 'Bei jedem Poll wird der Gerätezustand mit dem Sollzustand in netOrk verglichen. Abweichende Geräte erhalten eine Warnung; der Fix streamt Live-SSH-Output direkt in den Browser.' },
|
|
{ title: 'Git-basierte Konfigurationshistorie', body: 'Bei jedem Poll wird die Konfiguration in ein lokales Git-Repository gesnapshottet — vollständige Historie, Side-by-Side-Diffs zwischen beliebigen Zeitpunkten und Ein-Klick-Restore für OPNsense.' },
|
|
{ title: 'Ansible-Automatisierung', body: '16 eingebaute Rollen (base, docker, adguard, wireguard, fail2ban, ein Mailserver und mehr) mit automatischer Abhängigkeitsauflösung. Eigene Rollen schreiben inklusive vollständiger Lauf-Historie pro Gerät.' },
|
|
{ title: 'VM-Provisioning', body: 'Cloud-Init-VMs auf Proxmox direkt aus dem VMs-Tab des Hypervisors — Image, VLAN und IP auswählen, netOrk übernimmt DHCP-Reservierung und Geräteverknüpfung.' },
|
|
{ title: 'Dashboards', body: 'Konfigurierbare, teilbare Dashboards aus 18 Widgets auf einem WYSIWYG-Grid — statt festem Layout die Ansicht, die euer Team wirklich braucht.' },
|
|
{ title: 'Sicherheitsbewertung pro Gerät', body: 'TLS und SSH mit Note A bis F, installierte Software und Container-Images gegen bekannte Schwachstellen abgeglichen, Härtungs-Benchmarks, und welche Netze das Gerät erreichen — ohne Agent darauf.' },
|
|
{ title: 'Schwachstellen-Triage mit Verantwortlichen', body: 'Eine Queue über alle Geräte, geordnet nach Ausgenutztem und Überfälligem. Jede Entscheidung braucht eine Begründung; ein Risiko zu akzeptieren braucht eine Berechtigung, die Operatoren nicht haben, und Behebungen verifizieren die nächsten Bewertungen.' },
|
|
],
|
|
}
|
|
|
|
export default function ForItDepartment() {
|
|
const { lang, t } = useLang()
|
|
const labels = SECTION_LABELS[lang]
|
|
const painPoints = PAIN_POINTS[lang]
|
|
const features = FEATURES[lang]
|
|
|
|
return (
|
|
<div className="py-16 md:py-24">
|
|
<div className="max-w-4xl mx-auto px-6">
|
|
|
|
<div className="mb-16">
|
|
<div className="mb-4 flex h-10 w-10 items-center justify-center rounded-lg bg-sky-600/10">
|
|
<ServerStackIcon className="h-5 w-5 text-sky-400" />
|
|
</div>
|
|
<h1 className="text-4xl md:text-5xl font-bold text-slate-100 mb-4">{t.forItDepartment.heading}</h1>
|
|
<p className="text-base text-slate-400 leading-relaxed max-w-2xl">{linkify(t.forItDepartment.sub)}</p>
|
|
</div>
|
|
|
|
<div className="mb-20">
|
|
<h2 className="text-xl font-semibold text-slate-200 mb-6 pb-2 border-b border-slate-800">
|
|
{labels.pain}
|
|
</h2>
|
|
<div className="grid sm:grid-cols-2 gap-6">
|
|
{painPoints.map((p) => (
|
|
<div key={p.title} className="rounded-xl border border-slate-800 bg-slate-900 p-5">
|
|
<p className="text-sm font-semibold text-slate-200 mb-1.5">{p.title}</p>
|
|
<p className="text-sm text-slate-500 leading-relaxed">{linkify(p.body)}</p>
|
|
</div>
|
|
))}
|
|
</div>
|
|
</div>
|
|
|
|
<div className="mb-20">
|
|
<h2 className="text-xl font-semibold text-slate-200 mb-6 pb-2 border-b border-slate-800">
|
|
{labels.features}
|
|
</h2>
|
|
<div className="grid sm:grid-cols-2 gap-6">
|
|
{features.map((f) => (
|
|
<div key={f.title} className="rounded-xl border border-slate-800 bg-slate-900 p-5">
|
|
<p className="text-sm font-semibold text-slate-200 mb-1.5">{f.title}</p>
|
|
<p className="text-sm text-slate-500 leading-relaxed">{linkify(f.body)}</p>
|
|
</div>
|
|
))}
|
|
</div>
|
|
</div>
|
|
|
|
<div className="mb-20">
|
|
<h2 className="text-xl font-semibold text-slate-200 mb-4 pb-2 border-b border-slate-800">
|
|
{labels.drivers}
|
|
</h2>
|
|
<p className="text-sm text-slate-400 leading-relaxed mb-4">
|
|
{lang === 'en'
|
|
? 'Custom NAPALM drivers for 15 device types, plus the built-in NAPALM drivers.'
|
|
: 'Eigene NAPALM-Treiber für 15 Gerätetypen, plus die integrierten NAPALM-Treiber.'}
|
|
</p>
|
|
<Link to="/drivers" className="text-sky-400 hover:text-sky-300 transition-colors text-sm font-medium">
|
|
{lang === 'en' ? 'Full driver reference →' : 'Vollständige Treiberreferenz →'}
|
|
</Link>
|
|
</div>
|
|
|
|
<div className="rounded-xl border border-slate-800 bg-slate-900 p-8 text-center">
|
|
<h2 className="text-xl font-semibold text-slate-100 mb-3">{t.forItDepartment.cta.heading}</h2>
|
|
<p className="text-sm text-slate-400 leading-relaxed mb-6 max-w-md mx-auto">{t.forItDepartment.cta.body}</p>
|
|
<Link
|
|
to="/docs/getting-started"
|
|
className="inline-flex items-center gap-2 px-5 py-2.5 rounded-lg bg-sky-600 hover:bg-sky-500 text-white text-sm font-medium transition-colors"
|
|
>
|
|
{t.forItDepartment.cta.button}
|
|
</Link>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|