🍺 Buy me a beer
💧

Drupal per Svogliati

Il CMS che è anche un framework: entità, campi, Views, moduli, temi, hook e config management. Tutto quello che serve per capirlo e gestirlo — dalla goccia blu al deploy in produzione, senza vendere fuffa.

"Drupal è complicato" — no, è strutturato. Ha una curva d'apprendimento ripida perché ti dà in mano un modello dati serio invece di un tema con 200 plugin che litigano. La fatica iniziale è l'investimento.

01 / 13

Cos'è Drupal (e cosa non è)

Drupal è un CMS open-source (GPL) scritto in PHP, nato nel 2001. Ma la definizione onesta è un'altra: è un framework per costruire applicazioni web strutturate attorno a contenuti, con un CMS già montato sopra.

💡 L'analogia dei mobili

WordPress è un mobile IKEA già montato: apri la scatola, è un blog/sito, pronto in 10 minuti. Bellissimo finché ti va bene quella forma. Drupal è una falegnameria con attrezzi professionali: nessun mobile pronto, ma puoi costruire esattamente la struttura che ti serve — un portale con 12 tipi di contenuto correlati, permessi granulari, flussi editoriali, multilingua — senza incollare insieme 40 plugin che si odiano. La falegnameria richiede di imparare gli attrezzi. Ma quando il progetto è complesso, il mobile IKEA non basta più.

Drupal brilla quando...

  • Hai molti tipi di contenuto con relazioni tra loro
  • Servono permessi e ruoli granulari
  • Multilingua serio (non un plugin appiccicato)
  • Flussi editoriali, moderazione, revisioni
  • Il sito è una piattaforma che crescerà per anni
  • Enti pubblici, università, editoria, portali B2B

Drupal è overkill quando...

  • Ti serve un blog o una vetrina e basta
  • Budget e tempi risicati, contenuti semplici
  • Nessuno nel team vuole imparare il modello dati
  • Ti serve un e-commerce "chiavi in mano" (lì valuta altro)
  • Vuoi cambiare tema con un click ogni settimana

🏗️ Su cosa poggia (lo stack)

Drupal moderno non è più "solo PHP con qualche funzione": è costruito su componenti Symfony, gestito con Composer, con i template in Twig. Chi arriva da WordPress trova un mondo più ingegneristico e meno "clicca e vai".

DRUPAL CORE+ contrib + custom
entità, campi, Views, utenti
il CMS e le tue estensioni: moduli e temi
SYMFONY + TWIGil framework
routing, DI, HttpKernel
componenti PHP professionali sotto il cofano
PHP + COMPOSERruntime + dipendenze
PHP 8.3+, autoloading
il linguaggio e il gestore dei pacchetti
WEB + DBinfrastruttura
Nginx/Apache + MariaDB/PostgreSQL
server web e database (+ opzionale Redis, Solr)
💧 Il logo di Drupal è una goccia d'acqua ("Druplicon"). Il nome viene dall'olandese "druppel" (goccia): il creatore Dries Buytaert voleva chiamarlo "dorp" (villaggio) ma sbagliò a digitare il dominio. Un typo diventato uno dei CMS più usati al mondo.
02 / 13

Versioni, ciclo di rilascio e Drupal CMS

Capire le versioni ti evita di costruire su qualcosa che muore tra sei mesi. Drupal ha cambiato radicalmente il modo di aggiornarsi con la versione 8, e nel 2025 ha aggiunto una novità grossa: Drupal CMS.

📅 Il ciclo di rilascio (dati a metà 2026)

Da Drupal 8 in poi vale la regola semantica: una major ogni 2 anni (anni pari), una minor ogni 6 mesi con nuove funzionalità retro-compatibili. Il salto tra major moderne (8→9→10→11) è molto più facile del vecchio incubo 6→7→8.

