guides

Guida a Strapi 5: Setup, API, Plugin e Deploy (2026)

Scritto da Mert Batur
Apr 6, 2026
18 lettura
Guida a Strapi 5: Setup, API, Plugin e Deploy (2026)

Guida a Strapi 5: Setup, API, Plugin e Deployment (2026)

Strapi è un CMS headless open source costruito su Node.js che ti dà pieno controllo su API, database e deployment. A differenza delle piattaforme CMS hosted dove affitti l'accesso all'infrastruttura di qualcun altro, Strapi gira sui tuoi server, genera endpoint REST e GraphQL dagli schemi dei tuoi contenuti e ti permette di personalizzare ogni livello del backend con semplice JavaScript o TypeScript.

Questa guida copre Strapi 5 nello specifico -- dal primo npx create-strapi fino al deployment in produzione su Railway o Strapi Cloud. Ogni esempio di codice è pronto per essere copiato e testato su Strapi 5.x.

CampoValore
TipoCMS headless open source
LinguaggioJavaScript / TypeScript (Node.js)
Versione attualeStrapi 5
LicenzaMIT (Community) / Proprietaria (Enterprise)
Database supportatiPostgreSQL, MySQL, MariaDB, SQLite
Tipi di APIREST + GraphQL (entrambi integrati)
HostingSelf-hosted o Strapi Cloud
Prezzi CloudPiano gratuito, poi $18/mese+
Stelle GitHub65.000+
Ideale perTeam che vogliono piena proprietà del codice + personalizzazione API

Cos'è Strapi e Come Funziona?

Strapi è un content management system self-hosted e API-first che disaccoppia il backend dei contenuti dal frontend. Definisci gli schemi dei contenuti tramite un builder visuale o via codice, e Strapi genera automaticamente gli endpoint API CRUD -- sia REST che GraphQL -- che qualsiasi framework frontend può consumare. Il pannello admin è un'interfaccia React-based dove gli editor gestiscono e creano voci senza toccare il codice, come documentato nell'official Strapi documentation.

CMS Headless vs CMS Tradizionale

Un CMS tradizionale come WordPress accoppia il contenuto allo strato di presentazione. Post del blog, pagine e media vivono tutti nello stesso sistema che renderizza HTML ai visitatori. Funziona bene finché non hai bisogno dello stesso contenuto in un'app mobile, un microsito marketing e un portale documentazione contemporaneamente.

Un CMS headless elimina completamente il frontend. Strapi archivia i tuoi contenuti e li serve come JSON tramite endpoint API. Il tuo sito Next.js, la tua app React Native e il tuo dashboard IoT attingono tutti dallo stesso backend Strapi. Un'unica fonte di verità, più consumer.

Se stai valutando opzioni oltre a Strapi, la nostra confronto tra CMS headless analizza le principali piattaforme una accanto all'altra.

L'Architettura di Strapi

Lo stack di Strapi è diretto: un server Node.js si trova tra il database (PostgreSQL, MySQL o SQLite) e le applicazioni frontend. Il pannello admin -- una React single-page app -- si connette alla stessa API usata dai frontend, con permessi elevati.

Il flusso è questo: il database contiene i contenuti. Il layer ORM di Strapi (costruito su Knex.js) li interroga. Il layer API espone endpoint REST e GraphQL. I frontend -- Next.js, Nuxt, Astro, Gatsby, o un'app mobile -- recuperano JSON da quegli endpoint. Strapi non renderizza mai HTML agli utenti finali.

Il repository GitHub di Strapi ha oltre 65.000 stelle, il che lo rende uno dei progetti CMS open source più popolari sulla piattaforma.

Cosa C'è di Nuovo in Strapi 5?

Strapi 5 è una riscrittura importante che sostituisce l'Entity Service API con una nuova Document Service API, passa da Webpack a Vite per le build del pannello admin e introduce TypeScript come linguaggio predefinito per i nuovi progetti. Non sono aggiornamenti incrementali -- l'architettura interna è cambiata in modo significativo, come descritto nella pagina panoramica di Strapi 5.

