Nick Szaunig 9785eb221f
Docker-Images bauen und veroeffentlichen / lint (push) Successful in 1m15s
Docker-Images bauen und veroeffentlichen / typecheck (push) Successful in 1m20s
Docker-Images bauen und veroeffentlichen / test (push) Successful in 1m19s
Docker-Images bauen und veroeffentlichen / build-and-push (push) Failing after 1m14s
fix(auth): Anmeldung unter Node 24 (Proxy um NextRequest)
Next reicht Route-Handlern einen Proxy um NextRequest. undici 7 (Node 24)
prueft private Felder (#state), die ein Proxy nicht besitzt; new Request(request)
warf "Cannot read private member #state" und jede /api/auth-Anfrage endete
lokal mit 500. Produktion (Node 22, undici 6) war nicht betroffen.

withClientIp baut die Anfrage jetzt aus URL, Methode, Headern und Body neu.
Regressionstest mit einem Proxy wie in Next.
2026-10-15 05:10:51 +02:00
2026-09-27 06:06:56 +02:00
2026-09-27 06:06:56 +02:00
2026-09-27 06:06:56 +02:00
2026-09-27 06:06:56 +02:00
2026-09-27 06:06:56 +02:00
2026-09-27 06:06:56 +02:00
2026-09-27 06:06:56 +02:00
2026-09-27 06:06:56 +02:00

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-Abgleich, 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, Tagesablauf, Team, Reels, FAQ-Grundlagen: src/content/site.ts. Einträge mit confirmed: false gelten 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“.
  • Feste Bilder: public/images/unterkunft/ (Villa, aus dem Booking.com-Eintrag, Nutzung vom Auftraggeber freigegeben).
  • Logo, Headerbild, Porträts, Reels: feste Dateinamen im Medienverzeichnis, werden automatisch erkannt. Liste: docs/MEDIEN.md.
  • Widerrufsbelehrung: Adminbereich → Einstellungen, erscheint unter /widerruf.
  • Weitere Medien: Dateien ins Medienverzeichnis (MEDIA_DIR) legen und in site.ts als { kind: "image", src: "/media/…" } eintragen.
Languages
TypeScript 93.8%
PLpgSQL 3.4%
CSS 1.3%
Dockerfile 0.6%
Shell 0.5%
Other 0.4%