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):
-
Yii
requirestattrequire_once:CWebApplication::createController()(Zeile 354) verwendeterequire($classFile)stattrequire_once($classFile). In Kombination mitstrtolower()auf Controller-IDs führte das zu doppeltem Klassen-Laden →Cannot declare class FrontendUserController. -
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. -
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:
- require → require_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-enabled→sites-enabledim 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.