# Paketieren, installieren und aktualisieren

> Wie aus einer Modulversion eine signierte .nxm-Datei wird, wie ein Administrator sie hochlädt, entscheidet, ob er dem Herausgeber vertraut, sie prüft und installiert und wie Aktualisieren, Deaktivieren und Deinstallieren funktionieren, mit allen Beschriftungen des Paketkatalogs.

Ein NXM-Modul kommt als eine einzige Datei in den Mandanten. Eine Entwicklerin oder ein Entwickler baut sie aus dem Ordner des Pakets und signiert sie mit dem eigenen Schlüssel. Ein Administrator lädt sie hoch, entscheidet, ob der Mandant diesem Schlüssel vertraut, sieht genau, was das Paket mitbringt und welche Daten außerhalb seiner eigenen es nutzen will, stimmt zu, vergibt Rollen und installiert. Spätere Versionen aktualisieren die Installation an Ort und Stelle, samt Datenmigration. Beim Deinstallieren bleiben die Daten entweder für später erhalten, oder sie werden gelöscht.

Nehmen wir wieder Brandt & Söhne. Der Lieferant schickt `acme.leihgeraete-1.0.0.nxm`. Bevor irgendetwas installiert ist, sieht der Administrator auf einer Seite: Das Paket bringt ein Fachobjekt, zwei Menüeinträge, zwei Rollen und fünf Werkzeuge für den KI-Assistenten mit, es nutzt keine Daten außerhalb seiner eigenen, und der Lieferant hat es mit einem Schlüssel signiert, den der Mandant noch nicht kennt. Der Administrator vergleicht den Fingerabdruck des Schlüssels mit dem, den der Lieferant per Mail geschickt hat, und vertraut ihm mit einem Klick. Erst danach ändert sich etwas im Mandanten.

<Flow
  steps={[
    { icon: 'hammer', title: 'Bauen', text: 'module-package.mjs packt den Paketordner und listet jede Datei mit ihrem Hash.' },
    { icon: 'key-round', title: 'Signieren', text: 'Der Herausgeber signiert die Hashliste mit dem eigenen Ed25519-Schlüssel. Anmelden muss er ihn nirgends.' },
    { icon: 'upload', title: 'Hochladen', text: 'Ein Administrator lädt die .nxm-Datei im Reiter Pakete hoch.', tone: 'cyan' },
    { icon: 'shield-check', title: 'Prüfen und vertrauen', text: 'Hashes, Signatur, Schema und Regeln, alle Probleme auf einmal. Der Mandant entscheidet, ob er dem Schlüssel vertraut.', tone: 'cyan' },
    { icon: 'package-check', title: 'Installieren', text: 'Zustimmung, Rollen, auf Wunsch Beispieldaten. Das Modul ist da.', tone: 'lavender' },
  ]}
  caption="Vom Ordner zum laufenden Modul. Im Mandanten ändert sich nichts, bevor der Installationsdialog bestätigt ist."
/>

## Bevor Sie beginnen

