Daten importieren

Excel-Import mit allen Tabellenblättern, Spalten und der Referenz-Syntax, Markdown- und YAML-Import für Regulierungen sowie alle Artisan-Befehle von swark.

Überblick

Weg Befehl Für
Excel-Import php artisan swark:import:datamodel <pfad> Fast alle strukturierten Daten (Strategie, Compliance, Auditing, Infrastruktur)
Markdown/YAML-Import derselbe Befehl, Unterordner regulations/ Regulierungen mit Kapiteln und Controls
Content-Import php artisan swark:import:content <pfad> Texte in die Tabelle content (im Frontend kaum wirksam, siehe Kapitel Content)

Alle Befehle laufen im Container im Verzeichnis /var/www/html (bei Instanzen von Nerd-IT führt das Betriebsteam den Import aus).

Der Befehl swark:import:datamodel

php artisan swark:import:datamodel <pfad> [--governance] [--compliance] [--it] [--auditing] [--markdown-only]
Argument / Option Wirkung
<pfad> Ordner mit einer Datei import.xlsx (und optional einem Unterordner regulations/) oder direkt der Pfad zu einer .xlsx-Datei; dann gilt deren Ordner als Wurzel
keine Kategorie-Option Alle Kategorien werden importiert
--governance, --compliance, --it, --auditing Nur diese Kategorien (plus immer die Grunddaten)
--markdown-only Excel überspringen, nur den Ordner regulations/ einlesen

Ablauf:

  1. Excel (falls vorhanden und nicht --markdown-only): Blätter werden über ihren Namen gefunden und in fester Reihenfolge eingelesen. Fehlt ein Blatt einer aktivierten Kategorie, bricht der Import mit «Specified sheet 'X' does not exist» ab. Zusätzliche Blätter werden ignoriert. Der Excel-Import läuft in einer Datenbanktransaktion; bei einem Fehler wird er vollständig zurückgerollt.
  2. Markdown/YAML: Unterordner regulations/ (nur wenn Kategorie Compliance aktiv ist).
  3. Nachlauf: Bei aktiver Kategorie Compliance werden die Geltungsbereiche aller Regeln neu ermittelt.

Fehlt import.xlsx, erscheint eine Warnung und der Import fährt mit Schritt 2 fort.

Verhalten bei wiederholtem Import

  • Objekte werden über ihre Scomp-ID gefunden und aktualisiert (Upsert). Objekte ohne Scomp-Spalte werden über ihre natürlichen Schlüssel gefunden (zum Beispiel Release über Software und Version).
  • Es wird nichts gelöscht: Zeilen, die aus der Excel-Datei entfernt wurden, bleiben in der Datenbank.
  • Zuordnungen von Findings, Massnahmen und KPIs werden je Zeile gelöscht und neu geschrieben, ebenso die Messung eines KPI.
  • Für einen sauberen Neuaufbau: Datenbank leeren (php artisan migrate:fresh --force) und neu importieren. Das löscht auch alle Benutzer und alle im Admin-Bereich erfassten Daten.

Kategorien und Reihenfolge

Die Reihenfolge der Blätter in der Datei ist egal; swark liest in dieser Reihenfolge:

Schritt Kategorie Blätter
1 immer (Grunddaten) Technologies, Criticality, Protection goals, Data classifications
2 compliance Regulations, Regulation chapters, Regulation controls
3 auditing Scope templates, Policies, Rules
4 governance Strategies, Strategy questions, Strategy objectives, Measurement periods
5 it Actors, Logical zones, Stages, Protocol stacks, Resource types, Software, Systems, Releases, Managed accounts, Managed offers, Managed subscriptions, Baremetals, Clusters, Hosts, Runtimes, Application instances, danach zweite Durchgänge: Cluster-Mitglieder (Blatt Clusters), Hosts in Clustern (Blatt Hosts), Ressourcennutzung und Verbindungen (Blatt Application instances)
6 governance + auditing + compliance Findings, Actions
7 governance + auditing Metrics

Wer nur eine Kategorie importiert, braucht nur die Blätter dieser Kategorie und der Grunddaten. Referenzen auf Objekte aus nicht importierten Kategorien funktionieren nur innerhalb desselben Laufs; ein Blatt kann nur auf Scomp-IDs verweisen, die im selben Importlauf schon eingelesen wurden (Ausnahme: Resource Type db-schema, siehe unten).