VersioneStato (lug 2026)Note
Drupal 7Morto (EOL gen 2025)Architettura vecchia, niente Composer. Da migrare, punto.
Drupal 9EOL (nov 2023)Ponte tra 8 e 10. Non usarlo più.
Drupal 10EOL 9 dic 2026Ancora diffusissimo. Se sei qui, pianifica la migrazione a 11.
Drupal 11Attuale (11.4)Uscito lug 2024. PHP 8.3+, Symfony 7. Il target di oggi.
Drupal 12Atteso ~dic 2026Prossima major. Aggiornamento previsto indolore da 11.
⚠️ Se hai un sito Drupal 10 in produzione Va in end-of-life il 9 dicembre 2026: dopo quella data niente più patch di sicurezza. Il salto 10→11 è per lo piuù una questione di aggiornare i moduli contrib e togliere le API deprecate (usa lo strumento Upgrade Status). Non è una migrazione traumatica come ai vecchi tempi, ma non aspettare novembre.

🚀 Drupal CMS (ex "Starshot") — la novità del 2025

Storicamente Drupal "core" ti dà una scatola quasi vuota: potente ma da assemblare. Drupal CMS (lanciato a gennaio 2025) è una distribuzione ufficiale costruita su Drupal 11 pensata per marketer e non-sviluppatori: arriva già configurata, con strumenti no-code per costruire il sito senza toccare codice.

🥦

Recipes

Pacchetti di configurazione applicabili con un click (blog, SEO, eventi...).

🔧

Experience Builder

Costruzione visuale delle pagine, drag & drop.

🔄

Auto Updates

Aggiornamenti automatici e Project Browser per installare moduli dall'admin.

💡 Drupal "core" o Drupal CMS? Stesso motore sotto (Drupal 11). Drupal CMS = parti in discesa con tanto già pronto, ideale per chi vuole risultati veloci e meno codice. Drupal core "vuoto" = pieno controllo per chi costruisce una piattaforma su misura da zero. Per imparare i fondamentali (questa guida) il core è più didattico; per andare in produzione in fretta, Drupal CMS.
03 / 13

Installazione & ambiente

Dimentica il "scarica lo zip e scompatta": Drupal moderno si installa e si gestisce con Composer. È il modo giusto, ed è ciò che ti permette di aggiornare senza impazzire.

📦 Requisiti minimi (Drupal 11)

ComponenteConsigliato
PHP8.3+ (con estensioni gd, pdo, mbstring, opcache)
Web serverNginx o Apache
DatabaseMariaDB 10.6+ / MySQL 8+ / PostgreSQL 16+ / SQLite
Composer2.x (obbligatorio)
Drush13.x (la CLI, altamente consigliata)

⚙️ Installare con Composer, passo passo

creare un progetto Drupal 11 e installarlo
# 1. crea lo scheletro del progetto (scarica core + dipendenze)
composer create-project drupal/recommended-project miosito
cd miosito

# 2. installa Drush (la riga di comando di Drupal)
composer require drush/drush

# 3. installa il sito da CLI (invece del wizard nel browser)
./vendor/bin/drush site:install --db-url="mysql://user:pass@localhost/miodb" \
    --site-name="Il Mio Sito" --account-name=admin -y

# il docroot pubblico è la cartella web/ — punta lì il vhost
# NON esporre mai l'intera cartella del progetto: vendor/ deve restare fuori
🔒 La regola di sicurezza numero uno del docroot Il web server deve puntare solo a web/. Le cartelle vendor/, i file composer.json, .env e la config non devono essere raggiungibili via HTTP. Esporre l'intera cartella del progetto è l'errore che regala il tuo settings.php (con le credenziali del DB) al primo che passa.

🔬 Ambiente di sviluppo locale

Non installare PHP/MySQL a mano sul tuo portatile: usa uno strumento che ti dà l'ambiente pronto e replicabile.

🐘

DDEV

Il più usato oggi: Docker sotto, un comando e hai Drupal in locale. Consigliato.

🏖️

Lando

Alternativa a DDEV, sempre su Docker. Molto configurabile.

🖥️

Docker "a mano"

Massimo controllo, più lavoro. Per chi sa già cosa fa.

💧
DDEV in 3 comandiddev config --project-type=drupal11, poi ddev start, poi ddev composer create drupal/recommended-project. Ti tira su PHP, il database e un URL locale con HTTPS, senza sporcare il tuo sistema. Se usi Docker, dai un'occhiata alla guida Docker per Svogliati.
04 / 13

