-- +goose Up -- +goose StatementBegin -- Phase 2 Domain-Settings: -- * rate_limit_rps — Requests pro Sekunde Cap je Client-IP (0 = aus). -- HAProxy implementiert das via per-Domain Stick-Table (siehe -- internal/haproxy/haproxy.cfg.tpl). -- * max_body_kb — max. Request-Body-Größe in KiB (0 = aus). -- HAProxy verweigert größere Requests mit 413. -- * domain_response_headers — beliebige Set-Header Pairs die je -- Domain auf jede Response gesetzt werden (CORS, CSP, X-Frame- -- Options, …). HAProxy rendert pro Eintrag einen `http-response -- set-header` mit Host-ACL. ALTER TABLE domains ADD COLUMN IF NOT EXISTS rate_limit_rps INTEGER NOT NULL DEFAULT 0, ADD COLUMN IF NOT EXISTS max_body_kb INTEGER NOT NULL DEFAULT 0; ALTER TABLE domains DROP CONSTRAINT IF EXISTS domains_rate_limit_rps_check; ALTER TABLE domains ADD CONSTRAINT domains_rate_limit_rps_check CHECK (rate_limit_rps >= 0); ALTER TABLE domains DROP CONSTRAINT IF EXISTS domains_max_body_kb_check; ALTER TABLE domains ADD CONSTRAINT domains_max_body_kb_check CHECK (max_body_kb >= 0); CREATE TABLE IF NOT EXISTS domain_response_headers ( id BIGSERIAL PRIMARY KEY, domain_id BIGINT NOT NULL REFERENCES domains(id) ON DELETE CASCADE, name TEXT NOT NULL, value TEXT NOT NULL, position INTEGER NOT NULL DEFAULT 0, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); -- ein Header-Name darf pro Domain nur einmal auftauchen (case-insensitive, -- HTTP-Header sind per RFC nicht case-sensitive). Verhindert dass zwei -- konkurrierende Werte für "X-Frame-Options" gesetzt werden. CREATE UNIQUE INDEX IF NOT EXISTS uq_drh_domain_name_ci ON domain_response_headers (domain_id, lower(name)); CREATE INDEX IF NOT EXISTS idx_drh_domain ON domain_response_headers (domain_id, position); -- +goose StatementEnd -- +goose Down -- +goose StatementBegin DROP TABLE IF EXISTS domain_response_headers; ALTER TABLE domains DROP CONSTRAINT IF EXISTS domains_max_body_kb_check; ALTER TABLE domains DROP CONSTRAINT IF EXISTS domains_rate_limit_rps_check; ALTER TABLE domains DROP COLUMN IF EXISTS max_body_kb, DROP COLUMN IF EXISTS rate_limit_rps; -- +goose StatementEnd