Dal brief al sito online in 45 minuti.
Stack chiavi-in-mano per siti WordPress: Docker, Caddy, GCP, deploy automatico, Cloudflare, GDPR, accessibilità, performance — già configurati.
Costruire un sito WordPress production-ready oggi richiede 1-2 settimane di setup ripetitivo: hosting, certificati, hardening, cache, GDPR, accessibilità, monitoring, deploy, backup. Ogni progetto re-inventa la ruota. Lo stack inverte la prospettiva: tutto il frame infrastrutturale è pre-costruito, riusabile, versionato. Il progetto cliente eredita la baseline al primo clone.
./scripts/restore.sh./scripts/offboard.sh (cleanup VM/IP/bucket/secrets)Stack container-based su una singola VM Google Cloud (e2-small Milano). Caddy fa SSL automatico e reverse-proxy; WordPress gira come PHP-FPM con OPcache; MariaDB persiste il DB; Redis è object-cache. Un container backup dumppa nightly su Google Cloud Storage. Cloudflare opzionale davanti.
Lo stack è separato in repo dedicati per versioning indipendente e distribuzione modulare. Il template "stack" è quello da cui parti per ogni nuovo cliente; i plugin si scaricano automaticamente dalle release ZIP via plugins/manifest.yml.
Repository GitHub Template da cui parte ogni nuovo progetto cliente. Contiene Docker, Caddy, scripts di provisioning, deploy GitHub Actions, manifest dei plugin, skill Claude.
Block theme FSE con design tokens placeholder, performance baseline (critical CSS, lazy, defer, font self-host), PWA + SW, OG dinamica, Schema.org JSON-LD, health endpoint, WCAG AA.
Compliance & Consent Management standalone. Banner GDPR/CCPA/LGPD, Google Consent Mode v2, Records of Consent, RoPA art.30, DSAR, Data Breach art.33-34, Cookie Scanner, Document Versioning, Script Blocker.
Hardening generico WP: anti user enumeration (REST + ?author=N), XML-RPC disabilitato, security headers HTTP, login error generico. Zero dipendenze, attivo "always-on".
Mappe interattive Leaflet + Carto + OpenStreetMap senza API key. Multi-marker, geocoding Nominatim cachato, popup card 18 campi, polyline+numbered markers, cluster, schema.org auto.
Tour guidato wp-admin per editor finali. Pointer.js WP-native (no deps), 7 step default (Articoli, Pagine, Media, Aspetto, menu Justbit, Profilo). Estendibile via filter, auto-launch al primo login.
Widget di salute del sito in wp-admin dashboard. 8 check colorati: SSL, backup, performance (Lighthouse), GDPR, health endpoint, plugin Justbit attivi, WP core, PHP version.
Dal "ehi mi serve un sito" al "sito online con HTTPS, CDN, backup, monitoring, accessibilità WCAG AA, PSI 95+, GDPR-compliant". Sei comandi, niente lavoro manuale ripetuto.
Su GitHub: "Use this template" sul repo justbit/justbitwp-stack → crea repo cliente (es. justbit/visit-vasto).
gh repo create justbit/visit-vasto \
--template justbit/justbitwp-stack \
--private --clone
Chiede slug, brand, dominio, email admin, repo. Scrive .env con tutte le var (DB random, admin random). Scarica lo starter theme. Sostituisce README.md col project-specific.
./scripts/bootstrap-new-project.sh
Avvia lo stack Docker in locale. Bootstrap installa plugin Justbit dal manifest, attiva il tema, configura permalinks, fuso, lingua.
make up && make bootstrap
# → http://localhost:8080
Apri Claude Code nel progetto. Lo skill figma-to-theme legge il Figma del cliente (color/text/spacing styles) e genera theme.json + block patterns PHP. Fallback su screenshot reading se il Figma non ha un design system formale.
make figma-to-theme \
FIGMA=https://figma.com/design/abc/Visit-Vasto
Wizard interattivo end-to-end: provisiona la VM GCP, configura OS (Docker, UFW, fail2ban, deploy user, sudoers), copia .env sulla VM, aspetta DNS, avvia lo stack, emette Let's Encrypt, configura GitHub Actions deploy, smoke test HTTPS.
./scripts/onboard.sh
CDN, WAF, DDoS, health check. Idempotente, riusabile. Le rule sono prefissate ${PROJECT_NAME}- per multi-tenancy su una stessa zone CF.
CF_API_TOKEN=... ZONE_NAME=vasto.it \
SITE_HOSTNAME=visit.vasto.it \
ALERT_EMAIL=ops@justbit.it \
PROJECT_NAME=visit-vasto \
bash scripts/configure-cloudflare.sh
Ogni sito basato sullo stack eredita queste capability al primo clone. Ogni feature è opt-out via filtro WP — non sei lock-in.
Critical CSS inline · self-hosted Variable Fonts · defer JS · lazy images · fetchpriority LCP boost · Redis object cache · WP Super Cache + fast-path Caddy · target PSI 95+ mobile
Banner cookie multi-regione (GDPR/CCPA/LGPD) · Google Consent Mode v2 · Records of Consent con IP/UA hash · Script Blocker pre-consenso · Cookie Scanner · RoPA · DSAR · Data Breach · Document Versioning
Skip-link auto · :focus-visible rinforzato · prefers-reduced-motion safety net globale · auto id="main" · axe-core nightly CI · alt fallback dinamico
Anti user enumeration · XML-RPC off · security headers HTTP (HSTS, X-Frame, Referrer-Policy, Permissions-Policy) · CSP Report-Only · login error generico · fail2ban tollerante · UFW · file integrity check daily · WPS Hide Login opt-in
Sitemap XML auto (Yoast-aware) · robots.txt dinamico (MAINTENANCE_MODE) · Canonical URL paginazione-aware + strip tracking params (utm_*, fbclid, gclid) · meta robots granulare (noindex su search/attachment/page>2) · hreflang Polylang/WPML · Schema.org JSON-LD auto · OG image SVG dinamica · meta verification Bing/Yandex/Pinterest/Facebook
Service Worker offline-first · manifest dinamico · pagina /offline · cache-first per asset · network-first per HTML · stale-while-revalidate per REST · install prompt iOS/Android
Deploy via Git push · GitHub Actions con DB snapshot pre-deploy · rollback automatico su smoke test fail · graceful reload PHP-FPM (zero downtime) · run_command ad-hoc da Actions UI · gitleaks CI con regole stack-specific · migrazione .env idempotente
/health plain text · /wp-json/.../health JSON · Lighthouse CI auto post-deploy · axe-core a11y CI nightly · widget dashboard wp-admin con 8 health check · alert email Cloudflare Health Check failed · disk usage warn 80% / err 90% · inode check
Backup notturno volumi (offen, retention 14gg locale + 90gg GCS) · DB snapshot pre-deploy (7gg) · ./scripts/restore.sh list/db/volumes/full/from-gcs · make restore-* targets · disaster recovery completo da GCS in 5 minuti
Caddy ACME automatico · auto-fallback a Let's Encrypt staging se DNS non propagato (zero rischio ban 1h-7gg) · sub-comando onboard --promote-cert per passare a LE prod quando DNS è OK · HSTS preload + OCSP
DB & Redis opzionalmente su macchina condivisa esterna (Cloud SQL, Memorystore, o self-hosted) · wizard chiede i parametri al setup · break-even economico da 5+ siti · risparmio €2-4/sito/mese
./scripts/onboard.sh per il go-live · ./scripts/offboard.sh per smontare un sito (backup finale + cleanup VM/IP/bucket/SA/SSH key/GitHub secrets/CF DNS) · make wp-updates aggiornamento plugin wp.org
Un sito tecnicamente perfetto ma invisibile a Google è un sito che non esiste. Lo stack include 5 moduli SEO production-grade nello starter theme e pre-installa Google Site Kit (Search Console + Analytics 4 + PageSpeed Insights). Il connect richiede 5 minuti di OAuth Google, poi il sito è pronto per essere indicizzato.
/sitemap.xml (Yoast-aware: silente se Yoast attivo)ROBOTS_DIRECTIVES (pre-launch vs go-live)x-default)Plugin ufficiale Google (gratuito) che integra tutta la suite Google dentro a wp-admin. Lo stack lo installa al bootstrap, il connect (OAuth) si fa una volta dal browser.
Auto-prompt in wp-admin: lo starter theme mostra una admin notice "Site Kit non connesso" con CTA al wizard finché non lo connetti, poi sparisce.
/sitemap.xml o /sitemap_index.xml se Yoast).env: passa da ROBOTS_DIRECTIVES="Disallow: /" a "Allow: /"jbw_verify_metaGuida completa: docs/SEO-SETUP.md
Numeri misurati su una VM e2-small Milano (2 vCPU shared, 2 GB RAM, 30 GB pd-standard) con lo stack completo attivo (Caddy + WP + MariaDB + Redis + backup container). I dati di capacity tengono conto di Caddy fast-path su WP Super Cache, Redis object cache, OPcache, HTTP/3.
| VM e2-small Milano (con SUD discount) | €11-13 |
| Persistent Disk pd-standard 30 GB | €1.10 |
| IP statico (attaccato a VM running) | €0 |
| GCS Nearline backup (1-2 GB) | €0.05-0.20 |
| Dominio .info (€10/anno) | €1 |
| Cloudflare Free (DNS+CDN+WAF base) | €0 |
| TOTALE | €13-15 |
Confronto: Kinsta starter $35/mese · SiteGround StartUp €15/m rinnovo · OVH 1 GB VPS €7/m senza managed.
| Pagine cached (Caddy fast-path) | 1.500-3.000 req/s |
| Utenti contemporanei (cached) | 3.000-5.000 |
| Pagine dinamiche (PHP-FPM) | 30-40 req/s |
| Admin/REST contemporanei | 10-15 |
| MAU sostenibili per pattern: | |
| Sito turistico/editoriale (cache >95%) | 100k-500k |
| Sito con membership/form (cache 60%) | 30k-100k |
| E-commerce WooCommerce (cache 20%) | 5k-20k |
Bottleneck quando crescerà: PHP-FPM workers (raddoppiabili a 20 senza costo extra), poi CPU shared, poi disco IOPS.
Per portfolio di N siti, lo stack supporta DB e Redis su una VM esterna condivisa (configurabile da .env + wizard). Confronto economico:
| N siti | Monolite (default) | VM condivisa DB+Redis | Risparmio/sito |
|---|---|---|---|
| N=1-4 | €13-15/sito ✓ | €18-26/sito ✗ | - |
| N=5 | €13-15/sito | €15.60/sito ≈ pari | ~€0 |
| N=10 | €13-15/sito | €14.30/sito ✓ | €0.70-1.70 |
| N=20 | €13-15/sito | €13.65/sito ✓ | €1.35 |
Cloud SQL/Memorystore managed sono fuori scala: €60+/sito/mese — convenienti solo per workload enterprise. La VM condivisa self-hosted è il pareggio migliore per portfolio piccoli-medi.
Il primo sito basato sullo stack. Costruito per il Comune di Torino di Sangro (CH, Abruzzo) — sito turistico della Costa dei Trabocchi. Funziona da maggio 2026.
Tre comandi per arrivare a un sito locale funzionante. Da lì, 30 minuti aggiuntivi per il provisioning prod.
# 1. Crea il repo cliente dal template GitHub
gh repo create justbit/ \
--template justbit/justbitwp-stack \
--private --clone
cd
# 2. Wizard interattivo: slug, brand, dominio, repo
# (chiede anche DB/Redis esterni opzionali per multi-tenant)
./scripts/bootstrap-new-project.sh
# 3. Locale: stack su localhost:8080
make up && make bootstrap
# 4. (Opz.) Importa design da Figma
make figma-to-theme FIGMA=https://figma.com/design/...
# 5. Provisioning prod (quando sei pronto)
./scripts/onboard.sh
# Se DNS non propaga, sceglie LE staging di default (no rate-limit).
# Quando DNS è OK: ./scripts/onboard.sh --promote-cert <slug>
# Da qui: ogni `git push origin main` deploya in 30 secondi.
make wp-updates-prod # plugin wp.org update
make harden-prod # re-applica hardening
make fim-check-prod # file integrity check
make pull-prod # DB + uploads → locale
./scripts/restore.sh list # cosa ho disponibile
make restore-db BACKUP=... # solo DB da snapshot
make restore-full BACKUP=... # DB + volumi
make restore-from-gcs PREFIX=20260514 # da GCS
make lock-origin-prod # solo CF può raggiungere VM
make harden-prod # WPS Hide Login, headers
# CI: gitleaks scan ad ogni PR + push
# Caddyfile: ACME_CA=staging anti rate-limit LE
# Smonta TUTTO con backup finale automatico:
./scripts/offboard.sh <slug>
# Cancella VM, IP, bucket, SA, SSH key,
# secrets GitHub, opz. DNS Cloudflare.