# ITSM — Betriebshandbuch Stand: 2026-07-15. Produktivinstanz: SRV1361746 (`/docker/itsm/`), Port 8090. ## 1. ENV-Variablen | Variable | Pflicht | Bedeutung | |---|---|---| | `DATABASE_URL` | ja | `postgresql://itsm:...@postgres:5432/itsm` | | `ITSM_BIND` | – | Bind-Adresse (Default `0.0.0.0:8090`) | | `ITSM_HTTPS` | – | `1` = Secure-Cookies + HSTS (hinter TLS-Terminierung setzen) | | `ITSM_TRUSTED_PROXY_COUNT` | – | Anzahl vertrauenswürdiger Reverse-Proxies; nur dann zählt X-Forwarded-For | | `ITSM_SESSION_HOURS` | – | Session-Lebensdauer (Default 8) | | `ITSM_LOGIN_MAX_ATTEMPTS` / `ITSM_LOGIN_WINDOW_MINUTES` | – | Rate-Limit (Default 5 / 15) | | `ITSM_PASSWORD_MIN_LENGTH` | – | Default 12 | | `AES_DASHBOARD_URL` | – | AES-Service im Katalog | | `FORGE_BASE_URL` / `FORGE_SERVICE_TOKEN` | – | Repo-Edit aus Change-Tickets; ohne = Feature deaktiviert | | `RUST_LOG` | – | z. B. `info` | Hinweis: `ITSM_SECRET_KEY` (Flask-Ära) wird nicht mehr genutzt und kann aus der Server-`.env` entfernt werden. ## 2. Deployment / Update (SRV1361746) cd /docker/itsm rm -rf src && git clone --depth 1 https://git1.mrmoe.de/mscadm/ITSM.git src docker compose build itsm # Multi-Stage-Build, ~3 min docker compose up -d # Postgres läuft weiter, nur App wird getauscht curl -s localhost:8090/health # {"db":"ok","status":"ok"} Es wird KEIN Code mehr beim Container-Start gezogen (früherer bootstrap.sh- Mechanismus ist abgeschafft) — ein Neustart startet exakt das gebaute Image. Schema-Migrationen laufen idempotent beim App-Start. Rollback: `docker-compose.yml.flask-backup` liegt als letzter Flask-Stand in `/docker/itsm/`; für das Rust-Image genügt `git clone` eines älteren Tags/ Commits nach `src/` + erneutes `build`. ## 3. Backup & Retention - Täglicher pg_dump: `deploy/backup.sh` via Cron `0 3 * * *` nach `/docker/itsm/backups/` (14 Tage Rotation). Live-Daten: Bind-Mount `/docker/itsm/pgdata` (kein anonymes Docker-Volume). - DSGVO-Retention: Hintergrundtask löscht gelöste/geschlossene Tickets und Audit-Einträge nach Mandanten-Fristen; Sessions/Login-Versuche werden mitbereinigt. Manuell: Admin → Einstellungen → "Jetzt manuell bereinigen". ## 4. Troubleshooting | Symptom | Ursache / Abhilfe | |---|---| | Login schlägt für Bestandskonto fehl | Hash-Prefix prüfen: `docker exec itsm_postgres psql -U itsm -d itsm -c "SELECT email,left(password_hash,16) FROM users;"` — `pbkdf2:`/`scrypt:` = Werkzeug-Altbestand (wird unterstützt, ab Commit f732392 auch scrypt), `$argon2id$` = migriert. | | "Zu viele Fehlversuche" (429) | Rate-Limit-Sperre; wartet 15 min oder `DELETE FROM login_attempts;` | | 500er | `docker logs itsm_app --tail 50` (tracing-Log) | | Health rot | DB-Verbindung prüfen (`docker ps`, `pg_isready`) | | Repo-Edit-Button fehlt | FORGE_BASE_URL nicht gesetzt, Rolle < change_manager, oder Ticket ist kein freigegebener Change (gewollt, ADR-004) | | Alle Sessions ungültig nach Deploy | erwartungsgemäß NICHT der Fall (Sessions liegen in der DB); falls doch: sessions-Tabelle prüfen | ## 5. Monitoring-Punkte - `GET /health` (Docker-HEALTHCHECK eingebaut, curl-basiert) - Audit-Log (Admin-UI) für login_failed/login_rate_limited-Häufungen - Backup-Log `/docker/itsm/backup.log`