Il modello dati: entità, bundle, campi

Questo è il concetto che sblocca Drupal. Se capisci entità / bundle / campi, hai capito il 70% del sistema. Se non lo capisci, ti sembrerà caos. Fermati qui e leggi con calma.

💡 L'analogia degli schedari

Pensa a un ufficio pieno di schedari. Ogni tipo di schedario è un'entità (Contenuto, Utente, Taxonomy, Media...). Dentro un tipo di schedario ci sono cassetti diversi per categoria: sono i bundle (per il contenuto: Articolo, Pagina, Evento). Ogni scheda dentro un cassetto è una singola voce (un articolo preciso). E le righe da compilare sulla scheda (titolo, data, foto, autore) sono i campi. Costruire un sito Drupal significa in gran parte: decidere quali cassetti creare e quali righe mettere su ogni scheda.

📁 La gerarchia, dall'alto in basso

ENTITY TYPEil tipo di schedario
Node, User, Taxonomy, Media
le grandi categorie di "cose" che Drupal sa gestire
↓ si specializza in
BUNDLEil cassetto
Articolo, Pagina, Evento
le sotto-tipologie che definisci tu (per i Node = "content type")
↓ contiene
FIELDla riga da compilare
titolo, data, immagine, testo
i pezzi di dato; li aggiungi a un bundle. Riusabili tra bundle
↓ valorizzato in
ENTITY (istanza)la scheda compilata
"Articolo: Buon 2026"
il contenuto reale che l'editor crea e pubblica

📄 Le entità principali

  • Node — il contenuto vero e proprio (articoli, pagine). Il più usato.
  • User — gli account. Sì, anche gli utenti sono entità con campi.
  • Taxonomy term — le categorie/tag per classificare.
  • Media — immagini, video, documenti gestiti come entità.
  • Block content — blocchi di contenuto riutilizzabili.
  • Paragraph (contrib) — componenti ricchi dentro un contenuto.

🧩 Config vs Content: la distinzione chiave

Drupal separa nettamente due mondi, e capirlo è vitale per il deploy (cap. 11):

  • Configuration — la struttura: quali content type esistono, quali campi, le impostazioni. Va in Git.
  • Content — i dati: i singoli articoli, utenti, commenti. Vivono nel DB, non in Git.

Un campo è configurazione; il valore che ci metti dentro è contenuto. Confondere i due è la causa n.1 di deploy andati male.

💡 Perché è così potente — poiché tutto è un'entità con campi, gli stessi strumenti funzionano ovunque: puoi mettere un campo immagine su un articolo, su un utente o su un termine di tassonomia con la stessa identica interfaccia. Viste, permessi, traduzioni, API REST: tutto ragiona in termini di entità e campi. Impari il pattern una volta, lo applichi dappertutto.
05 / 13

Content type, campi e tassonomia

Ora che sai cosa sono, vediamo come si costruiscono in pratica dall'interfaccia: creare un tipo di contenuto, aggiungere campi e organizzare i contenuti con la tassonomia. Tutto senza scrivere codice.

📝 Creare un content type

Da Struttura → Tipi di contenuto (/admin/structure/types) crei un nuovo bundle di Node. Esempio: un content type "Evento". Drupal ti dà già il campo Titolo e un Body; tu aggiungi il resto.

Per ogni content type controlli tre schede fondamentali:

  • Manage fields — quali campi esistono (data, luogo, immagine...)
  • Manage form display — come appare il form di inserimento all'editor
  • Manage display — come i campi vengono mostrati in pagina (ordine, etichette, formato)

🔧 I tipi di campo più usati

