CodamAIDocs
Themafertig

CRMS beim Start

Was beim Start für CRMS passiert, zusammen mit CDMS und CIAS: Prüfung der Platzierung, Pflichtangaben wie der Zeitstempel-Schlüssel, die CRMS-Tabellen in System- und Mandanten-Datenbank, das Einspielen mitgelieferter Vorlagen und der erste Ankerlauf. Und welche Rollen CRMS bei CIAS anmeldet.

Ausprägungen
CRMS eingebettet, CIAS eingebettetCRMS eingebettet, CIAS getrenntCRMS als eigener DienstCDMS-Anwendung als ClientPflichtangabe fehltVorlagen einspielen gelingt / scheitert

Worum es geht

Eingebettet hat CRMS keinen eigenen Kaltstart. Es fährt im Start der CDMS-Anwendung mit hoch, im selben Prozess und in derselben Reihenfolge wie CDMS und CIAS. Als eigener Dienst hat es einen eigenen Start, der genauso aussieht, nur ohne die Modelle von CDMS daneben.

Wie der Start von CDMS und CIAS insgesamt abläuft, steht unter Kaltstart einer Installation. Diese Seite zeigt, was CRMS dazu beiträgt.

Der Zeitstrahl

flowchart LR
    A["1 Platzierung<br/>Eigenschaft gegen Klassenpfad"] --> B["2 Kontext<br/>Pflichtangaben, Schlüssel, Bucket"]
    B --> C["3 Tabellen<br/>System- und Mandanten-DB"]
    C --> D["4 Vorlagen<br/>mitgelieferte einspielen"]
    D --> E["5 Zeitgeber<br/>Ankerlauf, Aufbewahrung"]
    E --> F(["bereit für den ersten Bericht"])
    classDef stufe fill:#ffc107,stroke:#b38600,color:#1f1a00
    classDef ziel fill:#4d7c0f,stroke:#4d7c0f,color:#fff
    class A,B,C,D,E stufe
    class F ziel

Stufe 3 ist kein fester Zeitpunkt. Die Tabellen einer Datenbank entstehen, wenn sie zum ersten Mal gebraucht wird, wie bei CDMS. Für die System-Datenbank ist das spätestens beim Einspielen der Vorlagen.

Die fünf Stufen

CRMS beim Start, von oben nach unten
  1. 1
    CRMS
    1 Platzierung. Passt codamai.crms.placement zum Klassenpfad?
    local verlangt das eingebettete CRMS, remote verlangt crms-client und verbietet den Renderer und die HTTP-Schnittstelle von CRMS. Diese Prüfung läuft vor allem anderen von CRMS. Eine falsch zusammengesetzte Anwendung scheitert hier, bevor ein Modul nach seinen Schlüsseln fragt.
  2. 2
    CRMS
    2 Kontext. Spring baut die Objekte von CRMS. Jede Pflichtangabe wird jetzt geprüft
    Der Zeitstempel-Schlüssel, die Rollen der Plattform-Administratoren, die Formate, bei abgelegten Dokumenten Schlüssel, Aufbewahrung und Bucket. Dazu die Bausteine, die der Gastgeber liefern muss: den Aufrufer und die Mandantenliste aus CIAS, die Datenbankschicht von CDMS.
  3. 3
    CRMS→Datenbank
    3 Tabellen. Die crms_…-Tabellen entstehen in der System-Datenbank und in jeder Mandanten-Datenbank
    CRMS meldet seine Entities für beide Ebenen bei der Datenbankschicht an. Hibernate baut die Tabellen daraus, sobald eine Datenbank zum ersten Mal gebraucht wird.
  4. 4
    Anwendung→CRMS
    4 Vorlagen. Bringt die Anwendung Vorlagen mit, spielt sie sie ein, sobald sie bereit ist
    Als Plattform-Administrator im Scope SYSTEM, über den normalen Weg mit Entwurf und Einreichen. Die Vorlagen landen in der System-Datenbank.
  5. 5
    CRMS
    5 Zeitgeber. Eine Minute nach dem Start beginnen Ankerlauf und Aufbewahrungslauf
    Ergebnis: Die Anwendung nimmt Render-Anfragen an. Der erste Anker entsteht im ersten Ankerlauf.

Stufe 2: Was den Start abbricht

