Betrieb
Betriebsrelevante Dokumentation für Backup, Deployment, Hooks und Automatisierung.
Themen
- Backup - Tägliches Backup-System
- Scheduling - Cron-Jobs und Timer
- Deployment - Dev-zu-Prod Synchronisation
- Contracts - Contract-basierte Validierung
- File Backup Hook - Claude Code Pre-Hook für Dateisicherung
- Claude Hooks - Protokollierung, Backup, Task-Erstellung
- DB Hooks - Security-Hooks für Datenbankzugriffe
Hook-Übersicht
| Hook | Typ | Funktion |
|---|---|---|
| log_to_db.py | Logging | Alle Events protokollieren |
| file_backup_hook.py | Backup | Dateien vor Edit/Write sichern |
| task_hook.py | Automation | Tasks aus Prompts erstellen |
| block_direct_db.py | Security | Direkte DB-Zugriffe blockieren |
| block_direct_task_db.py | Security | Task-DB-Zugriffe blockieren |
Backup
Tägliche Sicherung aller wichtigen Daten um 03:00 Uhr. Bei Datenverlust oder Fehlkonfiguration kann der Zustand der letzten 7 Tage wiederhergestellt werden.
| Script | /opt/scripts/backup.sh |
|---|---|
| Ziel | /backup/ |
| Zeit | Täglich 03:00 |
| Retention | 7 Tage |
Was wird gesichert
- etc.tar.gz - /etc Konfigurationen
- www.tar.gz - /var/www Web-Dateien
- mariadb_all.sql.gz - Alle Datenbanken
- qdrant.tar.gz - Vektor-Storage
- ollama.tar.gz - LLM Modelle
Manuelles Backup
/opt/scripts/backup.sh
Restore Beispiele
Einzelne Datei wiederherstellen
# Datei aus www.tar.gz extrahieren
tar -xzf /backup/2025-12-20_03-00/www.tar.gz -C / var/www/dev.campus.systemische-tools.de/src/Controller/HomeController.php
Datenbank wiederherstellen
# Dump entpacken
gunzip /backup/2025-12-20_03-00/mariadb_all.sql.gz
# Alle Datenbanken wiederherstellen
mariadb < /backup/2025-12-20_03-00/mariadb_all.sql
# Einzelne Datenbank extrahieren (aus Dump)
sed -n '/^-- Current Database: `ki_dev`/,/^-- Current Database:/p' mariadb_all.sql > ki_dev.sql
Qdrant Storage wiederherstellen
# Qdrant stoppen
systemctl stop qdrant
# Storage wiederherstellen
tar -xzf /backup/2025-12-20_03-00/qdrant.tar.gz -C /
# Qdrant starten
systemctl start qdrant
Backup-Status prüfen
# Log des letzten Backups
tail -20 /var/log/backup.log
# Backup-Größen
du -sh /backup/*
# Inhalt eines Backups
ls -lh /backup/2025-12-20_03-00/
Cron-Job
Das Backup wird automatisch täglich um 03:00 Uhr ausgeführt.
# /etc/cron.d/backup
0 3 * * * root /opt/scripts/backup.sh >> /var/log/backup.log 2>&1
Verwandte Themen
- Scheduling - Alle automatisierten Tasks
- File Backup Hook - Automatisches Backup bei Dateiänderungen
Scheduling & Automatisierung
Übersicht aller automatisierten Tasks: Cron-Jobs und Systemd Timer.
| Cron-Jobs (/etc/cron.d/) | 4 (backup, certbot, e2scrub_all, php) |
|---|---|
| Systemd Timer | 14 aktiv |
| Logs | /var/log/backup.log, journalctl |
Cron-Jobs (/etc/cron.d/)
Backup
| Datei | /etc/cron.d/backup |
|---|---|
| Zeit | Täglich 03:00 |
| User | root |
| Script | /var/www/scripts/backup.sh |
| Log | /var/log/backup.log |
Cron-Eintrag
0 3 * * * root /var/www/scripts/backup.sh >> /var/log/backup.log 2>&1
Was wird gesichert
- etc.tar.gz - System-Konfigurationen (/etc)
- www.tar.gz - Web-Dateien (/var/www)
- mariadb_all.sql.gz - Alle Datenbanken
- qdrant.tar.gz - Vektor-Storage
- ollama.tar.gz - LLM Modelle
Retention
Backups älter als 7 Tage werden automatisch gelöscht.
Log prüfen
tail -50 /var/log/backup.log
Mehr Details: Backup-Dokumentation
SSL-Zertifikate (Certbot)
| Datei | /etc/cron.d/certbot |
|---|---|
| Zeit | Alle 12 Stunden (mit Random-Sleep) |
| User | root |
| Hinweis | Wird von Systemd Timer überschrieben (certbot.timer) |
Aktiver Timer
# Status prüfen
systemctl status certbot.timer
# Nächste Ausführung
systemctl list-timers certbot.timer
PHP Session Cleanup
| Datei | /etc/cron.d/php |
|---|---|
| Zeit | Alle 30 Minuten (:09, :39) |
| User | root |
| Script | /usr/lib/php/sessionclean |
| Hinweis | Wird von Systemd Timer überschrieben (phpsessionclean.timer) |
e2scrub_all
| Datei | /etc/cron.d/e2scrub_all |
|---|---|
| Zweck | Ext4 Filesystem Scrubbing |
| Hinweis | Wird von Systemd Timer überschrieben |
Systemd Timer
Übersicht aller Timer
systemctl list-timers --all
Wichtige Timer
| Timer | Service | Intervall | Beschreibung |
|---|---|---|---|
| certbot.timer | certbot.service | 2x täglich | SSL-Zertifikat Renewal |
| phpsessionclean.timer | phpsessionclean.service | 30 min | PHP Session Cleanup |
| apt-daily.timer | apt-daily.service | 1x täglich | APT Package Listen Update |
| apt-daily-upgrade.timer | apt-daily-upgrade.service | 1x täglich | Automatische Security Updates |
| logrotate.timer | logrotate.service | 1x täglich | Log-Rotation |
| fstrim.timer | fstrim.service | 1x wöchentlich | SSD TRIM |
| man-db.timer | man-db.service | 1x täglich | Man-Page Index Update |
| e2scrub_all.timer | e2scrub_all.service | 1x wöchentlich | Ext4 Filesystem Check |
Timer-Befehle
# Alle Timer anzeigen
systemctl list-timers --all
# Bestimmten Timer prüfen
systemctl status certbot.timer
# Timer manuell triggern
systemctl start certbot.service
# Timer Logs anzeigen
journalctl -u certbot.service --since today
Scheduling-Zeitplan
Täglicher Ablauf
00:00 dpkg-db-backup (Systemd)
03:00 Backup Script (/var/www/scripts/backup.sh)
05:00 apt-daily (Systemd)
06:00 apt-daily-upgrade (Systemd)
06:25 cron.daily (apache2, apt, dpkg, logrotate)
--:09 PHP Session Cleanup (alle 30 min, Systemd)
--:39 PHP Session Cleanup (alle 30 min, Systemd)
*/12h Certbot Renewal Check (Systemd)
Wöchentlicher Ablauf
Montag fstrim (SSD TRIM)
Sonntag cron.weekly (man-db)
Sonntag e2scrub_all (Filesystem Check)
Eigene Cron-Jobs erstellen
Methode 1: Datei in /etc/cron.d/
# /etc/cron.d/mein-job
# Format: Minute Stunde Tag Monat Wochentag User Befehl
30 4 * * * root /var/www/scripts/mein-script.sh >> /var/log/mein-job.log 2>&1
Methode 2: Crontab bearbeiten
crontab -e
Cron-Syntax
# ┌───────────── Minute (0-59)
# │ ┌───────────── Stunde (0-23)
# │ │ ┌───────────── Tag des Monats (1-31)
# │ │ │ ┌───────────── Monat (1-12)
# │ │ │ │ ┌───────────── Wochentag (0-7, 0 und 7 = Sonntag)
# │ │ │ │ │
# * * * * * Befehl
# Beispiele:
0 3 * * * # Täglich um 03:00
*/15 * * * * # Alle 15 Minuten
0 */2 * * * # Alle 2 Stunden
0 9 * * 1-5 # Werktags um 09:00
0 0 1 * * # Am 1. jeden Monats um Mitternacht
Troubleshooting
Cron-Job läuft nicht
# Cron-Daemon Status
systemctl status cron
# Cron Logs prüfen
grep CRON /var/log/syslog | tail -20
# Syntax prüfen
crontab -l
Systemd Timer läuft nicht
# Timer Status
systemctl status timer-name.timer
# Service Logs
journalctl -u service-name.service --since today
# Timer manuell starten
systemctl start service-name.serviceDeployment & Rollback
Synchronisiert Code-Änderungen von der Entwicklungsumgebung zur Produktion. Ermöglicht sicheres Testen auf dev bevor Änderungen live gehen. Bei Problemen kann auf den letzten Stand zurückgerollt werden.
| Script | /var/www/scripts/sync-dev-prod.sh |
|---|---|
| Richtung | dev → prod |
| Pre-Checks | Contract Validation, PHPStan, PHP-CS-Fixer, Composer Audit, Semgrep, PHPUnit |
| Rollback | Aus /backup/ wiederherstellen |
Pre-Deployment Checks
Das Sync-Script führt automatisch alle Quality- und Security-Checks durch. Bei Fehlern wird der Sync abgebrochen.
Check 1: Contract Validation
| Contract | Prüft | Blockiert bei |
|---|---|---|
| View Structure v1.0 | CRUD-Views, Struktur | Critical |
| HTML Tables v1.0 | Modals, Aktionen-Spalte | Critical |
| CSS Contract v1.0 | Stylelint-Regeln | Major |
| Python Pipeline v1.0 | Ruff, mypy | Major |
| Layered Architecture v1.0 | Layer-Grenzen | Critical |
| Betriebsdokumentation v1.1 | Docs-Struktur | Major |
Script: /var/www/scripts/contract-check.sh
Dokumentation: Contracts
Check 2: PHP Quality Check
| Tool | Prüft | Blockiert bei |
|---|---|---|
| PHPStan + Strict Rules | Typen, Null-Safety, Bugs | Errors |
| PHP-CS-Fixer | PSR-12 Code Style | Style Issues |
| Composer Audit | Dependency CVEs | Vulnerabilities |
| Semgrep | OWASP Security | Security Findings |
Check 3: PHPUnit Tests
Alle Unit-Tests im tests/ Verzeichnis müssen bestehen.
Bei fehlgeschlagenen Checks
# Contract Validation fehlgeschlagen:
❌ SYNC ABGEBROCHEN: Contract Validation fehlgeschlagen
Behebe die Contract-Violations und versuche es erneut.
Tipp: /var/www/scripts/contract-check.sh
# PHP Quality Check fehlgeschlagen:
❌ SYNC ABGEBROCHEN: PHP Quality Check fehlgeschlagen
Behebe die Fehler und versuche es erneut.
Tipp: /var/www/scripts/php-check.sh /var/www/dev.campus.systemische-tools.de --fix
Deployment ausführen
Standard-Deployment
/var/www/scripts/sync-dev-prod.sh
Erwartete Ausgabe (Erfolg)
=== Sync Dev → Prod: Sat Dec 20 10:00:00 CET 2025 ===
=== Contract Validation ===
[1/6] View Structure Contract v1.0
OK tasks/*
OK content/*
...
=== PHP Quality Check ===
[1/4] PHPStan - Static Analysis + Strict Rules
✓ PHPStan: OK
...
=== Summary ===
All checks passed!
=== PHPUnit Tests ===
PHPUnit 12.5.4
✓ All tests passed!
sending incremental file list
...
=== Sync abgeschlossen ===
Was wird synchronisiert
| Verzeichnis | Inhalt | rsync-Flags |
|---|---|---|
| src/ | Backend (MVC) | --delete (entfernt gelöschte Dateien) |
| app/ | Frontend (MVP) | --delete |
| routes/ | Web-Routes | -av |
| config/ | Autoloader (ohne config.php) | --exclude='config.php' |
| public/css/ | Stylesheets | --exclude='static-docs' |
| public/js/ | JavaScript | -av |
| public/images/ | Bilder | -av |
| public/index.php | Entry Point | -av |
| public/.htaccess | Apache Config | -av |
Was wird NICHT synchronisiert
- config/config.php - Umgebungsspezifische Einstellungen (APP_DEBUG=false, DB-Credentials)
- storage/ - Logs, Cache, Sessions
- *.log - Log-Dateien werden via --exclude ausgeschlossen
- public/static-docs/ - Statische Dokumentation
Nach dem Sync
Das Script führt automatisch /var/www/scripts/fix-permissions.sh aus, um die Dateiberechtigungen (www-data:www-data, 755) zu setzen.
Rollback-Verfahren
Bei Problemen nach dem Deployment kann der vorherige Stand aus dem Backup wiederhergestellt werden.
Schritt 1: Backup identifizieren
# Verfügbare Backups anzeigen
ls -la /backup/
Schritt 2: Vollständiger Rollback (prod)
# Prod-Verzeichnis komplett wiederherstellen
cd /
tar -xzf /backup/2025-12-20_03-00/www.tar.gz var/www/prod.campus.systemische-tools.de
# Berechtigungen setzen
/var/www/scripts/fix-permissions.sh
Schritt 3: Datenbank-Rollback (falls nötig)
# Dump entpacken
gunzip -k /backup/2025-12-20_03-00/mariadb_all.sql.gz
# Datenbank wiederherstellen
mariadb < /backup/2025-12-20_03-00/mariadb_all.sql
# Oder einzelne Datenbank:
sed -n '/^-- Current Database: `ki_dev`/,/^-- Current Database:/p' \
/backup/2025-12-20_03-00/mariadb_all.sql > /tmp/ki_dev.sql
mariadb ki_dev < /tmp/ki_dev.sql
Notfall-Rollback (Schnell)
# Letztes Backup finden
LATEST=$(ls -1d /backup/*/ | tail -1)
# Vollständiger Prod-Rollback
cd / && tar -xzf "${LATEST}www.tar.gz" var/www/prod.campus.systemische-tools.de
# Berechtigungen
/var/www/scripts/fix-permissions.sh
# Verifizieren
curl -I https://campus.systemische-tools.de
Workflow
┌─────────────────────────────────────────────────────────────┐
│ DEPLOYMENT WORKFLOW │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. ENTWICKLUNG │
│ └── Änderungen auf dev.campus.systemische-tools.de │
│ ↓ │
│ 2. TESTEN │
│ └── Funktionalität auf dev prüfen │
│ ↓ │
│ 3. PRE-CHECKS (automatisch) │
│ ├── Contract Validation (6 Contracts) │
│ ├── PHPStan (Typen, Bugs) │
│ ├── PHP-CS-Fixer (Style) │
│ ├── Composer Audit (CVEs) │
│ ├── Semgrep (Security) │
│ └── PHPUnit (Tests) │
│ ↓ OK ↓ FAIL │
│ 4. SYNC ABBRUCH │
│ └── rsync dev → prod └── Fehler beheben │
│ ↓ │
│ 5. VERIFIZIEREN │
│ └── Produktion prüfen │
│ ↓ OK ↓ PROBLEM │
│ FERTIG ROLLBACK │
│ └── Aus Backup wiederherstellen│
│ │
└─────────────────────────────────────────────────────────────┘
Checkliste vor Deployment
- Änderungen auf dev getestet?
- Browser-Cache gelöscht beim Testen?
- Keine sensiblen Daten im Code?
- Datenbank-Migrationen berücksichtigt?
- Backup vorhanden? (
ls /backup/)
Verwandte Themen
- Backup - Tägliche Sicherung
- Contracts - Contract-System
- PHP-Quality - Qualitätsprüfung
Contracts
Contracts sind normative YAML-Dokumente, die verbindliche Regeln für Code, Architektur und Dokumentation definieren. Sie ermöglichen automatisierte Validierung und stellen Qualitätsstandards sicher.
Was sind Contracts?
- Normativ: Verbindliche Regeln, keine Empfehlungen
- Maschinenlesbar: YAML-Format für automatisierte Prüfung
- Versioniert: Änderungen erfordern explizite Versionierung
- Validierbar: Klare Pass/Fail-Kriterien
Wann werden Contracts geprüft?
| Zeitpunkt | Contract | Aktion bei Violation |
|---|---|---|
| Vor Sync zu Prod | Alle aktiven | Sync blockiert |
| Nach Dateiänderung | Betriebsdokumentation | Warnung |
| Bei neuem Modul | Layered Architecture | Ablehnung |
Contract-Management
Contracts werden in der Datenbank verwaltet und sind über Web-UI und MCP-API zugänglich.
| Web-UI | /contracts |
|---|---|
| Datenbank | ki_dev.contracts |
| MCP-Server | mcp-contracts (contracts_* Tools) |
Web-UI Features
- /contracts - Liste aller Contracts mit Filter
- /contracts/new - Neuen Contract erstellen
- /contracts/{id} - Contract-Details, YAML-Inhalt, Validierungshistorie
- /contracts/{id}/edit - Contract bearbeiten (erzeugt neue Version)
- Validierung direkt aus der UI auslösen
- Versionshistorie mit Diff-Ansicht
MCP-Tools (mcp-contracts)
Für Details siehe MCP-Contracts Tools.
| Tool | Beschreibung |
|---|---|
contracts_list | Alle Contracts auflisten |
contracts_get | Contract nach ID/Name abrufen |
contracts_create | Neuen Contract anlegen |
contracts_update | Contract aktualisieren (neue Version) |
contracts_validate | Validierung ausführen |
contracts_history | Änderungshistorie abrufen |
contracts_violations | Letzte Violations abrufen |
contracts_deprecate | Contract als deprecated markieren |
Aktive Contracts (15)
| ID | Name | Version | Scope |
|---|---|---|---|
| 1 | betriebsdokumentation-pruefung | 2.0 | Docs-Struktur |
| 2 | CSS Contract | 2.0 | Stylelint-Regeln |
| 3 | HTML Tables Contract | 2.0 | Tabellen-Struktur |
| 4 | js-browser-architecture-contract | 2.0 | JavaScript ES Modules |
| 5 | layered-architecture-pruefung | 3.2 | Layer-Grenzen |
| 6 | python-pipeline-contract | 2.0 | Python Code Quality |
| 7 | View Structure Contract | 2.0 | CRUD-Views |
| 8 | db-access-security-protocol | 2.0 | DB Security |
| 9 | code-quality-standards | 2.1 | Code Quality |
| 10 | critic-workflow | 1.0 | Review-Workflow |
| 11 | architecture-gate-contract | 1.1 | PHP File Analysis |
| 12 | taxonomy-mapping-contract | 1.0.0 | Taxonomie-Mapping |
| 13 | text-quality-standards | 1.0 | Text-Qualität |
| 14 | htmx-patterns-contract | 1.0 | HTMX-Patterns |
| 15 | SemanticExplorerController | 1.0 | Semantic Explorer |
Severity Levels
| Level | Bedeutung | Aktion |
|---|---|---|
| critical | Faktisch falsch | Dokument abgelehnt |
| major | Unvollständig | Überarbeitung nötig |
| minor | Kosmetisch | Nur protokolliert |
Pass-Schwelle
- 0 critical violations (sonst: rejected)
- max 2 major violations (sonst: revision required)
- max 5 minor violations (sonst: approved with notes)
Automatische Validierung
Alle Contracts werden automatisch vor dem Sync zu Produktion geprüft.
Pre-Sync Hook
| Script | /var/www/scripts/contract-check.sh |
|---|---|
| Aufruf | /var/www/scripts/contract-check.sh [path] |
| Integration | /var/www/scripts/sync-dev-prod.sh |
| Exit-Codes | 0 = OK, 1 = Critical, 2 = Major |
Manuell ausführen
# Alle Contracts prüfen
/var/www/scripts/contract-check.sh
# Mit spezifischem Pfad
/var/www/scripts/contract-check.sh /var/www/dev.campus.systemische-tools.de
Verwandte Themen
- MCP-Contracts Server - Technische Dokumentation
- Qualität - Quality Gates und Code Hygiene
File Backup Hook
Automatisches Backup-System, das Dateien in der Datenbank sichert, bevor Claude Code sie mit Edit/Write Tools ändert.
| Script | /var/www/tools/ki-protokoll/claude-hook/file_backup_hook.py |
|---|---|
| Trigger | Claude PreToolUse (Edit, Write) |
| Datenbank | ki_dev.file_backup_history |
| Aktiviert | 2025-12-20 |
Funktionsweise
Claude Edit/Write → PreToolUse Hook → file_backup_hook.py
│
▼
Datei existiert?
In BACKUP_DIRS?
Hash geändert?
│
▼
ki_dev.file_backup_history
(version++, changed_by='claude-code-hook')
Gesicherte Verzeichnisse
- /var/www/dev.campus.systemische-tools.de/src/
- /var/www/dev.campus.systemische-tools.de/public/
- /var/www/dev.campus.systemische-tools.de/scripts/
- /var/www/dev.campus.systemische-tools.de/includes/
- /var/www/dev.campus.systemische-tools.de/config/
- /var/www/prod.campus.systemische-tools.de/* (analog)
Ausgeschlossene Patterns
- /vendor/, /node_modules/, /.git/
- /backups/, /tmp/, /logs/, /cache/
- .log, .cache, .tmp
- Dateien > 10 MB
Datenbank-Schema
| Spalte | Typ | Beschreibung |
|---|---|---|
| id | int(11) PK | Auto-increment ID |
| file_path | varchar(512) | Vollständiger Dateipfad |
| file_content | longtext | Dateiinhalt |
| content_hash | char(64) | SHA256 Hash |
| file_size | int(11) | Größe in Bytes |
| version | int(11) | Versionsnummer pro Datei (Default: 1) |
| change_type | enum | created/modified/deleted (Default: modified) |
| changed_at | timestamp | Zeitstempel (Default: current_timestamp) |
| changed_by | varchar(100) | claude-code-hook |
| reason | text | Backup-Grund |
| diff_summary | text | Zusammenfassung der Änderungen (optional) |
| affected_entities | longtext | Betroffene Entities als JSON (optional) |
Features
- Hash-Vergleich: Vor jedem Backup wird der aktuelle Hash mit dem letzten verglichen. Bei identischem Hash wird kein neues Backup erstellt.
- Versionierung: Jede Datei hat eine eigene Versionsnummer (1, 2, 3, ...)
- Non-blocking: Der Hook gibt immer {"continue": true} zurück und blockiert nie Claude Code.
Hooks-Konfiguration
In /root/.claude/settings.json:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Edit|Write",
"hooks": [{
"type": "command",
"command": "/var/www/tools/ki-protokoll/claude-hook/file_backup_hook.py",
"timeout": 10
}]
}
]
}
}
Manueller Test
echo '{"hook_event_name": "PreToolUse", "tool_name": "Edit", "tool_input": {"file_path": "/var/www/dev.campus.systemische-tools.de/src/Controller/DocsController.php"}}' | /var/www/tools/ki-protokoll/claude-hook/file_backup_hook.py
Backups abfragen
Mit MCP-DB (empfohlen)
# Letzte Backups anzeigen (via MCP-DB Tool)
# Verwendet automatisch sichere Authentifizierung ohne Passwort-Eingabe
# Bestimmte Datei-History
SELECT version, file_size, changed_at
FROM file_backup_history
WHERE file_path = '/pfad/zur/datei.php'
ORDER BY version DESC;
# Inhalt einer Version
SELECT file_content
FROM file_backup_history
WHERE id = 1;
Mit direktem MySQL (Legacy, nicht empfohlen)
# Hinweis: Direkter mysql-Zugriff erfordert Passwort-Eingabe
# Besser: Verwende MCP-DB Tool für sichere Authentifizierung
mysql -u <username> -p ki_dev -e "SELECT id, file_path, version FROM file_backup_history LIMIT 10;"
Unterschied zu anderen Systemen
| System | Trigger | Speicherort | Zweck |
|---|---|---|---|
| File Backup Hook | Claude PreToolUse | DB (ki_dev.file_backup_history) | Automatisches Backup vor Code-Änderungen |
| System Backup | Cron (03:00) | /backup/*.tar.gz | Vollständige System-Sicherung |
| KI-Protokoll | Alle Claude Hooks | DB (ki_dev.protokoll) | Claude Request/Response Logging |
Verwandte Module
- Claude Hooks - Übersicht aller Hooks
- System Backup - Tägliche Vollsicherung
- MCP-DB - Datenbank-Zugriff
Claude Hooks
Python-Hooks für Claude Code Integration mit Protokollierung, Backup, Task-Erstellung, Workflow-Validierung und Architektur-Guards.
| Pfad | /var/www/tools/ki-protokoll/claude-hook/ |
|---|---|
| Konfiguration | /root/.claude/settings.json |
| Datenbank | ki_dev |
Übersicht
| Hook | Trigger | Funktion |
|---|---|---|
| log_to_db.py | Alle Events | Protokollierung in DB |
| file_backup_hook.py | PreToolUse (Edit, Write) | Datei-Backup vor Änderung |
| task_hook.py | UserPromptSubmit | Auto-Task-Erstellung |
| task_completion_guard.py | PreToolUse (tasks_status) | Blockiert Task-Completion ohne Result |
| block_direct_db.py | PreToolUse (Bash) | Blockiert direkte DB-Zugriffe (mysql/mariadb) |
| architecture_guard.py | PreToolUse (Write) | Prüft Architektur-Regeln |
| hook_dispatcher.py | PreToolUse, PostToolUse | Quality-Gates Dispatcher |
Prozess-Dokumentation: Claude Pre-/Post-Hook Prozess
log_to_db.py
Protokolliert alle Claude Code Events in der Datenbank.
Features
- Request/Response-Pairing: PreToolUse → PostToolUse werden verknüpft
- Duration-Tracking: Millisekunden-genaue Zeiterfassung
- Token-Schätzung: ~4 Zeichen = 1 Token
- Sensible Daten: Automatische Maskierung (Passwörter, API-Keys, JWTs)
- Session-Tracking: Temporäre Dateien in /tmp/claude_hooks/
Verarbeitete Events
| Event | Verarbeitung |
|---|---|
| UserPromptSubmit | Prompt speichern |
| PreToolUse | Tool-Name + Input speichern, pending |
| PostToolUse | Response zu PreToolUse matchen, completed |
| SessionStart/End | Session-Lifecycle loggen |
| Stop/SubagentStop | Abschluss loggen |
Datenbank-Tabelle
ki_dev.protokoll
├── id, timestamp
├── request_ip, client_name
├── request, request_timestamp
├── response, response_timestamp
├── duration_ms
├── tokens_input, tokens_output, tokens_total
├── model_name, status
file_backup_hook.py
Sichert Dateien automatisch BEVOR sie geändert werden.
Trigger
- PreToolUse → Edit
- PreToolUse → Write
Backup-Verzeichnisse
/var/www/dev.campus.systemische-tools.de/src
/var/www/dev.campus.systemische-tools.de/public
/var/www/dev.campus.systemische-tools.de/scripts
/var/www/dev.campus.systemische-tools.de/config
/var/www/prod.campus.systemische-tools.de/src
...
Features
- Versionierung: Automatische Version pro Datei
- Hash-Prüfung: Skip bei unveränderter Datei
- Größenlimit: Max 10 MB pro Datei
- Non-Blocking: Hook blockiert nie
Datenbank-Tabelle
ki_dev.file_backup_history
├── id, file_path, version
├── file_content, content_hash, file_size
├── change_type, changed_by, reason
├── created_at
task_hook.py
Erstellt automatisch Tasks aus Patterns in User-Prompts.
Erkannte Patterns
TODO: <text> → Task erstellen
TASK: <text> → Task erstellen
@task <text> → Task erstellen
#task <text> → Task erstellen
task_completion_guard.py
Blockiert tasks_status(completed) wenn kein Result existiert. Erzwingt korrekten Workflow.
Trigger
- PreToolUse → mcp__mcp-tasks__tasks_status
- Nur bei status="completed"
Prüflogik
- Prüft ob
status == "completed" - DB-Query:
SELECT COUNT(*) FROM task_results WHERE task_id = ? - Wenn count = 0 → Block mit Exit-Code 2
Details: Task-Completion Guard Prozess
block_direct_db.py
Blockiert direkte Datenbank-Zugriffe via Bash. Erzwingt Nutzung von MCP-DB.
Trigger
- PreToolUse → Bash
- Prüft Command auf mysql/mariadb-Patterns
Blockierte Patterns
mysql ...
mariadb ...
sudo mysql ...
sudo mariadb ...
Erlaubt
MCP-Tools: mcp__mcp-db__db_select, mcp__mcp-db__db_insert, etc.
architecture_guard.py
Prüft Architektur-Regeln bei PHP-Datei-Erstellung.
Trigger
- PreToolUse → Write (*.php)
Geprüfte Regeln
- Layer-Grenzen (Controller darf nicht direkt auf Repository zugreifen)
- Namespace-Konventionen
- Dependency Injection Patterns
hook_dispatcher.py
Zentraler Dispatcher für Quality-Gates. Lädt Regeln dynamisch.
Trigger
- PreToolUse → Write (BLOCK-Regeln)
- PostToolUse → Write, Edit (WARN-Regeln)
Quality-Regeln
quality/
├── pre_rules.py ← BLOCK-Regeln
├── post_rules.py ← WARN-Regeln
└── task_creator.py ← Violations → Tasks
Details: Quality Gates
Konfiguration
Hooks werden in /root/.claude/settings.json registriert:
{
"hooks": {
"UserPromptSubmit": [...],
"PreToolUse": [
{"matcher": "Bash", "hooks": [...]},
{"matcher": "mcp__mcp-tasks__tasks_status", "hooks": [
{"type": "command", "command": ".../task_completion_guard.py", "timeout": 5}
]},
{"matcher": "Edit|Write", "hooks": [...]},
{"matcher": "", "hooks": [...]}
],
"PostToolUse": [...]
}
}
Environment-Variablen
In .env im Hook-Verzeichnis:
CLAUDE_DB_HOST=localhost
CLAUDE_DB_PORT=3306
CLAUDE_DB_USER=root
CLAUDE_DB_PASSWORD=***
CLAUDE_DB_NAME=ki_dev
Verwandte Themen
- Claude Hooks Prozess - Ablaufdiagramme und Workflow
- Quality Gates - Code-Qualitätsprüfung
- File Backup Hook - Detaillierte Backup-Dokumentation
DB Hooks
Security-Hooks die direkte Datenbankzugriffe blockieren und MCP-Server erzwingen.
| Pfad | /var/www/scripts/hooks/ |
|---|---|
| Hook-Typ | PreToolUse (Bash) |
| Verhalten | Blocking (Exit 1 bei Violation) |
Übersicht
| Hook | Blockiert | Empfehlung |
|---|---|---|
| block_direct_db.py | mysql/mariadb mit Passwort | MCP-DB Tools |
| block_direct_task_db.py | INSERT/UPDATE/DELETE auf Task-Tabellen | MCP-Tasks Tools |
| block_password_exposure.py | Passwörter im Klartext in Bash-Commands | Environment-Variablen |
block_direct_db.py
Verhindert Bash-Befehle mit direktem Datenbank-Login.
Blockierte Patterns
mysql -u user -ppassword
mariadb -u user -p
mysql --password=xxx
mariadb --password=xxx
Fehlermeldung
BLOCKIERT: Direkte Datenbankzugriffe sind aus Sicherheitsgründen nicht erlaubt.
Verwende stattdessen die MCP-DB Tools:
- db_select(query, params) : SELECT-Abfragen ausführen
- db_schema() : Datenbank-Schema anzeigen
- db_stats() : Statistiken abrufen
Vorteile von MCP-DB:
- Keine Credentials im Code/Verlauf
- Automatische Query-Validierung
- SQL-Injection Schutz
- Audit-Logging aller Abfragen
- Enforced Read-Only Zugriff
block_direct_task_db.py
Verhindert direkte SQL-Operationen auf Task-Tabellen.
Blockierte Patterns
INSERT INTO tasks ...
UPDATE tasks SET ...
DELETE FROM tasks ...
INSERT INTO task_assignments ...
UPDATE task_results ...
DELETE FROM task_comments ...
Fehlermeldung
BLOCKIERT: Direkte SQL-Operationen auf Task-Tabellen sind nicht erlaubt.
Verwende stattdessen die MCP-Tasks Tools:
- tasks_list() : Tasks auflisten
- tasks_create(title, ...) : Task erstellen
- tasks_get(id) : Task-Details abrufen
- tasks_update(id, ...) : Task aktualisieren
- tasks_status(id, status) : Status ändern
- tasks_assign(id, ...) : Task zuweisen
- tasks_result(id, ...) : Ergebnis speichern
- tasks_execute(id, model) : Mit Ollama ausführen
block_password_exposure.py
Verhindert Passwort-Exposition in Bash-Commands. Passwörter im Klartext sind sichtbar in ps aux, /proc/*/cmdline, bash_history und Logs.
Blockierte Patterns
DB_PASSWORD="wert"
MARIADB_ROOT_PASSWORD="wert"
API_KEY="wert"
TOKEN="wert"
SECRET="wert"
--password=wert
Erlaubte Patterns
$DB_PASSWORD # Variable verwenden
${DB_PASSWORD} # Variable verwenden
DB_PASSWORD="" # Leere Zuweisung
get_db_password() # Getter-Funktion
Fehlermeldung
BLOCKIERT: Passwort-Exposition im Bash-Command erkannt!
RICHTIG: Passwort aus Environment laden
./venv/bin/python script.py
# Script lädt Passwort via get_db_password()
FALSCH:
DB_PASSWORD="xxx" ./venv/bin/python script.py
Verhalten
Erfolg (erlaubt)
{
"allowed": true,
"message": ""
}
Exit Code: 0
Blockiert
{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "deny",
"permissionDecisionReason": "BLOCKIERT: ..."
}
}
Exit Code: 1
Fehler (Fail-Open)
{
"allowed": true,
"message": "Hook error (fail-open): ..."
}
Exit Code: 0
Konfiguration
In /root/.claude/settings.json:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{"type": "command", "command": "/var/www/scripts/hooks/block_direct_db.py"},
{"type": "command", "command": "/var/www/scripts/hooks/block_direct_task_db.py"},
{"type": "command", "command": "/var/www/scripts/hooks/block_password_exposure.py"}
]
}
]
}
}
Sicherheitskonzept
┌─────────────────────────────────────────────┐
│ Claude Code │
│ └─ Bash Tool → mysql -u root -p... │
└─────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ PreToolUse Hook │
│ ├─ block_direct_db.py │
│ ├─ block_direct_task_db.py │
│ └─ block_password_exposure.py │
│ └─ Pattern Match? → BLOCK (Exit 1) │
└─────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ MCP-Server (stattdessen) │
│ ├─ MCP-DB: db_select(), db_schema() │
│ └─ MCP-Tasks: tasks_*(), quality_*() │
└─────────────────────────────────────────────┘
Verwandte Dokumentation
Contract-Enforcement-System
Das Enforcement-System stellt sicher, dass alle Code-Qualitätsstandards und Architektur-Regeln automatisch durchgesetzt werden.
Architektur-Übersicht
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Contracts │────▶│ Validator │────▶│ Hooks │
│ (YAML in DB) │ │ (contract-check)│ │ (Python Scripts)│
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ MCP-Contracts │ │ sync-dev-prod │ │ Claude Code │
│ (API) │ │ (Workflow) │ │ (PreToolUse) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
Komponenten
1. Contracts (Datenbank)
Contracts sind in ki_protokoll.contracts gespeichert und definieren Regeln im YAML-Format.
| Contract | Zweck | Severity |
|---|---|---|
| code-quality-standards | LOC-Limits, PDO-Verbot in Controllern | critical/major |
| layered-architecture | Schichtenarchitektur (MVC/MVP) | critical |
| db-access-security | Keine direkten DB-Befehle | critical |
| python-pipeline | Python-Qualitätsstandards | critical/major |
| view-structure | CRUD-View-Standards | critical/major |
| css-standards | Accessibility (WCAG 2.1) | critical/major |
| critic-workflow | Review-Prozess Definition | critical |
2. Validator (contract-check.sh)
Führt Contract-Validierungen aus:
/opt/scripts/contract-check.sh /var/www/dev.campus.systemische-tools.de
3. Hooks (PreToolUse)
Blockieren Architektur-Verletzungen BEVOR Code geschrieben wird:
| Hook | Trigger | Prüfung |
|---|---|---|
| block_direct_db.py | Bash | mysql/mariadb-Befehle |
| architecture_guard.py | Write/Edit | Controller LOC > 500, PDO in Controller |
Workflow
Pre-Sync Validierung
- Contract-Check: Alle Contracts werden validiert
- PHP Quality: PHPStan, PHP-CS-Fixer, Semgrep
- Unit Tests: PHPUnit ausführen
- Entscheidung: Critical=Block, Major=Warn, Minor=Log
PreToolUse Hooks
- Claude Code ruft Write/Edit/Bash auf
- Hook prüft Content/Command
- Bei Violation: Exit 2 → Block + Fehlermeldung
- Bei OK: Exit 0 → Durchlassen
MCP-Tools
contracts_list
contracts_list(compact=True)
Listet alle Contracts auf.
contracts_validate
contracts_validate(name="code-quality-standards")
Validiert einen Contract gegen die Codebase.
contracts_create/update
contracts_create(name="...", yaml_content="...", version="1.0")
Erstellt oder aktualisiert einen Contract.
Troubleshooting
"Mein Code wird blockiert"
- Prüfe welcher Hook blockiert (Fehlermeldung)
- Prüfe welche Regel verletzt wird
- Behebe das Problem (z.B. Service extrahieren statt PDO in Controller)
"Contract-Validierung findet nichts"
- Prüfe ob Contract aktiv ist:
contracts_get(name="...") - Prüfe Scope-Pfade im Contract
- Prüfe ob Dateien existieren
"Sync wird blockiert"
- Führe
/opt/scripts/contract-check.shaus - Prüfe Critical/Major Violations
- Behebe alle Critical-Violations
- Major-Violations können als Baseline akzeptiert werden
Baseline für Legacy-Code
Aktuell akzeptierte Legacy-Violations (nicht für neue Code):
- SemanticExplorerRepository.php: 797 LOC
- SystemExplorerRepository.php: 709 LOC
- ChunkSyncService.php: 551 LOC
Neue Violations in diesen Dateien werden trotzdem blockiert.
Architektur
Clean Architecture Übersicht für das Campus-System. Strikte Trennung zwischen Backend (MVC), Frontend (MVP) und Infrastruktur.
| Projekt-Root | /var/www/dev.campus.systemische-tools.de/ |
|---|---|
| Backend | MVC Pattern (/src) |
| Frontend | MVP Pattern (/app) |
| Datenbanken | ki_dev, ki_content |
Backend-Architektur (MVC)
Pfad: /src/
| Verzeichnis | Zweck | Beispiele |
|---|---|---|
| Framework/ | App-Kern, Router, Controller-Base | App.php, Router.php, Controller.php |
| Controller/ | HTTP Controller (Request → Response) | TaskController, ChatController |
| Domain/ | Entities, Repository-Interfaces | Task.php, TaskRepositoryInterface |
| UseCases/ | Anwendungsfälle (Business Logic) | CreateTaskUseCase, ExecuteTaskUseCase |
| Infrastructure/ | DB, External Services | TaskRepository, OllamaService |
| View/ | Server-Templates (PHP) | tasks/index.php, chat/show.php |
Layer-Regeln
Controller → UseCase → Repository (via Interface)
↓ ↓ ↓
Request Business Infrastructure
Handler Logic (MySQL, API)
VERBOTEN:
- Controller → Repository direkt (muss über UseCase)
- UseCase → Infrastructure konkret (nur Interface)
- View → Database (niemals)
Frontend-Architektur (MVP)
Pfad: /app/
| Verzeichnis | Zweck | Beispiele |
|---|---|---|
| Presenter/ | UI-Logik, View-Model Aufbereitung | TaskPresenter, ChatPresenter |
| View/ | Passive Views (nur Anzeige) | TaskListView, ChatView |
MVP-Prinzip
- Model: Domain-Entities (aus /src/Domain)
- View: Passive Templates, keine Logik
- Presenter: Bereitet Daten für View auf, enthält UI-Logik
Datenbanken
| Datenbank | Zweck | Beispiel-Tabellen |
|---|---|---|
| ki_dev | Infrastruktur/Development | tasks, contracts, dokumentation, mcp_log, file_backup_history |
| ki_content | Content/User-facing | chat_sessions, chat_messages, content, documents, chunks, entities |
Zugriff
Kein direkter SQL-Zugriff! Immer über MCP-DB:
mcp__mcp-db__db_select(query, database="ki_dev")
mcp__mcp-db__db_insert(table, data, database="ki_content")
Verzeichnisstruktur
/var/www/dev.campus.systemische-tools.de/
├── app/ # Frontend (MVP)
│ ├── Presenter/ # UI-Logik
│ └── View/ # Passive Views
├── bin/ # CLI-Binaries
├── cli/ # CLI-Commands
├── composer.json # PHP Dependencies
├── composer.lock # Lock-File
├── config/ # Konfiguration
│ ├── config.php # App-Config
│ ├── autoload.php # PSR-4 Autoloader
│ ├── database.php # DB-Config
│ └── profiles/ # Author-Profile
├── contracts/ # Architecture Contracts (YAML)
├── database/ # Migrations, Seeds
├── docs/ # Projekt-Dokumentation
├── phpstan.neon # PHPStan Config
├── phpstan-baseline.neon # PHPStan Baseline
├── .php-cs-fixer.dist.php # PHP-CS-Fixer Config
├── public/ # Web-Root
│ ├── index.php # Entry Point
│ ├── css/ # Stylesheets
│ ├── js/ # JavaScript
│ ├── images/ # Bilder
│ └── static-docs/ # Statische Docs
├── routes/ # Route-Definitionen
│ ├── web.php # Web-Routes
│ └── api.php # API-Routes
├── src/ # Backend (MVC)
│ ├── Framework/ # App, Router, Controller-Base
│ ├── Controller/ # HTTP Controller
│ ├── Domain/ # Entity, Repository-Interfaces
│ ├── UseCases/ # Anwendungsfälle
│ ├── Infrastructure/ # DB, External Services
│ └── View/ # Server-Templates
├── storage/ # Logs, Cache, Sessions
│ ├── logs/ # Application Logs
│ ├── cache/ # Cache-Dateien
│ └── sessions/ # PHP-Sessions
├── tests/ # Unit-Tests
│ └── Unit/ # PHPUnit Tests
└── vendor/ # Composer Dependencies
Dependency Injection
Der DI-Container in /src/services.php bindet Interfaces an Implementierungen:
// Interface → Implementation
TaskRepositoryInterface::class => TaskRepository::class
OllamaServiceInterface::class => OllamaService::class
// Controller bekommt Dependencies via Constructor
class TaskController extends Controller {
public function __construct(
private TaskRepositoryInterface $taskRepository,
private CreateTaskUseCase $createTask
) {}
}
Request-Lifecycle
1. Request → public/index.php
2. App::bootstrap() → Autoload, Config, DI-Container
3. Router::dispatch() → Route matchen
4. Controller::action() → UseCase aufrufen
5. UseCase → Repository → Database
6. View::render() → HTML Response
7. Response → Browser
Code-Analyse
Vor Refactoring immer MCP-Code nutzen:
# Klasse finden
mcp__mcp-code__code_search("TaskController")
# Dependencies prüfen
mcp__mcp-code__code_dependencies("Controller\\TaskController")
# Impact vor Änderung
mcp__mcp-code__code_impact("Domain\\Entity\\Task")
Verwandte Themen
- Regeln - Entwicklungs-Regeln
- PHP-Quality - Code-Qualität
- MCP-Code - Code-Analyse Tools
- MCP-DB - Datenbankzugriff
Regeln
Verbindliche Entwicklungs- und Betriebsregeln für das Campus-System. Diese Regeln werden durch Hooks und Quality-Gates durchgesetzt.
1. Kein Git
| Regel | Git ist auf diesem Server verboten |
|---|---|
| Grund | File-Backup via Hooks ersetzt Versionierung |
| Alternative | file_backup_hook.py sichert jede Änderung automatisch |
2. MCP nutzen
| Regel | Kein direkter Datenbankzugriff via mysql/mariadb CLI |
|---|---|
| Grund | Validierung, Logging, Security durch MCP |
| Durchsetzung | block_direct_db.py Hook blockiert CLI-Zugriffe |
Statt:
mysql -u root -p ki_dev -e "SELECT * FROM tasks"
Verwende:
mcp__mcp-db__db_select("SELECT * FROM tasks", database="ki_dev")
Verfügbare MCP-Server
| Server | Zweck | Wichtige Tools |
|---|---|---|
| MCP-DB | Datenbankzugriff | db_select, db_insert, db_update, db_delete |
| MCP-Tasks | Task-Management | tasks_create, tasks_status, tasks_result |
| MCP-Contracts | Contract-Validierung | contracts_validate, contracts_list |
| MCP-Docs | Dokumentation | docs_get, docs_search, docs_update |
| MCP-Code | Code-Analyse | code_search, code_impact, code_dependents |
3. Dev first
| Regel | Entwicklung immer auf dev.campus.systemische-tools.de |
|---|---|
| Grund | Keine Risiken für Produktion |
| Workflow | dev → Testen → sync-dev-prod.sh → prod |
Umgebungen
| Umgebung | URL | Pfad |
|---|---|---|
| Development | dev.campus.systemische-tools.de | /var/www/dev.campus.systemische-tools.de/ |
| Production | campus.systemische-tools.de | /var/www/prod.campus.systemische-tools.de/ |
4. Quality vor Sync
| Regel | /var/www/scripts/php-check.sh muss bestehen |
|---|---|
| Grund | Keine Fehler in Produktion |
| Durchsetzung | sync-dev-prod.sh bricht bei Fehlern ab |
Quality-Checks
- PHPStan: Typen, Null-Safety, Bugs
- PHP-CS-Fixer: PSR-12 Code Style
- Composer Audit: Dependency CVEs
- Semgrep: OWASP Security
- Contracts: Architecture + View-Struktur
Manuell prüfen
/var/www/scripts/php-check.sh /var/www/dev.campus.systemische-tools.de
5. Task-Pflicht
| Regel | Für jede Anforderung tasks_create() nutzen |
|---|---|
| Grund | Nachvollziehbarkeit, Protokollierung |
| Durchsetzung | task_completion_guard.py prüft Result vor Completion |
Workflow
# 1. Task erstellen
tasks_create(title="Feature X implementieren", type="ai_task")
# 2. Status setzen
tasks_status(id=123, status="in_progress")
# 3. Arbeit dokumentieren
tasks_result(id=123, response="...", executor="claude", executor_type="claude")
# 4. Abschließen
tasks_status(id=123, status="completed")
6. Layer-Grenzen
| Regel | Controller → UseCase → Repository (nie direkt) |
|---|---|
| Grund | Clean Architecture, Testbarkeit |
| Durchsetzung | architecture_guard.py + Quality-Gates |
Erlaubt
// Controller → UseCase → Repository
$this->createTaskUseCase->execute($data);
Verboten
// Controller → Repository direkt
$this->taskRepository->save($task);
7. HTMX statt fetch()
| Regel | Frontend-Interaktionen via HTMX Attribute |
|---|---|
| Grund | Server-Rendering, weniger JavaScript |
| Dokumentation | HTMX Patterns |
Beispiel
<button hx-post="/tasks/123/complete"
hx-headers='{"X-CSRF-TOKEN": "..."}'
hx-confirm="Wirklich abschließen?">
Abschließen
</button>
Zusammenfassung
| # | Regel | Durchsetzung |
|---|---|---|
| 1 | Kein Git | file_backup_hook.py |
| 2 | MCP nutzen | block_direct_db.py |
| 3 | Dev first | sync-dev-prod.sh |
| 4 | Quality vor Sync | php-check.sh + contracts |
| 5 | Task-Pflicht | task_completion_guard.py |
| 6 | Layer-Grenzen | architecture_guard.py |
| 7 | HTMX statt fetch() | Quality-Gates |
Verwandte Themen
- Architektur - System-Architektur
- Claude Hooks - Hook-System
- Deployment - Sync-Prozess
- Quality Gates - Code-Qualität