Tipo di campoPer cosa
Text (plain / formatted)Titoli brevi o testo ricco con editor WYSIWYG
Number / Email / LinkDati tipizzati con validazione automatica
DateDate ed eventi (con o senza ora, con range)
Image / File / MediaAllegati; Media è il modo moderno e riusabile
Entity referenceIl più potente: collega un'entità a un'altra (un evento → un relatore)
Boolean / ListSì/no, o una scelta da un elenco predefinito
🔗 Entity reference è la colla di Drupal. È ciò che trasforma tanti contenuti isolati in una struttura relazionale: un articolo che punta al suo autore, un evento che punta alla sua sede, un prodotto che punta alle sue categorie. Quando qualcuno dice "Drupal è relazionale mentre WordPress è piatto", parla di questo.

🏷️ Tassonomia: classificare i contenuti

La tassonomia è il sistema di categorizzazione. Crei dei vocabolari (es. "Argomenti", "Regioni") e dentro ci metti i termini (es. "Sicurezza", "Networking"). Poi colleghi un campo entity reference ai termini dal tuo content type. Risultato: filtri, pagine per categoria, menu automatici, tutto guidato dai dati.

esempio: la struttura di un content type "Evento"
Content type: Evento  (bundle del Node)
  ├─ field_titolo        → Text (plain)        # il titolo
  ├─ field_data          → Date (range)        # inizio/fine
  ├─ field_luogo         → Entity reference    # → entità "Sede"
  ├─ field_relatori      → Entity reference    # → entità "Persona" (multiplo)
  ├─ field_argomenti     → Entity reference    # → termini tassonomia
  └─ field_locandina     → Media (immagine)    # la grafica

# Da questa struttura, senza codice, puoi generare:
# liste filtrabili (Views), pagine per argomento, feed, API REST.
06 / 13

Views: query senza scrivere SQL

Se il modello dati è il cuore, Views è il superpotere. È un costruttore visuale di query: crei liste, tabelle, griglie, feed, blocchi — filtrati, ordinati, paginati — senza scrivere una riga di SQL. In core da Drupal 8.

💡 L'analogia del filtro Excel su steroidi

Hai presente quando in Excel metti i filtri sulle colonne e ordini una tabella? Views è quello, ma su tutto il tuo sito e con l'output che vuoi. "Dammi tutti gli Eventi futuri, dell'argomento Sicurezza, ordinati per data, 10 per pagina, mostrati come griglia di card." Componi questa richiesta con dei menù a tendina, e Views genera la query ottimizzata, il markup e la paginazione. Il 90% delle "liste" che vedi su un sito Drupal — ultimi articoli, archivio, correlati, sidebar — sono Views.

🧩 I mattoni di una View

  • Display — la forma dell'output: una Page (URL proprio), un Block (da piazzare in una regione), un Feed, un endpoint REST.
  • Fields — quali campi mostrare (o mostra l'intera entità).
  • Filter criteria — le condizioni: pubblicato, tipo = Evento, data > oggi.
  • Sort criteria — l'ordinamento.
  • Contextual filters — filtri dinamici dall'URL (es. mostra solo gli articoli di quell'autore).
  • Relationships — segui le entity reference per pescare dati collegati.
  • Pager / Format — paginazione e stile (tabella, griglia, lista, HTML).
Regola dello svogliato — prima di scrivere codice per generare una lista, chiediti "posso farlo con una View?". Nel 90% dei casi sì. Scrivere una query custom quando bastava una View è il tipico errore di chi arriva da altri framework: butti via cache, permessi e manutenibilità che Views ti darebbe gratis.
⚠️ Il rovescio della medaglia Views è comodo ma può generare query pesanti se abusi di relationship e filtri complessi su tanti contenuti. Su siti grandi tieni d'occhio le performance, abilita la cache delle View, e per ricerche davvero complesse valuta Search API + Solr invece di spremere Views oltre il suo scopo.
07 / 13

Blocchi, regioni, menu e layout

Hai i contenuti e le liste. Ora: dove finiscono sulla pagina? Drupal organizza il layout con regioni (definite dal tema) in cui piazzi blocchi, più i sistemi di menu per la navigazione.

🧱 Regioni e blocchi

Il tema definisce delle regioni (header, contenuto, sidebar, footer...). Un blocco è un pezzo di contenuto che assegni a una regione dalla Block layout (/admin/structure/block). Un blocco può essere: il menù principale, il logo, una View-block, un form di ricerca, o del contenuto tuo.