Ecco i cambiamenti più rilevanti per gli sviluppatori, secondo il changelog per sviluppatori di Strapi 5:

  • Document Service API sostituisce Entity Service API -- firme dei metodi più pulite, tipizzazione TypeScript migliore, interfaccia unificata per le operazioni CRUD
  • Rework di Draft & Publish -- sistema a due tab nel pannello admin che separa gli stati di bozza e contenuto pubblicato
  • Content History -- visualizza e ripristina versioni precedenti di qualsiasi voce direttamente dall'admin
  • Funzionalità Preview -- anteprima del contenuto nel frontend reale prima della pubblicazione, configurabile per tipo di contenuto
  • Vite sostituisce Webpack -- le build del pannello admin sono notevolmente più veloci (abbiamo visto un miglioramento di circa il 60% nei tempi di build)
  • Approccio TypeScript-first -- i nuovi progetti vengono generati con TypeScript di default
  • AI Content-Type Builder -- genera schemi dei contenuti da descrizioni in linguaggio naturale o design Figma. È una novità del 2026 e nessun altro CMS headless la offre ancora
  • Risposte API semplificate -- struttura JSON più piatta sia per REST che per GraphQL
  • Nuovo Plugin SDK -- API semplificata per costruire e distribuire plugin Strapi
FunzionalitàStrapi 4Strapi 5
Service APIEntity ServiceDocument Service
BundlerWebpackVite
Linguaggio predefinitoJavaScriptTypeScript
Sistema di bozzeToggle singoloDue tab (bozza/pubblicato)
Content HistoryRichiede pluginIntegrato
Anteprima frontendNon disponibilePreview API nativa
Formato risposta APIProfondamente annidatoStruttura piatta
Generazione schemaSolo manualeIA + manuale

Come Installare e Configurare Strapi 5

Configurare un progetto Strapi 5 richiede circa due minuti. Ti serve Node.js 18 o superiore, e npm, yarn o pnpm. Strapi genera un progetto completo con pannello admin, connessione al database e layer API da un singolo comando, come documentato nella Guida Quick Start di Strapi.

Prerequisiti

  • Node.js 18+ (si raccomanda 20 LTS)
  • npm 6+, yarn o pnpm
  • Un database: SQLite funziona subito per lo sviluppo; PostgreSQL per la produzione

Creare il Tuo Primo Progetto

bash
npx create-strapi@latest my-project

# Prompt interattivi:
# ? Choose your preferred language: TypeScript
# ? Choose your default database client: sqlite
# ? Start with an example structure?: Yes (consigliato per i principianti)

cd my-project
npm run develop

Strapi parte su http://localhost:1337. La prima visita ti chiede di creare un account admin. Dopodiché sei nel pannello admin -- pronto a costruire i tipi di contenuto.

Panoramica della Struttura del Progetto

text
my-project/
├── config/
│   ├── database.ts          # Connessione al database
│   ├── server.ts             # Host, porta, chiavi app
│   ├── admin.ts              # Configurazione pannello admin
│   └── plugins.ts            # Configurazione plugin
├── src/
│   ├── api/                  # I tuoi tipi di contenuto sono qui
│   │   └── article/
│   │       ├── content-types/
│   │       │   └── article/schema.json
│   │       ├── controllers/article.ts
│   │       ├── routes/article.ts
│   │       └── services/article.ts
│   ├── plugins/              # Plugin personalizzati
│   └── index.ts              # Bootstrap/lifecycle dell'app
├── public/                   # File statici
├── .env                      # Variabili d'ambiente
└── package.json

Ogni tipo di contenuto ha la sua cartella in src/api/ con un file di schema, controller, route e service. Strapi li genera automaticamente quando crei un tipo di contenuto tramite il pannello admin, ma puoi anche crearli a mano.

Costruire i Content Types e Gestire i Contenuti

I Content Types sono il cuore di Strapi -- definiscono lo schema dei dati e generano automaticamente endpoint API, form nel pannello admin e tabelle nel database. Strapi supporta due tipi principali: Collection Types (come post del blog o prodotti, dove hai molte voci) e Single Types (come una homepage o impostazioni del sito, dove esiste una sola voce).

Procedura Guidata del Content-Type Builder

Il Content-Type Builder nel pannello admin di Strapi ti permette di definire gli schemi visivamente. Scegli i tipi di campo -- Testo, Testo ricco, Media, Numero, Booleano, Relazione, Componente, Dynamic Zone, JSON e altri -- e Strapi scrive il file di schema per te.

Ecco come appare uno schema per un tipo di contenuto Article:

