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
-
1CRMS1 Platzierung. Passt
codamai.crms.placementzum Klassenpfad?localverlangt das eingebettete CRMS,remoteverlangtcrms-clientund 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. -
2CRMS2 Kontext. Spring baut die Objekte von CRMS. Jede Pflichtangabe wird jetzt geprüftDer 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.
-
3CRMS→Datenbank3 Tabellen. Die
crms_…-Tabellen entstehen in der System-Datenbank und in jeder Mandanten-DatenbankCRMS meldet seine Entities für beide Ebenen bei der Datenbankschicht an. Hibernate baut die Tabellen daraus, sobald eine Datenbank zum ersten Mal gebraucht wird. -
4Anwendung→CRMS4 Vorlagen. Bringt die Anwendung Vorlagen mit, spielt sie sie ein, sobald sie bereit istAls Plattform-Administrator im Scope
SYSTEM, über den normalen Weg mit Entwurf und Einreichen. Die Vorlagen landen in der System-Datenbank. -
5CRMS5 Zeitgeber. Eine Minute nach dem Start beginnen Ankerlauf und AufbewahrungslaufErgebnis: Die Anwendung nimmt Render-Anfragen an. Der erste Anker entsteht im ersten Ankerlauf.
Stufe 2: Was den Start abbricht
| Angabe | Wenn sie fehlt oder nicht stimmt |
|---|---|
codamai.crms.placement fehlt oder passt nicht zum Klassenpfad | Start bricht ab, die Meldung nennt das fehlende oder überzählige Jar |
CODAMAI_CRMS_TSA_KEYSTORE fehlt, ist kein PKCS#12 oder das Zertifikat ist abgelaufen | Start bricht ab. Ohne diesen Schlüssel kann CRMS seine Journale nicht verankern |
| das Zeitstempel-Zertifikat läuft in weniger als 60 Tagen ab | kein Startfehler, eine Warnung im Log mit dem Ablaufdatum |
Scope SYSTEM ist zugelassen, CIAS nennt aber keine Plattform-Administratorrolle | Start bricht ab. Niemand könnte Systemvorlagen schreiben |
ein Format in CODAMAI_CRMS_FORMATS ohne installiertes Formatmodul | Start bricht ab |
| Dokumente werden abgelegt, aber Dokumentschlüssel, Aufbewahrung, Bucket oder S3-Zugang fehlen | Start bricht ab, die Meldung nennt die Variable |
| der Bucket hat kein Object Lock | Start bricht ab, solange CODAMAI_CRMS_STORAGE_ALLOW_UNLOCKED aus ist |
| ein Abstand der Zeitgeber ist null oder negativ | Start bricht ab |
remote: CODAMAI_CRMS_CLIENT_URL fehlt oder ist keine http- oder https-Adresse | Start 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.
| Datenbank | Was CRMS dort hält |
|---|---|
| System-Datenbank | Systemvorlagen, das System-Journal, die Anker |
Mandanten-Datenbank, etwa nordbau | Vorlagen 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:
-
1Anwendunghandelt als Plattform-Administrator: die Rollen aus CIAS, kein Mandant, die Kennung
hub-backendals Autor -
2Anwendung→CRMSlegt fehlende Ausgaben und Sprachvarianten im Scope
SYSTEMan -
3AnwendungIst der Quelltext gleich der veröffentlichten Revision?
-
4Anwendung→CRMSnur wenn nicht: Entwurf speichern und mit Grund einreichen
-
5CRMSdie Freigabekette des Scopes
SYSTEMentscheidetErgebnis: 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.
-
1CRMS→CIASfragt nach allen Mandanten, Seite für SeiteAuch gesperrte und geschlossene. Ihr Journal muss verankert bleiben, und ihre Aufbewahrungsfristen laufen weiter. Eingebettetes CIAS antwortet per Methodenaufruf, getrenntes über HTTP.
-
2CRMS→Datenbankliest den Kopf des System-Journals und den Kopf des Journals jedes MandantenFü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.
-
3CRMSbaut aus allen Köpfen einen Baum, lässt seine Wurzel stempeln und legt den Anker in die System-Datenbank
-
4CRMS→Datenbanklegt jedem Mandanten seinen Beweispfad in die eigene DatenbankErgebnis: 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
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
- Kaltstart einer Installation: der Start von CDMS und CIAS
- Datenbanken und Schemata und Module melden Rollen und Attribute an
- CRMS in den Betriebsarten
- Umgebungsvariablen und Die Datenbank
- Mitgelieferte Vorlagen und Zeitstempel und Anker