Docker Compose with 24+ services: - PostgreSQL (PostGIS), Valkey, MinIO, Qdrant - Vault (PKI/TLS), Nginx (Reverse Proxy) - Backend Core API, Consent Service, Billing Service - RAG Service, Embedding Service - Gitea, Woodpecker CI/CD - Night Scheduler, Health Aggregator - Jitsi (Web/XMPP/JVB/Jicofo), Mailpit Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
136 lines
7.6 KiB
SQL
136 lines
7.6 KiB
SQL
-- BreakPilot Schema-Separation
|
|
-- Erstellt 3 getrennte Schemas für Core, Lehrer und Compliance
|
|
-- Wird beim ersten Start von postgres ausgeführt
|
|
|
|
-- Schemas erstellen
|
|
CREATE SCHEMA IF NOT EXISTS core;
|
|
CREATE SCHEMA IF NOT EXISTS lehrer;
|
|
CREATE SCHEMA IF NOT EXISTS compliance;
|
|
|
|
-- Berechtigungen für breakpilot User
|
|
GRANT ALL ON SCHEMA core TO breakpilot;
|
|
GRANT ALL ON SCHEMA lehrer TO breakpilot;
|
|
GRANT ALL ON SCHEMA compliance TO breakpilot;
|
|
|
|
-- Default search_path für den breakpilot User
|
|
ALTER ROLE breakpilot SET search_path TO public, core, lehrer, compliance;
|
|
|
|
-- =============================================
|
|
-- TABELLEN-MIGRATION: public -> core Schema
|
|
-- =============================================
|
|
-- Hinweis: Wird nur ausgeführt wenn Tabellen in public existieren
|
|
-- Bei Neuinstallation werden Tabellen direkt im richtigen Schema erstellt
|
|
|
|
DO $$
|
|
BEGIN
|
|
-- Core-Tabellen verschieben (falls vorhanden)
|
|
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'users') THEN
|
|
ALTER TABLE public.users SET SCHEMA core;
|
|
END IF;
|
|
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'sessions') THEN
|
|
ALTER TABLE public.sessions SET SCHEMA core;
|
|
END IF;
|
|
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'consent_records') THEN
|
|
ALTER TABLE public.consent_records SET SCHEMA core;
|
|
END IF;
|
|
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'notifications') THEN
|
|
ALTER TABLE public.notifications SET SCHEMA core;
|
|
END IF;
|
|
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'email_templates') THEN
|
|
ALTER TABLE public.email_templates SET SCHEMA core;
|
|
END IF;
|
|
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'billing_customers') THEN
|
|
ALTER TABLE public.billing_customers SET SCHEMA core;
|
|
END IF;
|
|
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'billing_subscriptions') THEN
|
|
ALTER TABLE public.billing_subscriptions SET SCHEMA core;
|
|
END IF;
|
|
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'billing_invoices') THEN
|
|
ALTER TABLE public.billing_invoices SET SCHEMA core;
|
|
END IF;
|
|
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'rbac_roles') THEN
|
|
ALTER TABLE public.rbac_roles SET SCHEMA core;
|
|
END IF;
|
|
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'rbac_permissions') THEN
|
|
ALTER TABLE public.rbac_permissions SET SCHEMA core;
|
|
END IF;
|
|
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'rbac_role_permissions') THEN
|
|
ALTER TABLE public.rbac_role_permissions SET SCHEMA core;
|
|
END IF;
|
|
|
|
-- Lehrer-Tabellen verschieben (falls vorhanden)
|
|
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'classrooms') THEN
|
|
ALTER TABLE public.classrooms SET SCHEMA lehrer;
|
|
END IF;
|
|
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'learning_units') THEN
|
|
ALTER TABLE public.learning_units SET SCHEMA lehrer;
|
|
END IF;
|
|
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'klausuren') THEN
|
|
ALTER TABLE public.klausuren SET SCHEMA lehrer;
|
|
END IF;
|
|
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'corrections') THEN
|
|
ALTER TABLE public.corrections SET SCHEMA lehrer;
|
|
END IF;
|
|
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'worksheets') THEN
|
|
ALTER TABLE public.worksheets SET SCHEMA lehrer;
|
|
END IF;
|
|
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'certificates') THEN
|
|
ALTER TABLE public.certificates SET SCHEMA lehrer;
|
|
END IF;
|
|
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'letters') THEN
|
|
ALTER TABLE public.letters SET SCHEMA lehrer;
|
|
END IF;
|
|
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'meetings') THEN
|
|
ALTER TABLE public.meetings SET SCHEMA lehrer;
|
|
END IF;
|
|
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'messenger_contacts') THEN
|
|
ALTER TABLE public.messenger_contacts SET SCHEMA lehrer;
|
|
END IF;
|
|
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'messenger_conversations') THEN
|
|
ALTER TABLE public.messenger_conversations SET SCHEMA lehrer;
|
|
END IF;
|
|
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'messenger_messages') THEN
|
|
ALTER TABLE public.messenger_messages SET SCHEMA lehrer;
|
|
END IF;
|
|
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'vocab_sessions') THEN
|
|
ALTER TABLE public.vocab_sessions SET SCHEMA lehrer;
|
|
END IF;
|
|
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'game_sessions') THEN
|
|
ALTER TABLE public.game_sessions SET SCHEMA lehrer;
|
|
END IF;
|
|
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'game_scores') THEN
|
|
ALTER TABLE public.game_scores SET SCHEMA lehrer;
|
|
END IF;
|
|
|
|
-- Compliance-Tabellen verschieben (falls vorhanden)
|
|
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'compliance_risks') THEN
|
|
ALTER TABLE public.compliance_risks SET SCHEMA compliance;
|
|
END IF;
|
|
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'compliance_controls') THEN
|
|
ALTER TABLE public.compliance_controls SET SCHEMA compliance;
|
|
END IF;
|
|
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'compliance_requirements') THEN
|
|
ALTER TABLE public.compliance_requirements SET SCHEMA compliance;
|
|
END IF;
|
|
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'compliance_evidence') THEN
|
|
ALTER TABLE public.compliance_evidence SET SCHEMA compliance;
|
|
END IF;
|
|
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'dsr_requests') THEN
|
|
ALTER TABLE public.dsr_requests SET SCHEMA compliance;
|
|
END IF;
|
|
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'sdk_tenants') THEN
|
|
ALTER TABLE public.sdk_tenants SET SCHEMA compliance;
|
|
END IF;
|
|
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'sdk_audit_logs') THEN
|
|
ALTER TABLE public.sdk_audit_logs SET SCHEMA compliance;
|
|
END IF;
|
|
|
|
RAISE NOTICE 'Schema migration complete.';
|
|
END $$;
|
|
|
|
-- Cross-Schema Views für häufige Lookups
|
|
CREATE OR REPLACE VIEW compliance.v_users AS SELECT * FROM core.users;
|
|
CREATE OR REPLACE VIEW lehrer.v_users AS SELECT * FROM core.users;
|
|
CREATE OR REPLACE VIEW lehrer.v_consent_records AS SELECT * FROM core.consent_records;
|
|
CREATE OR REPLACE VIEW compliance.v_consent_records AS SELECT * FROM core.consent_records;
|