json
{
  "kind": "collectionType",
  "collectionName": "articles",
  "info": {
    "singularName": "article",
    "pluralName": "articles",
    "displayName": "Article"
  },
  "attributes": {
    "title": {
      "type": "string",
      "required": true
    },
    "slug": {
      "type": "uid",
      "targetField": "title"
    },
    "content": {
      "type": "richtext"
    },
    "coverImage": {
      "type": "media",
      "allowedTypes": ["images"]
    },
    "category": {
      "type": "relation",
      "relation": "manyToOne",
      "target": "api::category.category"
    },
    "publishedAt": {
      "type": "datetime"
    }
  }
}

Puoi anche usare il nuovo AI Content-Type Builder per generare schemi da una descrizione in inglese semplice come "Ho bisogno di un blog con articoli che hanno titoli, slug, contenuto rich text, immagini di copertina e categorie." Strapi genera lo schema JSON e crea la tabella nel database. È davvero utile per il prototipaggio.

Componenti e Dynamic Zones

I componenti sono gruppi di campi riutilizzabili. Pensali come componenti React ma per la struttura dei contenuti. Un componente "SEO" con campi metaTitle, metaDescription e canonicalUrl può essere allegato a qualsiasi tipo di contenuto.

Le Dynamic Zones vanno oltre -- permettono agli editor di scegliere da un elenco di componenti per costruire layout di pagina flessibili. Una landing page potrebbe avere un componente Hero, poi una Features Grid, poi un Testimonials Slider, tutti scelti e ordinati dall'editor. Questo pattern è popolare per i siti di marketing dove ogni pagina ha una struttura diversa.

Gestire i Contenuti con Draft & Publish

Strapi 5 ha rivoluzionato il sistema Draft & Publish. Invece di un singolo toggle, ora hai due tab separate nel Content Manager -- una per la versione in bozza, una per quella pubblicata. Gli editor possono modificare liberamente la bozza senza influenzare il contenuto live. Quando sono pronti, pubblicano, e la bozza diventa la nuova versione pubblicata. Content History ti permette di tornare a qualsiasi stato precedente se qualcosa va storto.

Lavorare con l'API di Strapi (REST e GraphQL)

Strapi genera automaticamente endpoint REST e GraphQL per ogni tipo di contenuto che crei. L'API REST è disponibile immediatamente -- nessuna configurazione richiesta. GraphQL richiede l'abilitazione del plugin integrato, ma bastano circa 30 secondi per configurarlo. Entrambe le API supportano filtri, ordinamento, paginazione, selezione dei campi e popolamento delle relazioni, come documentato nella documentazione REST API di Strapi.

Query REST API

Ogni collection type ottiene endpoint su /api/{pluralName}. Ecco come recuperare articoli con filtri e relazioni popolate:

javascript
// Recupera articoli pubblicati, ordinati per data, con category popolata
const response = await fetch(
  'http://localhost:1337/api/articles?' + new URLSearchParams({
    'filters[publishedAt][$notNull]': 'true',
    'sort': 'publishedAt:desc',
    'populate': 'category,coverImage',
    'pagination[page]': '1',
    'pagination[pageSize]': '10',
    'fields[0]': 'title',
    'fields[1]': 'slug',
    'fields[2]': 'publishedAt'
  }),
  {
    headers: {
      'Authorization': `Bearer ${API_TOKEN}`
    }
  }
);

const { data, meta } = await response.json();
// data: array di articoli
// meta.pagination: { page, pageSize, pageCount, total }

Strapi 5 ha appiattito il formato della risposta. In v4, si navigava attraverso data.attributes.title. In v5, è semplicemente data.title. Cambiamento piccolo, grande miglioramento della qualità della vita.

Setup e Query GraphQL

Abilita GraphQL installando il plugin:

bash
npm run strapi install graphql

Poi fai le query su /graphql:

graphql
query GetArticles {
  articles(
    filters: { publishedAt: { notNull: true } }
    sort: "publishedAt:desc"
    pagination: { page: 1, pageSize: 10 }
  ) {
    title
    slug
    publishedAt
    category {
      name
    }
    coverImage {
      url
      alternativeText
    }
  }
}

GraphQL è particolarmente utile quando il frontend ha bisogno di relazioni profondamente annidate. Invece di più chiamate REST con parametri populate diversi, una singola query GraphQL recupera esattamente ciò di cui hai bisogno.

Recuperare Contenuto Strapi in Next.js

Ecco un esempio pratico di recupero del contenuto Strapi in una pagina Next.js App Router -- uno dei pairing più comuni tra Strapi e framework frontend:

