Alle PlaybooksBooking Platform

In Produktion bringen

Die Buchungsplattform mit Vercel, Supabase, Stripe-Webhooks, dem Wartungs-Cron und transaktionalen E-Mails online bringen.

Wann du es brauchst

Das Produkt läuft lokal und braucht seine erste Produktionsumgebung. Die Schritte gehen von Vercel als Hosting aus; jeder Node.js-Host funktioniert, der den Cron-Endpunkt aufrufen kann.

Regeln, die gelten bleiben

  • SUPABASE_SERVICE_ROLE_KEY, STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET und CRON_SECRET bleiben serverseitig: nie mit NEXT_PUBLIC_-Präfix und nie mit Werten im Repository.
  • supabase/seed.sql enthält Demodaten: niemals in Produktion ausführen.
  • Eine Zahlung wird nur durch den signierten Stripe-Webhook bestätigt.

Schritte

  1. Datenbank. Lege das Supabase-Produktionsprojekt an und wende die Migrationen der Reihe nach an: supabase link --project-ref <ref> und supabase db push.
  2. Auth. Setze in Supabase unter Authentication → URL Configuration die Site URL und die Redirect-URLs auf die Produktionsdomain.
  3. Hosting. Importiere das Repository in Vercel und übernimm alle Variablen aus .env.example:
    • NEXT_PUBLIC_APP_URL ist die öffentliche Domain, ohne abschließenden Schrägstrich;
    • CRON_SECRET ist ein langer Zufallswert, zum Beispiel aus openssl rand -hex 32.
  4. Stripe. Lege einen Webhook-Endpunkt auf https://<domain>/api/stripe/webhook mit den Events checkout.session.completed, checkout.session.async_payment_succeeded, checkout.session.expired und charge.refunded an. Kopiere das Signing Secret nach STRIPE_WEBHOOK_SECRET und deploye erneut. Nutze zuerst Testschlüssel und wechsle erst nach den Prüfungen unten zu Live-Schlüsseln.
  5. Cron. GET /api/cron muss alle 5–15 Minuten mit Authorization: Bearer $CRON_SECRET laufen. Auf Vercel ergänzt du eine vercel.json:
    { "crons": [{ "path": "/api/cron", "schedule": "*/10 * * * *" }] }
    
    Vercel sendet den Header automatisch, wenn CRON_SECRET gesetzt ist. Intervalle unter einem Tag erfordern den Pro-Plan; alternativ pg_cron mit pg_net auf Supabase.
  6. E-Mail. Verifiziere die Absenderdomain bei Resend und setze RESEND_API_KEY und EMAIL_FROM. Ohne sie werden Benachrichtigungen nur protokolliert.
  7. Erster Admin. Registriere dich unter /register und befördere den Nutzer im SQL-Editor von Supabase: update public.profiles set role = 'admin' where id = '<user uuid>';

Prüfungen nach dem Deploy

  • curl -i https://<domain>/api/cron ohne Header antwortet mit 401.
  • Eine bezahlte Testbuchung bleibt pending_payment, bis der Webhook sie bestätigt, und Stripe zeigt die Webhook-Zustellung als erfolgreich an.
  • Wird diese Buchung storniert, folgt die Erstattung der Policy des Service.

Fertig, wenn

  • die Prüfbefehle lokal erfolgreich laufen;
  • die drei Prüfungen oben auf der Produktionsdomain bestehen;
  • kein Secret im Repository oder in Client-Bundles auftaucht.