Zuletzt bearbeitet vor 2 Tagen
von Andre Knieschewski

Kernmodul Regelbetrieb: Unterschied zwischen den Versionen

Markierung: 2017-Quelltext-Bearbeitung
Keine Bearbeitungszusammenfassung
Markierung: 2017-Quelltext-Bearbeitung
 
(8 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 264: Zeile 264:
  ORDER BY 1;
  ORDER BY 1;
</source>
</source>




=Migration auf die Webapp-Struktur=
=Migration auf die Webapp-Struktur=


==Ziel==
Das bereitgestellte Migrationsskript ermöglicht die Umstellung einer bestehenden SuperX-Installation auf die empfohlene Webapp-Struktur.
Mit dem Skript <code>migrate_superx_webapp.sh</code> kann eine bestehende SuperX-Installation automatisch auf die neue Verzeichnisstruktur migriert werden.


Die Migration unterstützt zwei Anwendungsfälle:
Dabei können sowohl klassische Installationen mit separatem DB-Verzeichnis als auch bestehende Webapp-Installationen migriert werden. Die Migration kann je nach Anwendungsfall vollständig oder ausschließlich für das DB-Verzeichnis durchgeführt werden.
Hier eine Anleitung "in short", wenn Sie bisher das "klasssische" Layout genutzt haben (also Unix Benutzer "superx", Installation in "/home/superx").


* vollständige Migration der Webapp inklusive DB-Verzeichnis
git clone https://git.campussource.de/git/SuperX/BI_Maintenance.git
* Migration nur des DB-Verzeichnisses in eine bereits vorhandene Webapp
#Script ausführen und neues ENV laden:
 
cd BI_Maintenance/webapps_migration
Die bisherige SuperX-Struktur:
./migrate_superx_webapp.sh


Das Skript liest die bestehende Installation anhand der vorhandenen SQL_ENV-Datei ein und erzeugt daraus die gewünschte Zielstruktur. Details können in der Konfigurationsdatei
<source lang="text">
<source lang="text">
/home/superx/db
migrate_superx.conf
/home/superx/webserver/tomcat/webapps/superx
</source>
</source>
konfiguriert, siehe folgende Dokumentation.


kann damit in folgende Zielstruktur überführt werden:
==Zielstruktur==


<source lang="text">
Die Webapp wird standardmäßig nicht direkt im Tomcat-Webapp-Verzeichnis abgelegt, sondern unter:
<WEBAPP>
└── WEB-INF
    └── conf
        └── edustore
            └── db
</source>
 
Beispiel:


<source lang="text">
<source lang="text">
/var/lib/tomcat10/webapps/superx
/home/superx/webapps/superx
└── WEB-INF
    └── conf
        └── edustore
            └── db
</source>
</source>


Dadurch bleibt die Installation unabhängig von der verwendeten Tomcat-Distribution und kann einfacher per Git, rsync oder Modulupdate gepflegt werden.


==Dateien==
Die zugehörige DB-Struktur befindet sich anschließend unter:
Das Migrationsskript besteht aus zwei Dateien:


<source lang="text">
<source lang="text">
migrate_superx.conf
/home/superx/webapps/superx/WEB-INF/conf/edustore/db
migrate_superx_webapp.sh
</source>
</source>


Beide Dateien müssen im selben Verzeichnis liegen.
==Tomcat-Anbindung==


Das Skript lädt die Konfigurationsdatei automatisch aus dem eigenen Skriptverzeichnis. Ein Pfad zur Konfigurationsdatei muss beim Aufruf nicht angegeben werden.
Für den Zugriff des Tomcat-Servers auf die Webapp gibt es grundsätzlich zwei Möglichkeiten:


Aufruf:
* Verwendung eines symbolischen Links vom Tomcat-Webapp-Verzeichnis auf die eigentliche Webapp.
* Anpassung der Tomcat-Konfiguration (z. B. appBase oder Context-Konfiguration).


<source lang="bash">
Empfohlen wird die Verwendung eines symbolischen Links.
./migrate_superx_webapp.sh
</source>


Für Produktivmigrationen mit Rechteanpassung wird in der Regel root benötigt:
Beispiel:


<source lang="bash">
<source lang="text">
sudo ./migrate_superx_webapp.sh
/srv/tomcat/webapps/superx
-> /home/superx/webapps/superx
</source>
</source>


==Wichtige Variablen==


==Grundlegende Konfiguration==
Die wichtigsten Einstellungen erfolgen in der Datei:


===Vorhandene SQL_ENV===
<source lang="text">
Die bestehende Installation wird über die vorhandene <code>SQL_ENV</code> ermittelt.
migrate_superx.conf
 
<source lang="bash">
SQL_ENV="/home/superx/db/bin/SQL_ENV"
</source>
</source>


Aus dieser Datei liest das Skript insbesondere:
===TARGET_WEBAPP===


<source lang="bash">
Definiert das Zielverzeichnis der Webapp.
SUPERX_DIR
WEBAPP
</source>


Diese Werte werden als Quellpfade für die Migration verwendet.
Beispiel:
 
 
==Migrationsmodus==
 
Die Variable <code>MIGRATION_MODE</code> steuert, ob die komplette Webapp oder nur das DB-Verzeichnis migriert wird.
 
<source lang="bash">
MIGRATION_MODE="full"
</source>
 
Erlaubte Werte:


<source lang="bash">
<source lang="bash">
full
TARGET_WEBAPP="/home/superx/webapps/superx"
db_only
</source>
 
===MIGRATION_MODE=full===
 
Bei <code>full</code> wird die bestehende Webapp in ein neues Ziel-Webapp-Verzeichnis kopiert.
 
Zusätzlich wird das DB-Verzeichnis nach:
 
<source lang="text">
<TARGET_WEBAPP>/WEB-INF/conf/edustore/db
</source>
</source>


kopiert oder verschoben.
===WEBAPP_USER===


Dieser Modus ist für eine vollständige Migration auf einen neuen Tomcat-Webapp-Pfad vorgesehen.
Definiert den Besitzer der Ziel-Webapp.


Beispiel:
Beispiel:


<source lang="bash">
<source lang="bash">
MIGRATION_MODE="full"
WEBAPP_USER="superx"
TARGET_WEBAPP="/var/lib/tomcat10/webapps/superx"
DB_TRANSFER_MODE="copy"
</source>
</source>


Ablauf:
===WEBAPP_GROUP===


# bestehende Webapp wird nach <code>TARGET_WEBAPP</code> kopiert
Definiert die Gruppe der Ziel-Webapp.
# bestehendes DB-Verzeichnis wird nach <code>TARGET_WEBAPP/WEB-INF/conf/edustore/db</code> kopiert oder verschoben
# die neue <code>SQL_ENV</code> im Ziel wird angepasst
 
===MIGRATION_MODE=db_only===
 
Bei <code>db_only</code> wird keine Webapp kopiert.
 
Es wird nur das DB-Verzeichnis in die bereits vorhandene Webapp-Struktur übernommen.
 
Dieser Modus ist sinnvoll, wenn die Webapp bereits an der gewünschten Stelle liegt und nur noch das bisher externe DB-Verzeichnis in die neue Zielstruktur übernommen werden soll.


Beispiel:
Beispiel:


<source lang="bash">
<source lang="bash">
MIGRATION_MODE="db_only"
WEBAPP_GROUP="tomcat"
TARGET_WEBAPP="auto"
DB_TRANSFER_MODE="move"
</source>
</source>


Bei <code>TARGET_WEBAPP="auto"</code> verwendet das Skript automatisch den bestehenden Wert von <code>WEBAPP</code> aus der geladenen <code>SQL_ENV</code>.
Ergebnis:
 
Das DB-Verzeichnis wird dann nach:


<source lang="text">
<source lang="text">
$WEBAPP/WEB-INF/conf/edustore/db
Owner: superx
Group: tomcat
</source>
</source>


kopiert oder verschoben.
===MIGRATION_MODE===
 


==Übertragung des DB-Verzeichnisses==
Steuert die Art der Migration.


Die Variable <code>DB_TRANSFER_MODE</code> steuert, ob das DB-Verzeichnis kopiert oder verschoben wird.
Vollständige Migration:


<source lang="bash">
<source lang="bash">
DB_TRANSFER_MODE="copy"
MIGRATION_MODE="full"
</source>
</source>


Erlaubte Werte:
Nur Migration des DB-Verzeichnisses:


<source lang="bash">
<source lang="bash">
copy
MIGRATION_MODE="db_only"
move
</source>
</source>
==Migration des DB-Verzeichnisses==
Das DB-Verzeichnis kann entweder kopiert oder verschoben werden.


===DB_TRANSFER_MODE=copy===
===DB_TRANSFER_MODE=copy===


Bei <code>copy</code> wird das DB-Verzeichnis per <code>rsync</code> kopiert.
Das bestehende DB-Verzeichnis bleibt erhalten.


<source lang="bash">
<source lang="bash">
Zeile 441: Zeile 390:
</source>
</source>


Die Quelle bleibt erhalten.
Intern wird hierfür rsync verwendet.
 
Das ist die sicherere Variante und eignet sich besonders für Produktivmigrationen, bei denen die alte Installation zunächst unverändert erhalten bleiben soll.


===DB_TRANSFER_MODE=move===
===DB_TRANSFER_MODE=move===


Bei <code>move</code> wird das DB-Verzeichnis per <code>mv</code> verschoben.
Das DB-Verzeichnis wird verschoben.


<source lang="bash">
<source lang="bash">
Zeile 453: Zeile 400:
</source>
</source>


Die Quelle liegt danach nicht mehr am alten Ort.
Intern wird hierfür mv verwendet. Ist das Zielverzeichnis bereits vorhanden und
<code>ALLOW_EXISTING_TARGET_DB="true"</code> gesetzt, wird das vorhandene Ziel-DB-Verzeichnis vor dem Verschieben vollständig ersetzt. Damit verbleiben keine alten Dateien im Ziel.


Diese Variante kann sinnvoll sein, wenn das DB-Verzeichnis sehr groß ist, z. B. durch:
Dies ist der empfohlene Standard für die Migration klassischer SuperX-Installationen und vermeidet unnötigen zusätzlichen Speicherbedarf.


* unload-Dateien
==Automatische Anpassung der SQL_ENV==
* Exportdateien
* temporäre Arbeitsdateien
* lokale Sicherungen


Da beim Verschieben kein doppelter Speicherplatz benötigt wird, kann <code>move</code> bei knappen Plattenplatzverhältnissen sinnvoll sein.
Nach der Migration kann die SQL_ENV-Datei automatisch angepasst werden.


Aus Sicherheitsgründen darf das Zielverzeichnis bei <code>move</code> noch nicht existieren. Das Skript bricht sonst ab, um unerwünschte Verschachtelungen wie <code>db/db</code> zu vermeiden.
Dabei werden insbesondere folgende Variablen aktualisiert:
 
 
==Ziel-Webapp==
 
Die Ziel-Webapp wird über <code>TARGET_WEBAPP</code> festgelegt.


<source lang="bash">
<source lang="bash">
TARGET_WEBAPP="/var/lib/tomcat10/webapps/superx"
SUPERX_DIR
WEBAPP
</source>
</source>


Bei <code>MIGRATION_MODE=full</code> muss hier ein konkreter Zielpfad eingetragen werden.
Zusätzlich wird sichergestellt, dass folgende Einstellung vorhanden ist:
 
Bei <code>MIGRATION_MODE=db_only</code> kann stattdessen <code>auto</code> verwendet werden:


<source lang="bash">
<source lang="bash">
TARGET_WEBAPP="auto"
umask 002
</source>
</source>


Dann verwendet das Skript den bestehenden Wert von <code>WEBAPP</code> aus der alten <code>SQL_ENV</code>.
Vor der Änderung wird automatisch eine Sicherungskopie der SQL_ENV-Datei angelegt.


==Benutzer und Gruppen==


==Bestehende Zielverzeichnisse==
Die folgenden Variablen steuern, welchem Benutzer und welcher Gruppe die Ziel-Webapp nach der Migration zugeordnet wird.


===ALLOW_EXISTING_TARGET===
===WEBAPP_USER===


Diese Variable steuert, ob eine bereits vorhandene Ziel-Webapp ergänzt werden darf.
Definiert den Besitzer der Ziel-Webapp.


<source lang="bash">
Beispiel:
ALLOW_EXISTING_TARGET="true"
</source>
 
Bei <code>MIGRATION_MODE=full</code> kann damit erlaubt werden, dass eine vorhandene Ziel-Webapp per <code>rsync</code> ergänzt oder aktualisiert wird.
 
===ALLOW_EXISTING_TARGET_DB===
 
Diese Variable steuert, ob ein bereits vorhandenes Ziel-DB-Verzeichnis bei <code>DB_TRANSFER_MODE=copy</code> ergänzt werden darf.


<source lang="bash">
<source lang="bash">
ALLOW_EXISTING_TARGET_DB="true"
WEBAPP_USER="superx"
</source>
</source>


Bei <code>DB_TRANSFER_MODE=copy</code> kann das Ziel per <code>rsync</code> ergänzt werden.
Alle Dateien und Verzeichnisse der Ziel-Webapp werden diesem Benutzer zugeordnet, sofern die Rechteverwaltung aktiviert ist.
 
Bei <code>DB_TRANSFER_MODE=move</code> wird diese Einstellung ignoriert. In diesem Fall darf das Ziel-DB-Verzeichnis nicht existieren.
 


==SQL_ENV-Anpassung==
===WEBAPP_GROUP===


Nach der Migration wird die <code>SQL_ENV</code> im Ziel-DB-Verzeichnis angepasst.
Definiert die Gruppe der Ziel-Webapp.
 
Ziel:
 
<source lang="bash">
WEBAPP=<TARGET_WEBAPP>
SUPERX_DIR=<TARGET_WEBAPP>/WEB-INF/conf/edustore
umask 002
</source>


Beispiel:
Beispiel:


<source lang="bash">
<source lang="bash">
WEBAPP=/var/lib/tomcat10/webapps/superx
WEBAPP_GROUP="tomcat"
SUPERX_DIR=/var/lib/tomcat10/webapps/superx/WEB-INF/conf/edustore
umask 002
</source>
</source>


Vor der Änderung wird automatisch eine Sicherung der Ziel-<code>SQL_ENV</code> angelegt.
Die Gruppe wird für alle Dateien und Verzeichnisse der Ziel-Webapp verwendet.
 
Die Anpassung kann über folgende Variable gesteuert werden:
 
<source lang="bash">
UPDATE_SQL_ENV="true"
</source>


Durch das gesetzte setgid-Bit auf den Verzeichnissen erben neu angelegte Dateien und Unterverzeichnisse automatisch diese Gruppe.


==Automatische Rechtebehandlung==
==Automatische Rechtebehandlung==


Die Rechtebehandlung wird über folgende Variablen gesteuert:
Die Migration kann sowohl als root als auch – unter bestimmten Voraussetzungen – direkt als Anwendungsbenutzer ausgeführt werden.
 
<source lang="bash">
SET_RIGHTS="true"
SET_OWNER="auto"
SET_CHMOD="true"
</source>


===SET_OWNER=auto===
===SET_OWNER=auto===


Dies ist die empfohlene Standardeinstellung.
Dies ist die empfohlene Standardeinstellung.
Das Skript entscheidet automatisch, ob ein <code>chown</code> erforderlich ist:
* Wird das Skript als <code>root</code> ausgeführt, werden Besitzer und Gruppe gemäß <code>TOMCAT_USER</code> und <code>SUPERX_GROUP</code> gesetzt.
* Wird das Skript als derselbe Benutzer ausgeführt, der auch als <code>TOMCAT_USER</code> konfiguriert wurde und ist dieser Benutzer Mitglied der angegebenen Gruppe, wird auf das <code>chown</code> automatisch verzichtet.
* Ist eine Änderung des Besitzers erforderlich, das Skript läuft jedoch nicht als <code>root</code>, wird mit einer Fehlermeldung abgebrochen.
Beispiel Produktivsystem:


<source lang="bash">
<source lang="bash">
TOMCAT_USER="tomcat"
SUPERX_GROUP="superx"
SET_OWNER="auto"
SET_OWNER="auto"
</source>
</source>


Beispiel Testsystem ohne root:
Das Skript entscheidet abhängig vom aktuellen Benutzer automatisch, ob ein Besitzerwechsel erforderlich ist.


<source lang="bash">
====Ausführung als root====
TOMCAT_USER="superx"
SUPERX_GROUP="superx"
SET_OWNER="auto"
</source>


===SET_OWNER=true===
Wird das Skript als root ausgeführt, werden Besitzer und Gruppe der Ziel-Webapp auf die konfigurierten Werte gesetzt.


<source lang="bash">
<source lang="bash">
SET_OWNER="true"
chown -R $WEBAPP_USER:$WEBAPP_GROUP ...
</source>
</source>


Der Besitzer wird immer auf den konfigurierten Benutzer und die konfigurierte Gruppe gesetzt:
Zusätzlich wird auch das übergeordnete Verzeichnis der Webapp (z. B. /home/superx/webapps) auf die gleichen Besitz- und Gruppenrechte gesetzt.


<source lang="bash">
====Ausführung als WEBAPP_USER====
chown -R $TOMCAT_USER:$SUPERX_GROUP ...
</source>


Dafür werden normalerweise root-Rechte benötigt.
Wird das Skript direkt als der konfigurierte WEBAPP_USER ausgeführt und ist dieser Benutzer Mitglied der konfigurierten WEBAPP_GROUP, wird kein chown ausgeführt.


===SET_OWNER=false===
Stattdessen verwendet das Skript bei Bedarf ein chgrp, um die Gruppenzugehörigkeit der Dateien anzupassen.


<source lang="bash">
In diesem Fall kann die Migration häufig vollständig ohne root-Rechte durchgeführt werden.
SET_OWNER="false"
</source>


Es wird kein <code>chown</code> ausgeführt.
====Ausführung als anderer Benutzer====


Die vorhandenen Besitzer- und Gruppeninformationen bleiben unverändert.
Wird das Skript weder als root noch als WEBAPP_USER mit passender Gruppenmitgliedschaft ausgeführt, bricht das Skript mit einer entsprechenden Fehlermeldung ab.


===SET_CHMOD===
===ADD_WEBAPP_USER_TO_GROUP===


Mit <code>SET_CHMOD</code> wird gesteuert, ob Dateirechte gesetzt werden.
Optional kann das Skript die Gruppenmitgliedschaft des Zielbenutzers automatisch anpassen.


<source lang="bash">
<source lang="bash">
SET_CHMOD="true"
ADD_WEBAPP_USER_TO_GROUP="true"
</source>
</source>


Dabei werden u. a.:
Hierfür sind root-Rechte erforderlich.
 
* Verzeichnisse auf <code>2775</code> gesetzt
* Dateien auf <code>664</code> gesetzt
* Dateien unter <code>db/bin</code> ausführbar gesetzt
* Dateien mit Endung <code>.x</code> und <code>.sh</code> ausführbar gesetzt
 
Das gesetzte setgid-Bit auf Verzeichnissen sorgt dafür, dass neu angelegte Dateien und Verzeichnisse die Gruppe des übergeordneten Verzeichnisses erben.
 


==Tomcat-Gruppe==
==Tomcat-Symlink==


Wenn mit Gruppenrechten gearbeitet wird, muss der Tomcat-Benutzer Mitglied der verwendeten Gruppe sein.
Optional kann das Skript den Symlink für den Tomcat automatisch erzeugen.


Beispiel:
===CREATE_TOMCAT_SYMLINK===


<source lang="bash">
<source lang="bash">
usermod -aG superx tomcat
CREATE_TOMCAT_SYMLINK="true"
</source>
</source>


Im Skript kann diese Zuordnung automatisch erfolgen:
===TOMCAT_WEBAPPS_DIR===


<source lang="bash">
<source lang="bash">
ADD_TOMCAT_TO_GROUP="true"
TOMCAT_WEBAPPS_DIR="/srv/tomcat/webapps"
</source>
</source>


Falls die Gruppenmitgliedschaft neu gesetzt wurde, muss Tomcat anschließend neu gestartet werden, damit die neue Gruppenzugehörigkeit im laufenden Prozess wirksam wird.
===TOMCAT_CONTEXT_NAME===
 
 
==Sicherheitsprüfung bereits migrierter Installationen==
 
Um versehentliche Mehrfachmigrationen zu vermeiden, prüft das Skript standardmäßig, ob die Quelle bereits nach einer migrierten Webapp-Struktur aussieht.
 
Beispiel:


<source lang="bash">
<source lang="bash">
SUPERX_DIR=/home/superx/webserver/tomcat/webapps/superx/WEB-INF/conf/edustore
TOMCAT_CONTEXT_NAME="superx"
WEBAPP=/home/superx/webserver/tomcat/webapps/superx
</source>
</source>


Hier liegt <code>SUPERX_DIR</code> bereits innerhalb von <code>WEBAPP</code>.
===REPLACE_EXISTING_SYMLINK===


In diesem Fall bricht das Skript standardmäßig ab.
Bestehende Symlinks können bei Bedarf automatisch ersetzt werden.
 
Die Prüfung kann im Notfall übersteuert werden:


<source lang="bash">
<source lang="bash">
FORCE_ALREADY_MIGRATED="true"
REPLACE_EXISTING_SYMLINK="true"
</source>
</source>


Standardwert:
Normale Dateien oder Verzeichnisse werden dabei niemals automatisch gelöscht.


<source lang="bash">
==Sicherheitsprüfungen==
FORCE_ALREADY_MIGRATED="false"
</source>


Diese Option sollte nur verwendet werden, wenn die Auswirkungen bekannt sind. Andernfalls besteht die Gefahr, dass bereits migrierte Strukturen erneut kopiert oder ungewollt verschachtelt werden.
Vor Beginn der Migration werden verschiedene Sicherheitsprüfungen durchgeführt.


Unter anderem wird geprüft:


==Dry-Run==
* Existiert die SQL_ENV-Datei?
* Existiert der konfigurierte Benutzer?
* Existiert die konfigurierte Gruppe?
* Sind Quell- und Zielverzeichnis identisch?
* Würde eine Verzeichnisverschachtelung entstehen?
* Befindet sich SUPERX_DIR bereits innerhalb von WEBAPP?


Vor einer Produktivmigration empfiehlt sich ein Testlauf:
Wird erkannt, dass die Installation bereits der neuen Struktur entspricht, bricht das Skript standardmäßig ab.


<source lang="bash">
===FORCE_ALREADY_MIGRATED===
DRY_RUN="true"
</source>


Danach:
In Ausnahmefällen kann diese Prüfung übersteuert werden.


<source lang="bash">
<source lang="bash">
./migrate_superx_webapp.sh
FORCE_ALREADY_MIGRATED="true"
</source>
</source>


Es werden die geplanten Aktionen angezeigt, ohne Änderungen durchzuführen.
Dies sollte nur verwendet werden, wenn die Auswirkungen bekannt sind.


==Typischer Ablauf==


==Beispiele==
# Laden der migrate_superx.conf
# Laden der bestehenden SQL_ENV
# Ermitteln von SUPERX_DIR, WEBAPP und DB-Verzeichnis
# Sicherheitsprüfungen
# Optionales Stoppen des Tomcat-Dienstes
# Kopieren der Webapp
# Kopieren oder Verschieben des DB-Verzeichnisses
# Anpassen der SQL_ENV
# Setzen von Besitzern, Gruppen und Rechten
# Optionales Erzeugen des Tomcat-Symlinks
# Optionales Starten des Tomcat-Dienstes


===Vollständige Migration mit Kopie des DB-Verzeichnisses===
==Empfohlene Standardkonfiguration==


<source lang="bash">
<source lang="bash">
SQL_ENV="/home/superx/db/bin/SQL_ENV"
TARGET_WEBAPP="/home/superx/webapps/superx"
 
MIGRATION_MODE="full"
DB_TRANSFER_MODE="copy"


TARGET_WEBAPP="/var/lib/tomcat10/webapps/superx"
WEBAPP_USER="superx"
WEBAPP_GROUP="tomcat"


TOMCAT_USER="tomcat"
MIGRATION_MODE="db_only"
SUPERX_GROUP="superx"
 
SET_RIGHTS="true"
SET_OWNER="auto"
SET_CHMOD="true"
</source>
 
Aufruf:
 
<source lang="bash">
sudo ./migrate_superx_webapp.sh
</source>
 
===Vollständige Migration mit Verschieben des DB-Verzeichnisses===
 
<source lang="bash">
SQL_ENV="/home/superx/db/bin/SQL_ENV"
 
MIGRATION_MODE="full"
DB_TRANSFER_MODE="move"
DB_TRANSFER_MODE="move"


TARGET_WEBAPP="/var/lib/tomcat10/webapps/superx"
TOMCAT_USER="tomcat"
SUPERX_GROUP="superx"
SET_RIGHTS="true"
SET_OWNER="auto"
SET_OWNER="auto"
SET_CHMOD="true"
</source>
In diesem Fall wird die Webapp kopiert, das DB-Verzeichnis jedoch verschoben.
===Nur DB-Verzeichnis in bestehende Webapp übernehmen===
<source lang="bash">
SQL_ENV="/home/superx/db/bin/SQL_ENV"
MIGRATION_MODE="db_only"
DB_TRANSFER_MODE="move"
TARGET_WEBAPP="auto"
SET_RIGHTS="false"
UPDATE_SQL_ENV="true"
</source>
Aufruf:
<source lang="bash">
./migrate_superx_webapp.sh
</source>
In diesem Fall wird keine Webapp kopiert. Das DB-Verzeichnis wird in die bestehende Webapp unter <code>WEB-INF/conf/edustore/db</code> verschoben.
===Testmigration ohne root===
<source lang="bash">
SQL_ENV="/home/superx/test/db/bin/SQL_ENV"
MIGRATION_MODE="db_only"
DB_TRANSFER_MODE="copy"
TARGET_WEBAPP="auto"
TOMCAT_USER="superx"
SUPERX_GROUP="superx"
SET_RIGHTS="true"
SET_RIGHTS="true"
SET_OWNER="auto"
SET_CHMOD="true"
SET_CHMOD="true"


ADD_TOMCAT_TO_GROUP="false"
CREATE_TOMCAT_SYMLINK="true"
</source>
</source>
Wird das Skript als Benutzer <code>superx</code> ausgeführt, kann diese Migration ohne root-Rechte laufen.
==Ablauf der Migration==
Das Skript führt je nach Modus folgende Schritte aus:
# Laden von <code>migrate_superx.conf</code>
# Laden der bestehenden <code>SQL_ENV</code>
# Ermitteln von <code>SUPERX_DIR</code>, <code>WEBAPP</code> und dem bisherigen DB-Verzeichnis
# Sicherheitsprüfung, ob die Quelle bereits migriert aussieht
# Ermitteln der Zielstruktur
# Optional: Tomcat stoppen
# Bei <code>MIGRATION_MODE=full</code>: Webapp kopieren
# DB-Verzeichnis je nach <code>DB_TRANSFER_MODE</code> kopieren oder verschieben
# Backup der Ziel-<code>SQL_ENV</code>
# Anpassung von <code>WEBAPP</code>, <code>SUPERX_DIR</code> und <code>umask</code>
# Optional: Rechte setzen
# Optional: Tomcat starten


==Hinweise==
==Hinweise==


* Die Webapp wird vom Skript nie verschoben, sondern bei <code>MIGRATION_MODE=full</code> kopiert.
* Standardziel ist /home/superx/webapps/superx.
* Das DB-Verzeichnis kann wahlweise kopiert oder verschoben werden.
* Die Tomcat-Anbindung kann über einen Symlink erfolgen.
* Bei <code>DB_TRANSFER_MODE=move</code> ist die alte DB-Quelle nach der Migration nicht mehr vorhanden.
* Bei WEBAPP_USER=superx und WEBAPP_GROUP=tomcat kann die Migration häufig ohne root erfolgen, sofern der Benutzer Mitglied der Gruppe tomcat ist.
* Bei <code>DB_TRANSFER_MODE=move</code> darf das Ziel-DB-Verzeichnis nicht existieren.
* Root wird nur benötigt, wenn Besitzer geändert, Benutzer oder Gruppen angepasst oder Systemkonfigurationen verändert werden müssen.
* Für <code>copy</code> wird <code>rsync</code> verwendet.
* Die interne Zielstruktur ist fest vorgegeben: <code>WEB-INF/conf/edustore/db</code>.
* Für Produktivmigrationen ist ein vorheriger Dry-Run empfehlenswert.
* Bei Rechteänderungen auf andere Benutzer oder Gruppen sind root-Rechte erforderlich.

Aktuelle Version vom 4. August 2026, 07:55 Uhr

BI Maintenance

logobutton maintenance2b.png

Ziel und Überblick

Die hier bereitgestellten Skripte ermöglichen es, in der BI-Umgebung von HISinOne und in Zukunft auch von SuperX (aktuell können die Scripte in SuperX leider noch nicht verwendet werden) Modul-Updates und -Upgrades zuverlässig über die Shell auszuführen – automatisiert per Cronjob oder manuell. Sie orientieren sich bewusst am bisherigen Vorgehen aus SuperX, wurden jedoch erweitert:

  • Ausführung der BI-Modul-Updates/-Upgrades über Java (ComponentAdminCLI).
  • Vollständige Protokollierung in Logdateien.
  • Optional: Protokollierung der Läufe in der Tabelle update_prot.
  • Automatischer Mailversand über ein konfigurierbares Mailprogramm.
  • Optional: Erkennen interner Fehler im Batch-Job (auch wenn Java Exitcode 0 liefert).
  • Möglichkeit, Logdateien automatisch an Mails anzuhängen (erfolgreiche und fehlerhafte Module).

Installation aus dem git Repository

Führen Sie folgenden Shell-Befehl aus:

git clone https://git.campussource.de/git/SuperX/BI_Maintenance.git

Die weitere Konfiguration wird im Folgenden beschrieben. Alle Einstellungen erfolgen zentral in der Datei BI_ENV, die als Template BI_ENV.sam ausgeliefert wird.

Umgebungsvariablen in der BI_ENV

BI_ENV.sam – Template und lokale BI_ENV

Die Datei BI_ENV.sam wird als Muster ausgeliefert.

Sie muss vor Ort:

  1. in BI_ENV kopiert/umbenannt werden:
cp BI_ENV.sam BI_ENV
  1. an die lokalen Gegebenheiten angepasst werden (Pfade, Module, Mailadressen usw.).
  2. mit restriktiven Rechten versehen werden:
chmod 600 BI_ENV

Skripte binden diese Datei später mit

. /pfad/zu/BI_ENV

ein.


Bedeutung der Variablen

Im Folgenden die wichtigsten Variablen, die angepasst werden müssen.

Java-Konfiguration

JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export JAVA_HOME

JRE_HOME=$JAVA_HOME
export JRE_HOME

PATH=$JAVA_HOME/bin:$PATH
export PATH

Diese Variablen stellen sicher, dass die BI-Jobs mit dem vorgesehenen Java (empfohlen: Java 17) ausgeführt werden.

Java-Optionen:

JAVA_OPTS="-Xmx1520M -Djava.awt.headless=true ... --add-opens ..."
export JAVA_OPTS

Pfade zur SuperX-BI-Installation

WEBAPP=/var/lib/tomcat10/webapps/superx
export WEBAPP

SUPERX_DIR=$WEBAPP/WEB-INF/conf/edustore
export SUPERX_DIR

Diese Pfade müssen an lokale Tomcat-Installation und SuperX-Verzeichnisstruktur angepasst werden.

Modulsteuerung

Für die Update- und Upgrade-Skripte werden die zu bearbeitenden Module festgelegt:

export BI_UPDATE_MODULES="sos kenn zul"
export BI_UPGRADE_MODULES="kenn"

Hinweis: Die Modulkürzel müssen klein geschrieben sein (z. B. sos, kenn, zul) und mit Leerzeichen getrennt aufgelistet werden.

Logging

LOGPFAD=$WEBAPP/WEB-INF/logs
export LOGPFAD

Im Logpfad werden u. a. folgende Dateien erzeugt:

  • bi_update.log – Sammellog des Updates
  • bi_upgrade.log – Sammellog des Upgrades
  • <modul>_update.log
  • <modul>_upgrade.log

Java-Batch-Jobs erzeugen ergänzende Logs in:

$WEBAPP/WEB-INF/logs/jobs

Mailversand

Folgende Variablen steuern Empfänger und Format der Benachrichtigungen:

export ERRORMAIL="admin@hs.de"
export LOGMAIL="$ERRORMAIL"
#export LOGMAIL="admin@hs.de kollege@hs.de"   # mehrere Empfänger möglich
  • ERRORMAIL – Empfänger für Fehlermails
  • LOGMAIL – Empfänger für Erfolgs- und Statusmails

Mehrere Adressen werden per Leerzeichen getrennt.

Mailprogramm:

export MAILPROG="s-nail --account=test1 -S ttycharset=utf-8 -S sendcharset=utf-8"

Betreffzeilen:

export MAIL_BETREFF_UPDATE="BI Job Update"
export MAIL_BETREFF_UPGRADE="BI Job Upgrade"
export MAIL_BETREFF_SUFFIX_ERFOLGREICH=" - Erfolgreich"
export MAIL_BETREFF_SUFFIX_FEHLER=" - Fehler"
Kernmodul Regelbetrieb Mailversand.png

So könnten die Mails aussehen.

Steuerung der Log-Anhänge

# error  = Logs nur bei Fehlern anhängen
# always = Logs immer anhängen (Erfolg + Fehler)
export MAIL_ATTACH_LOGS_MODE="error"

Optionale Prüfung der Modul-Logs

# true  = zusätzlich Modul-Log auf interne Fehler prüfen
# false = nur Exitcode des Java-Calls verwenden
export CHECK_JOBLOG_FOR_ERRORS="true"

Gerade bei dem Java Aufruf von ComponentAdminCLI empfehlenswert, da dieser aktuell noch trotz status: FAILED oft Exitcode 0 liefert.


Module Updates

modules_update.sh – Hauptskript

Dieses Skript führt alle Module aus BI_UPDATE_MODULES nacheinander aus.

Ablauf:

  1. Startcheck: Sind WEBAPP, LOGPFAD und BI_UPDATE_MODULES gesetzt?
  2. Falls verfügbar: DB-Protokollierung via DOQUERY.
  3. Für jedes Modul:
    1. Logdatei anlegen
    2. Start in update_prot protokollieren (update_id = -10000)
    3. Java-Update starten:
  ComponentAdminCLI -e <modul>
    1. Optional: Modul-Logdatei nach internen Fehlern durchsuchen
    2. Erfolg:
      1. Modul-Log in SUCCESS_LOG_FILES
      2. DB-Update (update_id = -10000)
    3. Fehler:
      1. Modul-Log in ERROR_LOG_FILES
      2. DB-Update (update_id = -10001)
    4. Zuletzt: Java-Joblogs aus $WEBAPP/WEB-INF/logs/jobs ermitteln
  1. Nach Abschluss aller Module:
    1. Erfolgs- oder Fehlermail versenden
    2. Anhänge abhängig von MAIL_ATTACH_LOGS_MODE

modules_update_cron.sh – Wrapper für Cron

Damit Updates regelmäßig durchgeführt werden können, existiert ein einfaches Wrapper-Skript.

Vorgehen:

  1. Beispieldatei kopieren:
cp modules_update_cron.sh.sam modules_update_cron.sh
chmod +x modules_update_cron.sh
  1. Pfade zur BI_ENV und zum Update-Skript anpassen.
  2. Cronjob eintragen, z. B. werktags um 18 Uhr:
0 18 * * 1-5 /pfad/zu/modules_update_cron.sh

Inhaltlich:

  • Laden der BI_ENV
  • Start des Skripts modules_update.sh

Module Upgrades

modules_upgrade.sh – Hauptskript

Das Upgrade-Skript entspricht dem Update-Skript, unterscheidet sich aber in folgenden Punkten:

  • Es wird **manuell** ausgeführt – kein Cronjob vorgesehen.
  • Es verwendet BI_UPGRADE_MODULES.
  • Das eigentliche Upgrade erfolgt über:
 ComponentAdminCLI -u <modul>
  • Nach Abschluss des Upgrades erfolgt ein Mailversand analog zum Update-Skript.

Aufruf:

cd /var/lib/tomcat10/webapps/superx/WEB-INF/bin/BI-Maintenance/update
./modules_upgrade.sh

Vorher muss zu Beginn des Skripts der Pfad zur BI_ENV eingetragen sein:

. /pfad/zur/BI_ENV

Modulverwaltung

Modulkürzel

Die folgenden Modulkürzel sind in einer typischen BI-Installation relevant:

 kuerzel |                         name                          
---------+-------------------------------------------------------
 astat   | Amtliche Statistik                                
 bau     | Gebäude, Räume, Flächen                           
 cob     | Kostenrechnung                                    
 erfolg  | Studienverlauf                                    
 fin     | Finanzrechnung                                    
 gang    | Studiengänge                                      
 ivs     | Inventar                                          
 kenn    | Kennzahlen                                        
 kern    | Administration                                    
 lm      | Leistungsmonitoring                               
 man     | Management                                        
 prom    | Promovierende                                     
 res     | Forschung                                         
 sos     | Studierende, Prüfungen                            
 sva     | Personal, Stellen                                 
 zul     | Bewerbung, Zulassung

Die aktiven Module der eigenen Installation können mit folgendem SQL abgefragt werden:

SELECT V.his_system AS kuerzel,
       S.name
  FROM db_version V
  JOIN systeminfo S
    ON S.tid = V.systeminfo_id
 ORDER BY 1;


Migration auf die Webapp-Struktur

Das bereitgestellte Migrationsskript ermöglicht die Umstellung einer bestehenden SuperX-Installation auf die empfohlene Webapp-Struktur.

Dabei können sowohl klassische Installationen mit separatem DB-Verzeichnis als auch bestehende Webapp-Installationen migriert werden. Die Migration kann je nach Anwendungsfall vollständig oder ausschließlich für das DB-Verzeichnis durchgeführt werden. Hier eine Anleitung "in short", wenn Sie bisher das "klasssische" Layout genutzt haben (also Unix Benutzer "superx", Installation in "/home/superx").

git clone https://git.campussource.de/git/SuperX/BI_Maintenance.git
#Script ausführen und neues ENV laden:
cd BI_Maintenance/webapps_migration
./migrate_superx_webapp.sh

Das Skript liest die bestehende Installation anhand der vorhandenen SQL_ENV-Datei ein und erzeugt daraus die gewünschte Zielstruktur. Details können in der Konfigurationsdatei

migrate_superx.conf

konfiguriert, siehe folgende Dokumentation.

Zielstruktur

Die Webapp wird standardmäßig nicht direkt im Tomcat-Webapp-Verzeichnis abgelegt, sondern unter:

/home/superx/webapps/superx

Dadurch bleibt die Installation unabhängig von der verwendeten Tomcat-Distribution und kann einfacher per Git, rsync oder Modulupdate gepflegt werden.

Die zugehörige DB-Struktur befindet sich anschließend unter:

/home/superx/webapps/superx/WEB-INF/conf/edustore/db

Tomcat-Anbindung

Für den Zugriff des Tomcat-Servers auf die Webapp gibt es grundsätzlich zwei Möglichkeiten:

  • Verwendung eines symbolischen Links vom Tomcat-Webapp-Verzeichnis auf die eigentliche Webapp.
  • Anpassung der Tomcat-Konfiguration (z. B. appBase oder Context-Konfiguration).

Empfohlen wird die Verwendung eines symbolischen Links.

Beispiel:

/srv/tomcat/webapps/superx
 -> /home/superx/webapps/superx

Wichtige Variablen

Die wichtigsten Einstellungen erfolgen in der Datei:

migrate_superx.conf

TARGET_WEBAPP

Definiert das Zielverzeichnis der Webapp.

Beispiel:

TARGET_WEBAPP="/home/superx/webapps/superx"

WEBAPP_USER

Definiert den Besitzer der Ziel-Webapp.

Beispiel:

WEBAPP_USER="superx"

WEBAPP_GROUP

Definiert die Gruppe der Ziel-Webapp.

Beispiel:

WEBAPP_GROUP="tomcat"

Ergebnis:

Owner: superx
Group: tomcat

MIGRATION_MODE

Steuert die Art der Migration.

Vollständige Migration:

MIGRATION_MODE="full"

Nur Migration des DB-Verzeichnisses:

MIGRATION_MODE="db_only"

Migration des DB-Verzeichnisses

Das DB-Verzeichnis kann entweder kopiert oder verschoben werden.

DB_TRANSFER_MODE=copy

Das bestehende DB-Verzeichnis bleibt erhalten.

DB_TRANSFER_MODE="copy"

Intern wird hierfür rsync verwendet.

DB_TRANSFER_MODE=move

Das DB-Verzeichnis wird verschoben.

DB_TRANSFER_MODE="move"

Intern wird hierfür mv verwendet. Ist das Zielverzeichnis bereits vorhanden und ALLOW_EXISTING_TARGET_DB="true" gesetzt, wird das vorhandene Ziel-DB-Verzeichnis vor dem Verschieben vollständig ersetzt. Damit verbleiben keine alten Dateien im Ziel.

Dies ist der empfohlene Standard für die Migration klassischer SuperX-Installationen und vermeidet unnötigen zusätzlichen Speicherbedarf.

Automatische Anpassung der SQL_ENV

Nach der Migration kann die SQL_ENV-Datei automatisch angepasst werden.

Dabei werden insbesondere folgende Variablen aktualisiert:

SUPERX_DIR
WEBAPP

Zusätzlich wird sichergestellt, dass folgende Einstellung vorhanden ist:

umask 002

Vor der Änderung wird automatisch eine Sicherungskopie der SQL_ENV-Datei angelegt.

Benutzer und Gruppen

Die folgenden Variablen steuern, welchem Benutzer und welcher Gruppe die Ziel-Webapp nach der Migration zugeordnet wird.

WEBAPP_USER

Definiert den Besitzer der Ziel-Webapp.

Beispiel:

WEBAPP_USER="superx"

Alle Dateien und Verzeichnisse der Ziel-Webapp werden diesem Benutzer zugeordnet, sofern die Rechteverwaltung aktiviert ist.

WEBAPP_GROUP

Definiert die Gruppe der Ziel-Webapp.

Beispiel:

WEBAPP_GROUP="tomcat"

Die Gruppe wird für alle Dateien und Verzeichnisse der Ziel-Webapp verwendet.

Durch das gesetzte setgid-Bit auf den Verzeichnissen erben neu angelegte Dateien und Unterverzeichnisse automatisch diese Gruppe.

Automatische Rechtebehandlung

Die Migration kann sowohl als root als auch – unter bestimmten Voraussetzungen – direkt als Anwendungsbenutzer ausgeführt werden.

SET_OWNER=auto

Dies ist die empfohlene Standardeinstellung.

SET_OWNER="auto"

Das Skript entscheidet abhängig vom aktuellen Benutzer automatisch, ob ein Besitzerwechsel erforderlich ist.

Ausführung als root

Wird das Skript als root ausgeführt, werden Besitzer und Gruppe der Ziel-Webapp auf die konfigurierten Werte gesetzt.

chown -R $WEBAPP_USER:$WEBAPP_GROUP ...

Zusätzlich wird auch das übergeordnete Verzeichnis der Webapp (z. B. /home/superx/webapps) auf die gleichen Besitz- und Gruppenrechte gesetzt.

Ausführung als WEBAPP_USER

Wird das Skript direkt als der konfigurierte WEBAPP_USER ausgeführt und ist dieser Benutzer Mitglied der konfigurierten WEBAPP_GROUP, wird kein chown ausgeführt.

Stattdessen verwendet das Skript bei Bedarf ein chgrp, um die Gruppenzugehörigkeit der Dateien anzupassen.

In diesem Fall kann die Migration häufig vollständig ohne root-Rechte durchgeführt werden.

Ausführung als anderer Benutzer

Wird das Skript weder als root noch als WEBAPP_USER mit passender Gruppenmitgliedschaft ausgeführt, bricht das Skript mit einer entsprechenden Fehlermeldung ab.

ADD_WEBAPP_USER_TO_GROUP

Optional kann das Skript die Gruppenmitgliedschaft des Zielbenutzers automatisch anpassen.

ADD_WEBAPP_USER_TO_GROUP="true"

Hierfür sind root-Rechte erforderlich.

Tomcat-Symlink

Optional kann das Skript den Symlink für den Tomcat automatisch erzeugen.

CREATE_TOMCAT_SYMLINK

CREATE_TOMCAT_SYMLINK="true"

TOMCAT_WEBAPPS_DIR

TOMCAT_WEBAPPS_DIR="/srv/tomcat/webapps"

TOMCAT_CONTEXT_NAME

TOMCAT_CONTEXT_NAME="superx"

REPLACE_EXISTING_SYMLINK

Bestehende Symlinks können bei Bedarf automatisch ersetzt werden.

REPLACE_EXISTING_SYMLINK="true"

Normale Dateien oder Verzeichnisse werden dabei niemals automatisch gelöscht.

Sicherheitsprüfungen

Vor Beginn der Migration werden verschiedene Sicherheitsprüfungen durchgeführt.

Unter anderem wird geprüft:

  • Existiert die SQL_ENV-Datei?
  • Existiert der konfigurierte Benutzer?
  • Existiert die konfigurierte Gruppe?
  • Sind Quell- und Zielverzeichnis identisch?
  • Würde eine Verzeichnisverschachtelung entstehen?
  • Befindet sich SUPERX_DIR bereits innerhalb von WEBAPP?

Wird erkannt, dass die Installation bereits der neuen Struktur entspricht, bricht das Skript standardmäßig ab.

FORCE_ALREADY_MIGRATED

In Ausnahmefällen kann diese Prüfung übersteuert werden.

FORCE_ALREADY_MIGRATED="true"

Dies sollte nur verwendet werden, wenn die Auswirkungen bekannt sind.

Typischer Ablauf

  1. Laden der migrate_superx.conf
  2. Laden der bestehenden SQL_ENV
  3. Ermitteln von SUPERX_DIR, WEBAPP und DB-Verzeichnis
  4. Sicherheitsprüfungen
  5. Optionales Stoppen des Tomcat-Dienstes
  6. Kopieren der Webapp
  7. Kopieren oder Verschieben des DB-Verzeichnisses
  8. Anpassen der SQL_ENV
  9. Setzen von Besitzern, Gruppen und Rechten
  10. Optionales Erzeugen des Tomcat-Symlinks
  11. Optionales Starten des Tomcat-Dienstes

Empfohlene Standardkonfiguration

TARGET_WEBAPP="/home/superx/webapps/superx"

WEBAPP_USER="superx"
WEBAPP_GROUP="tomcat"

MIGRATION_MODE="db_only"
DB_TRANSFER_MODE="move"

SET_OWNER="auto"
SET_RIGHTS="true"
SET_CHMOD="true"

CREATE_TOMCAT_SYMLINK="true"

Hinweise

  • Standardziel ist /home/superx/webapps/superx.
  • Die Tomcat-Anbindung kann über einen Symlink erfolgen.
  • Bei WEBAPP_USER=superx und WEBAPP_GROUP=tomcat kann die Migration häufig ohne root erfolgen, sofern der Benutzer Mitglied der Gruppe tomcat ist.
  • Root wird nur benötigt, wenn Besitzer geändert, Benutzer oder Gruppen angepasst oder Systemkonfigurationen verändert werden müssen.