Betrieb

Erstellt: 2025-12-20 | Aktualisiert: 2025-12-20

Betriebsrelevante Dokumentation für Backup, Deployment, Hooks und Automatisierung.

Themen

Hook-Übersicht

HookTypFunktion
log_to_db.pyLoggingAlle Events protokollieren
file_backup_hook.pyBackupDateien vor Edit/Write sichern
task_hook.pyAutomationTasks aus Prompts erstellen
block_direct_db.pySecurityDirekte DB-Zugriffe blockieren
block_direct_task_db.pySecurityTask-DB-Zugriffe blockieren

Backup

Erstellt: 2025-12-20 | Aktualisiert: 2025-12-27

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/
ZeitTäglich 03:00
Retention7 Tage

Was wird gesichert

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 & Automatisierung

Erstellt: 2025-12-20 | Aktualisiert: 2025-12-31

Übersicht aller automatisierten Tasks: Cron-Jobs und Systemd Timer.

Cron-Jobs (/etc/cron.d/)4 (backup, certbot, e2scrub_all, php)
Systemd Timer14 aktiv
Logs/var/log/backup.log, journalctl

Cron-Jobs (/etc/cron.d/)

Backup

Datei/etc/cron.d/backup
ZeitTäglich 03:00
Userroot
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

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
ZeitAlle 12 Stunden (mit Random-Sleep)
Userroot
HinweisWird 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
ZeitAlle 30 Minuten (:09, :39)
Userroot
Script/usr/lib/php/sessionclean
HinweisWird von Systemd Timer überschrieben (phpsessionclean.timer)

e2scrub_all

Datei/etc/cron.d/e2scrub_all
ZweckExt4 Filesystem Scrubbing
HinweisWird von Systemd Timer überschrieben

Systemd Timer

Übersicht aller Timer

systemctl list-timers --all

Wichtige Timer

TimerServiceIntervallBeschreibung
certbot.timercertbot.service2x täglichSSL-Zertifikat Renewal
phpsessionclean.timerphpsessionclean.service30 minPHP Session Cleanup
apt-daily.timerapt-daily.service1x täglichAPT Package Listen Update
apt-daily-upgrade.timerapt-daily-upgrade.service1x täglichAutomatische Security Updates
logrotate.timerlogrotate.service1x täglichLog-Rotation
fstrim.timerfstrim.service1x wöchentlichSSD TRIM
man-db.timerman-db.service1x täglichMan-Page Index Update
e2scrub_all.timere2scrub_all.service1x wöchentlichExt4 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.service

Deployment & Rollback

Erstellt: 2025-12-20 | Aktualisiert: 2025-12-31

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
Richtungdev → prod
Pre-ChecksContract Validation, PHPStan, PHP-CS-Fixer, Composer Audit, Semgrep, PHPUnit
RollbackAus /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

ContractPrüftBlockiert bei
View Structure v1.0CRUD-Views, StrukturCritical
HTML Tables v1.0Modals, Aktionen-SpalteCritical
CSS Contract v1.0Stylelint-RegelnMajor
Python Pipeline v1.0Ruff, mypyMajor
Layered Architecture v1.0Layer-GrenzenCritical
Betriebsdokumentation v1.1Docs-StrukturMajor

Script: /var/www/scripts/contract-check.sh

Dokumentation: Contracts

Check 2: PHP Quality Check

ToolPrüftBlockiert bei
PHPStan + Strict RulesTypen, Null-Safety, BugsErrors
PHP-CS-FixerPSR-12 Code StyleStyle Issues
Composer AuditDependency CVEsVulnerabilities
SemgrepOWASP SecuritySecurity 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

VerzeichnisInhaltrsync-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.phpEntry Point-av
public/.htaccessApache Config-av

Was wird NICHT synchronisiert

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

Verwandte Themen

Contracts

Erstellt: 2025-12-20 | Aktualisiert: 2025-12-31

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?

Wann werden Contracts geprüft?