Aufbau eines Blatts

  • Die ersten 1 bis 3 Zeilen sind Kopfzeilen; ihre Anzahl ist je Blatt fest (Spalte «Kopf» in den Tabellen unten). Die Daten beginnen in der Zeile danach.
  • Spalten werden über ihre Position (A, B, C …) gelesen, nicht über die Überschrift. Die Überschriften dürfen frei formuliert sein, die Reihenfolge nicht.
  • Leere Zeilen werden übersprungen.
  • Pflichtfelder (in den Tabellen mit «Pflicht» markiert): Ist die Zelle leer, bricht der Import mit «Invalid empty string at [Sheet:'…',row:…,col:…]» ab.
  • Spalten mit dem Vermerk «nicht importiert» werden gelesen, aber nicht gespeichert.
  • Datumswerte am besten als Text im Format JJJJ-MM-TT (oder TT.MM.JJJJ) eingeben, nicht als Excel-Datumszahl.

Referenz-Syntax

Die zweite Kopfzeile vieler Blätter beschreibt, was in eine Spalte gehört. Die Notation:

Schreibweise Bedeutung Beispiel
${typ.scomp_id} Scomp-ID eines Objekts dieses Typs ${stage.scomp_id} → prod
${a.scomp_id}:${b.scomp_id} Zusammengesetzter Schlüssel, Teile mit Doppelpunkt ${software.scomp_id}:${release.scomp_id} → debian:12
typ:… Typisierte Referenz: der Typ steht als erstes Element strategy_question:2029:techstack
* Mehrere Werte, durch Komma getrennt ${actor.scomp_id}* → it,devops
? Optional, darf leer bleiben ${technology.scomp_id}?
a \| b Alternativen ${baremetal.scomp_id \| host.scomp_id}

Besondere Schlüssel:

  • <software>:latest verweist auf die Release, die beim Einlesen der Software als «latest» markiert war. Beim ersten Import ist das die automatisch angelegte Platzhalter-Release *.
  • <technologie>:latest verweist auf die automatisch angelegte Version latest einer Technologie.
  • Regulierungskapitel: <regulierung>:<kapitelnummer>, Controls: <regulierung>:<control-id>, Fragen und Ziele: <strategie>:<scomp-id> (Ziele zusätzlich auch nur <scomp-id>).
  • Protokoll-Stacks werden über ihren Namen in Kleinbuchstaben angesprochen (zum Beispiel https, json/rest over https).
  • Logische Zonen sind in Klein- und Grossschreibung ansprechbar (intern und INTERN).

Verweist eine Zelle auf einen unbekannten Schlüssel, bricht der Import mit «Key 'x' of type 'y' is not registered» ab und listet die bekannten Werte.

Die Tabellenblätter

Das Beispiel-Workbook der Demo (Importvorlage mit Lumen-Daten herunterladen) enthält alle 33 Blätter. Spalten der Reihe nach ab A.

Grunddaten

Technologies (Kopf: 1)

Spalte Inhalt
A Name Pflicht
B Scomp-ID Pflicht
C Type protocol, language, framework, data-format, concept, other
D Versions Versionen, durch Komma getrennt, zum Beispiel 1.2,1.3

Beispiel: TLS | tls | protocol | 1.2,1.3. Hinweis: Protokoll-Stacks im Demo-Datensatz verweisen auf eine Technologie any, die deshalb ebenfalls angelegt sein muss.

Criticality (Kopf: 1)

Spalte Inhalt
A Name Anzeigename, zum Beispiel Hoch
B Scomp-ID Pflicht
C Position Zahl für die Reihenfolge; leer = Zeilennummer

Protection goals (Kopf: 1)

Spalte Inhalt
A Name zum Beispiel Vertraulichkeit
B Scomp-ID Pflicht
C Description Text
D Levels Pflicht; Stufen durch Komma, aufsteigend, zum Beispiel Normal,Hoch,Sehr hoch

Data classifications (Kopf: 1)

Spalte Inhalt
A Name zum Beispiel Vertraulich
B Scomp-ID Pflicht
C Description Text

Compliance

Regulations (Kopf: 1): A Name, B Scomp-ID (Pflicht).

Regulation chapters (Kopf: 2)