HEADERregione
logo + menu principale
blocchi in cima, presenti su tutte le pagine
CONTENTregione principale
il nodo o la View
dove va il contenuto vero della pagina
SIDEBARregione laterale
correlati, filtri, banner
blocchi contestuali, spesso View o menu
FOOTERregione
link, contatti, credits
blocchi in fondo, globali
💡 Ogni blocco ha delle condizioni di visibilità: mostralo solo su certe pagine, solo a certi ruoli, solo per certi tipi di contenuto. È così che costruisci layout diversi senza duplicare pagine.

🧭 Menu

Drupal ha un sistema di menu nativo: crei voci, le annidi, le riordini con drag & drop. Il Main menu e il Footer menu arrivano di default. Ogni menu diventa un blocco che piazzi dove vuoi. Le voci possono puntare a nodi, viste, URL esterni.

🔧 Layout Builder

Per un controllo più fine, Layout Builder (in core) ti fa comporre visualmente il layout di un intero content type o di un singolo nodo: righe, colonne, blocchi trascinati dentro. È il ponte tra la struttura rigida a regioni e la composizione libera delle pagine.

08 / 13

Utenti, ruoli e permessi

Uno dei punti dove Drupal umilia la concorrenza: un sistema di permessi granulare costruito su ruoli. Chi può fare cosa è deciso riga per riga, non "admin o non-admin".

👤 Il modello: utenti → ruoli → permessi

Gli utenti hanno uno o più ruoli. Ai ruoli assegni i permessi (centinaia, uno per ogni azione: "creare articoli", "modificare i propri articoli", "amministrare i menu"...). Un utente può fare la somma di ciò che i suoi ruoli gli concedono. Non assegni mai permessi al singolo utente: sempre via ruolo.

UID 1il superutente
bypassa tutti i permessi
il primo utente creato: può tutto. Usalo il meno possibile
ADMINISTRATORruolo
quasi tutti i permessi
chi amministra il sito nel quotidiano
EDITOR / AUTHORruoli custom
crea/modifica contenuti
i ruoli che definisci tu per la redazione
AUTHENTICATEDruolo base
chiunque sia loggato
e ANONYMOUS = i visitatori non loggati
☠️ UID 1: il pericolo silenzioso Il primo utente (UID 1) ha un bypass totale: ignora ogni controllo di permesso, sempre. Non usarlo per il lavoro quotidiano, non condividerlo, dagli una password lunghissima. Crea ruoli e account normali per te e gli altri. Se un attaccante prende UID 1, ha preso tutto. (Da Drupal 11 il privilegio di UID 1 è ridimensionabile, ma la prudenza resta.)

Permessi fatti bene

  • Un ruolo per funzione (Editor, Revisore, Autore)
  • Principio del minimo privilegio: dai solo il necessario
  • Usa "modifica i propri contenuti" quando basta
  • Rivedi i permessi dopo ogni modulo installato

Errori classici

  • Dare "administer" a mezza redazione "per comodità"
  • Concedere permessi pericolosi ad Authenticated
  • Usare UID 1 come account di lavoro normale
  • Permessi come "administer users" a chi non serve (escalation!)
09 / 13

Moduli e temi

Drupal core è deliberatamente essenziale. La potenza arriva dai moduli (funzionalità) e dai temi (aspetto). Sapere da dove vengono e come si installano correttamente ti salva da mille guai.

🧩 Le tre origini di un modulo

📦

Core

Inclusi in Drupal: Views, Media, Layout Builder, JSON:API. Attivi/disattivi.

🌐

Contrib

Della community, da drupal.org. Migliaia. Si installano con Composer.

🔧

Custom

I tuoi, scritti su misura. Vivono in web/modules/custom/.

installare moduli contrib nel modo giusto
# SEMPRE con Composer — scarica il modulo e le sue dipendenze
composer require drupal/admin_toolbar drupal/pathauto drupal/token

# poi abilitalo con Drush (o dall'interfaccia /admin/modules)
drush pm:enable admin_toolbar pathauto token -y

