Deploy Sites Runtime + Wildcard *.sites.multiverbe.com · Setup Step-by-step

⚠️ Documento in parte superato (aggiornato 2026-05-21). Il dominio dei siti cliente non è più *.sites.multiverbe.com ma *.multiverbe.app (decisione 2026-05-13/18, migrazione completata il 2026-05-19, v18: rimossi i record DNS legacy di sites.multiverbe.com). I passaggi qui sotto vanno letti sostituendo mentalmente *.sites.multiverbe.com con *.multiverbe.app e il provider DNS con quello gestito da Vercel sul progetto multiverbe-sites. La procedura concettuale (deploy del runtime, wildcard, SSL automatico, verifica) resta valida. Conservato come riferimento storico e di metodo, secondo la regola "zero perdita di informazioni".

Stream C · Publish/Hosting · 2026-05-12 Status: codice + config + Edge Functions creati in worktree feat/publish-hosting. Deploy effettivo richiede azioni founder. Tempo founder stimato: ~20 min azione + ~30 min attesa DNS propagation.

Pattern derivato da deploy-bos-multiverbe-com-setup.md.


✅ File già creati da Claude (Stream C)

Path Scopo
sites-runtime/ Next.js 16 App Router · SSR/ISR · sezioni · cookie banner · Impressum · Schema.org
frontend/multiverbe-app/api/sites/publish.ts Edge Function: chiamata dal wizard Stream A on "Publish"
frontend/multiverbe-app/api/sites/check-slug.ts Edge Function: real-time slug availability check
scripts/setup-vercel-sites-runtime.ts Provisioning idempotent project Vercel + env vars via API
frontend/multiverbe-app/src/features/site-builder/PUBLISH_CONTRACT.md Contratto API + schema DB atteso da Stream A

🛠️ Azioni founder · 20 min + 30 min DNS

Step 1 · Provisioning Vercel project multiverbe-sites (3 min)

Prerequisite: VERCEL_API_TOKEN valido in D:\Desktop\Multiverbe\.env (già presente, prefisso vcp_*).

cd D:\Desktop\Multiverbe
npx tsx scripts/setup-vercel-sites-runtime.ts

Lo script:

  1. Crea progetto Vercel multiverbe-sites (framework nextjs, rootDirectory sites-runtime).
  2. Genera REVALIDATE_SECRET random 32 char.
  3. Imposta env vars production: SUPABASE_URL, SUPABASE_ANON_KEY, REVALIDATE_SECRET.
  4. Stampa a console: SITES_PROJECT_ID, SITES_RUNTIME_URL, SITES_REVALIDATE_SECRET.

Copia in D:\Desktop\Multiverbe\.env aggiungendo queste 3 nuove righe (mai in chat / mai in commit):

SITES_PROJECT_ID=prj_xxx
SITES_RUNTIME_URL=https://multiverbe-sites.vercel.app
SITES_REVALIDATE_SECRET=hex32...

E salva anche in 1Password vault "Multiverbe Production".

Lo script NON fa git-link (memoria project_vercel_git_author_email_verification.md: info@metaverbe.it non verificata su GH → git-trigger deploy può fallire).

  1. Vercel dashboard → project multiverbe-sites → Settings → Git
  2. Connect → seleziona metaverbe-hub/Multiverbe → branch master
  3. Production branch: master
  4. Build & Development Settings:
    • Framework Preset: Next.js
    • Root Directory: sites-runtime ⚠️ critico
    • Build/Install Command: default (auto-detect)
  5. Test push manuale: cd D:\Desktop\Multiverbe && vercel --prod --cwd sites-runtime (skip git, deploy locale)

Step 3 · Custom DNS wildcard *.sites.multiverbe.com (5 min)

3a. Register.it DNS

  1. Login register.it → dominio multiverbe.com → Gestione DNS
  2. Aggiungi record:
    • Type: CNAME
    • Nome: *.sites (wildcard di terzo livello sotto sites)
    • Valore: cname.vercel-dns.com
    • TTL: 3600 (default)
  3. Salva

⚠️ Se Register.it non accetta * come nome, prova *.sites.multiverbe.com. (con FQDN trailing dot).

3b. Vercel project domain

  1. Vercel dashboard → project multiverbe-sites → Settings → Domains
  2. Add → inserisci *.sites.multiverbe.com → Verify
  3. Aspetta Valid Configuration (anche 15-30 min)
  4. SSL Let's Encrypt auto-provisioned

Step 4 · Variabili dashboard sito (5 min)

Il dashboard multiverbe-app chiama Vercel Domains API e Sites Runtime revalidate. Vercel project multiverbe-app deve avere queste env vars production:

VERCEL_API_TOKEN=vcp_***                 (PAT esistente, già configurato)
SITES_PROJECT_ID=prj_xxx                 (output script Step 1)
SITES_RUNTIME_URL=https://multiverbe-sites.vercel.app
SITES_REVALIDATE_SECRET=hex32...         (output script Step 1)

Vercel dashboard → project multiverbe-app → Settings → Environment Variables → Production.

Step 5 · Test end-to-end (5 min + attesa DNS)

# DNS verify
dig CNAME demo-ristorante.sites.multiverbe.com +short
# atteso: cname.vercel-dns.com

# HTTPS verify
curl -I https://demo-ristorante.sites.multiverbe.com
# atteso: HTTP/2 200 (o 404 con SSL valid se mock non deployato)

# Lighthouse mobile
npx --yes lighthouse https://demo-ristorante.sites.multiverbe.com \
  --preset=mobile --view --quiet --chrome-flags="--headless"
# target: Performance ≥80, LCP <2.5s, CLS <0.1, INP <200ms

# On-demand revalidation
curl -X POST "https://multiverbe-sites.vercel.app/api/revalidate?slug=demo-ristorante&secret=$SITES_REVALIDATE_SECRET"
# atteso: { "ok": true, "revalidated": "demo-ristorante" }

# Schema.org rich-results-test
# Apri https://search.google.com/test/rich-results e incolla l'URL

📊 Cost estimate Stream C

Voce Tier Costo
Vercel project multiverbe-sites Hobby → Pro €0 → $20/mo (passare a Pro quando 1° cliente paga)
Wildcard SSL Let's Encrypt Included €0
sites.multiverbe.com subdomain esistente €0 (sottodominio di multiverbe.com già pagato)
DNS Register.it changes included €0
Total Stream C €0/mo Hobby, $20/mo Pro post-1°-cliente

🔐 Security checklist post-deploy

  • [ ] REVALIDATE_SECRET salvato in 1Password + .env (mai in git, mai in chat)
  • [ ] HTTPS attivo per wildcard (test ssllabs.com grade ≥A)
  • [ ] Security headers attivi: HSTS, X-Frame-Options SAMEORIGIN, X-Content-Type-Options nosniff, Referrer-Policy strict-origin-when-cross-origin, Permissions-Policy minimal (configurati in next.config.ts)
  • [ ] Cookie banner mostrato a primo visit
  • [ ] Impressum auto-gen per ogni sito (link in footer)
  • [ ] Privacy Policy auto-gen per ogni sito
  • [ ] Schema.org JSON-LD valido (rich-results-test green)
  • [ ] sitemap.xml accessible + indicizzato in Google Search Console
  • [ ] robots.txt blocca /api/
  • [ ] Reserved slug blacklist enforced (test: https://admin.sites.multiverbe.com → 404)

🚦 Verifica finale

  1. Pubblica mock site: lo script ha già configurato demo-ristorante come fixture.
  2. Apri https://demo-ristorante.sites.multiverbe.com → vedi La Trattoria Demo
  3. Apri https://demo-ristorante.sites.multiverbe.com/impressum → vedi Impressum CH
  4. Apri https://demo-ristorante.sites.multiverbe.com/privacy → vedi Privacy
  5. Lighthouse mobile: Performance ≥80 (target ≥90 finale)
  6. SSL Labs: grade ≥A
  7. Security Headers: grade ≥A (https://securityheaders.com)

📝 Note operative

  • Auto-deploy on push master: ogni cambio in sites-runtime/** triggera rebuild.
  • Manual deploy: cd sites-runtime && vercel --prod
  • Rollback: Vercel Dashboard → Deployments → versione precedente → Promote to Production
  • Preview deployments: ogni PR genera preview URL multiverbe-sites-<hash>.vercel.app
  • ISR: pagine cached, revalidate ogni 60s + on-demand via /api/revalidate

⚠️ Limiti noti (post-MVP, NON ora)

  • Custom domain cliente (es. ristorante.it → Multiverbe site): post 5 paganti
  • Multi-locale routing in URL (/it/, /de/): post-MVP, default IT solo
  • A/B testing on-site: post-MVP
  • Analytics on-site (Plausible/Posthog): post-MVP
  • Edge geo-routing: post-MVP

Owner: Gregorio (founder, esecuzione DNS + Vercel domain add) Codice: Claude Stream C 2026-05-12 (worktree feat/publish-hosting) Cross-reference: PUBLISH_CONTRACT.md (Stream A coordination), first-paying-customer-checklist.md sezione C