Spalte Inhalt
A Chapter number Pflicht; muss über alle Excel-Regulierungen eindeutig sein
B Regulation Pflicht; ${regulation.scomp_id}
C Name Überschrift
D Official content Amtlicher Text
E Actual status Ist-Zustand
F Target status Soll-Zustand

Regulation controls (Kopf: 2)

Spalte Inhalt
A Control ID Pflicht
B Regulation / Chapter Pflicht; ${regulation.scomp_id} oder ${regulation.scomp_id}:${kapitelnummer}, zum Beispiel vait:1.2.d
C Name Pflicht
D Content Text

Auditing

Scope templates (Kopf: 1)

Spalte Inhalt
A Name
B Scomp-ID Pflicht
C Description
D Instance of / Class PHP-Klasse; in 0.2.1 nur Swark\DataModel\Infrastructure\Repository\Scope\ItemsByScompId
E Instance parameters JSON, zum Beispiel {"type":"logical_zone"}
F Template options JSON, optional

Policies (Kopf: 1): A Name, B Scomp-ID (Pflicht), C Description (Markdown).

Rules (Kopf: 2)

Spalte Inhalt
A Name
B Policy Pflicht; ${policy.scomp_id}
C Scomp-ID Pflicht
D Description HTML-Text
E Referenced scopes Pflicht; je Zeile in der Zelle <scope_template-scomp-id>:<JSON-Optionen>, mehrere durch Zeilenumbruch

Beispiel E: logical-zones-by-scomp-id:{"scomp_ids":["b2x"]}.

Governance

Strategies (Kopf: 1): A Name, B Scomp-ID (Pflicht).

Strategy questions (Kopf: 2)

Spalte Inhalt
A Name Frage
B Scomp-ID Pflicht
C Strategy Pflicht; genau eine ${strategy.scomp_id}. Die Kopfzeile spricht von mehreren Strategien; in 0.2.1 wird nur ein Wert unterstützt.

Strategy objectives (Kopf: 2)

Spalte Inhalt
A Name
B Scomp-ID Pflicht
C Description Markdown
D Reason Begründung
E Strategy Pflicht; ${strategy.scomp_id}
F Answers questions optional, Komma-Liste aus strategy_question:<strategie>:<frage> und regulation_chapter:<regulierung>:<kapitel>

Measurement periods (Kopf: 2)

Spalte Inhalt
A Name zum Beispiel 2025 1. Halbjahr
B Scomp-ID Pflicht
C Description
D Begin at Datum (Pflichtfeld in der Datenbank)
E End at Datum

Die erste Periode im Blatt ist die Standardperiode für alle Messungen aus dem Blatt «Metrics».

Findings, Massnahmen, Metriken

Findings (Kopf: 2)

Spalte Inhalt
A Name
B Scomp-ID Pflicht
C Description Markdown
D Control Komma-Liste aus regulation_control:<regulierung>:<control-id> und strategy_objective:<strategie>:<ziel>
E References nicht importiert
F Criticality ${criticality.scomp_id} (Priorität)

Actions (Kopf: 2)

Spalte Inhalt
A Name
B Scomp-ID Pflicht
C Description Markdown
D Actionable Komma-Liste aus strategy_objective:<strategie>:<ziel>, regulation_control:<regulierung>:<control-id>, finding:<scomp-id>
E References nicht importiert
F Begin at Datum
G End at / Duration Dauer relativ zum Beginn, zum Beispiel 4w, 3 months, 10 days. Ohne Beginn bleibt das Ende leer. Ein festes Enddatum ist hier nicht möglich (im Admin-Bereich schon).

Metrics (Kopf: 2)

Spalte Inhalt
A Name
B Scomp-ID Pflicht
C Description
D Type boolean, decimal, percentage, time_seconds, time_minutes, time_hours, time_days
E Precision Nachkommastellen, leer = 0
F Goal direction higher oder lower
G Goal value Zielwert; nur wenn gesetzt, entstehen KPI und Messung
H Threshold 1 Schwellwert; gesetzt = Metrik ist messbar
I Threshold 2 Schwellwert; leer = Metrik gilt als Systemparameter
J Assigned Komma-Liste aus action:<scomp-id> und strategy_objective:<strategie>:<ziel>
K Current value Aktueller Wert in der Standardperiode

Infrastruktur und Architektur (Kategorie it)

