Justbit WP Stack

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.

7 repo modulari
13-15 € al mese in prod
PSI 95+ mobile · 100 desktop
WCAG 2.1 AA built-in
500k MAU capacity
Multi-tenant ready
Il problema, la promessa

Cosa cambia tra un sito “sviluppato a mano” e uno con lo stack

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.

😩 Senza stack

  • Setup 1-2 settimane di lavoro ripetitivo
  • Ogni sito è una snowflake: configurazioni diverse, drift garantito
  • GDPR, a11y, SEO, PWA come “after-thoughts”
  • Deploy manuali via FTP/SSH, rollback ad-hoc
  • No monitoring: scopri il sito giù dai clienti
  • Backup “forse, qualche volta”
  • Costi imprevedibili (hosting, plugin premium, manutenzione)

🚀 Con lo stack

  • Setup 45 minuti da “Use this template” al go-live
  • Ogni sito eredita la stessa baseline; update centralizzati
  • GDPR, WCAG AA, SEO, PWA — built-in
  • Deploy automatico via Git push, rollback automatico se smoke test fail
  • Health check + Lighthouse CI + a11y CI + gitleaks secret scan
  • Backup notturni GCS (90gg) + DB snapshot pre-deploy (7gg) + ./scripts/restore.sh
  • LE staging auto-fallback se DNS non propagato (anti rate-limit)
  • Smontaggio sito completo con ./scripts/offboard.sh (cleanup VM/IP/bucket/secrets)
  • Costo prevedibile 13-15 €/mese per sito · DB+Redis condivisi per portfolio
Architettura

Cosa gira, dove gira

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.

👨‍💻 Sviluppatore git push origin main make / claude code 🤖 GitHub Actions deploy.yml lighthouse.yml VM Google Compute Engine — e2-small Milano Ubuntu 24.04 LTS · Docker · UFW · fail2ban 🔒 Caddy 2 SSL Let's Encrypt HTTP/3 · super-cache 🌐 WordPress 6.x PHP-FPM 8.2 · OPcache starter theme + plugin 💾 MariaDB 11 ⚡ Redis 📦 Docker Volumes (persistenti) wp-core · wp-uploads · wp-plugins · wp-mu-plugins · db-data · caddy-data 📂 Bind-mount dal repo (hot reload) ./project/theme · ./project/seeds · ./scripts · ./plugins/manifest.yml 📦 Backup container · nightly dump → tar.gz → GCS off-site (retention 14gg) ☁️ Cloudflare (opzionale) — CDN + WAF + DDoS + Health Check configure-cloudflare.sh — auto-setup via API 👥 Visitatori HTTPS PWA ready · offline OK
Edge / SSL Application Data External (Cloudflare)
Anatomia — i pezzi versionati

I 7 repo Justbit pubblici

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.

justbitwp-stack

TEMPLATE

Repository GitHub Template da cui parte ogni nuovo progetto cliente. Contiene Docker, Caddy, scripts di provisioning, deploy GitHub Actions, manifest dei plugin, skill Claude.

template · public

justbitwp-starter-theme

TEMA

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.

v0.2.0 · public

justbitz

PRIVATE

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.

v0.9.9 · asset commerciale

justbit-wp-security

PLUGIN

Hardening generico WP: anti user enumeration (REST + ?author=N), XML-RPC disabilitato, security headers HTTP, login error generico. Zero dipendenze, attivo "always-on".

v1.1.1 · public

justbit-maps

PLUGIN

Mappe interattive Leaflet + Carto + OpenStreetMap senza API key. Multi-marker, geocoding Nominatim cachato, popup card 18 campi, polyline+numbered markers, cluster, schema.org auto.

v0.5.3 · public

justbit-admin-tour

PLUGIN

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.

v0.1.0 · public

justbit-dashboard

PLUGIN

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.

v0.1.0 · public
Come si parte un cliente nuovo

Workflow end-to-end · 45 minuti reali

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.

1

Crea il repo cliente dal template

1 minuto

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
2

Wizard post-clone

5 minuti

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
3

Locale up

5 minuti

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
4

Figma → Tema con Claude

5-30 minuti (dipende dal design)

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
5

Provisioning prod

30 minuti

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
6

Cloudflare edge (opzionale)

2 minuti

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
Cosa viene di serie

Features built-in (niente da configurare)

Ogni sito basato sullo stack eredita queste capability al primo clone. Ogni feature è opt-out via filtro WP — non sei lock-in.

Performance

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

🛡

GDPR / Consent

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

Accessibilità WCAG 2.1 AA

Skip-link auto · :focus-visible rinforzato · prefers-reduced-motion safety net globale · auto id="main" · axe-core nightly CI · alt fallback dinamico

🔒

