Risolve i conflitti su codice-etico mantenendo traduzioni EN/TH, companyConfig e link agli allegati. Co-authored-by: Cursor <cursoragent@cursor.com>
NexStudio Website Runbook
Sito istituzionale NexStudio basato su Astro, con deploy su Cloudflare e form contatti protetto da Turnstile.
Obiettivo del repository
- Presentazione aziendale e servizi (homepage e pagine legali).
- Entry point unico per richieste commerciali e supporto.
- Base pronta per contenuti multilingua IT/EN/TH.
- Pipeline di deploy stabile su Cloudflare.
Stack tecnico
- Astro + Tailwind CSS
- Adapter Cloudflare (
@astrojs/cloudflare) - Sitemap (
@astrojs/sitemap) - Form backend su endpoint
/api/contact - Turnstile + Cloudflare Email Service per anti-spam e invio email
Struttura essenziale
src/pages/: pagine pubbliche e route API (src/pages/api/contact.ts)src/components/: componenti UI condivisisrc/data/: contenuti testuali e configurazioni paginepublic/: asset statici (loghi, immagini, robots).env.example: variabili locali di riferimento
Prerequisiti
- Node.js 20+
- npm 10+
- Account Cloudflare (Workers + Turnstile + Email Service con dominio onboardato, es.
nexstudio.ai)
Avvio locale
- Installazione dipendenze:
npm install
- Copia variabili di ambiente:
- copia
.env.examplein.env
- copia
- Avvio sviluppo:
npm run dev
- Se Vite resta in cache incoerente:
npm run dev:fresh
Comandi utili
npm run dev: sviluppo localenpm run dev:fresh: reset cache.vitee.astro+ avvio dev servernpm run build: build produzionenpm run preview: preview locale della buildnpm run deploy:cf: build + deploy con wrangler su output Astro
Configurazione contatti
Variabili pubbliche (frontend):
PUBLIC_CONTACT_FORM_ACTION_URL(default consigliato:/api/contact)PUBLIC_CONTACT_FORM_SUCCESS_REDIRECT(URL assoluto della pagina post-submit)PUBLIC_CONTACT_FORM_MAILTO(fallback se action URL non disponibile)PUBLIC_CONTACT_TURNSTILE_SITE_KEY
Variabili server (Cloudflare/local):
CONTACT_FORM_MODE(devoppurelive)CONTACT_FORM_FROM_EMAIL(consigliato:no-reply@nexstudio.ai, dominio verificato su Email Service)CONTACT_FORM_TO_EMAIL(casella reale dove ricevi, es. Gmail; evita indirizzi solo Email Routing se DMARC èp=reject)CONTACT_FORM_TO_EMAIL_INFO(opzionale, override esplicito per area "info")CONTACT_FORM_TO_EMAIL_PRIVACYCONTACT_FORM_TO_EMAIL_CAREERSCONTACT_TURNSTILE_SECRET_KEY
Comportamento:
dev: accetta submit e scrive payload nei log (senza invio reale)live: valida Turnstile e invia email via bindingEMAIL(Cloudflare Email Service)
Routing pubblico consigliato (portale vetrina):
info: informazioni generali/commercialiprivacy: richieste privacy e diritti interessatocareers: candidature e collaborazioni
Indirizzi consigliati portale:
info@nexstudio.aiprivacy@nexstudio.aicareers@nexstudio.aino-reply@nexstudio.ai(solo invio comunicazioni/newsletter, non destinazione inbound)
Configurazione newsletter
Sistema custom su Cloudflare D1 + Cloudflare Email Service (double opt-in).
Prerequisito: dominio (es. nexstudio.ai) onboardato in Email Service con SPF/DKIM, e binding send_email → EMAIL nel Worker.
Variabili server:
NEWSLETTER_MODE(devoppurelive; se assente usaCONTACT_FORM_MODE)NEWSLETTER_FROM_EMAIL(fallback:CONTACT_FORM_FROM_EMAIL, consigliatono-reply@nexstudio.ai)NEWSLETTER_NOTIFY_TO_EMAIL(notifiche admin; fallback:CONTACT_FORM_TO_EMAIL)NEWSLETTER_ADMIN_TOKEN(Bearer token per endpoint admin)NEWSLETTER_TURNSTILE_SECRET_KEY(opzionale; fallback:CONTACT_TURNSTILE_SECRET_KEY)PUBLIC_SITE_URL(origine usata nei link di conferma/disiscrizione)
Endpoint pubblici:
POST /api/newsletter/subscribe— iscrizione (form footer)GET /api/newsletter/confirm?token=…— conferma double opt-inGET|POST /api/newsletter/unsubscribe?token=…— disiscrizione
Endpoint admin (header Authorization: Bearer <NEWSLETTER_ADMIN_TOKEN>):
GET /api/newsletter/admin/subscribers?status=active|pending|unsubscribedPOST /api/newsletter/admin/send— body JSON{ "subject", "text", "html?", "dryRun?" }
Nota: Email Service è pensato per email transazionali (conferme, contatti, notifiche). Le campagne marketing di massa non sono ancora il target ufficiale del servizio.
Database:
- D1
nexstudio-newsletter(bindingNEWSLETTER_DB) - Migrazioni in
migrations/ npm run db:migrate:local/npm run db:migrate:remote
Comportamento:
dev: accetta submit e logga (senza D1/Email obbligatori)live: scrive su D1, invia email di conferma via Cloudflare Email Service, richiede binding D1 + EMAIL
Deploy Cloudflare
Impostazioni consigliate:
- Build command:
npm run build - Deploy command:
npm run deploy:cf
Questa configurazione evita errori tipo:
The entry-point file at "@astrojs/cloudflare/entrypoints/server" was not found.
Dominio e sicurezza
- Dominio ufficiale:
https://nexstudio.ai - Hostname Turnstile da mantenere allineati:
nexstudio.aiwww.nexstudio.ai(se usato)localhost(test locale)
- Accesso pre-go-live gestito con Cloudflare Zero Trust Access
Stato operativo attuale
- Issue #1 (contact form live): implementata
- Issue #2 (anti-spam Turnstile): implementata
- Issue #3 (SEO base): implementata (sitemap, robots, canonical/OG/Twitter)
- Issue #4: in avanzamento (contenuti non placeholder)
- Issue #5: da completare (localizzazione reale IT/EN/TH)
Note operative
- Per modifiche non minori usare branch dedicato (
feat/*,fix/*) e merge sumaindopo verifica. - Evitare commit su
mainper attivita complesse. - Rigenerare eventuali API key esposte e aggiornare subito i secret su Cloudflare.