Actors (Kopf: 1): A Name, B Scomp-ID (Pflicht).

Logical zones (Kopf: 2)

Spalte Inhalt
A Name zum Beispiel CORE
B Scomp-ID Pflicht
C Description
D Data classification ${data_classification.scomp_id}
E Actors ${actor.scomp_id}*
F Allow access to ${logical_zone.scomp_id}* (Zielzonen)
G Deny access to ${logical_zone.scomp_id}*; ohne Eintrag gilt ohnehin «verweigert»

Die Zugriffsregeln werden erst nach allen Zonen eingelesen; Vorwärtsverweise auf spätere Zeilen sind daher erlaubt.

Stages (Kopf: 1): A Name (Pflicht), B Scomp-ID (Pflicht).

Protocol stacks (Kopf: 2)

Spalte Inhalt
A Name Pflicht; der Name in Kleinbuchstaben ist der Schlüssel für Verweise
B Port Standard-Port (ganze Zahl)
C Application layer ${technology.scomp_id}, typischerweise Typ data-format
D Presentation layer ${technology.scomp_id}
E Session layer ${technology.scomp_id}
F Transport layer ${technology.scomp_id}
G Network layer ${technology.scomp_id}

In 0.2.1 müssen alle fünf Schichtspalten befüllt sein; eine leere Zelle führt zum Abbruch.

Resource types (Kopf: 2)

Spalte Inhalt
A Name Pflicht
B Scomp-ID Pflicht
C Technology ${technology.scomp_id}?

Pflichteintrag: Ein Resource Type mit der Scomp-ID db-schema muss existieren (in diesem Blatt oder schon in der Datenbank), sobald die Kategorie it importiert wird. Sonst bricht der Import beim Blatt «Application instances» ab.

Software (Kopf: 1)

Spalte Inhalt
A Name
B Scomp-ID Pflicht
C Vendor Herstellername; legt die Organisation an (Scomp-ID aus dem Namen, zum Beispiel red_hat)
D Releases Versionen, durch Komma getrennt
E Is virtualizer beliebiger Wert = ja
F Is operating system beliebiger Wert = ja
G Is runtime beliebiger Wert = ja
H Is library beliebiger Wert = ja
I Notes nicht importiert

Jede neue Software erhält automatisch eine Platzhalter-Release *.

Systems (Kopf: 2)

Spalte Inhalt
A Name Pflicht
B Scomp-ID Pflicht
C Description
D Stage ${stage.scomp_id}
E Zone ${logical_zone.scomp_id}
F Business criticality ${criticality.scomp_id}
G Infrastructure criticality ${criticality.scomp_id}
H Composed of Komma-Liste aus software:<scomp-id> und resource_type:<scomp-id>

Releases (Kopf: 2): A Software (Pflicht, ${software.scomp_id}), B Version (Pflicht). Jede Zeile markiert ihre Version als «latest» der Software; die letzte Zeile einer Software gewinnt.

Managed accounts (Kopf: 2)

Spalte Inhalt
A Vendor Pflicht; Providername, legt die Organisation als Managed Service Provider an
B Name Kontoname
C Scomp-ID Pflicht
D Notes nicht importiert

Managed offers (Kopf: 3)

Spalte Inhalt
A Vendor Pflicht; Name eines Providers, der bereits als Organisation bekannt ist (aus Managed accounts oder Software)
B Name Angebotsname
C Scomp-ID Pflicht
D Software ${software.scomp_id}?

Managed subscriptions (Kopf: 2)

Spalte Inhalt
A Account Pflicht; ${managed_account.scomp_id}
B Offer Pflicht; ${managed_offer.scomp_id}
C Name Name des Abonnements
D Resources Komma-Liste <resource_type-scomp-id>:<ressourcenname>, zum Beispiel entra-id:entra-id-prod; legt die Ressourcen mit dem Abonnement als Provider an

Baremetals (Kopf: 3)

Spalte Inhalt
A Name
B Scomp-ID Pflicht
C Description
D Offer ${managed_offer.scomp_id}?
E Account ${managed_account.scomp_id}?
F Region Regionsname; wird als Region des Providers angelegt
G Availability zone Zonenname; wird in der Region angelegt

D bis G nur für gemietete Maschinen; D und E müssen dann beide gesetzt sein.

Clusters (Kopf: 2)

