- Dateinamen nach Wabenhain-Schema (01-configmap, 02-secret, 03-storage, 04-postgres, 05-app-deployment, 06-ingress, 07-worker-cronjob, 08-networkpolicy); Secret-Vorlage als 02-secret.yaml.example, echte 02-secret.yaml gitignored. - Namespace: Pod Security "baseline" erzwungen, "restricted" als warn/audit. "restricted" kann den HTTP-01-Solver-Pod von cert-manager abweisen und damit die Zertifikatsausstellung blockieren. - NetworkPolicy nur noch fuer PostgreSQL; keine Policy vor der App (wie Wabenhain/ApiCore), da sie bei Traefik im Host-Netzwerk die Seite sperrt. - README: kompletter Neuaufbau inkl. Freigabe der Retain-PVs nach "kubectl delete namespace", Zertifikats-Diagnose. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
ARTISTA MODELCAMP 2027 – Buchungswebsite
Deutschsprachige Onepage mit echter Buchungsstrecke: Stripe-Zahlung (einmalig oder in bis zu drei Raten), persistente Bestell- und Gutscheinverwaltung, geschützter Adminbereich mit Zwei-Faktor-Anmeldung, Docker- und RKE2-Deployment.
Stand: technisch vollständig, im Stripe-Testmodus buchbar. Der Live-Verkauf ist serverseitig gesperrt, bis alle Inhalte und Freigaben aus docs/OFFENE-PUNKTE.md im Adminbereich bestätigt sind.
| Dokument | Inhalt |
|---|---|
| docs/ARCHITEKTUR.md | Entscheidungen: Stack, Preisbindung, Ratenzahlung, Kapazität, Webhooks, Design |
| docs/BETRIEB.md | RKE2-Deployment, Secrets, Stripe-Webhooks, E-Mail, Sicherung, Storno/Erstattung |
| docs/OFFENE-PUNKTE.md | Noch benötigte Inhalte und Freigaben |
| docs/TESTS.md | Ausgeführte Tests und verbleibende Einschränkungen |
Stack
TypeScript 5.9 (strict) · Next.js 16.3 (App Router, standalone) · React 19.3 · Tailwind CSS 4.3 · Motion 13 · PostgreSQL 18 · Prisma 7.10 (versionierte Migrationen) · Stripe 22 (Checkout + PaymentIntents) · Zod 4 · Better Auth 1.7 (Admin, TOTP) · Nodemailer 10 · Vitest 4 · Playwright 1.63. Versionen sind exakt fixiert, Lockdatei: pnpm-lock.yaml.
Lokal starten
Voraussetzungen: Node.js 22+, pnpm 12. Docker ist optional.
pnpm install
cp .env.example .env # APP_SECRET, BETTER_AUTH_SECRET setzen, Stripe-Testschlüssel eintragen
pnpm db:dev # eingebettetes PostgreSQL (eigenes Terminal) – oder: docker compose up -d db mailpit
pnpm db:deploy # Migrationen anwenden
pnpm db:seed # nur Entwicklung: Early Bird simuliert, Test-Anreisetag, Gutschein TEST-STAMMMODEL
pnpm admin:create --email [email protected] --name "Dein Name"
pnpm dev # http://localhost:3000, Verwaltung unter /admin
Stripe-Testbuchung mit Webhooks lokal:
stripe listen --forward-to localhost:3000/api/stripe/webhook # gibt das whsec_… für STRIPE_WEBHOOK_SECRET aus
pnpm worker # Reservierungen, Raten, E-Mails (im Cluster: CronJob)
Testkarte 4242 4242 4242 4242, für 3-D-Secure-Fälle 4000 0027 6000 3184. E-Mails landen mit MAIL_TRANSPORT=file als .eml in .mail-outbox/ (oder in Mailpit unter http://localhost:8025).
Befehle
| Befehl | Zweck |
|---|---|
pnpm dev / pnpm build / pnpm start |
Entwicklung, Produktionsbuild, Produktionsserver |
pnpm typecheck / pnpm lint |
Typprüfung, ESLint |
pnpm test |
Unit- und Integrationstests (startet eine eigene PostgreSQL-Instanz) |
pnpm test:e2e |
Playwright: Smartphone, Tablet, Desktop, axe-Barrierefreiheit (gegen laufenden Server) |
pnpm db:migrate / pnpm db:deploy |
Migration erstellen / anwenden |
pnpm worker |
Einmaliger Worker-Lauf |
pnpm admin:create |
Admin-Konto anlegen (kein Standardpasswort) |
Wo was gepflegt wird
- Texte, Bilder, Dozentinnen, Videos, FAQ-Grundlagen: src/content/site.ts. Einträge mit
confirmed: falsegelten als Entwurf. - Termin, Ort, Zimmerbeschreibung, Veranstalter, Steuerhinweis, Bedingungen, Kapazität, Freigaben: Adminbereich → „Einstellungen und Freigaben“.
- Preise und Preisphasen: fest in src/lib/pricing.ts, weil sie verbindlich vorgegeben sind.
- Gutscheine (Stammmodel-Codes): Adminbereich → „Gutscheine“.
- Medien: Dateien ins Medienverzeichnis (
MEDIA_DIR) legen und insite.tsals{ kind: "image", src: "/media/…" }eintragen.