ZeitpunktContractAktion bei Violation
Vor Sync zu ProdAlle aktivenSync blockiert
Nach DateiänderungBetriebsdokumentationWarnung
Bei neuem ModulLayered ArchitectureAblehnung

Contract-Management

Contracts werden in der Datenbank verwaltet und sind über Web-UI und MCP-API zugänglich.

Web-UI/contracts
Datenbankki_dev.contracts
MCP-Servermcp-contracts (contracts_* Tools)

Web-UI Features

MCP-Tools (mcp-contracts)

Für Details siehe MCP-Contracts Tools.

ToolBeschreibung
contracts_listAlle Contracts auflisten
contracts_getContract nach ID/Name abrufen
contracts_createNeuen Contract anlegen
contracts_updateContract aktualisieren (neue Version)
contracts_validateValidierung ausführen
contracts_historyÄnderungshistorie abrufen
contracts_violationsLetzte Violations abrufen
contracts_deprecateContract als deprecated markieren

Aktive Contracts (15)

IDNameVersionScope
1betriebsdokumentation-pruefung2.0Docs-Struktur
2CSS Contract2.0Stylelint-Regeln
3HTML Tables Contract2.0Tabellen-Struktur
4js-browser-architecture-contract2.0JavaScript ES Modules
5layered-architecture-pruefung3.2Layer-Grenzen
6python-pipeline-contract2.0Python Code Quality
7View Structure Contract2.0CRUD-Views
8db-access-security-protocol2.0DB Security
9code-quality-standards2.1Code Quality
10critic-workflow1.0Review-Workflow
11architecture-gate-contract1.1PHP File Analysis
12taxonomy-mapping-contract1.0.0Taxonomie-Mapping
13text-quality-standards1.0Text-Qualität
14htmx-patterns-contract1.0HTMX-Patterns
15SemanticExplorerController1.0Semantic Explorer

Severity Levels

LevelBedeutungAktion
criticalFaktisch falschDokument abgelehnt
majorUnvollständigÜberarbeitung nötig
minorKosmetischNur protokolliert

Pass-Schwelle

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-Codes0 = 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

File Backup Hook

Erstellt: 2025-12-20 | Aktualisiert: 2025-12-31

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
TriggerClaude PreToolUse (Edit, Write)
Datenbankki_dev.file_backup_history
Aktiviert2025-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

Ausgeschlossene Patterns

Datenbank-Schema

SpalteTypBeschreibung
idint(11) PKAuto-increment ID
file_pathvarchar(512)Vollständiger Dateipfad
file_contentlongtextDateiinhalt
content_hashchar(64)SHA256 Hash
file_sizeint(11)Größe in Bytes
versionint(11)Versionsnummer pro Datei (Default: 1)
change_typeenumcreated/modified/deleted (Default: modified)
changed_attimestampZeitstempel (Default: current_timestamp)
changed_byvarchar(100)claude-code-hook
reasontextBackup-Grund
diff_summarytextZusammenfassung der Änderungen (optional)
affected_entitieslongtextBetroffene Entities als JSON (optional)

Features

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