- **Administratorrechte** im Mandanten. Den Paketkatalog und jedes Installieren, Aktualisieren und Deinstallieren gibt es nur für Administratoren. Alle anderen landen auf dem Dashboard.
- **Ein Paket**, also eine `.nxm`-Datei von einem Herausgeber oder ein Paketordner, den Sie selbst gebaut haben (siehe [Ihr erstes Modul](/de/modules/first-module/)).
- Für ein signiertes Paket eines neuen Herausgebers: den **Fingerabdruck** seines Schlüssels, den Ihnen der Herausgeber auf einem anderen Weg als das Paket genannt hat (Mail, Telefon, seine Website), damit Sie ihn vergleichen können (siehe [Dem Herausgeber vertrauen](#dem-herausgeber-vertrauen)).

## Eine Version paketieren

Dieser Teil richtet sich an Entwickler. Eine ausgelieferte Version ändert sich nie mehr. Dafür gibt es zwei Wege: Jede Version liegt in einem eigenen Ordner, der wie die Version heißt (`acme.leihgeraete/1.0.0`), oder das Paket hat einen einzigen Ordner mit der aktuellen Version, und jede ausgelieferte Version ist ein Git-Tag wie `acme.leihgeraete-v1.0.0`. Weil das Skript aus denselben Dateien immer dasselbe Archiv baut, lässt sich eine ältere Version aus ihrem Tag jederzeit neu bauen. Ob eine neue Version die Regeln einer Aktualisierung einhält, prüft `validatePackage` gegen die letzte (siehe [Auf der Kommandozeile und in CI](/de/modules/develop/#auf-der-kommandozeile-und-in-ci)).

<Steps>

1. Besorgen Sie das Paketier-Skript `module-package.mjs`. Es liegt in den nexxus-Quellen unter `backend/scripts/`, läuft mit Node.js und braucht keine weiteren Pakete.

2. Bauen Sie das Archiv aus dem Paketordner:

   ```sh
   node module-package.mjs build acme.leihgeraete/1.0.0
   ```

   Das Skript braucht `module.json` mit `kind`, `key` und `version` und eine Überschrift `## [1.0.0]` in `CHANGELOG.md`. Es packt jede Datei des Ordners (Dateien mit Punkt am Anfang bleiben draußen), legt `MANIFEST.sha256` mit einer Zeile `<sha256>  <pfad>` je Datei dazu und schreibt `acme.leihgeraete-1.0.0.nxm`. Mit `--out <datei.nxm>` wählen Sie einen anderen Namen. Die Einträge sind sortiert und tragen feste Zeitstempel, derselbe Ordner ergibt also immer dasselbe Archiv.

3. Lesen Sie das Archiv zur Kontrolle zurück:

   ```sh
   node module-package.mjs verify acme.leihgeraete-1.0.0.nxm
   ```

   `verify` prüft, ob jede Datei mit dem richtigen Hash aufgeführt ist, ob nichts fehlt oder zu viel ist, und die Changelog-Überschrift. Die Antwort sieht etwa so aus: `acme.leihgeraete-1.0.0.nxm: acme.leihgeraete 1.0.0, 5 Dateien, Hashes stimmen, unsigniert`. Den Inhalt des Manifests prüft nexxus beim Hochladen, nicht das Skript.

</Steps>

:::tip[Ohne das Skript]
Auch ein einfaches ZIP des Paketordners ist ein gültiges Paket. Ohne `MANIFEST.sha256` und `SIGNATURE` gilt es als unsigniert und wird nur in Mandanten angenommen, die unsignierte Pakete zulassen.
:::

### Das Paket signieren

Die Signatur belegt, dass das Paket vom Besitzer eines Schlüssels stammt und dass sich nach dem Signieren keine Datei geändert hat. Sie signieren mit Ihrem eigenen Schlüssel. Weder der Betreiber der Instanz noch Systaro muss ihn vorher kennen: Jeder Mandant entscheidet selbst, ob er ihm vertraut. Unsignierte Pakete nimmt ein Mandant nur an, wenn sein Administrator sie zulässt.

<Steps>

1. Erzeugen Sie einmalig ein Schlüsselpaar:

   ```sh
   node module-package.mjs keygen ~/keys/acme.pem
   ```

   Das Skript schreibt einen privaten Ed25519-Schlüssel (PKCS#8-PEM, nur für Sie lesbar) und gibt den öffentlichen Schlüssel und seinen Fingerabdruck aus, den SHA-256 des Schlüssels in Vierergruppen aus Hex-Ziffern. Eine vorhandene Datei überschreibt es nie. Der private Schlüssel gehört in kein Repository.

2. Bauen Sie mit dem Schlüssel und einer frei gewählten Schlüssel-Id:

   ```sh
   node module-package.mjs build acme.leihgeraete/1.0.0 --key ~/keys/acme.pem --key-id acme-2026
   ```

   Das Archiv enthält jetzt eine Datei `SIGNATURE`: `{"keyId": "acme-2026", "alg": "Ed25519", "sig": "<base64>", "publicKey": "<base64>"}`, eine Signatur über `MANIFEST.sha256` und den öffentlichen Schlüssel, mit dem sie sich prüfen lässt. Das Skript gibt Schlüssel und Fingerabdruck noch einmal aus. Die Schlüssel-Id ist nur ein Name für Sie; nexxus erkennt einen Schlüssel an seinem Fingerabdruck.

3. Prüfen Sie die Signatur:

   ```sh
   node module-package.mjs verify acme.leihgeraete-1.0.0.nxm
   ```

   `verify` prüft die Signatur mit dem öffentlichen Schlüssel, den das Paket nennt, und endet mit `Signatur gültig, Fingerabdruck <Fingerabdruck>`. Mit `--public-key <base64>` besteht es darauf, dass das Paket genau diesen Schlüssel nennt.

4. Nennen Sie den Administratoren, die Ihre Pakete installieren, den Fingerabdruck, und zwar auf einem anderen Weg als das Paket: per Mail, auf Ihrer Website, am Telefon. Daran erkennen sie, dass das Paket wirklich von Ihnen kommt.

</Steps>

Signieren Sie spätere Versionen mit demselben Schlüssel. Ein Mandant, der ihm einmal vertraut, installiert jede spätere Version damit ohne neue Rückfrage.

## Dem Herausgeber vertrauen

Dieser Teil ist für Administratoren. Ein gültig signiertes Paket mit einem Schlüssel, den der Mandant noch nicht kennt, nimmt nexxus beim Hochladen an. Installieren lässt es sich erst, wenn Sie dem Schlüssel vertrauen.

<Steps>

1. Laden Sie das Paket wie unten beschrieben hoch. Der Katalog zeigt in der Spalte <Ui>Herkunft</Ui> den Chip <Ui>Unbekannter Herausgeber</Ui>.

2. Öffnen Sie das Paket. Der Hinweis <Ui>Unbekannter Herausgeber</Ui> nennt den Herausgeber aus dem Manifest und die Schlüssel-Id und zeigt den Fingerabdruck. Die Karte <Ui>Herkunft</Ui> rechts wiederholt <Ui>Herausgeber</Ui>, <Ui>Vertrauen</Ui>, <Ui>Schlüssel</Ui> und <Ui>Fingerabdruck</Ui>. <Ui>Installieren</Ui> bleibt gesperrt.

3. Vergleichen Sie den Fingerabdruck mit dem, den Ihnen der Herausgeber genannt hat. Weicht er ab, vertrauen Sie dem Schlüssel nicht: Dann hat jemand anderes das Paket signiert.

4. Klicken Sie auf <Ui>Diesem Herausgeber vertrauen</Ui>. Der Dialog <Ui>Diesem Herausgeber vertrauen?</Ui> zeigt den Fingerabdruck noch einmal. Bestätigen Sie mit <Ui>Vertrauen</Ui>. Der Chip wechselt auf <Ui>Vertraut</Ui>, und <Ui>Installieren</Ui> ist frei, ohne dass Sie das Paket noch einmal hochladen.

</Steps>

Hat Ihnen der Herausgeber den öffentlichen Schlüssel selbst geschickt, können Sie ihm vertrauen, bevor ein Paket da ist: Im Reiter <Ui>Herausgeber</Ui> (Route `/modules/herausgeber`) klicken Sie in der Karte <Ui>Vertraute Schlüssel</Ui> auf <Ui>Schlüssel hinzufügen</Ui>, fügen den Schlüssel bei <Ui>Öffentlicher Schlüssel</Ui> ein und vergleichen den Fingerabdruck, den der Dialog beim Tippen berechnet (<Ui>Stimmt er mit dem überein, den der Herausgeber Ihnen genannt hat?</Ui>). <Ui>Herausgeber (optional)</Ui> und <Ui>Name des Schlüssels (optional)</Ui> dienen Ihrer eigenen Übersicht. <Ui>Vertrauen</Ui> speichert. Der Schlüssel ist base64 mit 44 Zeichen, so wie `module-package.mjs keygen` ihn in der Zeile „öffentlicher Schlüssel“ ausgibt; die DER-Form und ein Block `-----BEGIN PUBLIC KEY-----` gehen auch. Passt der Text nicht, sagt der Dialog, woran es liegt, zum Beispiel wenn es ein privater Schlüssel ist.

### Der Reiter Herausgeber

Der Reiter <Ui>Herausgeber</Ui> zeigt, wem dieser Mandant vertraut:

- <Ui>Unsignierte Pakete zulassen</Ui>: standardmäßig aus. Solange der Schalter aus ist, lehnt nexxus unsignierte Uploads ab, und eine unsignierte Version lässt sich nicht installieren. Lässt die Instanz unsignierte Pakete für alle zu (siehe unten), steht auf der Seite <Ui>Diese Instanz lässt unsignierte Pakete für alle Mandanten zu; der Schalter ändert daran nichts.</Ui>
- <Ui>Vertraute Schlüssel</Ui>: jeder Schlüssel, dem der Mandant vertraut oder den er entfernt hat, mit Herausgeber, Schlüssel-Id, Fingerabdruck, seit wann und von wem, und Links zu den hochgeladenen Versionen, die damit signiert sind.
- <Ui>Schlüssel der Plattform</Ui>: Schlüssel, die der Betreiber für die ganze Instanz eingetragen hat. Ihnen vertraut jeder Mandant; entfernen lassen sie sich hier nicht.

<Ui>Entfernen</Ui> nimmt das Vertrauen nach der Frage <Ui>Schlüssel von „acme“ entfernen?</Ui> zurück (<Ui>Laufende Installationen laufen weiter. Neue Uploads, Installationen und Upgrades mit diesem Schlüssel werden abgelehnt.</Ui>). Der Schlüssel bleibt als <Ui>Entfernt</Ui> in der Liste, seine Pakete zeigen <Ui>Schlüssel entfernt</Ui>. <Ui>Wieder vertrauen</Ui> macht das rückgängig.

Den Reiter sehen und ändern nur Administratoren; nexxus prüft das auch auf dem Server. Der KI-Assistent kann einem Administrator sagen, welchen Herausgebern der Mandant vertraut und welche Pakete sich deshalb installieren lassen. Einem Schlüssel vertrauen, ihn entfernen oder den Schalter umlegen kann der KI-Assistent nicht; er verweist auf diese Seite.

### Schlüssel, denen die ganze Instanz vertraut

Wer die Instanz betreibt, kann einem Schlüssel in der Konfiguration für alle Mandanten vertrauen. So sind die Pakete von Systaro selbst signiert.

```yaml
nexxus:
  modules:
    trusted-keys:
      systaro2026: <öffentlicher Schlüssel in base64>
    allow-unsigned: false
```

`trusted-keys` nimmt den base64-Text des rohen 32-Byte-Schlüssels (so, wie `keygen` ihn ausgibt) oder seiner DER-Form. Ein Paket mit derselben Schlüssel-Id, aber einem anderen Schlüssel gilt durch diesen Eintrag nicht als vertraut: nexxus vergleicht Fingerabdrücke, keine Namen. `allow-unsigned` lässt unsignierte Pakete für alle Mandanten zu. Fehlt die Angabe, lässt nexxus sie auf Instanzen mit dem Spring-Profil `development`, `local` oder `demo` zu; überall sonst entscheidet jeder Mandant mit seinem Schalter.

### Die Herkunft eines Pakets

Die Spalte <Ui>Herkunft</Ui> im Katalog, die Paketseite und ihre Karte <Ui>Herkunft</Ui> zeigen für jede Version eines davon:

| Beschriftung | Bedeutung |
|---|---|
| <Ui>Plattform</Ui> | Kommt mit nexxus oder ist mit einem Schlüssel der Plattform signiert. Hinweis: <Ui>Kommt mit NEXXUS oder ist mit einem Schlüssel der Plattform signiert, dem alle Mandanten vertrauen.</Ui> |
| <Ui>Vertraut</Ui> | Mit einem Schlüssel signiert, dem dieser Mandant vertraut. Hinweis: <Ui>Mit einem Schlüssel signiert, dem dieser Mandant vertraut.</Ui> |
| <Ui>Unbekannter Herausgeber</Ui> | Gültig signiert, aber dem Schlüssel vertraut hier noch niemand. Installieren lässt es sich erst, wenn Sie ihm vertrauen. |
| <Ui>Schlüssel entfernt</Ui> | Mit einem Schlüssel signiert, den dieser Mandant entfernt hat. Laufende Installationen laufen weiter; neu installieren oder aktualisieren lässt sich damit nichts. Der Reiter <Ui>Module</Ui> zeigt den Chip auch beim installierten Paket. |
| <Ui>Unsigniert</Ui> | Ohne Signatur. Nur angenommen, solange unsignierte Pakete zugelassen sind, und immer mit der Warnung <Ui>Nicht signiert. Prüfen Sie die Herkunft, bevor Sie es installieren.</Ui> Installierte unsignierte Pakete tragen den Chip <Ui>Unsigniert</Ui> auch im Reiter <Ui>Module</Ui>. |

Hat die installierte Version eine andere Herkunft als die neueste, zeigt der Katalog zusätzlich einen Chip wie <Ui>installierte Version: Unsigniert</Ui>.

Ein falscher Hash oder eine Signatur, die nicht zu ihrem Schlüssel passt, lehnt nexxus immer ab, egal wer signiert hat.

## Das Paket hochladen

<Steps>

1. Öffnen Sie <MenuPath to="Administration > Betrieb > Module" /> und wechseln Sie auf den Reiter <Ui>Pakete</Ui> (Route `/modules/pakete`). Der Reiter <Ui>Module</Ui> daneben listet die eingebauten Module und die installierten Pakete mit Version und Changelog. Pakete tragen dort den Chip <Ui>Paket</Ui>.

   <Screenshot src={shot_nxm_01} url="/modules" alt={"Die Modulliste mit installierten Paketen und dem Changelog des Tutorial-Pakets"} caption={"Installierte Pakete stehen neben den eingebauten Modulen, mit Version und Changelog."} />

2. In einem Mandanten ohne Pakete zeigt die Seite <Ui>Noch keine Pakete</Ui> mit der Schaltfläche <Ui>Paket hochladen (.nxm)</Ui>. Sonst listet der Katalog jedes Paket mit den Spalten <Ui>Paket</Ui>, <Ui>Version</Ui>, <Ui>Stand</Ui> und <Ui>Herkunft</Ui>. Mit <Ui>Pakete durchsuchen</Ui> und den Filtern <Ui>Alle</Ui>, <Ui>Installiert</Ui>, <Ui>Nicht installiert</Ui> und <Ui>Updates</Ui> finden Sie ein bestimmtes.

   <Screenshot src={shot_nxm_02} url="/modules/pakete" alt={"Der leere Paketkatalog mit der Schaltfläche zum Hochladen"} caption={"Der Weg in den Katalog führt über das Hochladen einer .nxm-Datei."} />

   <Screenshot src={shot_nxm_03} url="/modules/pakete" alt={"Der Paketkatalog mit Stand und Herkunft jedes Pakets"} caption={"Stand, wartende Updates und Herkunft auf einen Blick."} />

3. Klicken Sie unten auf <Ui>Paket hochladen (.nxm)</Ui> und wählen Sie die Datei (`.nxm` oder `.zip`).

4. nexxus prüft die Datei. Nimmt es sie an, erscheint der Hinweis <Ui>Leihgeräte 1.0.0 hochgeladen.</Ui> und die Paketseite dieser Version öffnet sich. Lehnt es sie ab, bleibt ein roter Hinweis stehen: <Ui>„acme.leihgeraete-1.0.0.nxm“ wurde nicht angenommen.</Ui>, darunter der Grund des Servers und eine Zeile je Problem. Korrigieren Sie das Paket und laden Sie es erneut hoch.

   <Screenshot src={shot_nxm_04} url="/modules/pakete" alt={"Ein abgelehnter Upload mit der Liste der Probleme"} caption={"nexxus nennt alle Probleme eines abgelehnten Pakets auf einmal."} />

</Steps>

Gespeichert wird das Paket nur für Ihren Mandanten. Das Hochladen installiert noch nichts.

## Die Paketseite lesen

Die Paketseite (`/modules/pakete/<key>`) zeigt die neueste Version, außer Sie wählen mit den Schaltflächen neben <Ui>Version</Ui> eine andere. Alles darauf stammt aus dem Manifest. Installiert ist noch nichts.

<Screenshot src={shot_nxm_05} url="/modules/pakete/curiaos.kanzlei" alt={"Die Paketseite vor der Installation"} caption={"Alles, was ein Paket mitbringt, bevor etwas installiert ist."} />

| Teil | Was er Ihnen sagt |
|---|---|
| Kopf | Name, Beschreibung, Schlüssel, der Chip für die Herkunft und nach der Installation Stand und Version. |
| <Ui>Herkunft</Ui> | Herausgeber, Vertrauen, Schlüssel-Id und Fingerabdruck der angezeigten Version. Lässt sich die Version wegen ihrer Herkunft nicht installieren, sagt ein Hinweis oben auf der Seite, was zu tun ist. |
| <Ui>Was das Paket mitbringt</Ui> | Je eine Zeile: <Ui>Fachobjekte</Ui>, <Ui>Menüeinträge</Ui>, <Ui>Ansichten</Ui> mit dem Ort, an dem jede erscheint, <Ui>Rollen</Ui> mit ihren Rechten, <Ui>Daten außerhalb des Pakets</Ui>, <Ui>Externe Dienste</Ui> mit Host und den Ereignissen, die sie bekommen, <Ui>Werkzeuge für den Assistenten</Ui> (die Werkzeugnamen für den KI-Assistenten) und <Ui>Rechte</Ui> mit ihren vollen Schlüsseln. Leere Zeilen lauten <Ui>keine</Ui>. |
| <Ui>Änderungen</Ui> | Der Changelog der Version. |
| <Ui>Installation</Ui> | Nach der Installation: <Ui>Stand</Ui>, <Ui>Version</Ui>, <Ui>Installiert am</Ui>, <Ui>Installiert von</Ui>, <Ui>Zuletzt aktualisiert</Ui> und <Ui>Zugestimmt</Ui>, die Liste dessen, dem Sie zugestimmt haben. Davor: <Ui>Nicht installiert</Ui>. |
| <Ui>Einstellungen</Ui> | Nur wenn die installierte Version Einstellungen mitbringt. |
| <Ui>Ereigniszustellungen</Ui> | Nur wenn die installierte Version externe Dienste nutzt. |

Am genauesten lesen Sie die Zeilen <Ui>Daten außerhalb des Pakets</Ui> und <Ui>Externe Dienste</Ui>. nexxus schreibt jeden Punkt als Satz, den technischen Schlüssel daneben:

| Schlüssel | Angezeigt als |
|---|---|
| `core:partner:read` | <Ui>Partner lesen</Ui> |
| `core:user:read` | <Ui>Benutzer lesen</Ui> |
| `core:dmsDocument:read` | <Ui>Dokumente lesen</Ui> |
| `core:dmsDocument:create` | <Ui>Dokumente anlegen</Ui> |
| `core:partnerContact:read` | <Ui>Ansprechpartner lesen</Ui> |
| `core:partnerContact:create` | <Ui>Ansprechpartner anlegen</Ui> |
| `core:project:read` | <Ui>Projekte lesen</Ui> |
| `core:invoice:create` | <Ui>Rechnungsentwürfe anlegen</Ui> |
| `core:invoice:read` | <Ui>Rechnungen lesen</Ui> |
| `core:opportunity:read` | <Ui>Opportunities lesen</Ui> |
| `core:opportunity:create` | <Ui>Opportunities anlegen</Ui> |
| `core:ismsMeasure:create` | <Ui>ISMS-Maßnahmen anlegen</Ui> |
| `core:partner:create` | <Ui>Kontakte anlegen</Ui> |
| `core:mail:send` | <Ui>E-Mails im Namen Ihrer Organisation versenden</Ui> |
| `service:fristendienst@fristen.example.com` | <Ui>Dienst „Fristendienst“ unter fristen.example.com aufrufen und ihm Ereignisse schicken</Ui> |

<Ui>E-Mails im Namen Ihrer Organisation versenden</Ui> erlaubt den [Mail-Aktionen](/de/modules/structure/#mail-aktionen) des Pakets, über den Mailserver Ihres Mandanten zu versenden, mit einem Brief als PDF unter Dateien. Jede Mail geht trotzdem erst hinaus, wenn ein Mensch sie nach einem Blick auf die Vorschau versendet, und nur an die Adresse, die im Kontakt steht. Der KI-Assistent bekommt eine solche Aktion nie.

## Das Paket installieren

<Steps>

1. Klicken Sie auf der Paketseite in der Aktionsleiste auf <Ui>Installieren</Ui>. nexxus berechnet zuerst einen Installationsplan. Der Dialog <Ui>Leihgeräte installieren</Ui> öffnet sich mit der Unterzeile <Ui>Version 1.0.0</Ui>.

2. Lesen Sie die Hinweise oben. Ein unsigniertes Paket zeigt <Ui>Dieses Paket ist nicht signiert. Installieren Sie es nur, wenn Sie wissen, woher es kommt.</Ui> (Solange die Herkunft das Installieren nicht erlaubt, ist <Ui>Installieren</Ui> schon auf der Paketseite gesperrt, siehe [Dem Herausgeber vertrauen](#dem-herausgeber-vertrauen).) Lässt sich das Paket nicht installieren, nennt ein roter Kasten <Ui>So lässt sich das Paket nicht installieren:</Ui> die Gründe, und die Schaltfläche zum Installieren bleibt gesperrt.

3. Haken Sie unter <Ui>Ihre Zustimmung</Ui> jeden Punkt an: <Ui>Diese Daten und Dienste darf das Paket nutzen, sobald es installiert ist. Haken Sie jeden Punkt an.</Ui> Die Schaltfläche bleibt gesperrt, bis alles angehakt ist. Ein Paket, das nichts davon braucht, sagt <Ui>Das Paket nutzt keine Daten außerhalb seiner eigenen.</Ui>

4. Wählen Sie unter <Ui>Rollen zuweisen</Ui> für jede Rolle des Pakets die Personen aus: Feld <Ui>Personen auswählen</Ui> öffnen, Namen anklicken und mit <Ui>Anwenden</Ui> übernehmen. Angeboten werden nur Personen, keine Dienst- oder Systemkonten. Wen Sie hier auslassen, der kann die Rolle später im [Rolleneditor](/de/setup/roles/) bekommen.

5. Bringt das Paket Beispieldaten mit, entscheiden Sie über <Ui>Beispieldaten anlegen</Ui>: <Ui>Legt erfundene Musterdatensätze und -dokumente an, zum Ausprobieren.</Ui> Der Haken ist zu Beginn nicht gesetzt. Lassen Sie ihn in produktiven Mandanten weg.

6. Klicken Sie auf <Ui>Installieren</Ui>. Der Hinweis <Ui>Leihgeräte ist installiert.</Ui> bestätigt es. Lehnt der Server ab, bleibt der Dialog offen und zeigt <Ui>Nicht installiert:</Ui> mit dem Grund.

   <Screenshot src={shot_nxm_06} url="/modules/pakete/curiaos.kanzlei" alt={"Der Installationsdialog mit Zustimmung, Rollen und Beispieldaten"} caption={"Jeder Punkt der Zustimmung muss angehakt sein; die gewählten Personen bekommen die Rolle sofort."} />

</Steps>

Die Menüeinträge des Moduls erscheinen sofort und ohne Neuladen im Menübereich seines Fachbereichs. Administratoren sehen alles. Alle anderen sehen das Modul erst mit einer seiner Rollen. Schaltet der Mandant diesen Fachbereich ab, bleibt das Modul trotzdem da; verbergen lässt es sich nur durch Deaktivieren.

## Was im Hintergrund passiert

Die Installation läuft in einer Transaktion. Entweder passiert alles oder nichts.

- **Installation.** nexxus speichert die Installation mit dem Stand <Ui>Aktiv</Ui>, der Version und der Liste dessen, dem Sie zugestimmt haben.
- **Rollen.** Für jede Rolle im Manifest legt nexxus eine Zugriffsrolle an, benannt nach Modul und Rolle, zum Beispiel <Ui>Leihgeräte – Geräteverwaltung</Ui>. Die Rolle gehört zur Installation, und niemand hat sie außer den Personen, die Sie im Dialog gewählt haben. Die Rechte des Moduls stehen im Rolleneditor wie alle anderen Rechte.
- **KI-Assistent.** Bringt das Paket Anweisungen für den Assistenten mit, legt nexxus einen firmenweiten Skill an, der immer aktiv ist und nach dem Modul heißt, zum Beispiel <Ui>Leihgeräte: Arbeitsweise</Ui>. Solange das Modul deaktiviert ist, ist auch der Skill aus. Beim Deinstallieren verschwindet er. Avatare und Skills aus dem Paket werden firmenweite Avatare und Skills, ihre KI-Knöpfe erscheinen auf den Datensatzseiten des Pakets. Sie sind aus, solange das Modul deaktiviert ist; beim Deinstallieren verschwinden die Skills, und die Avatare werden archiviert, damit ihre Gespräche bleiben. Die Werkzeuge des Pakets stehen im KI-Assistenten allen zur Verfügung, die die passenden Rechte haben.
- **Daten.** Paketdaten aus `data/` legt nexxus immer an, Beispieldaten aus `demo/` nur mit gesetztem Haken. Dokumente aus den Beispieldaten landen in einem neuen Ordner in den Dateien, benannt nach dem Modul mit dem Zusatz „(Beispieldaten)“. Partner, die in Beispieldaten vorkommen, sucht nexxus über den Namen oder legt sie an.
- **Dienstkonto.** Jede Installation bekommt ein Dienstkonto, mit dem sich niemand anmelden kann, mit einer Systemrolle `<Modulname> – Dienstkonto` und allen Rechten des Moduls. Nur die externen Dienste des Pakets handeln damit. Pakete ohne Dienste nutzen es nie.
- **Dienste.** Bringt das Paket externe Dienste mit, benachrichtigt nexxus jeden davon über die Installation, sobald die Transaktion abgeschlossen ist.

## Einstellungen und Ereigniszustellungen

Manche Pakete haben Einstellungen je Installation, zum Beispiel das Bundesland, dessen Feiertage zählen. Nach der Installation erscheint dafür auf der Paketseite die Karte <Ui>Einstellungen</Ui> mit den Feldern, die das Paket festlegt, etwa einer Auswahlliste und einer Zahl. Ändern Sie die Werte und klicken Sie auf <Ui>Speichern</Ui>, oder auf <Ui>Verwerfen</Ui>, um Ihre Änderungen zurückzunehmen. nexxus antwortet mit <Ui>Einstellungen gespeichert.</Ui> oder <Ui>Nicht gespeichert:</Ui> und dem Grund.

Pakete mit externen Diensten bekommen die Karte <Ui>Ereigniszustellungen</Ui>: <Ui>Die letzten 100 Ereignisse, die NEXXUS an die Dienste des Pakets geschickt hat.</Ui> Jede Zeile zeigt das Ereignis, die Nummer des Datensatzes, den Zustand <Ui>Wartet</Ui>, <Ui>Zugestellt</Ui> oder <Ui>Fehlgeschlagen</Ui>, die Zahl der Versuche, den letzten Fehler und wann das Ereignis entstanden ist. Solange Sie die Karte ansehen, aktualisiert sie sich alle fünf Sekunden. <Ui>Aktualisieren</Ui> lädt sie sofort neu. Wie Zustellung und Wiederholung funktionieren, erklärt [Moduldienste](/de/modules/services/).

<Screenshot src={shot_nxm_09} url="/modules/pakete/curiaos.kanzlei" alt={"Die Karte mit den Einstellungen eines installierten Pakets"} caption={"Einstellungen gelten für diese Installation; die Felder legt das Paket fest."} />

## Auf eine neue Version aktualisieren

Eine neue Version kommt als neue `.nxm`-Datei mit höherer Versionsnummer.

<Steps>

1. Laden Sie die neue Datei auf dem Reiter <Ui>Pakete</Ui> hoch. Der Katalog zeigt neben der installierten Version den Chip <Ui>Update auf 1.1.0</Ui>, und der Filter <Ui>Updates</Ui> listet jedes Paket mit einer neueren Version.

2. Öffnen Sie das Paket und klicken Sie auf <Ui>Auf 1.1.0 aktualisieren</Ui>. Die Schaltfläche aktualisiert immer auf die Version, die die Seite gerade zeigt. Eine andere Version wählen Sie mit den Schaltflächen neben <Ui>Version</Ui>.

   <Screenshot src={shot_nxm_07} url="/modules/pakete/acme.leihgeraete?version=1.1.0" alt={"Eine Paketseite mit wartendem Update"} caption={"Die Schaltfläche aktualisiert immer auf die angezeigte Version."} />

3. Lesen Sie den Dialog <Ui>Leihgeräte aktualisieren</Ui> mit der Unterzeile <Ui>Von 1.0.0 auf 1.1.0</Ui>:
   - <Ui>Was sich ändert</Ui>: jeder Changelog-Abschnitt zwischen der installierten und der neuen Version.
   - <Ui>Datenanpassungen</Ui>: <Ui>Probelauf auf den heutigen Daten. Alle Schritte laufen in einem Zug; scheitert einer, bleibt das Paket auf 1.0.0.</Ui> Je Migrationsschritt eine Zeile mit Schritt, Feld, Version, <Ui>vor dem Wechsel</Ui> oder <Ui>nach dem Wechsel</Ui> und der Zahl der Datensätze, die er ändern würde. Ohne Schritte: <Ui>Keine Datenanpassungen nötig.</Ui>
   - <Ui>Neu zuzustimmen</Ui>: nur das, was die neue Version über Ihre frühere Zustimmung hinaus nutzen will. <Ui>Diese Version will zusätzlich Folgendes nutzen. Ohne Ihre Zustimmung bleibt das Paket auf 1.0.0.</Ui> Haken Sie jeden Punkt an.
   - <Ui>Neue Beispieldaten anlegen</Ui>: nur, wenn die neue Version Beispieldaten mitbringt, die es hier noch nicht gibt. Der Hinweis darunter nennt ihre Zahl und endet mit <Ui>Gelöschte Beispieldaten kommen nicht zurück.</Ui> Der Haken ist zu Beginn nicht gesetzt. Lassen Sie ihn in produktiven Mandanten weg.
   - <Ui>Diese Aktualisierung ist nicht möglich:</Ui> nennt Gründe, die das Aktualisieren verhindern.

   <Screenshot src={shot_nxm_35} url="/modules/pakete/acme.leihgeraete?version=1.1.0" alt={"Der Dialog zum Aktualisieren mit Probelauf"} caption={"Der Probelauf zählt die Datensätze, die jeder Migrationsschritt ändert."} />

4. Klicken Sie auf <Ui>Aktualisieren</Ui>. Der Hinweis lautet <Ui>Leihgeräte ist auf 1.1.0 aktualisiert.</Ui>

</Steps>

Das Aktualisieren läuft je Mandant in einer Transaktion. Scheitert ein Migrationsschritt, ändert sich nichts, und das Modul bleibt auf der alten Version. Die Rollen der Installation bekommen nur Rechte, die in dieser Version neu sind, und nur Rollen, die es vorher schon gab. Rechte, die Sie einer Rolle entzogen haben, bleiben entzogen. Versionsregeln und Migrationsschritte erklärt [Daten und Aktualisierungen](/de/modules/data-and-upgrades/).

:::note[Eine ausgelieferte Version ändert sich nie]
nexxus behält jede hochgeladene Version. Laden Sie denselben Schlüssel in derselben Version mit gleichem Inhalt noch einmal hoch, bekommen Sie das gespeicherte Paket zurück. Mit anderem Inhalt lehnt nexxus ab. Selbst ein korrigierter Tippfehler in einer Ansicht braucht eine neue Versionsnummer.
:::

## Deaktivieren und aktivieren

Deaktivieren blendet ein Modul aus, ohne seine Daten anzufassen. Klicken Sie auf der Paketseite auf <Ui>Deaktivieren</Ui>. nexxus fragt <Ui>Leihgeräte deaktivieren?</Ui>: <Ui>Menüeinträge, Seiten und Werkzeuge des Pakets verschwinden für alle. Daten, Rollen und Einstellungen bleiben; „Aktivieren“ bringt alles zurück.</Ui> Bestätigen Sie mit <Ui>Deaktivieren</Ui>. Der Hinweis lautet <Ui>Leihgeräte ist deaktiviert.</Ui>

<Screenshot src={shot_nxm_10} url="/modules/pakete/acme.leihgeraete" alt={"Die Rückfrage vor dem Deaktivieren eines Pakets"} caption={"Deaktivieren blendet das Modul aus und behält alle Daten."} />

Wer jetzt einen Link in das Modul öffnet, sieht die Seite <Ui>Modul nicht verfügbar</Ui> mit <Ui>Das Modul „Leihgeräte“ ist deaktiviert.</Ui> Die Adresse bleibt im Browser stehen, derselbe Link funktioniert also nach dem Aktivieren wieder. Mit <Ui>Aktivieren</Ui> kommt alles zurück: <Ui>Leihgeräte ist wieder aktiv.</Ui>

## Deinstallieren

<Steps>

1. Öffnen Sie auf der Paketseite in der Aktionsleiste <Ui>Weitere Aktionen</Ui> und wählen Sie <Ui>Deinstallieren</Ui>. Der Dialog <Ui>Leihgeräte deinstallieren</Ui> öffnet sich.

2. Sichern Sie zuerst eine Kopie mit <Ui>Daten exportieren (ZIP)</Ui>: <Ui>Vorher sichern: eine JSON-Datei je Fachobjekt.</Ui> Die Datei `acme.leihgeraete-export.zip` enthält je Fachobjekt eine `<fachobjekt>.json` mit jedem Datensatz samt Id, Schlüssel, Daten, Version und Zeitstempeln, dazu eine `module.json` mit Schlüssel, Version und Exportzeit.

3. Wählen Sie unter <Ui>Was mit den Daten geschieht</Ui>:
   - <Ui>Daten behalten</Ui> (voreingestellt): <Ui>Das Paket verschwindet, die Datensätze bleiben unsichtbar erhalten. Eine spätere Installation bindet sie wieder an.</Ui>
   - <Ui>Daten löschen</Ui>: <Ui>Die Datensätze, die Rollen des Pakets und seine Beispieldokumente werden gelöscht.</Ui>

4. Tippen Sie den Modulschlüssel in das Feld <Ui>Zum Bestätigen den Schlüssel acme.leihgeraete eingeben</Ui>. Die Schaltfläche <Ui>Deinstallieren</Ui> wird erst frei, wenn der Schlüssel stimmt.

5. Klicken Sie auf <Ui>Deinstallieren</Ui>. Der Hinweis lautet <Ui>Leihgeräte ist deinstalliert.</Ui>

   <Screenshot src={shot_nxm_11} url="/modules/pakete/acme.leihgeraete" alt={"Der Deinstallationsdialog mit Export und der Wahl für die Daten"} caption={"Erst der eingetippte Modulschlüssel gibt das Deinstallieren frei."} />

</Steps>

Nach <Ui>Daten behalten</Ui> zeigt der Katalog den Stand <Ui>Entfernt, Daten behalten</Ui>, und die Paketseite bietet <Ui>Wieder installieren</Ui> an. Der Dialog <Ui>Leihgeräte wieder installieren</Ui> sagt dann <Ui>Die Daten der früheren Installation sind noch da und werden wieder angebunden.</Ui> Rollen und Datensätze kommen zurück, wie sie waren.

Nach <Ui>Daten löschen</Ui> sind die Datensätze gelöscht, die Rollen des Pakets verlieren ihre Rechte und Zuweisungen, und die Beispieldokumente wandern in den Papierkorb der Dateien. Partner aus den Beispieldaten bleiben, weil andere Datensätze sie nutzen können. Das hochgeladene Paket bleibt im Katalog und lässt sich neu installieren.

## Wenn etwas schiefgeht

**Beim Hochladen** zeigt der Katalog <Ui>„&lt;Datei&gt;“ wurde nicht angenommen.</Ui> und den Grund:

| Meldung | Was zu tun ist |
|---|---|
| `Das Paket ist fehlerhaft:` mit einer Liste | Manifest oder Dateien verletzen die Paketregeln. Jede Zeile nennt Datei und Stelle, zum Beispiel `module.json views.geraet.list: Filter 'notiz' ist nicht indexed`. Beheben Sie jede Zeile und bauen Sie eine neue Datei. |
| `Das Paket ist nicht signiert. Unsignierte Pakete sind für diesen Mandanten nicht zugelassen; zulassen lassen sie sich unter System › Module › Herausgeber.` | Signieren Sie das Paket, oder schalten Sie im Reiter <Ui>Herausgeber</Ui> <Ui>Unsignierte Pakete zulassen</Ui> ein, wenn Sie der Quelle vertrauen. |
| `Das Paket nennt den öffentlichen Schlüssel zu 'acme-2026' nicht, und die Plattform kennt ihn nicht; mit module-package.mjs build neu signieren. ...` | Das Paket stammt von einer älteren Version des Skripts, die den öffentlichen Schlüssel noch nicht hineingeschrieben hat. Bauen und signieren Sie es neu. |
| `Der Schlüssel, mit dem das Paket signiert ist, wurde für diesen Mandanten entfernt (...).` | Ein Administrator hat den Schlüssel im Reiter <Ui>Herausgeber</Ui> entfernt. War das ein Versehen, vertrauen Sie ihm dort wieder. |
| `Die Signatur mit dem Schlüssel 'acme-2026' ist ungültig.` | Nach dem Signieren hat sich eine Datei geändert, oder ein anderer Schlüssel hat signiert. Bauen und signieren Sie neu aus dem unveränderten Ordner. |
| `MANIFEST.sha256 stimmt nicht:` mit Pfaden | Nach dem Bauen wurden Dateien ergänzt, entfernt oder bearbeitet. Bauen Sie neu. |
| `acme.leihgeraete 1.0.0 gibt es schon mit anderem Inhalt; eine neue Fassung braucht eine neue Versionsnummer.` | Geben Sie der Änderung eine neue Versionsnummer. |
| `Das Archiv enthält kein module.json.` | Das Manifest liegt weder ganz oben im Archiv noch in einem einzigen obersten Ordner. |
| `Das Archiv ist entpackt größer als 64 MB.` / `Das Archiv hat mehr als 2000 Dateien.` | Ein Paket darf entpackt höchstens 64 MB groß sein und höchstens 2000 Dateien haben. Jede Ansichtsdatei darf höchstens 2 MB groß sein. |

**Im Dialog zum Installieren oder Aktualisieren** sperren Gründe im roten Kasten die Aktion:

| Meldung | Was zu tun ist |
|---|---|
| `Dem Herausgeber „acme“ vertraut dieser Mandant noch nicht (...).` | Vergleichen Sie den Fingerabdruck und vertrauen Sie dem Herausgeber, siehe [Dem Herausgeber vertrauen](#dem-herausgeber-vertrauen). |
| `Der Schlüssel des Herausgebers „acme“ wurde für diesen Mandanten entfernt (...); damit signierte Versionen lassen sich nicht installieren.` | Vertrauen Sie dem Schlüssel im Reiter <Ui>Herausgeber</Ui> wieder, oder fragen Sie den Herausgeber nach einer Version mit einem Schlüssel, dem Sie vertrauen. |
| `Die Version ist nicht signiert, und unsignierte Pakete sind für diesen Mandanten nicht zugelassen (System › Module › Herausgeber).` | Schalten Sie <Ui>Unsignierte Pakete zulassen</Ui> ein, oder fragen Sie nach einer signierten Version. |
| `Version 1.0.0 verlangt die Plattform >=0.2.0 <1.0.0, hier läuft <Version>.` | Das Paket ist für andere nexxus-Versionen gebaut. Fragen Sie den Herausgeber nach einer passenden Version. |
| `Das Modul 'partners' gibt es auf dieser Plattform nicht.` | Ein vorausgesetztes eingebautes Modul fehlt in dieser Instanz. |
| `Das Modul 'partners' läuft in Version 1.0.0, verlangt ist >=2.0.0.` | Das Paket braucht eine andere Version eines eingebauten Moduls. Fragen Sie den Herausgeber nach einer passenden Version. |
| `Diese Version baut auf dem Paket 'muster.akten' auf. Pakete bauen nicht mehr aufeinander auf; was zusammengehört, kommt als ein Paket.` | Die Version wurde hochgeladen, bevor Pakete in sich geschlossen sein mussten. Fragen Sie den Herausgeber nach einer Version, die alles in einem Paket mitbringt. |
| `Das neue Pflichtfeld 'geraet.standort' hat keinen Standardwert.` | Die neue Version verletzt eine Versionsregel. Beheben kann das nur der Herausgeber, mit einer neuen Version. |
| `Die Migration auf 1.1.0 ist gescheitert, 'acme.leihgeraete' bleibt auf 1.0.0:` mit der Ursache | Ein Migrationsschritt ist an Ihren Daten gescheitert. Es hat sich nichts geändert. Schicken Sie die Meldung an den Herausgeber. |

**In der Karte Einstellungen:** <Ui>Nicht gespeichert:</Ui> `Die Einstellungen sind ungültig.` Prüfen Sie die markierten Felder im Formular.

Fehler, die externe Dienste melden, stehen unter [Moduldienste](/de/modules/services/).

## Wie es weitergeht

<CardGrid>
  <LinkCard title="Daten und Aktualisierungen" description="Versionsregeln, Migrationsschritte und was mit den Daten passiert." href="/de/modules/data-and-upgrades/" />
  <LinkCard title="Rollen" description="Geben Sie Personen die Rollen, die ein Paket angelegt hat." href="/de/setup/roles/" />
  <LinkCard title="Fallstudie: CuriaOS" description="Ein Paket für eine Kanzlei, mit Rollen, Zustimmung und einem Fristendienst." href="/de/modules/curiaos/" />
</CardGrid>