typescript
// app/blog/page.tsx
async function getArticles() {
  const res = await fetch(
    `${process.env.STRAPI_URL}/api/articles?populate=category,coverImage&sort=publishedAt:desc`,
    {
      headers: {
        Authorization: `Bearer ${process.env.STRAPI_TOKEN}`,
      },
      next: { revalidate: 60 }, // ISR: rivalida ogni 60 secondi
    }
  );

  if (!res.ok) throw new Error('Failed to fetch articles');
  const { data } = await res.json();
  return data;
}

export default async function BlogPage() {
  const articles = await getArticles();

  return (
    <main>
      {articles.map((article) => (
        <article key={article.documentId}>
          <h2>{article.title}</h2>
          <span>{article.category?.name}</span>
        </article>
      ))}
    </main>
  );
}

Nota documentId nella v5 -- sostituisce il id numerico della v4. È uno di quei dettagli di migrazione che ti morderà se lo perdi.

Controller, Service e Route Personalizzati in Strapi

I controller personalizzati sono il punto in cui Strapi si separa davvero dalle piattaforme CMS headless SaaS come Contentful o Sanity. Poiché Strapi gira sul tuo server come applicazione Node.js, puoi sovrascrivere qualsiasi endpoint generato automaticamente con la tua logica di business -- validazione degli input, trasformazione dei dati, chiamate API esterne, trigger di notifiche, tutto ciò che faresti in un'app Express.js. Ho trovato che questa funzionalità è quella che spinge i team a scegliere Strapi rispetto alle alternative hosted.

La documentazione dei Controller di Strapi copre l'API completa. Ecco i pattern che uso di più, basati sugli esempi ufficiali di service e controller.

Estendere i Controller Core

Strapi fornisce una factory createCoreController. La estendi sovrascrivendo azioni specifiche (find, findOne, create, update, delete) mantenendo il resto del comportamento generato automaticamente:

typescript
// src/api/article/controllers/article.ts
import { factories } from '@strapi/strapi';

export default factories.createCoreController(
  'api::article.article',
  ({ strapi }) => ({
    // Sovrascrive il find predefinito per aggiungere filtri personalizzati
    async find(ctx) {
      // Valida e sanifica la query in arrivo
      const sanitizedQuery = await this.sanitizeQuery(ctx);

      // Aggiungi la tua logica personalizzata -- es. restituisci solo articoli
      // che appartengono all'organizzazione dell'utente autenticato
      const user = ctx.state.user;
      if (user?.organization) {
        sanitizedQuery.filters = {
          ...sanitizedQuery.filters,
          organization: user.organization.id,
        };
      }

      const { results, pagination } = await strapi
        .service('api::article.article')
        .find(sanitizedQuery);

      const sanitizedResults = await this.sanitizeOutput(results, ctx);
      return this.transformResponse(sanitizedResults, { pagination });
    },
  })
);

Scrivere Service Personalizzati

I service contengono la logica di business riutilizzabile che i controller (e altri service) possono chiamare. Mantieni i controller snelli e i service robusti:

typescript
// src/api/article/services/article.ts
import { factories } from '@strapi/strapi';

export default factories.createCoreService(
  'api::article.article',
  ({ strapi }) => ({
    // Metodo personalizzato: pubblica l'articolo e notifica gli iscritti
    async publishAndNotify(documentId: string) {
      const article = await strapi.documents('api::article.article').update({
        documentId,
        data: { publishedAt: new Date() },
        status: 'published',
      });

      // Chiama un servizio di notifica esterno
      const subscribers = await strapi
        .service('api::subscriber.subscriber')
        .find({ filters: { active: true } });

      await Promise.allSettled(
        subscribers.results.map((sub) =>
          fetch(process.env.NOTIFICATION_WEBHOOK, {
            method: 'POST',
            body: JSON.stringify({
              email: sub.email,
              article: article.title,
            }),
          })
        )
      );

      return article;
    },
  })
);

Aggiungere Route Personalizzate

Registra route personalizzate accanto alle route CRUD generate automaticamente:

typescript
// src/api/article/routes/custom-article.ts
export default {
  routes: [
    {
      method: 'POST',
      path: '/articles/:id/publish-notify',
      handler: 'article.publishAndNotify',
      config: {
        policies: ['admin::isAuthenticatedAdmin'],
      },
    },
  ],
};

Poi aggiungi l'handler al controller:

typescript
async publishAndNotify(ctx) {
  const { id } = ctx.params;
  const article = await strapi
    .service('api::article.article')
    .publishAndNotify(id);
  return this.transformResponse(article);
}

Questo tipo di personalizzazione backend è semplicemente impossibile con Contentful o Sanity -- ti servirebbe una funzione serverless separata o un layer middleware. Con Strapi, è tutto in un unico codebase.

Ecosistema dei Plugin e Come Costruirne Uno

Il marketplace dei plugin di Strapi ha oltre 500 plugin che coprono tutto, dal metadata SEO ai pagamenti con Stripe. Alcuni sono ufficiali (mantenuti dal team Strapi), altri sono realizzati dalla community. La qualità varia -- proprio come i pacchetti npm -- quindi controlla le stelle GitHub, i commit recenti e la compatibilità con Strapi 5 prima di installare.

Plugin Essenziali

Questi vengono con Strapi o richiedono un solo comando di installazione:

  • GraphQL -- aggiunge l'endpoint /graphql e GraphQL Playground
  • i18n -- supporto all'internazionalizzazione con varianti di contenuto basate sulla locale
  • Users & Permissions -- autenticazione, ruoli, accesso API pubblico/autenticato
  • Upload -- libreria media con archiviazione locale, AWS S3 o provider Cloudinary
  • Email -- email transazionale tramite SendGrid, Mailgun, Amazon SES o SMTP

Plugin della community che vale la pena esaminare: @strapi/plugin-seo (meta tag e social card), strapi-plugin-sitemap (sitemap XML generate automaticamente) e strapi-plugin-content-versioning (controllo granulare delle versioni oltre alla Content History integrata).

Costruire un Plugin Personalizzato (Strapi 5 SDK)

Strapi 5 ha introdotto un nuovo Plugin SDK che semplifica lo sviluppo dei plugin. Il tutorial ufficiale sui plugin illustra l'intero processo, ma in sintesi:

  1. Esegui npx @strapi/sdk-plugin init my-plugin per generare lo scaffold
  2. Definisci i tipi di contenuto, i controller e l'UI del pannello admin del plugin
  3. Build con npm run build e pubblica su npm

La scelta tra costruire un plugin o scrivere un controller personalizzato dipende dalla riusabilità. Se la logica è specifica al progetto, usa un controller. Se vuoi condividerla tra progetti o con la community, impacchettala come plugin.

Configurazione del Database: PostgreSQL, MySQL o SQLite?

Strapi supporta PostgreSQL, MySQL, MariaDB e SQLite out of the box. SQLite viene fornito come predefinito per i nuovi progetti perché non richiede alcuna configurazione -- ottimo per lo sviluppo e il prototipaggio. Per la produzione, PostgreSQL è la scelta raccomandata e quella su cui il team Strapi testa più intensamente.

Ecco una configurazione PostgreSQL pronta per la produzione:

typescript
// config/database.ts
export default ({ env }) => ({
  connection: {
    client: 'postgres',
    connection: {
      host: env('DATABASE_HOST', 'localhost'),
      port: env.int('DATABASE_PORT', 5432),
      database: env('DATABASE_NAME', 'strapi'),
      user: env('DATABASE_USERNAME', 'strapi'),
      password: env('DATABASE_PASSWORD', ''),
      ssl: env.bool('DATABASE_SSL', false) && {
        rejectUnauthorized: env.bool('DATABASE_SSL_REJECT', true),
      },
    },
    pool: {
      min: env.int('DATABASE_POOL_MIN', 2),
      max: env.int('DATABASE_POOL_MAX', 10),
    },
  },
});

Se stai valutando le opzioni per il database, il nostro confronto PostgreSQL vs MySQL copre le differenze in dettaglio.

DatabaseIdeale perSupporto StrapiPronto per produzione?
PostgreSQLCarichi di lavoro in produzione, query complesse, campi JSONPrimario (il più testato)
MySQL 8+Team già su infrastruttura MySQLSupporto completo
MariaDBAlternativa compatibile con MySQLSupporto completo
SQLiteSviluppo locale, prototipaggio, CI/CDSupporto completoNo (single-writer, nessun accesso concorrente)

Per applicazioni content-heavy con oltre 10.000 voci, PostgreSQL con connection pooling (PgBouncer) gestisce bene il carico. SQLite inizia a mostrare problemi di write contention a qualche centinaio di richieste concorrenti -- va bene per un admin di blog, problematico per un'API ad alto traffico.

