Skip to content

CalServer OpenShift Debug — Zusammenfassung

Datum: 2026-03-27/28

Branch: claude/debug-calwebapp-openshift-VJZM4

PR: calhelp/calServer-yii#2441


1. Gelöste Probleme

1.1 OpenShift Container startet nicht (Critical)

Symptom: StatefulSet calwebapp-calserver konnte keinen Pod erstellen. Ursache: Der volumePermissions Init-Container war an podSecurityContext.enabled gekoppelt. Auf OpenShift ist podSecurityContext.enabled=false (SCCs verwalten den Security-Context), wodurch der Init-Container nie erstellt wurde. PVC-subPath-Verzeichnisse hatten falsche Berechtigungen → PHP-FPM konnte nicht starten. Fix: podSecurityContext.enabled aus den Init-Container-Bedingungen im StatefulSet-Template entfernt. Commit: f21bf7c8

1.2 Borg-Backup Fehler beim Start (High)

Symptom: chmod: Operation not permitted, Error 14: Must be root to install, seteuid: Operation not permitted Ursache: borg/setup.sh versuchte crontab zu installieren und SSH-Rechte zu setzen — beides erfordert Root, das OpenShift nicht erlaubt. Fix: Borg-Backup-Integration komplett entfernt (kein Kunde nutzt es). Entfernt: borg/-Verzeichnis (10 Scripts), alle BORG-Env-Vars, Volume-Mounts, Helm-Values, nginx fastcgi_params, Dockerfile-Installation. Commit: 6c4d831e

1.3 sym_service und crontab Fehler (Medium)

Symptom: Error 14: Must be root to install und seteuid: Operation not permitted bei jedem Container-Start. Ursache: setup_calserver() in common.sh rief /app/calserver-sync/bin/sym_service install und /usr/bin/crontab auf — beides erfordert Root. Fix: am_i_root() Guard hinzugefügt. Auf non-root Systemen werden die Befehle übersprungen mit WARN-Meldung. Commit: b431379c

1.4 Container-Startup blockiert 10+ Minuten (High)

Symptom: nginx und PHP-FPM starten nicht, ERR_CONNECTION_CLOSED im Browser. Ursache: setup_filemanager_permissions() in common.sh führte chmod -R g+rwX /app/httpdocs/filemanager synchron aus — bei 500.000 Dateien dauerte das über 30 Minuten und blockierte den gesamten Startup. Fix: chmod läuft jetzt im Background (chmod -R g+rwX "$fm_dir" 2>/dev/null &), nginx und PHP-FPM starten sofort. Commit: 26b41145

1.5 Init-Container zu langsam (High)

Symptom: Pod blieb 10+ Minuten in Init:0/1 Status. Ursache: Der volumePermissions Init-Container führte rekursives chown -R und chmod -R auf dem gesamten PVC aus (500k+ Dateien). Fix: Init-Container erstellt nur noch fehlende Verzeichnisse und setzt top-level Gruppenrechte. Kein rekursives chown/chmod mehr auf existierenden Daten. Commit: 85a694a6

1.6 SIGSEGV / 502 Bad Gateway auf Demo und OpenShift (Critical)

Symptom: Jeder /login-Request crashte PHP-FPM Worker mit SIGSEGV (Signal 11 — Stack Overflow). Accumulation von Zombie-Prozessen. Ursache (mehrstufig):

  1. Yii require statt require_once: CWebApplication::createController() (Zeile 354) verwendete require($classFile) statt require_once($classFile). In Kombination mit strtolower() auf Controller-IDs führte das zu doppeltem Klassen-Laden → Cannot declare class FrontendUserController.

  2. KCDbLogRoute Endlosrekursion: Der Fatal Error triggerte KCDbLogRoute, die versuchte den Fehler in die DB zu loggen. Das DB-Schema-Loading triggerte weitere Fehler → Rekursion → Stack-Overflow → SIGSEGV.

  3. Fehlende Properties: Die property-Tabelle auf OpenShift hatte nur 2 von 115 benötigten Einträgen. FrontendUserController::actionLogin() versuchte Properties zu lesen die nicht existierten → Fehler.

Fixes: - requirerequire_once in CWebApplication::createController() (beide Kopien: yii/ und vendor/) - class_exists Guards in allen 79 Modul-Controller-Dateien - KCDbLogRoute durch CFileLogRoute ersetzt (keine DB-Abhängigkeit im Error-Handling) - Separate dbLog DB-Verbindung als zusätzliche Sicherheit - yiic resetProperty run Command zum Nachfüllen fehlender Properties

Commits: 411c094c, b60472ba, 8c8a80d0, 5f11f669, 8227cf23

1.7 Helm Chart Probleme (Medium)