# aggiornare un modulo
composer update drupal/pathauto -W
drush updatedb -y          # applica gli update di schema al DB

# MAI scaricare lo zip e scompattarlo a mano: rompe Composer
# e rende impossibile aggiornare in sicurezza.

Moduli contrib "quasi obbligatori"

ModuloA cosa serve
admin_toolbarRende la barra di amministrazione usabile (menù a tendina)
pathauto + tokenURL puliti automatici (/eventi/titolo invece di /node/42)
paragraphsComponenti di contenuto ricchi e riordinabili
webformForm complessi (contatti, sondaggi) senza codice
metatagSEO: meta tag, Open Graph, Twitter card
search_api + SolrRicerca avanzata e sfaccettata
gin (tema admin)Backend moderno e gradevole

🎨 Temi e Twig

Un tema controlla l'aspetto. Il frontend di riferimento moderno è Olivero (core); per l'admin, Claro o Gin. I template usano Twig, il motore di Symfony: pulito, sicuro (escaping automatico), niente PHP sparso nell'HTML.

node--evento.html.twig — un template Twig
{# override del template per il content type "evento" #}
<article class="evento">
  <h2>{{ label }}</h2>

  {% if content.field_data %}
    <time>{{ content.field_data }}</time>
  {% endif %}

  <div class="corpo">{{ content.body }}</div>
</article>

{# {{ }} stampa (con escaping), {% %} logica. Mai concatenare
   HTML a mano: Twig protegge da XSS di default. #}
10 / 13

Sviluppo: hook, plugin, servizi

Quando l'interfaccia non basta, scrivi un modulo custom. Drupal moderno è orientato agli oggetti e usa i pattern di Symfony: dependency injection, plugin, eventi. Ma sopravvive anche il vecchio sistema degli hook.

🔧 Un modulo custom minimo

Un modulo è una cartella con almeno un file .info.yml che lo descrive. Da lì aggiungi routing, controller, servizi, hook.

web/modules/custom/miomodulo/miomodulo.info.yml
name: 'Il Mio Modulo'
type: module
description: 'Fa qualcosa di utile'
package: Custom
core_version_requirement: '^11'
dependencies:
  - drupal:node

🪝 Hook: agganciarsi al flusso

Gli hook sono funzioni con un nome convenzionale che Drupal chiama in momenti precisi. Vuoi modificare un form? Implementi hook_form_alter(). È il modo "classico", ancora vivo per tante cose.

miomodulo.module
function miomodulo_form_alter(
    &$form, $form_state, $form_id) {
  if ($form_id == 'node_evento_form') {
    $form['field_luogo']['#weight'] = -10;
  }
}

🔌 Plugin: estendere per tipi

I plugin sono il modo moderno per fornire "una cosa di un certo tipo": un blocco, un campo, un formatter, una regola di accesso. Sono classi PHP con un'annotazione/attributo che le registra. Riusabili e scopribili dal sistema.

un blocco custom (plugin)
#[Block(
  id: 'saluto',
  admin_label: 'Blocco Saluto',
)]
class SalutoBlock extends BlockBase {
  public function build() {
    return ['#markup' => 'Ciao svogliato!'];
  }
}

🏭 Servizi e dependency injection

La logica riusabile vive nei servizi (oggetti registrati nel container). Invece di richiamare funzioni globali, inietti i servizi che ti servono. È il cuore Symfony di Drupal: testabile, disaccoppiato, pulito.

usare un servizio via dependency injection
// invece di funzioni globali, chiedi il servizio al container
$logger  = \Drupal::service('logger.factory')->get('miomodulo');
$current = \Drupal::currentUser();
$node    = \Drupal::entityTypeManager()
              ->getStorage('node')->load(42);

// \Drupal::service() va bene per script veloci, ma nei tuoi
// controller/plugin inietta le dipendenze dal costruttore:
// è testabile e non ti accoppia al container globale.
💧
Vuoi scrivere moduli custom senza sbatterti? Un agente di coding come Claude Code conosce bene le API di Drupal (hook, plugin, servizi, entity query) ed è ottimo per scaffolding e boilerplate. Se ti interessa capire come ragiona uno strumento del genere, c'è la guida Come funziona l'IA Agentica.
11 / 13