Security

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

🔍

SEO production-grade

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

📱

PWA

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

🚀

DevOps

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

📊

Monitoring

/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 & restore

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

🔑

HTTPS sicuro (anti rate-limit LE)

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

🏢

Multi-tenant ready

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

♻️

Lifecycle completo

./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

Discoverability — il pezzo critico per la ricerca

SEO + Google Site Kit: il setup che fa la differenza

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.

🛠 Built-in nello starter theme

  • Sitemap XML a /sitemap.xml (Yoast-aware: silente se Yoast attivo)
  • robots.txt dinamico, controllato da env ROBOTS_DIRECTIVES (pre-launch vs go-live)
  • Canonical URL corretto su paginazione + archivi + strip tracking params (utm_*, fbclid, gclid, mc_*)
  • meta robots granulare: noindex su search, attachment, page/3+, archivi vuoti, maintenance
  • hreflang automatico Polylang/WPML (con x-default)
  • Schema.org JSON-LD: WebSite, Organization, BreadcrumbList, BlogPosting
  • OG image dinamica SVG via REST endpoint
  • Verification meta tags pronti: Bing, Yandex, Pinterest, Facebook Business

📊 Google Site Kit pre-installato

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.

  • Search Console — query di ricerca, impression, pagine indicizzate, errori di crawl
  • Analytics 4 — visitatori, sessioni, eventi, traffic source (GDPR-compliant via Justbitz Consent Mode v2)
  • PageSpeed Insights — Core Web Vitals (LCP, CLS, INP) reali dai visitatori
  • AdSense — se monetizzi con annunci (opzionale)

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.

⏱ Checklist SEO go-live (~20 min totali)

  1. 5' · Connetti Site Kit (Search Console + GA4 + PSI) via OAuth Google
  2. 2' · Submit sitemap in Search Console (/sitemap.xml o /sitemap_index.xml se Yoast)
  3. 30" · .env: passa da ROBOTS_DIRECTIVES="Disallow: /" a "Allow: /"
  4. 5' · Configura Justbitz wizard (banner cookie + Consent Mode v2 per GA4 GDPR-compliant)
  5. 3' · Test Rich Results + Mobile-friendly
  6. continuo · Monitora Core Web Vitals in Site Kit Dashboard
  7. 5' opzionale · Bing/Yandex/Pinterest/Facebook verification via jbw_verify_meta

Guida completa: docs/SEO-SETUP.md

Misurabile, non promesse

Numeri chiave dello stack

45min
Setup E2E
(clone → sito in prod)
13-15€/m
Costo prod su Google
e2-small Milano · all-in
500kMAU
Capacity stimata
siti turistici · cache >95%
95+/100
PSI mobile
Lighthouse target
100/100
PSI desktop
+ A11y + Best Practices + SEO
90gg
Backup retention
off-site GCS
0s
Downtime su deploy
graceful reload
5+
Soglia VM condivisa
DB+Redis multi-sito
Quanto costa, quanto regge

Costi reali Google Cloud + capacity con tutte le ottimizzazioni

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.

💰 Costo mensile (Google Cloud)

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.

📈 Capacity sostenibile

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 contemporanei10-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.

🏢 DB + Redis condivisi: conviene da 5+ siti

Per portfolio di N siti, lo stack supporta DB e Redis su una VM esterna condivisa (configurabile da .env + wizard). Confronto economico:

N sitiMonolite (default)VM condivisa DB+RedisRisparmio/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.

In produzione adesso

Esempio reale: Visit Torino di Sangro

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.

Cosa contiene il sito

  • 17 storie editoriali (POI, leggende, tradizioni, eventi storici)
  • 70 POI mappati (chiese, palazzi, trabocchi, ristoranti, B&B, servizi)
  • 12 itinerari tematici con tappe, durata, difficoltà
  • Mappa fullscreen con clustering, search live, filtri categoria
  • API Da Vivere integrata (sync daily da CMS turistico esterno)
  • Multi-lingua predisposto (IT base, EN/DE in roadmap)
  • Editor della Pro Loco + Comune con tour guidato wp-admin
Visit Torino di Sangro
visit.torinodisangro.info
17 storie
70 POI
12 itinerari
PSI mobile 89 · desktop 99
WCAG AA · Bandiera Blu 2025
Quickstart

Come parti un nuovo sito (dalla tua macchina)

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.

🔄 Operazioni quotidiane

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

🆘 Disaster recovery

./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

🛡 Sicurezza & lockdown

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

♻️ Fine progetto

# Smonta TUTTO con backup finale automatico:
./scripts/offboard.sh <slug>
# Cancella VM, IP, bucket, SA, SSH key,
# secrets GitHub, opz. DNS Cloudflare.