diff --git a/install-notes/000-installation-index.md b/install-notes/000-installation-index.md index ff3a8b8..1240ad4 100644 --- a/install-notes/000-installation-index.md +++ b/install-notes/000-installation-index.md @@ -13,3 +13,5 @@ | 007 | Debian 12 LXC: Gitea SSH über interne IPv4 | erledigt | - [014 - PostgreSQL-Anbindung und server.env](014-postgresql-anbindung-server-env.md) + +- [015 - Initiales PostgreSQL-Datenbankschema und Migrationen](015-initiales-postgresql-datenbankschema-und-migrationen.md) diff --git a/install-notes/015-initiales-postgresql-datenbankschema-und-migrationen.md b/install-notes/015-initiales-postgresql-datenbankschema-und-migrationen.md new file mode 100644 index 0000000..97181b6 --- /dev/null +++ b/install-notes/015-initiales-postgresql-datenbankschema-und-migrationen.md @@ -0,0 +1,278 @@ +# 015 - Initiales PostgreSQL-Datenbankschema und Migrationen + +## Ziel + +Für RUVNOX Tactical wurde die erste PostgreSQL-Datenbankmigration angelegt und erfolgreich auf CT101 angewendet. + +## Umgebung + +- Tactical Server Container: RUVNOX-TACTICAL +- PostgreSQL Container: CT101 / PostgreSQL +- PostgreSQL IP: 192.168.178.4 +- Datenbank: ruvnox_tactical +- Datenbank-User: ruvnox_tactical +- Deploy-Repository: /opt/ruvnox/tactical/deploy-repo + +## Neue Dateien im tactical-deploy Repository + +database/migrations/001_initial_schema.sql + +scripts/apply-db-migrations.sh + +## Angelegte Tabellen + +Die Migration legt folgende Tabellen an: + +- app_users +- devices +- auth_sessions +- operation_rooms +- operation_room_members +- messages +- audit_events +- schema_migrations + +## Migration 001_initial_schema.sql + +Die Migration aktiviert pgcrypto: + +CREATE EXTENSION IF NOT EXISTS pgcrypto; + +pgcrypto wird für UUID-Erzeugung über gen_random_uuid() verwendet. + +## app_users + +Speichert Benutzerkonten. + +Wichtige Felder: + +- id +- username +- display_name +- role +- password_hash +- is_active +- created_at +- updated_at + +Erlaubte Rollen: + +- admin +- dispatcher +- operator +- viewer + +## devices + +Speichert registrierte Endgeräte. + +Wichtige Felder: + +- id +- user_id +- device_name +- platform +- public_key +- last_seen_at +- is_active +- created_at +- updated_at + +## auth_sessions + +Speichert Login- und Refresh-Sessions. + +Wichtige Felder: + +- id +- user_id +- device_id +- refresh_token_hash +- expires_at +- revoked_at +- created_at +- last_seen_at + +## operation_rooms + +Speichert Einsatzräume. + +Wichtige Felder: + +- id +- code +- name +- description +- classification +- is_active +- created_by +- created_at +- updated_at + +Erlaubte Klassifizierungen: + +- public +- internal +- confidential +- restricted + +## operation_room_members + +Speichert Raum-Mitgliedschaften. + +Wichtige Felder: + +- room_id +- user_id +- member_role +- joined_at +- left_at + +Erlaubte Rollen: + +- lead +- dispatcher +- member +- observer + +## messages + +Speichert Nachrichten-Metadaten und serverseitig lesbare Einsatzraum-Nachrichten. + +Wichtige Felder: + +- id +- room_id +- sender_user_id +- sender_device_id +- message_type +- content_text +- metadata +- created_at +- deleted_at + +Erlaubte Nachrichtentypen: + +- text +- system +- status +- file + +Hinweis: Diese Tabelle ist für Einsatzräume gedacht, bei denen der Server lesen und schreiben darf. Für echte 1:1-Ende-zu-Ende-verschlüsselte Nachrichten wird später eine separate Struktur ergänzt. + +## audit_events + +Speichert sicherheits- und betriebsrelevante Ereignisse. + +Wichtige Felder: + +- id +- actor_user_id +- event_type +- entity_type +- entity_id +- ip_address +- user_agent +- details +- created_at + +## schema_migrations + +Speichert angewendete Migrationen. + +Wichtige Felder: + +- version +- checksum +- applied_at + +Damit erkennt das Migrationsscript bereits angewendete Migrationen und schützt vor nachträglich veränderten SQL-Dateien. + +## Trigger + +Die Migration legt die Funktion set_updated_at() an. + +Diese aktualisiert updated_at automatisch bei Updates. + +Trigger wurden gesetzt auf: + +- app_users +- devices +- operation_rooms + +## Indizes + +Angelegt wurden Indizes für: + +- devices.user_id +- auth_sessions.user_id +- auth_sessions.device_id +- operation_room_members.user_id +- messages.room_id und messages.created_at +- messages.sender_user_id +- audit_events.actor_user_id +- audit_events.created_at +- audit_events.entity_type und audit_events.entity_id + +## Migrationsscript + +Das Script liegt unter: + +scripts/apply-db-migrations.sh + +Aufgaben: + +1. Lädt /opt/ruvnox/tactical/config/server.env +2. Setzt PGPASSWORD aus DB_PASSWORD +3. Erstellt schema_migrations falls nötig +4. Prüft Checksums bereits angewendeter Migrationen +5. Wendet neue SQL-Migrationen transaktional an +6. Bricht bei Checksum-Abweichungen ab + +Ausführung: + +cd /opt/ruvnox/tactical/deploy-repo +./scripts/apply-db-migrations.sh + +## Verifikation + +Tabellenprüfung: + +psql -h 192.168.178.4 -p 5432 -U ruvnox_tactical -d ruvnox_tactical -c "\\dt" + +Ergebnis: + +- app_users +- audit_events +- auth_sessions +- devices +- messages +- operation_room_members +- operation_rooms +- schema_migrations + +Migrationstabelle: + +select version, applied_at from schema_migrations order by applied_at; + +Ergebnis: + +001_initial_schema.sql wurde angewendet am 2026-06-14 06:41:04 UTC. + +## Git-Commit + +tactical-deploy: + +9e6d27e Add initial database schema migration + +## Abschlussstand + +- Migration erfolgreich angewendet +- 8 Tabellen vorhanden +- schema_migrations aktiv +- Migration im tactical-deploy Repository gepusht +- SQL-Datei visuell geprüft und sauber + +## Nächster Abschnitt + +Als nächstes folgt die serverseitige Datenbankzugriffsschicht im Ktor-Server.