Tutti i playbookBooking Platform

Andare in produzione

Metti online la piattaforma di prenotazione con Vercel, Supabase, webhook Stripe, il cron di manutenzione e le email transazionali.

Quando usarlo

Il prodotto funziona in locale e serve il primo ambiente di produzione. I passi usano Vercel per l'hosting; va bene qualunque host Node.js in grado di chiamare l'endpoint del cron.

Regole da rispettare

  • SUPABASE_SERVICE_ROLE_KEY, STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET e CRON_SECRET restano solo lato server: mai con prefisso NEXT_PUBLIC_ e mai con valori nel repository.
  • supabase/seed.sql contiene dati demo: non eseguirlo mai in produzione.
  • Un pagamento è confermato solo dal webhook Stripe firmato.

Passi

  1. Database. Crea il progetto Supabase di produzione e applica le migration in ordine: supabase link --project-ref <ref> e supabase db push.
  2. Auth. In Supabase, in Authentication → URL Configuration, imposta Site URL e redirect URL sul dominio di produzione.
  3. Hosting. Importa il repository in Vercel e copia tutte le variabili di .env.example:
    • NEXT_PUBLIC_APP_URL è il dominio pubblico, senza barra finale;
    • CRON_SECRET è un valore casuale lungo, per esempio da openssl rand -hex 32.
  4. Stripe. Crea un endpoint webhook verso https://<dominio>/api/stripe/webhook con gli eventi checkout.session.completed, checkout.session.async_payment_succeeded, checkout.session.expired e charge.refunded. Copia il signing secret in STRIPE_WEBHOOK_SECRET e rifai il deploy. Usa prima le chiavi di test e passa a quelle live solo dopo i controlli qui sotto.
  5. Cron. GET /api/cron deve girare ogni 5-15 minuti con Authorization: Bearer $CRON_SECRET. Su Vercel aggiungi un vercel.json:
    { "crons": [{ "path": "/api/cron", "schedule": "*/10 * * * *" }] }
    
    Vercel invia l'header in automatico quando CRON_SECRET è impostato. Gli intervalli inferiori al giorno richiedono il piano Pro; in alternativa usa pg_cron con pg_net su Supabase.
  6. Email. Verifica il dominio di invio su Resend e imposta RESEND_API_KEY ed EMAIL_FROM. Senza, le notifiche vengono solo registrate nei log.
  7. Primo admin. Registrati da /register e promuovi l'utente dall'SQL editor di Supabase: update public.profiles set role = 'admin' where id = '<uuid utente>';

Controlli dopo il deploy

  • curl -i https://<dominio>/api/cron senza header risponde 401.
  • Una prenotazione di prova a pagamento resta pending_payment finché il webhook non la conferma, e Stripe mostra la consegna del webhook riuscita.
  • Annullando quella prenotazione il rimborso segue la policy del servizio.

Completato quando

  • i comandi di verifica passano in locale;
  • i tre controlli qui sopra passano sul dominio di produzione;
  • nessun segreto compare nel repository o nei bundle client.