Spalte Inhalt
A Scomp-ID Pflicht; zugleich Clustername
B Members Komma-Liste typ:<scomp-id> mit Typ host, parent-host, child-host, runtime, rt, application_instance oder ai
C Type Modus: failover, replica, lb oder leer
D Stage ${stage.scomp_id}
E Notes nicht importiert

Die Mitglieder werden erst nach Hosts, Runtimes und Application Instances zugeordnet; Verweise auf später eingelesene Objekte sind daher erlaubt.

Hosts (Kopf: 2)

Spalte Inhalt
A Name zum Beispiel dc1.internal
B Scomp-ID Pflicht
C Parent Pflicht; baremetal:<scomp-id>, host:<scomp-id> (virtualisiert auf diesem Host) oder cluster:<scomp-id> (Mitglied eines Clusters)
D Operating system Pflicht; <software>:<version> oder <software>:latest, zum Beispiel debian:12
E Virtualizer optional, <software>:<version>
F IP addresses nicht importiert
G DNS names nicht importiert
H Notes nicht importiert

Ein Eltern-Host muss in einer früheren Zeile stehen.

Runtimes (Kopf: 2)

Spalte Inhalt
A Name zum Beispiel Kubernetes
B Scomp-ID Pflicht
C Host Pflicht; ${host.scomp_id}
D Software release Pflicht; <software>:<version>, zum Beispiel kubernetes:1.27.6

Application instances (Kopf: 3)

Spalte Inhalt
A Software ${software.scomp_id}; verwendet immer <software>:latest
B Scomp-ID Pflicht
C Logical zone Zonen-Scomp-ID; unbekannte Werte werden ohne Fehler ignoriert
D Stage ${stage.scomp_id}
E System ${system.scomp_id}
F Database schema Komma-Liste <provider>:<schemaname>; Provider ist die Scomp-ID eines Clusters oder einer Application Instance. Legt Ressourcen vom Typ db-schema an und eine Beziehung «uses».
G Connects to Komma-Liste <ziel>:<protokoll-stack>:<port>; Ziel ist die Scomp-ID eines Clusters, einer Application Instance oder einer Ressource. Legt eine Beziehung «connects_to» an.
H Host Executor: ${host.scomp_id}
I Runtime Executor: ${runtime.scomp_id}
J Replica, K Failover, L Cluster/VIP nicht importiert
M Kubernetes Cluster Executor: ${cluster.scomp_id}, nur zusammen mit O
N Deployment nicht importiert
O Namespace Namespace-Name; wird im Cluster angelegt

Genau ein Executor ist nötig: H, sonst I, sonst M mit O. Fehlt er, bricht der Import mit «Can not locate executor type» ab.

Beispiele aus dem Demo-Datensatz:

wsus | wsus-prod | INFRA | prod | | mssql-wsus-prod:wsus | | dc1
rancher | rancher-infra | INFRA | prod | | | kubernetes-prod:ssh:22,kubernetes-prod:https:8443 | | | | | | kubernetes-prod | | rancher

Einschränkung 0.2.1: Eine bestimmte Version lässt sich für eine Application Instance im Excel nicht angeben; das Frontend zeigt die Version *. Die Release kann danach im Panel Operations geändert werden; ein erneuter Import setzt sie wieder auf latest zurück.

Markdown- und YAML-Import

Liegt neben import.xlsx ein Ordner regulations/, liest der Import ihn ein (Kategorie Compliance muss aktiv sein; mit --markdown-only nur dieser Teil):

<import-ordner>/
├── import.xlsx
└── regulations/
    └── <regulierung>/            Ordnername = Scomp-ID der Regulierung
        ├── data.yaml             optional: name, scomp_id
        └── <kapitel>/            Ordnername = Kapitelnummer
            ├── law.md            Frontmatter heading, relevancy (yes | partly | no); Inhalt = amtlicher Text
            ├── summary.md        Inhalt = Zusammenfassung
            ├── actual.md         Inhalt = Ist-Zustand
            ├── target.md         Inhalt = Soll-Zustand
            └── controls/
                └── <beliebig>.md Frontmatter external_id, name; Inhalt = Control-Text

Beispiel law.md:

---
relevancy: partly
heading: Meldepflichten
---

Text des Artikels …

Beispiel controls/1.md:

