INSTALL.md dækker hele vejen fra en frisk server til en kørende
løsning: forudsætninger, database, .env, migrations, admin-UI-build,
en systemd-unit til backend'en, domæne-/reverse proxy-krav (holdt
værktøjs-uafhængigt, med en kort CloudPanel-note), DNS, Postal-webhook,
rute-opsætning, verifikation og fremtidige opdateringer.
scripts/create_admin_user.py lukker en reel mangel: der findes ingen
selvbetjenings-registrering, så uden en bruger i databasen kan ingen
logge ind på en frisk installation. Scriptet opretter (eller genbruger)
en organisation + rute, samt en ny superadmin-bruger med korrekt
hashet adgangskode — samme mønster som det eksisterende
scripts/import_participants.py. Verificeret i en isoleret test
(oprettet bruger kunne logge ind via POST /auth/login), testdata
ryddet op igen.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Scaffolder admin-ui/ (Vite + React + TypeScript, almindelig CSS) med
en minimal login-side (POST /auth/login + GET /auth/me) der beviser
hele kæden virker. Vites build skriver direkte til app/admin_dist/.
Admin-UI'et serveres af samme FastAPI-app som API'et og den
offentlige side, men på sit eget dedikerede domæne (ADMIN_DOMAIN,
default admin.localhost) via en ny AdminDomainDispatch-middleware
(app/admin_site.py) der genbruger Host-header-teknikken fra 8b: den
offentlige side ejer allerede roden "/" domæneopløst, så admin-UI'et
kan ikke dele det domæne uden at kollidere. Samme trick undgår CORS
helt, da admin-UI'ets fetch-kald går til samme origin. API-kald
(/auth, /participants, ...) passerer uændret gennem til det
almindelige API uanset domæne; alt andet på admin-domænet serveres
fra den byggede SPA med index.html-fallback for client-side routing.
Et sikkerhedsnet deaktiverer dispatch'en stille hvis admin_dist/
mangler (frisk clone uden frontend-build), i stedet for at crashe
hele appen.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Config-driven DATABASE_URL shared by the app and Alembic's env.py
(fixes v1's config drift), psycopg3 driver, auto-discovering
app/models package for SQLModel.metadata, and a /health endpoint
that exercises the DB dependency end-to-end.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>