← Torna al documento principale

Architettura Tecnica MVP

Data: Marzo 2026 Autore: Nicholas Wieland (CTO) Status: Definita e validata, pronta per implementation

Executive Summary

Architettura completa per marketplace bevande artigianali con modello puro intermediario. Stack scelto: Rails 8 + Hotwire + PostgreSQL + Solid Queue/Cache/Cable + Stripe Connect. Priorità: SEO-first, time-to-market veloce, costi infrastruttura minimi.

3 mesi
Timeline sviluppo (1 founder full-time)
~€45
Costo infrastruttura MVP/mese (hosting + monitoring)
1.000+
Produttori scalabili senza refactoring

1. Principi Architetturali

1.1 Core Principles

1.2 Non-Requirements (MVP)

2. Stack Tecnologico

2.1 Backend

Framework: Ruby on Rails 8

  • Maturo, stabile, veloce per marketplace
  • Hotwire (Turbo + Stimulus) per interattività senza SPA
  • Action Cable per real-time opzionale (post-MVP)

Database: PostgreSQL 18

  • Relazioni complesse produttore-prodotto-ordine-commissione
  • Estensioni: earthdistance (geo-filtering km 0)
  • Ricerca full-text: Meilisearch (search engine esterno, typo-tolerant, faceting, filtri avanzati)
  • Backup automatizzato su Cloudflare R2

Background Jobs / Cache / Real-time: Rails 8 Solid Stack

  • Solid Queue — job asincroni (email, indicizzazione Meilisearch, geocoding) su PostgreSQL, zero Redis
  • Solid Cache — fragment caching durable su database (256MB namespace)
  • Solid Cable — WebSocket per aggiornamenti real-time (notifiche ordini)
  • Mission Control Jobs per UI gestione code

Storage: ActiveStorage + Cloudflare R2

  • Sviluppo: storage locale su disco
  • Produzione: Cloudflare R2 (S3-compatible, free tier 10GB + 10M reads/mese)
  • Image processing: libvips (ruby-vips) + mini_magick fallback
  • PDF fatture/ricevute

2.2 Frontend

2.3 Dashboard Produttori

Framework: Rails + Hotwire (Turbo + Stimulus) — stesso stack del frontend pubblico

Rationale stack unificato: Hotwire fornisce reattività sufficiente per dashboard analytics con aggiornamenti real-time (Turbo Streams) e interazioni complesse (Stimulus controllers). Evita complessità double-stack, riduce bundle size, facilita manutenzione.

3. Architettura Dati

3.1 Schema Database (Core Entities)

Users

  • id (UUID), email (unique, index)
  • password_digest (bcrypt)
  • role (enum: consumer, producer, admin)
  • OAuth identities (Google, Facebook, LinkedIn)
  • avatar (ActiveStorage attachment)
  • timestamps

Producers

  • id (UUID), user_id (FK)
  • business_name, slug (unique via friendly_id, SEO-friendly URLs)
  • ProducerProfile (modello separato per dati editoriali)
  • ProducerAddress (indirizzo + geocoding asincrono via Nominatim)
  • latitude, longitude (per km 0)
  • commission_rate (decimal, default 12% — scala a 8% oltre soglia volume)
  • plan (enum: free, pro, partner)

Products

  • id (UUID), producer_id (FK, index)
  • name, slug (scoped to producer, via friendly_id)
  • description (Markdown via Redcarpet)
  • category, style, region, product_attributes
  • ABV (alcohol_percentage), volume_ml
  • price_cents
  • stock_quantity, published (boolean)
  • images (ActiveStorage, has_many_attached)
  • tags (Gutentag — genere, stile, attributi)
  • ProductListing (modello separato per arricchimento editoriale SEO)
  • Indicizzato su Meilisearch (name, description, producer_name, category)