Was CRMS beim Kontextbau prüft
AngabeWenn sie fehlt oder nicht stimmt
codamai.crms.placement fehlt oder passt nicht zum KlassenpfadStart bricht ab, die Meldung nennt das fehlende oder überzählige Jar
CODAMAI_CRMS_TSA_KEYSTORE fehlt, ist kein PKCS#12 oder das Zertifikat ist abgelaufenStart bricht ab. Ohne diesen Schlüssel kann CRMS seine Journale nicht verankern
das Zeitstempel-Zertifikat läuft in weniger als 60 Tagen abkein Startfehler, eine Warnung im Log mit dem Ablaufdatum
Scope SYSTEM ist zugelassen, CIAS nennt aber keine Plattform-AdministratorrolleStart bricht ab. Niemand könnte Systemvorlagen schreiben
ein Format in CODAMAI_CRMS_FORMATS ohne installiertes FormatmodulStart bricht ab
Dokumente werden abgelegt, aber Dokumentschlüssel, Aufbewahrung, Bucket oder S3-Zugang fehlenStart bricht ab, die Meldung nennt die Variable
der Bucket hat kein Object LockStart bricht ab, solange CODAMAI_CRMS_STORAGE_ALLOW_UNLOCKED aus ist
ein Abstand der Zeitgeber ist null oder negativStart bricht ab
remote: CODAMAI_CRMS_CLIENT_URL fehlt oder ist keine http- oder https-AdresseStart bricht ab. Das ist die einzige Pflicht eines Clients

Die Liste aller Variablen und wann welche Pflicht ist, steht unter Umgebungsvariablen. Den Zeitstempel-Schlüssel erklärt Zeitstempel und Anker.

Stufe 3: Wo die CRMS-Tabellen landen

CRMS hat keinen eigenen Datenbankweg. Es nutzt die gemeinsame Datenbankschicht von CodamAI, dieselbe wie bei CDMS, und meldet seine Entities dort zweimal an: einmal für die System-Datenbank, einmal für jede Mandanten-Datenbank. Jede Datenbank bekommt also dieselben crms_…-Tabellen. Welche Zeile wohin kommt, entscheidet, wem sie gehört.

DatenbankWas CRMS dort hält
System-DatenbankSystemvorlagen, das System-Journal, die Anker
Mandanten-Datenbank, etwa nordbauVorlagen des Mandanten und seiner Personen, das Journal von nordbau, seine endgültigen Dokumente, der Beweispfad seines Journals

In SINGLE ist das eine Datenbank. Die Dateien der endgültigen Dokumente liegen nicht in der Datenbank, sondern im S3-Bucket.

Anders als bei CIAS gibt es dafür keinen eigenen Migrationslauf. Die Tabellen entstehen auf demselben Weg wie die der CDMS-Modelle, beim ersten Zugriff auf die jeweilige Datenbank. Nach einem Update wird also auch eine Mandanten-Datenbank erst angehoben, wenn dieser Mandant arbeitet oder ein Zeitgeber ihn besucht. Einzelheiten unter Die Datenbank und Datenbanken und Schemata.

Stufe 4: Mitgelieferte Vorlagen einspielen

CRMS liest keinen Vorlagenordner von selbst. Bringt eine Anwendung Vorlagen in ihrem Build mit, spielt die Anwendung sie ein. Das Hub-Backend tut das für seine Projektdokumente, sobald es sich als bereit meldet:

Einspielen im Hub-Backend
  1. 1
    Anwendung
    handelt als Plattform-Administrator: die Rollen aus CIAS, kein Mandant, die Kennung hub-backend als Autor
  2. 2
    Anwendung→CRMS
    legt fehlende Ausgaben und Sprachvarianten im Scope SYSTEM an
  3. 3
    Anwendung
    Ist der Quelltext gleich der veröffentlichten Revision?
  4. 4
    Anwendung→CRMS
    nur wenn nicht: Entwurf speichern und mit Grund einreichen
  5. 5
    CRMS
    die Freigabekette des Scopes SYSTEM entscheidet
    Ergebnis: Ohne Freigabestufen ist die Vorlage sofort veröffentlicht. Ein unveränderter Build ändert nichts.

Scheitert das Einspielen, steht das im Log, und der Start läuft weiter. Alles andere der Anwendung funktioniert ohne die Vorlagen. Ein Bericht, der sie braucht, antwortet bis zum nächsten erfolgreichen Einspielen mit template-not-found. Den ganzen Weg zeigt Mitgelieferte Vorlagen.

Stufe 5: Der erste Ankerlauf

Verankern heißt: CRMS lässt den letzten Stand jedes Journals mit einem Zeitstempel bestätigen. So lässt sich später nichts unbemerkt umschreiben.

Ein Ankerlauf nach dem Start
  1. 1
    CRMS→CIAS
    fragt nach allen Mandanten, Seite für Seite
    Auch gesperrte und geschlossene. Ihr Journal muss verankert bleiben, und ihre Aufbewahrungsfristen laufen weiter. Eingebettetes CIAS antwortet per Methodenaufruf, getrenntes über HTTP.
  2. 2
    CRMS→Datenbank
    liest den Kopf des System-Journals und den Kopf des Journals jedes Mandanten
    Für jeden Mandanten betritt CRMS dessen Kontext über CIAS. Das Mandanten-Tor lässt dabei auch nicht bediente Mandanten zu, lehnt aber unbekannte ab. Der Kontext hat keine Rollen.
  3. 3
    CRMS
    baut aus allen Köpfen einen Baum, lässt seine Wurzel stempeln und legt den Anker in die System-Datenbank
  4. 4
    CRMS→Datenbank
    legt jedem Mandanten seinen Beweispfad in die eigene Datenbank
    Ergebnis: Ist ein Mandant nicht erreichbar, wird er ausgelassen und im nächsten Lauf nachgeholt. Ein Lauf, der ganz scheitert, steht im Log, der nächste ist der Neuversuch.