---
name: Konzepte für Risikoanalyse
external_id: 21.2.a
---
Konzepte in Bezug auf die Risikoanalyse sind vorhanden.

Regeln:

  • Alle Dateien sind optional. Existiert law.md, muss das Frontmatter heading und relevancy enthalten.
  • Kapitel werden über Regulierung und Kapitelnummer gefunden und aktualisiert, Controls über Regulierung und external_id.
  • Eigene Ist- und Sollzustände für die mitgelieferte NIS2 lassen sich in einem eigenen Import-Ordner ablegen: regulations/nis2/21/actual.md usw. Nur vorhandene Dateien überschreiben die jeweiligen Felder.

Frontmatter ist YAML zwischen zwei Zeilen --- am Dateianfang.

Weitere Artisan-Befehle

Befehl Zweck Status 0.2.1
swark:import:datamodel <pfad> Excel- und Markdown-Import (siehe oben) funktioniert
swark:import:content <pfad> Importiert .md, .html und .txt aus Unterordnern von <pfad> in die Tabelle content. Scomp-ID = <unterordner>_<dateiname bis zum ersten Punkt>. Bereits vorhandene Einträge werden nur ersetzt, wenn das Frontmatter updated_at neuer ist. funktioniert, Inhalte erscheinen aber in der Regel nicht im Frontend (siehe Kapitel Content)
swark:create-user --name= --email= --password= [--skip-on-existing-user] Legt einen Benutzer an; ohne --password wird ein Passwort erzeugt und ausgegeben. Die Option --is-admin existiert, hat aber keine Wirkung. funktioniert
cluster:import --kube-config= --kube-user= --kube-cluster= --kube-context= --account= Soll Nodes eines Kubernetes-Clusters als Baremetal, Host und Runtime übernehmen nicht lauffähig: nutzt eine REST-API unter http://localhost:8000/api, deren Routen in 0.2.1 nicht registriert sind
k8:token-review --kube-config= … Listet Tokens eines Kubernetes-Clusters mit Ablaufdatum (Token maskiert) nur lesend gegen Kubernetes; im Hosting ohne Kube-Config nicht nutzbar
helm:update Sucht für Software mit einer Quelle vom Typ helm neuere Chart-Versionen auf Artifact Hub und legt Releases an Quellen (source, source_provider) lassen sich weder per Excel noch im Admin-Bereich erfassen; nur mit direkt in der Datenbank angelegten Quellen nutzbar
app:process-batch-dependencies <xlsx> Wertet Batch-Abhängigkeiten aus einer Excel-Datei aus und schreibt PlantUML-Gantt und Graphviz-Dateien Entwicklerwerkzeug; schreibt fest nach /mnt/c/temp, im Container nicht sinnvoll
app:ingest-flat-structure-deprecated Alter YAML-Import veraltet und nicht lauffähig (kein Speicherort konfiguriert)

Ein Export der Daten als Excel-Vorlage ist im Code vorbereitet, aber in 0.2.1 weder als Befehl noch in der Oberfläche erreichbar. Die README von swark nennt die Befehle app:import und app:import:content; diese existieren in 0.2.1 nicht (richtig: swark:import:datamodel und swark:import:content).

Zusätzlich stehen die Laravel- und Filament-Standardbefehle zur Verfügung, etwa migrate, migrate:fresh, optimize, optimize:clear, storage:link, route:list und make:filament-user.

Vorgehen für einen Erstimport

  1. Die Importvorlage als Ausgangspunkt nehmen, Demo-Zeilen löschen, Kopfzeilen stehen lassen.
  2. Blätter in der Reihenfolge der Abhängigkeiten befüllen: Grunddaten → Zonen, Stages, Technologien, Protokoll-Stacks, Resource Types (mit db-schema) → Software und Releases → Baremetals, Hosts, Runtimes, Cluster → Application Instances → Strategie, Compliance, Findings, Massnahmen, Metriken.
  3. Für leere Kategorien die Blätter trotzdem stehen lassen (nur Kopfzeilen) oder den Import mit Kategorie-Optionen einschränken.
  4. Import ausführen und die Ausgabe prüfen («Importing sheet …», «… done»). Bei einem Abbruch nennt die Meldung Blatt, Zeile und Spalte bzw. den unbekannten Schlüssel.
  5. Optional NIS2: php artisan swark:import:datamodel --markdown-only default-importables.