Symptom: OpenShift sah neue Chart-Version nicht; bitnami/os-shell Image nicht pullbar; SCC-Konflikte. Ursache: Helm-Repository zeigte auf altes Bitbucket-Repo; veraltetes Image-Tag; runAsUser: 1001 außerhalb des OpenShift UID-Ranges. Fix: Chart-Packaging und index.yaml aktualisiert; Repository-URL auf GitHub umgestellt. Commits: dcb69106, 6197a714, 0532f85d

1.8 Statefulset Template Bugs (Low)

  • Tippfehler: site-enabledsites-enabled im mkdir-Befehl
  • Trailing Space: "auto ""auto" im runAsUser-Vergleich Commit: f21bf7c8

2. Eingeführte Sicherheitsmaßnahmen

2.1 Pre-Bootstrap Schema-Validierung (SchemaCheck)

Datei: httpdocs/protected/components/SchemaCheck.php Eingebunden in: httpdocs/index.php Funktion: Prüft vor dem Yii-Bootstrap ob kritische Datenbanktabellen (user, authitem, property, tbl_migration, messages) existieren. Bei fehlenden Tabellen wird eine benutzerfreundliche 503-Fehlerseite mit Anleitung angezeigt — statt SIGSEGV. Commits: 64b76a52, f1281900, 02fdd009

2.2 Datenbank-Diagnose-Script (db-diagnose.php)

Datei: httpdocs/db-diagnose.php Aufruf: docker exec calserver php /app/httpdocs/db-diagnose.php Funktion: Zeigt DB-Verbindungsstatus, Tabellenanzahl, kritische Tabellen mit Row-Count, Migrationsstand, Strukturprüfungen und eine Zusammenfassung mit Empfehlungen. Commit: eeb74d5f

2.3 Property-Reset-Command (yiic resetProperty)

Datei: httpdocs/protected/commands/ResetPropertyCommand.php Aufruf: - yiic resetProperty check — zeigt fehlende Properties (Dry-Run) - yiic resetProperty run — fügt fehlende Default-Properties ein (überschreibt nie bestehende)

Funktion: Enthält 102 Default-Properties (User/Login, Calibration, File Store, Backup Store, Filemanager, SymmetricDS, Mark Column, Translation, Features). Sicher auf jeder Umgebung ausführbar. Commit: 8227cf23

2.4 Controller Class-Loading Guards

Dateien: 79 Controller-Dateien in allen Modulen (frontend, adminpanel, api, dms, jbackup, support, wiki) Funktion: if (class_exists('ControllerName', false)) return; vor jeder Klassendefinition verhindert doppeltes Klassen-Laden durch Yii's Autoloader. Commit: b60472ba

2.5 CFileLogRoute statt KCDbLogRoute

Datei: httpdocs/protected/config/components.php Funktion: Error-Logging geht nach protected/runtime/application.log statt in die Datenbank. Eliminiert jede Möglichkeit einer DB-Rekursion im Error-Handling. Die KCDbLogRoute-Klasse bleibt im Code als Referenz. Commit: 8c8a80d0

2.6 Yii Framework Patch (require_once)

Dateien: yii/web/CWebApplication.php, httpdocs/protected/vendor/yiisoft/yii/framework/web/CWebApplication.php Funktion: require($classFile)require_once($classFile) in createController(). Verhindert doppeltes Klassen-Laden wenn Yii's strtolower() auf Controller-IDs einen Case-Mismatch verursacht. Identisch mit dem Pattern in CConsoleCommandRunner. Commit: 411c094c


3. Noch offen / Nacharbeiten

3.1 Helm Values auf OpenShift aktualisieren

Die Values haben noch: - persistantVolumeClaim (Tippfehler → persistentVolumeClaim) - calserverScheme: https (sollte http sein, TLS am Ingress) - Veraltete borg-Referenzen

Korrigierte Values: k8s/values-oc-corrected.yml

3.2 CI test-dev Job wieder aktivieren

Temporär deaktiviert (if: false) für schnellere Builds. Wieder aktivieren wenn stabil: .github/workflows/ci.yml Zeile 541

3.3 Helm Chart 0.1.22/0.1.23 OpenShift-kompatibel machen

Charts 0.1.22/0.1.23 hatten SCC-Probleme. Aktuell läuft 0.1.21 (Rollback). Die Chart-Fixes (volumePermissions, Init-Container) sind im Code aber nicht im deployed Chart.

3.4 Demo-Server SSL

Let's Encrypt Zertifikat auf Demo muss erneuert werden. deploy.sh startet den letsencrypt-nginx-proxy-companion, aber das Cert war abgelaufen.

3.5 OpenShift DB Property-Check

Die property-Tabelle auf OpenShift hatte fast keine Einträge. Root Cause unklar — möglicherweise ein fehlgeschlagener Initial-Setup. yiic resetProperty run wurde ausgeführt, aber für Kunden-Installationen sollte das im Setup-Wizard integriert werden.