Deploy di Strapi in Produzione

Il deployment in produzione è dove la maggior parte delle guide a Strapi si ferma -- ed è dove la maggior parte degli sviluppatori si blocca. Strapi ha bisogno di un server Node.js persistente (non è un sito statico), un database, archiviazione media e una configurazione dell'ambiente corretta. Hai due percorsi: Strapi Cloud (gestito) o self-hosted su piattaforme come Railway, Render o DigitalOcean, come descritto nella documentazione Deployment di Strapi.

Strapi Cloud (Gestito)

Strapi Cloud è l'opzione hosted ufficiale. Gestisce il provisioning del server, la gestione del database, CDN e backup. Ecco i livelli:

LivelloPrezzoProgettiChiamate APIPostiStorage
Free$0/mese110K/mese1500MB
Essential$18/mese1500K/mese325GB
Pro$90/meseIllimitati2M/mese10100GB
Scale$450/meseIllimitati10M/mese25500GB

Strapi Cloud è il percorso più veloce verso la produzione. Però è ancora in maturazione rispetto all'hosting di Contentful e Sanity -- meno regioni, controlli di accesso meno granulari, e il piano gratuito è abbastanza restrittivo. Per progetti personali o MVP il piano gratuito va bene. Per app in produzione che servono traffico reale, probabilmente avrai bisogno di Essential o Pro.

Self-Hosting su Railway o Render

Nella nostra esperienza, Railway è il percorso più veloce verso un'istanza Strapi self-hosted in produzione. Connetti il tuo repository GitHub, imposti le variabili d'ambiente, e Railway fa il resto. Per un confronto dettagliato delle piattaforme, vedi il nostro confronto Railway vs Render.

Ecco la configurazione dell'ambiente di produzione:

bash
# .env.production
NODE_ENV=production
HOST=0.0.0.0
PORT=1337

# Chiavi app (genera valori unici!)
APP_KEYS=key1,key2,key3,key4
API_TOKEN_SALT=your-api-token-salt
ADMIN_JWT_SECRET=your-admin-jwt-secret
JWT_SECRET=your-jwt-secret
TRANSFER_TOKEN_SALT=your-transfer-token-salt

# Database (Railway fornisce DATABASE_URL automaticamente)
DATABASE_CLIENT=postgres
DATABASE_HOST=${PGHOST}
DATABASE_PORT=${PGPORT}
DATABASE_NAME=${PGDATABASE}
DATABASE_USERNAME=${PGUSER}
DATABASE_PASSWORD=${PGPASSWORD}
DATABASE_SSL=true

# Archiviazione media (compatibile con S3)
AWS_ACCESS_KEY_ID=your-key
AWS_SECRET_ACCESS_KEY=your-secret
AWS_REGION=us-east-1
AWS_BUCKET=your-strapi-uploads

Se preferisci i container, puoi Dockerizzare Strapi e fare il deploy ovunque -- vedi la nostra guida sulle opzioni di containerizzazione. Railway supporta anche Nixpacks per build automatiche senza un Dockerfile.

Checklist Pre-Produzione

Prima di andare live, verifica questi punti:

  • Build del pannello admin: Esegui npm run build -- questo compila il React admin per la produzione
  • Process manager: Usa PM2 per mantenere Strapi in esecuzione e riavviarlo automaticamente in caso di crash
  • Health check: Strapi espone /_health (restituisce HTTP 204) -- punta il tuo load balancer lì
  • Archiviazione media: Passa dagli upload locali a S3 o Cloudinary -- l'archiviazione locale non persiste sulla maggior parte delle piattaforme PaaS
  • Reverse proxy: Metti Nginx o Caddy davanti a Strapi per la terminazione SSL e la cache dei file statici
  • Variabili d'ambiente: Non committare mai i segreti. Usa la gestione delle variabili d'ambiente nativa della piattaforma

Strapi vs Sanity vs Contentful: Quale Scegliere?

La scelta tra Strapi, Sanity e Contentful dipende da tre cose: se hai bisogno del self-hosting, come il tuo team collabora sui contenuti e i vincoli di budget. Tutte e tre sono piattaforme CMS headless di livello produzione, ma fanno trade-off fondamentalmente diversi. Per una copertura più approfondita, consulta la nostra guida a Sanity CMS e la guida a Contentful.

