70 lines
3.5 KiB
Markdown
Executable File
70 lines
3.5 KiB
Markdown
Executable File
# 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`.
|
||
|
||
### Zugang zum Server
|
||
Zwei gleichwertige Wege: (a) PuTTY-Session SRV1361746, (b) hPanel →
|
||
VPS 1361746 → Button "Terminal" (Browser-Terminal, bereits als root
|
||
eingeloggt). Weg (b) hat sich als der robustere erwiesen, wenn lokal keine
|
||
SSH-Sitzung offen ist.
|
||
|
||
## 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`
|