Orders

  • id, user_id (FK consumer)
  • producer_id (FK, for filtering)
  • order_number (unique: #BRW-20260215-0042)
  • status (enum: pending, paid, shipped, delivered, cancelled)
  • subtotal_cents, commission_cents, total_cents
  • stripe_payment_intent_id, stripe_transfer_id
  • shipping_tracking_url, shipped_at, delivered_at

3.2 Relazioni Chiave

3.3 Indici Critici per Performance

4. Pagine Principali (MVP)

4.1 Pubbliche (SEO-critical)

  1. Home (/): Hero con value proposition, Featured producers, "Scopri per regione"
  2. Produttori Index (/produttori): Lista con filtri (regione, prodotto, km 0), paginazione
  3. Produttore Single (/produttori/:slug): Storia, processo produttivo, territorio + lista prodotti + Schema.org LocalBusiness markup
  4. Prodotti Index (/prodotti): Lista cross-produttori con filtri categoria, regione, prezzo, km 0
  5. Prodotto Single (/produttori/:producer_slug/prodotti/:product_slug): Foto, descrizione, ingredients + pricing + Schema.org Product markup
  6. Carrello (/cart): Session-based, raggruppato per produttore
  7. Checkout (/checkout): Login/signup required, Stripe Payment Intent

4.2 Autenticate (Produttori)

  1. Dashboard (/dashboard): Ordini recenti, analytics vendite
  2. Prodotti (/dashboard/prodotti): CRUD prodotti, upload foto, gestione inventario
  3. Ordini (/dashboard/ordini): Lista ordini da evadere, azioni spedizione
  4. Profilo (/dashboard/profilo): Modifica storia, processo produttivo, foto + export PDF profilo stampabile (con QR code per marketing offline) + [Post-MVP Fase 2] ordina copie stampate e rilegati professionalmente (Brewsters Print)
  5. Analytics (/dashboard/analytics): [Post-MVP] Grafici vendite, breakdown prodotto (Hotwire + Stimulus + Chart.js)

5. Flussi Principali

5.1 Onboarding Produttore

  1. Produttore richiesta accesso (form pubblico /richiedi-accesso)
  2. Admin review (verifica licenze, P.IVA)
  3. Admin approva → email invite con link setup
  4. Produttore completa profilo (storia, foto, prodotti iniziali)
  5. Admin final review → pubblica profilo
  6. Stripe Connect onboarding (Standard o Express account)

5.2 Acquisto Consumer

  1. Consumer naviga /produttori o /prodotti
  2. Aggiunge prodotti al carrello (session-based)
  3. Checkout → login/signup
  4. Inserisce indirizzo spedizione
  5. Conferma ordine → Stripe Payment Intent
  6. Pagamento riuscito: email conferma + notifica produttore
  7. Stripe Connect Transfer a produttore (subtotal - commission, hold 7 giorni)
  8. Produttore spedisce → segna "shipped" con tracking URL
  9. Consumer riceve email con tracking

5.3 Gestione Commissioni (Stripe Connect)

6. Integrazioni Esterne

Servizio Provider Use Case Costo
Stripe Connect Stripe Pagamenti + trasferimenti produttori 1.5% + €0.25/tx
Ricerca Meilisearch Full-text search prodotti (typo-tolerant, faceting) Self-hosted (Fly Machine dedicata)
AI Contenuti Anthropic (Claude API) Generazione testi, traduzioni, arricchimento prodotti Pay-per-use
Geocoding Nominatim (OpenStreetMap) Geolocalizzazione produttori per filtro km 0 Gratuito
Storage Cloudflare R2 Immagini prodotti/produttori (ActiveStorage) Free tier 10GB; poi ~€0.015/GB/mese
Analytics Google Analytics 4 Tracking conversioni, e-commerce events Gratuito
Maps Leaflet + OpenStreetMap Filtro km 0, visualizzazione produttori Gratuito
SEO meta-tags + json-ld + sitemap_generator Dynamic meta tags, Schema.org (LocalBusiness, Product), XML sitemap Gratuito

7. Infrastruttura e Deployment

7.1 Hosting e Deploy (MVP)

Fly.io (scelta MVP)

  • Fly Machines per app Rails (~$5-15/mo shared CPU)
  • Fly Postgres (managed, 1GB free tier)
  • Meilisearch su Fly Machine dedicata
  • Cloudflare R2 per storage file (S3-compatible, free tier generoso)
  • Zero Redis — Rails 8 Solid Stack su PostgreSQL

✅ Deploy con fly deploy, SSL automatico, edge networking globale. Scaling orizzontale semplice con Fly Machines. CDN e R2 via Cloudflare.

7.2 CI/CD

7.3 Monitoring (MVP)

8. Sicurezza e Compliance

8.1 Autenticazione

8.2 Verifica Età (Compliance Alcol)

8.3 GDPR

8.4 Payment Security

PCI Compliance: gestito da Stripe (zero PCI scope per Brewsters, usiamo Stripe.js). No credit card data stored on Brewsters servers.

9. Performance e Scalabilità

9.1 Target Performance (MVP)

< 300ms
Time to First Byte (TTFB)
< 1.5s
Page Load Time (Lighthouse)
100+
Concurrent users senza degradation

9.2 Ottimizzazioni MVP

10. Timeline Sviluppo

Mese 1 - Setup & Core (Settimane 1-4)

  • Setup progetto Rails 8 + PostgreSQL + Solid Queue/Cache/Cable
  • Schema database migrations (UUID primary keys)
  • Models: User, Producer, Product, Order, OrderItem
  • Autenticazione (Devise + OmniAuth Google/Facebook/LinkedIn)
  • Layout base + Tailwind CSS 4 + Importmap setup

Mese 2 - Features MVP (Settimane 5-8)

  • CRUD Produttori (admin) + CRUD Prodotti (producer dashboard)
  • Pagine pubbliche: home, produttori index/show, prodotti index/show
  • Carrello (session-based)
  • Checkout + Stripe Payment Intent integration
  • Order management (producer dashboard)

Mese 3 - Polish & Launch (Settimane 9-12)

  • Redcarpet (Markdown) per storytelling produttore
  • Image upload (ActiveStorage + libvips)
  • Email transazionali
  • SEO: sitemap_generator, meta-tags, json-ld (Schema.org)
  • Testing: RSpec suite core flows
  • Deploy staging + produzione via Fly.io
  • Onboarding manuale primi 5 produttori (beta)

11. Costi Ricorrenti (MVP - Anno 1)

Servizio Costo Mensile Note
Fly.io (hosting) ~€30 App + Postgres + Meilisearch Machines
Sentry (monitoring) $26 Error tracking
Dominio (.it) $2 Registrazione annuale / 12
Stripe (payment) Variabile 1.5% + €0.25 per transazione (assorbito)
Totale fisso ~€55-60/mese R2 free tier; email da aggiungere quando necessario

Note: Costi scalano con traffico, ma restano asset-light. Nessun costo logistica/magazzino.

12. Rischi Tecnici e Mitigazione

Rischio 1: Complessità Stripe Connect

Probabilità: Media | Impatto: Alto

Mitigazione:

  • Usare Stripe Standard Connect (onboarding hosted, zero custom UI)
  • Testing su Stripe test mode con account dummy
  • Consultazione documentazione ufficiale + Rails gem stripe-ruby
  • Fallback: se troppo complesso, MVP con pagamenti diretti PayPal produttore

Rischio 2: Performance Database (1.000+ prodotti)

Probabilità: Bassa (MVP) | Impatto: Medio

Mitigazione:

  • Indici ottimizzati su query critiche
  • Fragment caching aggressivo (invalidazione smart on update)
  • Monitoring query N+1 (Bullet gem)
  • Upgrade Fly Machine se necessario (scaling verticale/orizzontale semplice)

Rischio 3: CTO Single Point of Failure

Probabilità: Media | Impatto: Alto

Mitigazione:

  • Documentazione inline codice
  • README completo con setup instructions
  • Deploy automatizzato (zero deploy manuale)
  • Utente non tecnico può gestire contenuti via dashboard admin
  • Post-Anno 1: onboarding dev junior per supporto manutenzione

13. Metriche Tecniche di Successo MVP

Metrica Target MVP Strumento Monitoraggio
Deploy time < 10 minuti Fly.io deploy
Page load time (avg) < 1.5s Google Lighthouse
Uptime > 99.5% Uptime Robot
Error rate < 1% Sentry
Test coverage > 80% (models/controllers) SimpleCov
Database query time (p95) < 100ms Sentry + Fly Metrics
Bugs critical (Mese 1) < 10 GitHub Issues

Conclusioni

Architettura tecnica validata e pronta per execution.

Stack scelto (Rails 8 + Hotwire + PostgreSQL + Solid Stack + Fly.io + Cloudflare R2 + Stripe Connect) è:

  • ✅ Maturo e battle-tested per marketplace
  • ✅ SEO-first nativo (server-rendering)
  • ✅ Veloce da sviluppare (3 mesi per MVP completo)
  • ✅ Costi fissi bassi (~€55-60/mese)
  • ✅ Scalabile fino a 1.000 produttori senza rewrite

Prossimo step: Start sviluppo Mese 1.

Riferimenti Tecnici

Documentazione ufficiale e fonti per ogni tecnologia adottata nello stack MVP.

Framework e Linguaggi

Database, Search e Storage

Pagamenti

Hosting e Infrastruttura

Monitoring e Qualità

Autenticazione e Sicurezza

AI e Contenuti

SEO e Performance