CriterioStrapiSanityContentful
Open SourceSì (MIT)No (proprietario)No (proprietario)
Self-HostingSì (obbligatorio o Cloud)No (solo hosted)No (solo hosted)
Collaborazione in tempo realeNoSì (stile Google Docs)Limitata
Linguaggio di queryREST + GraphQLGROQ + GraphQLREST + GraphQL
Piano gratuitoCommunity Edition (illimitata)500K richieste API/mese5 utenti, 25K record
Logica backend personalizzataAccesso Node.js completoSolo funzioni serverlessSolo webhook
Governance enterpriseIn crescitaForteLa più forte
Curva di apprendimentoMedia (utile conoscere Node.js)Media (GROQ è unico)Bassa-Media

Framework decisionale -- scegli in base al tuo vincolo reale:

Se hai bisogno di...ScegliPerché
Piena proprietà del codice + self-hostingStrapiUnica opzione open source con accesso backend completo
Collaborazione editoriale in tempo realeSanityEditing multiplayer in stile Google Docs
Compliance enterprise (SOC2, HIPAA)ContentfulStrumenti di governance e audit più maturi
Budget più ristretto (piccolo team)Strapi CommunityGratuito per sempre, self-hosted
Gestione dei contenuti senza codiceWordPressAncora il più semplice per i non sviluppatori
Logica API personalizzata senza servizi esterniStrapiController, service e route in un unico codebase

In Techsy costruiamo architetture CMS headless con Strapi, Sanity e Contentful. Se hai bisogno di aiuto per scegliere il CMS giusto per il tuo progetto o vuoi un setup Strapi pronto per la produzione, ottieni una consulenza gratuita.

Pro, Contro e Quando NON Usare Strapi

Dopo aver testato Strapi 5 su tre progetti client, ecco la valutazione onesta. Strapi è eccellente per i team che vogliono pieno controllo del backend, ma non è lo strumento giusto per tutti.

Pro:

  • Piena proprietà del codice -- i tuoi dati, il tuo server, le tue regole
  • Licenza MIT senza vendor lock-in
  • TypeScript-first nella v5 con forte type inference
  • Endpoint REST e GraphQL generati automaticamente dagli schemi dei contenuti
  • Community attiva: 65.000+ stelle GitHub, Discord con oltre 20.000 membri
  • Oltre 500 plugin nel marketplace
  • I controller personalizzati ti danno la flessibilità backend di Express.js
  • Strapi Cloud offre un'opzione gestita se non vuoi fare self-hosting