SystemTriggerSpeicherortZweck
File Backup HookClaude PreToolUseDB (ki_dev.file_backup_history)Automatisches Backup vor Code-Änderungen
System BackupCron (03:00)/backup/*.tar.gzVollständige System-Sicherung
KI-ProtokollAlle Claude HooksDB (ki_dev.protokoll)Claude Request/Response Logging

Verwandte Module

Claude Hooks

Erstellt: 2025-12-20 | Aktualisiert: 2025-12-27

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
Datenbankki_dev

Übersicht

HookTriggerFunktion
log_to_db.pyAlle EventsProtokollierung in DB
file_backup_hook.pyPreToolUse (Edit, Write)Datei-Backup vor Änderung
task_hook.pyUserPromptSubmitAuto-Task-Erstellung
task_completion_guard.pyPreToolUse (tasks_status)Blockiert Task-Completion ohne Result
block_direct_db.pyPreToolUse (Bash)Blockiert direkte DB-Zugriffe (mysql/mariadb)
architecture_guard.pyPreToolUse (Write)Prüft Architektur-Regeln
hook_dispatcher.pyPreToolUse, PostToolUseQuality-Gates Dispatcher

Prozess-Dokumentation: Claude Pre-/Post-Hook Prozess

log_to_db.py

Protokolliert alle Claude Code Events in der Datenbank.

Features

Verarbeitete Events

EventVerarbeitung
UserPromptSubmitPrompt speichern
PreToolUseTool-Name + Input speichern, pending
PostToolUseResponse zu PreToolUse matchen, completed
SessionStart/EndSession-Lifecycle loggen
Stop/SubagentStopAbschluss 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

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

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

Prüflogik

  1. Prüft ob status == "completed"
  2. DB-Query: SELECT COUNT(*) FROM task_results WHERE task_id = ?
  3. 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

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

Geprüfte Regeln

hook_dispatcher.py

Zentraler Dispatcher für Quality-Gates. Lädt Regeln dynamisch.

Trigger

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

DB Hooks

Erstellt: 2025-12-20 | Aktualisiert: 2025-12-31

Security-Hooks die direkte Datenbankzugriffe blockieren und MCP-Server erzwingen.

Pfad/var/www/scripts/hooks/
Hook-TypPreToolUse (Bash)
VerhaltenBlocking (Exit 1 bei Violation)

Übersicht

HookBlockiertEmpfehlung
block_direct_db.pymysql/mariadb mit PasswortMCP-DB Tools
block_direct_task_db.pyINSERT/UPDATE/DELETE auf Task-TabellenMCP-Tasks Tools
block_password_exposure.pyPasswörter im Klartext in Bash-CommandsEnvironment-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

Erstellt: 2025-12-22 | Aktualisiert: 2025-12-27

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.

ContractZweckSeverity
code-quality-standardsLOC-Limits, PDO-Verbot in Controllerncritical/major
layered-architectureSchichtenarchitektur (MVC/MVP)critical
db-access-securityKeine direkten DB-Befehlecritical
python-pipelinePython-Qualitätsstandardscritical/major
view-structureCRUD-View-Standardscritical/major
css-standardsAccessibility (WCAG 2.1)critical/major
critic-workflowReview-Prozess Definitioncritical

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:

HookTriggerPrüfung
block_direct_db.pyBashmysql/mariadb-Befehle
architecture_guard.pyWrite/EditController LOC > 500, PDO in Controller

Workflow

Pre-Sync Validierung

  1. Contract-Check: Alle Contracts werden validiert
  2. PHP Quality: PHPStan, PHP-CS-Fixer, Semgrep
  3. Unit Tests: PHPUnit ausführen
  4. Entscheidung: Critical=Block, Major=Warn, Minor=Log

PreToolUse Hooks

  1. Claude Code ruft Write/Edit/Bash auf
  2. Hook prüft Content/Command
  3. Bei Violation: Exit 2 → Block + Fehlermeldung
  4. 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"

  1. Prüfe welcher Hook blockiert (Fehlermeldung)
  2. Prüfe welche Regel verletzt wird
  3. Behebe das Problem (z.B. Service extrahieren statt PDO in Controller)

"Contract-Validierung findet nichts"

  1. Prüfe ob Contract aktiv ist: contracts_get(name="...")
  2. Prüfe Scope-Pfade im Contract
  3. Prüfe ob Dateien existieren

"Sync wird blockiert"

  1. Führe /opt/scripts/contract-check.sh aus
  2. Prüfe Critical/Major Violations
  3. Behebe alle Critical-Violations
  4. Major-Violations können als Baseline akzeptiert werden

Baseline für Legacy-Code

Aktuell akzeptierte Legacy-Violations (nicht für neue Code):

Neue Violations in diesen Dateien werden trotzdem blockiert.

Architektur

Erstellt: 2025-12-27 | Aktualisiert: 2025-12-31

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/
BackendMVC Pattern (/src)
FrontendMVP Pattern (/app)
Datenbankenki_dev, ki_content

Backend-Architektur (MVC)

Pfad: /src/

VerzeichnisZweckBeispiele
Framework/App-Kern, Router, Controller-BaseApp.php, Router.php, Controller.php
Controller/HTTP Controller (Request → Response)TaskController, ChatController
Domain/Entities, Repository-InterfacesTask.php, TaskRepositoryInterface
UseCases/Anwendungsfälle (Business Logic)CreateTaskUseCase, ExecuteTaskUseCase
Infrastructure/DB, External ServicesTaskRepository, 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/

VerzeichnisZweckBeispiele
Presenter/UI-Logik, View-Model AufbereitungTaskPresenter, ChatPresenter
View/Passive Views (nur Anzeige)TaskListView, ChatView

MVP-Prinzip

Datenbanken

DatenbankZweckBeispiel-Tabellen
ki_devInfrastruktur/Developmenttasks, contracts, dokumentation, mcp_log, file_backup_history
ki_contentContent/User-facingchat_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

Erstellt: 2025-12-27 | Aktualisiert: 2025-12-27

Verbindliche Entwicklungs- und Betriebsregeln für das Campus-System. Diese Regeln werden durch Hooks und Quality-Gates durchgesetzt.

1. Kein Git

RegelGit ist auf diesem Server verboten
GrundFile-Backup via Hooks ersetzt Versionierung
Alternativefile_backup_hook.py sichert jede Änderung automatisch

2. MCP nutzen

RegelKein direkter Datenbankzugriff via mysql/mariadb CLI
GrundValidierung, Logging, Security durch MCP
Durchsetzungblock_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

ServerZweckWichtige Tools
MCP-DBDatenbankzugriffdb_select, db_insert, db_update, db_delete
MCP-TasksTask-Managementtasks_create, tasks_status, tasks_result
MCP-ContractsContract-Validierungcontracts_validate, contracts_list
MCP-DocsDokumentationdocs_get, docs_search, docs_update
MCP-CodeCode-Analysecode_search, code_impact, code_dependents

3. Dev first

RegelEntwicklung immer auf dev.campus.systemische-tools.de
GrundKeine Risiken für Produktion
Workflowdev → Testen → sync-dev-prod.sh → prod

Umgebungen

UmgebungURLPfad
Developmentdev.campus.systemische-tools.de/var/www/dev.campus.systemische-tools.de/
Productioncampus.systemische-tools.de/var/www/prod.campus.systemische-tools.de/

4. Quality vor Sync

Regel/var/www/scripts/php-check.sh muss bestehen
GrundKeine Fehler in Produktion
Durchsetzungsync-dev-prod.sh bricht bei Fehlern ab

Quality-Checks

Manuell prüfen

/var/www/scripts/php-check.sh /var/www/dev.campus.systemische-tools.de

5. Task-Pflicht

RegelFür jede Anforderung tasks_create() nutzen
GrundNachvollziehbarkeit, Protokollierung
Durchsetzungtask_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

RegelController → UseCase → Repository (nie direkt)
GrundClean Architecture, Testbarkeit
Durchsetzungarchitecture_guard.py + Quality-Gates

Erlaubt

// Controller → UseCase → Repository
$this->createTaskUseCase->execute($data);

Verboten

// Controller → Repository direkt
$this->taskRepository->save($task);

7. HTMX statt fetch()

RegelFrontend-Interaktionen via HTMX Attribute
GrundServer-Rendering, weniger JavaScript
DokumentationHTMX Patterns

Beispiel

<button hx-post="/tasks/123/complete"
        hx-headers='{"X-CSRF-TOKEN": "..."}'
        hx-confirm="Wirklich abschließen?">
    Abschließen
</button>

Zusammenfassung

#RegelDurchsetzung
1Kein Gitfile_backup_hook.py
2MCP nutzenblock_direct_db.py
3Dev firstsync-dev-prod.sh
4Quality vor Syncphp-check.sh + contracts
5Task-Pflichttask_completion_guard.py
6Layer-Grenzenarchitecture_guard.py
7HTMX statt fetch()Quality-Gates

Verwandte Themen