Config management & deploy

Come porti in produzione una modifica fatta in locale? In Drupal la configurazione è codice: si esporta in file YAML, si versiona in Git, si importa in produzione. È la funzionalità che ha reso Drupal 8+ professionale.

💡 L'analogia della fotografia della struttura

Immagina di poter fare una fotografia di tutta la struttura del sito — content type, campi, viste, impostazioni — e salvarla in file di testo. Cambi qualcosa in locale, rifai la foto, la metti in Git. In produzione, invece di rifare a mano gli stessi click, "sviluppi la foto" e la struttura si allinea da sola. Questo è il Configuration Management (CMI): niente più "in locale funziona ma in produzione ho dimenticato di creare quel campo".

🔄 Il workflow: export → Git → import

il ciclo di deploy della configurazione
# === IN LOCALE (dopo aver modificato la struttura) ===
drush config:export -y        # scrive tutta la config in file YAML (config/sync)
git add config/ && git commit -m "Aggiunto content type Evento"
git push

# === IN PRODUZIONE (dopo il git pull) ===
composer install --no-dev      # allinea core e moduli
drush config:import -y        # applica la config fotografata
drush updatedb -y            # update di schema DB dei moduli
drush cache:rebuild          # svuota le cache

# Questi 4 comandi in produzione, in quest'ordine, sono
# il 90% dei deploy Drupal. Spesso in uno script deploy.sh.

🌐 Ambienti multipli

Il flusso classico è local → staging → produzione. Il codice e la configurazione viaggiano via Git in avanti; i contenuti (che sono dati, non config) viaggiano semmai indietro (produzione → locale) con un dump del DB per lavorare su dati reali.

🥦 Config split & override

A volte vuoi config diversa per ambiente (moduli di debug attivi solo in locale). Si gestisce con Config Split e con override in settings.php per ambiente. Così la stessa base di config si adatta senza fork.

⚠️ L'errore che fanno tutti la prima volta Modificare la struttura direttamente in produzione dall'interfaccia. Al primo config:import successivo, Drupal vede che la config del DB non combacia con quella in Git e sovrascrive le tue modifiche. Regola ferrea: la struttura si cambia in locale, si esporta, si versiona. La produzione la riceve, non la genera.
12 / 13

Gestione: sicurezza, aggiornamenti, performance

Un sito Drupal si gestisce, non si "installa e dimentica". Aggiornamenti di sicurezza, cache, backup: la routine da sysadmin che tiene il sito vivo e non bucato.

🔒 Sicurezza & aggiornamenti

Il Drupal Security Team rilascia patch il mercoledì (giorno standard degli advisory). Restare aggiornati è la singola cosa più importante: la stragrande maggioranza dei siti Drupal bucati erano semplicemente non aggiornati.

routine di aggiornamento sicura
# controlla cosa è da aggiornare (core e contrib)
composer outdated "drupal/*"
drush pm:security             # solo gli update DI SICUREZZA

# aggiorna core (con le dipendenze)
composer update drupal/core-recommended -W
drush updatedb -y
drush cache:rebuild

# SEMPRE: backup prima, test su staging, poi produzione.
# Drupal CMS offre gli Automatic Updates per il core.