Der erste Lauf beginnt eine Minute nach dem Start, danach alle CODAMAI_CRMS_ANCHOR_INTERVAL (stündlich). Der Aufbewahrungslauf, der abgelaufene Dokumente entfernt, folgt demselben Muster mit einem Abstand von 24 Stunden. Beide sind an, sobald CRMS eingebettet ist. Bei CIAS ist das umgekehrt: Seine Zeitgeber sind aus, bis jemand sie einschaltet. Der Grund ist, dass Verankern und Aufbewahren Pflichten sind und keine Wartung.

Bei mehreren Instanzen derselben Anwendung lässt du die Zeitgeber in genau einer an (CODAMAI_CRMS_SCHEDULING_ENABLED). Wie ein Anker aufgebaut ist, steht unter Zeitstempel und Anker.

CRMS meldet seine Rollen an

In Stufe 4 des Kaltstarts liest CIAS die Deklarationen der Module, also die Listen ihrer Rollen und Attribute, und legt daraus Rollen in Keycloak an. Ein eingebettetes CRMS steht in dieser Liste als Modul crms, neben cias und cdms. Seine Deklaration ist die Bean crmsIdentityRegistry, und der Projektrahmen trägt sie ein.

Daraus folgt:

  • Was nicht genutzt wird, kommt nicht dazu. Ein Scope, den die Installation nicht zulässt, und Dokumente, die sie nicht ablegt, melden keine Rolle an. Der Hub lässt nur Systemvorlagen zu und legt keine Dokumente ab, seine Liste ist darum leer.
  • Der Abgleich legt die Rollen an als Client-Rollen am Client der Anwendung, wie die von CDMS. Vergeben musst du sie wie jede andere Rolle.
  • Ein neuer Name ersetzt den alten. Nennt die Installation eine Rolle um, meldet CRMS den neuen Namen an. Den alten legt der Abgleich still, statt ihn zu löschen. Siehe Module melden Rollen und Attribute an.
  • Plattformrollen meldet CRMS nie an. Systemvorlagen schreiben die Plattform-Administratoren, die CIAS für die Installation nennt. Siehe Die Realm-Rollen der Plattform.
  • Ein eigener CRMS-Dienst meldet nichts an. Seine Rollen gehören zum Client des CRMS-Dienstes. Dort legst du sie selbst an.

Wo du die Rollennamen einstellst, steht unter Die Rollen.

Die Ausprägungen

Wie der Start mit CRMS aussieht

Wann: Alles läuft in einem Prozess, wie im Hub-Backend.

Ein Start für alle drei. Die CRMS-Tabellen liegen neben denen von CDMS und CIAS in der System-Datenbank und neben den Mandanten-Modellen in jeder Mandanten-Datenbank. Die Mandantenliste für den Ankerlauf ist ein Methodenaufruf.

Ergebnis: Ist der Prozess oben, kann er Berichte erzeugen.

Wann: CRMS liegt in der CDMS-Anwendung, CIAS ist ein eigener Dienst.

Der Start der Anwendung prüft dasselbe wie oben. Der Ankerlauf fragt den CIAS-Dienst über HTTP nach den Mandanten, mit dem Dienst-Token der Anwendung. Dafür muss CIAS seine Mandantenliste veröffentlichen, und das Dienstkonto braucht dort die Rolle aus codamai.cias.tenancy.directory-roles.

Ergebnis: Ist CIAS beim ersten Lauf nicht erreichbar, scheitert nur dieser Lauf. Der Start ist davon nicht betroffen.

Wann: Das CRMS-Modul liegt in einer Laufzeit ohne CDMS-Anwendung.

Der CRMS-Dienst hat seinen eigenen Start und seine eigene Datenbank mit nur den CRMS-Tabellen. Er braucht dieselben Pflichtangaben und dazu immer Bucket und S3-Zugang. CIAS fragt er über HTTP, für das Mandanten-Tor und für die Mandantenliste.

Ergebnis: Die Zeitgeber laufen im CRMS-Dienst, nicht in den Anwendungen, die ihn aufrufen.

Wann: Die Anwendung ruft einen CRMS-Dienst über crms-client.

Die Anwendung prüft nur die Platzierung und die Adresse des Dienstes. Sie hat keine CRMS-Tabellen, keine Schlüssel, keine Vorlagen zum Einspielen und keine Zeitgeber. Alles das gehört dem Dienst.

Ergebnis: Läuft der CRMS-Dienst noch nicht, startet die Anwendung trotzdem. Berichte antworten dann mit crms-unavailable.

Fallen

Weiter

Suchen