Sito web per matrimoni completamente configurabile dal pannello admin. Deployabile su Netlify + Supabase.
- Netlify — hosting statico + serverless functions
- Supabase — database PostgreSQL + storage foto
- HTML/CSS/Vanilla JS — nessun framework, nessun build step
- JWT — autenticazione admin stateless via cookie
git clone <url-del-repo>
cd matrimonio-webnpm installServe anche la Netlify CLI:
npm install -g netlify-cli- Crea un progetto su supabase.com
- Vai su SQL Editor e incolla il contenuto di
supabase/schema.sql— crea tabelle, RLS, storage bucket e dati di default - Vai su Storage e verifica che il bucket
photosesista ed sia pubblico
cp .env.example .envCompila il file .env:
| Variabile | Descrizione |
|---|---|
SUPABASE_URL |
URL del progetto Supabase |
SUPABASE_SERVICE_ROLE_KEY |
Service role key (da Settings > API) |
ADMIN_USER |
Username admin (default: admin) |
ADMIN_PASS |
Password admin (default: admin) |
SESSION_SECRET |
Stringa segreta per firmare i JWT |
npm run devQuesto avvia netlify dev, che serve i file statici e le functions localmente.
- Sito pubblico: http://localhost:8888
- Pannello admin: http://localhost:8888/admin.html
Username: admin
Password: admin
La password puo' essere cambiata dal pannello admin (tab Impostazioni).
1. Crea un account su netlify.com
- New site > Import an existing project > seleziona il repo GitHub
- Netlify rileva automaticamente
netlify.toml
Vai in Site settings > Environment variables e aggiungi:
SUPABASE_URL = https://xxxxx.supabase.co
SUPABASE_SERVICE_ROLE_KEY = eyJhbG...
ADMIN_USER = admin
ADMIN_PASS = <la-tua-password>
SESSION_SECRET = <stringa-casuale-lunga>
Per generare un secret sicuro:
openssl rand -hex 32Netlify fa il deploy automaticamente ad ogni git push sul branch principale.
/
├── netlify.toml <- config Netlify (build + redirects API)
├── package.json
├── .env.example <- template variabili d'ambiente
├── supabase/
│ └── schema.sql <- schema PostgreSQL + seed dati
├── netlify/
│ └── functions/
│ ├── _shared/
│ │ ├── supabase.js <- client Supabase (service role)
│ │ └── auth.js <- JWT auth helper
│ ├── settings.js <- GET impostazioni
│ ├── guests.js <- CRUD invitati + RSVP
│ ├── guests-import.js <- import da matrimonio.com
│ ├── photos.js <- CRUD foto (Supabase Storage)
│ ├── timeline.js <- CRUD programma
│ ├── locations.js <- CRUD location
│ ├── admin-login.js <- login admin
│ ├── admin-logout.js <- logout admin
│ ├── admin-me.js <- check sessione
│ ├── admin-settings.js <- salva impostazioni
│ └── admin-password.js <- cambio password
└── public/
├── index.html <- sito frontend (single page)
└── admin.html <- pannello admin
Accessibile da /admin.html. Organizzato in 6 tab:
| Tab | Funzionalita' |
|---|---|
| Invitati | Aggiungi, importa CSV, esporta, conferma/elimina invitati |
| Testi | Modifica tutti i testi del sito (hero, storia, regalo, RSVP...) |
| Foto | Upload drag&drop, gestione hero, carousel on/off, riordina |
| Programma | Gestisci la timeline della giornata |
| Location | Aggiungi/modifica location con link Google Maps |
| Impostazioni | Cambia password, elimina tutti gli invitati |
Il formato CSV per importare invitati e':
Nome,Cognome
Mario,Rossi
Anna,BianchiLa prima riga (intestazione) viene ignorata.
Tutte le API sono sotto /api/. Le GET sono pubbliche, le POST/PATCH/DELETE richiedono autenticazione admin (JWT cookie).
| Metodo | Endpoint | Descrizione |
|---|---|---|
GET |
/api/settings |
Tutti i settings |
GET |
/api/guests |
Lista invitati |
PATCH |
/api/guests/:id |
Conferma RSVP (pubblico) |
GET |
/api/photos |
Lista foto |
GET |
/api/timeline |
Programma della giornata |
GET |
/api/locations |
Location |
POST |
/api/admin/login |
Login admin |
POST |
/api/admin/settings |
Salva impostazioni (protetto) |
POST |
/api/guests/import-matrimoniocom |
Import da matrimonio.com |
- Le foto sono salvate su Supabase Storage (bucket
photos, pubblico) - La password admin puo' essere cambiata dal pannello: viene salvata nel database e ha priorita' sulle variabili d'ambiente
- Il sito e' responsive e ottimizzato per mobile
- Non serve nessun volume o persistenza esterna: Supabase gestisce tutto