Contro:

  • Il self-hosting richiede lavoro operativo -- prevedi 10-20 ore al mese per aggiornamenti, monitoraggio e backup
  • Nessuna collaborazione in tempo reale (due editor possono sovrascrivere le modifiche dell'altro)
  • La migrazione da Strapi 4 a 5 crea attrito: Entity Service verso Document Service, nuovi formati di risposta, lacune nella compatibilità dei plugin
  • Strapi Cloud è ancora in maturazione rispetto alle piattaforme hosted di Contentful o Sanity
  • Minore adozione enterprise rispetto a Contentful -- meno certificazioni di compliance
  • La personalizzazione del pannello admin, pur possibile, richiede una conoscenza approfondita delle API interne di Strapi

Quando NON usare Strapi:

  • Hai bisogno di collaborazione in tempo reale -- il tuo team editoriale lavora contemporaneamente sui contenuti? Usa Sanity. Strapi non ha editing multiplayer.
  • Hai bisogno di governance enterprise e SOC2 -- organizzazione con requisiti di compliance? Contentful ha un decennio di vantaggio sugli strumenti di governance.
  • Team non tecnico, nessun supporto sviluppatore -- Strapi richiede uno sviluppatore per setup, deployment e manutenzione. Se il tuo team è tutto marketing, considera un SaaS CMS o WordPress.
  • Architettura serverless-first -- Strapi ha bisogno di un server persistente. Se stai costruendo interamente su edge function e serverless, Sanity o Contentful si adattano meglio.

FAQ

Cos'è Strapi e come funziona?

Strapi è un CMS headless open source costruito su Node.js. Definisci i tipi di contenuto tramite un builder visuale o via codice, e Strapi genera automaticamente endpoint API REST e GraphQL. Le applicazioni frontend recuperano i contenuti come JSON da questi endpoint. Il pannello admin fornisce un'interfaccia React-based agli editor per gestire le voci senza scrivere codice.

Strapi è gratuito?

Sì. Strapi Community Edition è gratuito e open source sotto licenza MIT. Puoi fare il self-host sul tuo server senza limiti di utilizzo, senza restrizioni sui posti e senza limiti alle chiamate API. Strapi Cloud (l'opzione di hosting gestito) ha un piano gratuito con 10.000 chiamate API al mese, con piani a pagamento a partire da $18/mese per limiti più alti.

Qual è la differenza tra Strapi e Contentful?

Strapi è open source e self-hosted, dandoti pieno accesso al codice e proprietà dei dati. Contentful è una piattaforma SaaS proprietaria con governance enterprise più forte, certificazioni di compliance e un toolset editoriale più ampio. Scegli Strapi per il controllo del codice e la flessibilità del budget. Scegli Contentful per le esigenze di compliance enterprise e team editoriali più grandi che hanno bisogno di infrastruttura gestita.

Strapi è adatto ai principianti?

Strapi è accessibile ai principianti se hai conoscenze di base di Node.js e JavaScript. Il pannello admin e il Content-Type Builder sono visuali e intuitivi -- non serve codice per la modellazione dei contenuti. Il deployment e la logica backend personalizzata richiedono esperienza da sviluppatore. Per assoluti principianti senza background di coding, WordPress o un SaaS CMS completamente gestito sarebbero punti di partenza più semplici.

Quale database usa Strapi?

Strapi supporta PostgreSQL, MySQL, MariaDB e SQLite. I nuovi progetti usano SQLite come predefinito per lo sviluppo senza configurazione. PostgreSQL è raccomandato per i carichi di lavoro in produzione -- è il database più testato con Strapi e gestisce bene l'accesso concorrente, le query complesse e i tipi di campo JSON. La connessione al database si configura in config/database.ts.

Come si fa il deploy di Strapi in produzione?

Puoi fare il deploy di Strapi su Strapi Cloud (hosting gestito a partire da $18/mese), o in self-hosting su piattaforme come Railway, Render, DigitalOcean o AWS. Il self-hosting richiede la configurazione di un server Node.js, database PostgreSQL, variabili d'ambiente, archiviazione media (S3 o Cloudinary) e un process manager come PM2. Esegui npm run build prima del deploy per compilare il pannello admin.

Strapi è migliore di WordPress?

Strapi e WordPress risolvono problemi diversi. Strapi è un CMS headless che serve API JSON a qualsiasi frontend -- ideale per sviluppatori che costruiscono app personalizzate, distribuzione di contenuti multi-piattaforma o siti JavaScript-heavy. WordPress è un CMS tradizionale che renderizza pagine HTML -- migliore per utenti non tecnici che vogliono temi, builder drag-and-drop e un ecosistema di plugin enorme senza scrivere codice.

Quali sono gli svantaggi di Strapi?

Gli svantaggi principali sono il carico operativo del self-hosting (aggiornamenti, monitoraggio, backup), la mancanza di collaborazione in tempo reale per i team editoriali, l'attrito nella migrazione tra versioni principali (da v4 a v5 ha richiesto modifiche al codice) e un'offerta enterprise meno matura rispetto a Contentful. Strapi Cloud risolve il problema dell'hosting ma sta ancora recuperando terreno su funzionalità e disponibilità globale.

Strapi può gestire applicazioni su larga scala?

Sì. Strapi può gestire applicazioni su larga scala con la giusta infrastruttura: PostgreSQL con connection pooling, scalabilità orizzontale dietro un load balancer, CDN per gli asset media e Redis per il caching. Aziende come IBM, NASA e Toyota usano Strapi in produzione. Il collo di bottiglia è di solito le performance del database e la configurazione dell'hosting, non Strapi in sé.

Cos'è Strapi Cloud e quanto costa?

Strapi Cloud è la piattaforma di hosting gestito ufficiale per i progetti Strapi. Gestisce il provisioning del server, la gestione del database, CDN e backup automatici. I prezzi partono con un piano gratuito (1 progetto, 10K chiamate API/mese), poi Essential a $18/mese, Pro a $90/mese e Scale a $450/mese. Ogni livello aumenta i limiti delle chiamate API, i posti nel team e la capacità di archiviazione.

Tag

guida-strapiheadless-cmsstrapi-5cms-open-sourcecms-nodejs

Condividi questo articolo

Il Tuo Prossimo Passo

Hai un progetto in mente? Parliamone.

Prenota una call di 30 minuti. Ti ascoltiamo, capiamo il problema e ti diciamo se possiamo aiutarti.