-- Körs som RDS master-användare EN gång (spec §52). -- Separat databas + användare med minsta möjliga privilegier. -- Ingen delning av andras tabeller. CREATE DATABASE app; -- byt namn per varumärke (brand.config.json slug) -- Byt ut lösenordet mot ett genererat värde från Secrets Manager! CREATE USER app_user WITH PASSWORD 'CHANGE_ME_FROM_SECRETS_MANAGER'; -- Anslut till den nya databasen och kör: \connect app -- Sök-extensions (i18n M7): skapas av master – appanvändaren saknar rättighet. CREATE EXTENSION IF NOT EXISTS unaccent; CREATE EXTENSION IF NOT EXISTS pg_trgm; -- Låst schema: appanvändaren äger public-schemat i sin egen databas GRANT CONNECT ON DATABASE app TO app_user; GRANT USAGE, CREATE ON SCHEMA public TO app_user; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO app_user; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT USAGE, SELECT ON SEQUENCES TO app_user; -- Ingen superuser, ingen replication, ingen åtkomst till andra databaser: REVOKE ALL ON DATABASE postgres FROM app_user; -- Migrationer körs av samma användare (CREATE på schemat räcker för drizzle). -- Vid senare utbrytning till egen RDS: pg_dump/pg_restore enligt docs/infrastruktur.md.