Igiene di sicurezza

  • Aggiorna appena esce un advisory di sicurezza
  • Backup automatici di DB + file, testati
  • HTTPS ovunque, permessi file corretti
  • Solo moduli mantenuti (guarda l'ultima release)
  • UID 1 blindato, ruoli a minimo privilegio

Come ci si buca

  • Ignorare gli update "perché funziona"
  • Moduli contrib abbandonati da anni
  • Hackerare il core a mano (niente più update!)
  • settings.php e vendor/ esposti sul web
  • Permessi PHP scrivibili su cartelle sbagliate

Performance & cache

Drupal ha un sistema di cache a livelli molto sofisticato (cache tag, contexts, BigPipe). Le basi che fanno la differenza:

  • Cache di pagina per gli anonimi: pagine servite quasi statiche
  • Dynamic Page Cache + BigPipe per i loggati
  • Aggregazione CSS/JS attiva in produzione
  • Redis/Memcached come cache backend sui siti grandi
  • Reverse proxy (Varnish) o CDN davanti
  • drush cache:rebuild quando "qualcosa non si aggiorna"
💡 Il primo comando che imparerai a memoria è drush cr (cache:rebuild). Il 70% dei "ho fatto una modifica ma non si vede" si risolve svuotando la cache. Il restante 30% è che stavi guardando l'ambiente sbagliato.
13 / 13

Cheat sheet & glossario

I comandi Drush che userai ogni giorno e i termini da tenere a mente. Da tenere aperto in un tab.

Drush — i comandi essenziali

drush quotidiano
drush cr                # cache:rebuild (il salvavita)
drush uli               # link di login one-time
drush cim / cex         # config import / export
drush updb              # updatedb (schema DB)
drush pmu / pm:enable   # abilita/disabilita moduli
drush sql:dump          # dump del database
drush status            # stato del sito
drush ws                # watchdog: i log
drush upwd admin        # cambia password utente

🔗 URL di amministrazione utili

percorsi admin
/admin/content            # i contenuti
/admin/structure/types    # content type
/admin/structure/views    # le Views
/admin/structure/block    # blocchi e regioni
/admin/people             # utenti
/admin/people/permissions # permessi
/admin/modules            # moduli
/admin/config             # configurazione
/admin/reports/status     # report di stato

📚 Glossario da sopravvivenza

TermineIn parole povere
NodeUn singolo contenuto (un articolo, una pagina). L'entità più comune.
EntityQualsiasi "cosa" gestita da Drupal: nodo, utente, termine, media...
BundleUna sotto-tipologia di entità. Per i Node = il "content type".
FieldUn pezzo di dato aggiunto a un bundle (data, immagine, riferimento...).
Content typeUn tipo di contenuto che definisci tu (Articolo, Evento, Prodotto).
TaxonomySistema di categorie: vocabolari che contengono termini.
ViewUna lista/tabella/griglia di contenuti costruita senza SQL.
BlockUn pezzo di contenuto piazzabile in una regione del tema.
RegionUna zona del layout definita dal tema (header, sidebar, footer).
HookUna funzione con nome convenzionale che Drupal chiama in un dato momento.
PluginClasse che fornisce "una cosa di un tipo" (blocco, campo, formatter).
ServiceOggetto riusabile nel container; lo inietti dove serve (DI).
TwigIl motore di template (da Symfony) usato nei temi.
DrushLa riga di comando di Drupal: gestisci il sito da terminale.
ComposerIl gestore di dipendenze PHP: come installi/aggiorni Drupal e i moduli.
CMI / config syncConfiguration Management: la struttura esportata in YAML e versionata.
RecipePacchetto di configurazione applicabile (novità usata da Drupal CMS).
Drupal CMSDistribuzione no-code su base Drupal 11 per non-sviluppatori.
UID 1Il primo utente: bypassa ogni permesso. Da blindare.

📚 Per approfondire

  • drupal.org — documentazione ufficiale e moduli contrib
  • drupalize.me — i migliori tutorial (a pagamento, ottimi)
  • Drupal Slack / Discord — community attivissima
  • DrupalCon — la conferenza; le session finiscono su YouTube
  • Selwyn Polit — "Drupal at your fingertips" — ricettario per sviluppatori

🔗 Guide collegate

  • Docker — per l'ambiente locale (DDEV/Lando)
  • PostgreSQL, MySQL & SQL — il database MySQL/MariaDB che sta sotto ogni Drupal
  • Linux Admin — gestire il server LEMP sotto
  • Git — il versionamento di codice e config
  • CI/CD — automatizzare i deploy Drupal
💧
Regola finale dello svogliato — Drupal punisce chi improvvisa e premia chi capisce il modello. Impara entità / bundle / campi, usa Views invece di scrivere query, gestisci la config in Git e aggiorna sempre: con questi quattro pilastri hai un sito che regge per anni. Tutto il resto è dettaglio.