Blogging · 12 min read · Oct 23, 2025

Come distribuire Ghost Blog con Nginx su Debian 12

Ghost è una piattaforma di blogging open-source che ti aiuta a creare un blog dall’aspetto professionale. È stata lanciata nel 2013 come alternativa a WordPress. È scritta in JavaScript ed è alimentata dalla libreria Node.js.

In questo tutorial, esploreremo come installare Ghost CMS utilizzando Nginx e MySQL su un server alimentato da Debian 12. Utilizzeremo il certificato SSL di Let’s Encrypt per proteggere la nostra installazione.

Prerequisiti

  • Un server che esegue Debian 12 con un minimo di 2GB di RAM.
  • Un utente non root con privilegi sudo.
  • Un Nome di Dominio Completo (FQDN) come example.com che punta al tuo server.
  • Assicurati che tutto sia aggiornato. $ sudo apt update $ sudo apt upgrade
  • Alcuni pacchetti di cui il tuo sistema ha bisogno. $ sudo apt install wget curl nano ufw software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release debian-archive-keyring unzip -y Alcuni di questi pacchetti potrebbero già essere installati sul tuo sistema.

Passo 1 - Configurare il Firewall UFW

Il primo passo è configurare il firewall. Debian viene fornito con ufw (Uncomplicated Firewall) per impostazione predefinita.

Controlla se il firewall è attivo.

$ sudo ufw status

Dovresti ottenere il seguente output.

Status: inactive

Consenti la porta SSH in modo che il firewall non interrompa la connessione attuale quando viene abilitato.

$ sudo ufw allow OpenSSH

Consenti anche le porte HTTP e HTTPS.

$ sudo ufw allow http
$ sudo ufw allow https

Abilita il Firewall

$ sudo ufw enable
Il comando potrebbe interrompere le connessioni ssh esistenti. Procedere con l'operazione (y|n)? y
Il firewall è attivo e abilitato all'avvio del sistema

Controlla di nuovo lo stato del firewall.

$ sudo ufw status

Dovresti vedere un output simile.

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443                        ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)

Passo 2 - Installare Nginx

Debian 12 viene fornito con una versione più vecchia di Nginx. Per installare l’ultima versione, è necessario scaricare il repository ufficiale di Nginx.

Importa la chiave di firma di Nginx.

$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Aggiungi il repository per la versione stabile di Nginx.

$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] \
http://nginx.org/packages/debian `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list

Aggiorna i repository di sistema.

$ sudo apt update

Installa Nginx.

$ sudo apt install nginx

Verifica l’installazione. Il sudo è necessario per eseguire il comando su Debian.

$ sudo nginx -v
nginx version: nginx/1.24.0

Avvia il server Nginx.

$ sudo systemctl start nginx

Passo 3 - Installare Node.js

Ghost Installer ha bisogno di Nodejs per funzionare. Il primo passo è importare la chiave GPG di Nodesource.

$ curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/nodesource.gpg

Successivamente, crea il file del repository Nodesource. Installeremo Node 18x che è l’attuale versione LTS (Long Term Support) che Ghost raccomanda.

$ NODE_MAJOR=18
$ echo "deb [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list

Aggiorna l’elenco dei repository di sistema.

$ sudo apt update

Installa Node.

$ sudo apt install nodejs -y

Conferma l’installazione di Node.

$ node --version
v18.18.2

Passo 4 - Installare MySQL utilizzando Docker

Debian non fornisce più MySQL. Invece, fornisce MariaDB. Ghost supporta solo MySQL. Puoi modificare Ghost per funzionare con MariaDB, ma non è raccomandato. Poiché i repository ufficiali di MySQL non sono stati aggiornati per Debian 12 al momento della scrittura di questo tutorial, lo installeremo utilizzando Docker.

Importa la chiave GPG di Docker.

$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg

Crea un file di repository Docker.

$ echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/debian \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Aggiorna l’elenco dei repository di sistema.

$ sudo apt update

Installa Docker e Docker Compose.

$ sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Per impostazione predefinita, Docker richiede privilegi di root. Se vuoi evitare di usare sudo ogni volta che esegui il comando docker, aggiungi il tuo nome utente al gruppo docker.

$ sudo usermod -aG docker $(whoami)

Dovrai disconnetterti dal server e riconnetterti come lo stesso utente per abilitare questa modifica o utilizzare il seguente comando.

$ su - ${USER}

Conferma che il tuo utente è stato aggiunto al gruppo Docker.

$ groups
navjot wheel docker

Ora che Docker è installato, dobbiamo creare un file di composizione Docker per MySQL. Crea una directory per Docker di MySQL.

$ mkdir ~/mysql

Crea e apri il file docker-compose.yml per la modifica.

$ nano docker-compose.yml

Incolla il seguente codice in esso.

services:
  database:
    image: container-registry.oracle.com/mysql/community-server:latest
    container_name: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_USER: ghost
      MYSQL_PASSWORD: ghostpassword
      MYSQL_DATABASE: ghostdb
    ports:
      - "3306:3306"
    volumes:
      - ./mysql:/var/lib/mysql

Salva il file premendo Ctrl + X e inserendo Y quando richiesto.

Qui abbiamo impostato la password di root e le credenziali MySQL per il database Ghost. Questi verranno creati quando il contenitore verrà eseguito.

Avvia il contenitore MySQL.

$ docker compose up -d

Controlla lo stato del contenitore Docker.

$ docker ps
CONTAINER ID   IMAGE                                                         COMMAND                  CREATED         STATUS         PORTS                                                        NAMES
ec42fb205f1e   container-registry.oracle.com/mysql/community-server:latest   "/entrypoint.sh mysq…"   4 seconds ago   Up 2 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060-33061/tcp   mysql

Ghost può connettersi al contenitore MySQL utilizzando la porta 3306 ed eseguire operazioni su di esso.

Passo 5 - Installare Ghost

Possiamo installare Ghost anche utilizzando Docker, il che può semplificare le cose, ma non lo faremo qui.

L’installazione di Ghost comprenderà tre componenti - lo strumento da riga di comando Ghost-CLI che installa e gestisce gli aggiornamenti del blog Ghost e il pacchetto del blog stesso.

Installare Ghost-CLI

Esegui il seguente comando per installare lo strumento Ghost-CLI.

$ sudo npm install ghost-cli@latest -g

Preparare la Directory di Ghost

Crea la directory principale di Ghost.

$ sudo mkdir -p /var/www/html/ghost

Imposta la proprietà della directory all’utente corrente.

$ sudo chown $USER:$USER /var/www/html/ghost

Imposta i permessi corretti per la directory.

$ sudo chmod 755 /var/www/html/ghost

Passa alla directory di Ghost.

$ cd /var/www/html/ghost

Installare Ghost

Installare Ghost è un processo con un singolo comando.

$ ghost install

Durante l’installazione, lo strumento CLI farà diverse domande per configurare il blog.

  • URL del Blog: Inserisci il tuo URL completo del blog insieme al protocollo https. ( https://example.com)
  • Nome Host MySQL: Premi Invio per utilizzare il valore predefinito di localhost poiché la nostra installazione di Ghost e MySQL sono sullo stesso server.
  • Nome Utente MySQL: Inserisci ghost come nome utente MySQL.
  • Password MySQL: Inserisci la tua password di root creata prima nel file docker.
  • Nome del database Ghost: Inserisci il nome del database ( ghostdb) configurato nel file docker.
  • Password Sudo: Ti verrà chiesta la tua password sudo per eseguire attività amministrative.
  • Configurare Nginx? Di solito, Ghost-CLI rileva la tua installazione di Nginx e la configura automaticamente per il tuo blog. Ma questo funziona solo per Nginx installato utilizzando il pacchetto OS. Poiché lo abbiamo installato utilizzando il repository di Nginx, Ghost non può rilevarlo e lo salterà automaticamente.
  • Configurare SSL?: Poiché ha saltato la configurazione di Nginx, lo strumento CLI salterà anche la configurazione di un SSL.
  • Configurare systemd?: Ghost chiederà se vuoi impostare un servizio di sistema per Ghost. Premi Y per procedere.
  • Avviare Ghost?: Premi Y per avviare la tua installazione di Ghost. Tuttavia, non funzionerà perché Nginx e SSL non sono ancora configurati.

Passo 6 - Installare SSL

Prima di procedere, dobbiamo installare lo strumento Certbot e installare un certificato SSL per il nostro dominio.

Per installare Certbot, utilizzeremo l’installer di pacchetti Snapd. Snapd porta sempre l’ultima versione stabile di Certbot. Tuttavia, Debian non viene fornito con Snapd installato. Installalo prima.

$ sudo apt install snapd

Assicurati che la tua versione di snapd sia aggiornata.

$ sudo snap install core
$ sudo snap refresh core

Installa Certbot.

$ sudo snap install --classic certbot

Usa il seguente comando per assicurarti che il comando Certbot possa essere eseguito creando un collegamento simbolico alla directory /usr/bin.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Verifica l’installazione.

$ certbot --version
certbot 2.7.1

Genera un certificato SSL.

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d example.com

Il comando sopra scaricherà un certificato nella directory /etc/letsencrypt/live/example.com sul tuo server.

Genera un certificato di gruppo Diffie-Hellman.

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Controlla il servizio di pianificazione del rinnovo di Certbot.

$ sudo systemctl list-timers

Troverai snap.certbot.renew.service come uno dei servizi programmati per l’esecuzione.

NEXT                        LEFT          LAST                        PASSED       UNIT                       ACTIVATES
Tue 2023-10-17 00:00:00 UTC 14h left    Mon 2023-10-16 00:00:18 UTC 9h ago       dpkg-db-backup.timer         dpkg-db-backup.service
Mon 2023-10-16 19:12:00 UTC 9h left     Mon 2023-10-16 07:27:11 UTC 2h 17min ago snap.certbot.renew.timer     snap.certbot.renew.service
Mon 2023-10-16 20:49:14 UTC 11h left    Mon 2023-10-16 07:48:12 UTC 1h 56min ago apt-daily.timer              apt-daily.service

Fai una prova del processo per controllare se il rinnovo SSL funziona correttamente.

$ sudo certbot renew --dry-run

Se non vedi errori, sei a posto. Il tuo certificato si rinnoverà automaticamente.

Passo 7 - Configurare Nginx

Crea e apri il file /etc/nginx/conf.d/ghost.conf per la modifica.

$ sudo nano /etc/nginx/conf.d/ghost.conf

Incolla il seguente codice nel file ghost.conf. Sostituisci tutte le istanze di example.com con il tuo dominio.

server {
  listen 80;
  listen [::]:80;
  server_name example.com;
  location / { 
   return 301 https://$server_name$request_uri; 
  }
}

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name example.com;
    
  access_log /var/log/nginx/ghost.access.log;
  error_log /var/log/nginx/ghost.error.log;
  client_max_body_size 20m;

  ssl_protocols TLSv1.2 TLSv1.3;
  ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
  ssl_prefer_server_ciphers off;
  ssl_session_timeout 1d;
  ssl_session_cache shared:SSL:10m;
  ssl_dhparam /etc/ssl/certs/dhparam.pem;
  ssl_stapling on;
  ssl_stapling_verify on;
  resolver 1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001] 8.8.8.8 8.8.4.4 [2001:4860:4860::8888] [2001:4860:4860::8844] valid=60s;
  resolver_timeout 2s;

  ssl_certificate         /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key     /etc/letsencrypt/live/example.com/privkey.pem;
  ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;

  location / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://localhost:2368;
  }
}

La configurazione sopra reindirizzerà tutte le richieste HTTP a HTTPS e fungerà da proxy per il servizio Ghost per servirlo tramite il tuo dominio.

Salva il file premendo Ctrl + X e inserendo Y quando richiesto.

Apri il file /etc/nginx/nginx.conf per la modifica.

$ sudo nano /etc/nginx/nginx.conf

Aggiungi la seguente riga prima della riga include /etc/nginx/conf.d/*.conf;.

server_names_hash_bucket_size  64;

Salva il file premendo Ctrl + X e inserendo Y quando richiesto.

Verifica la tua configurazione Nginx.

$ sudo nginx -t

Se non vedi errori, significa che sei a posto. Riavvia il server Nginx per applicare la configurazione.

$ sudo systemctl restart nginx

Passo 9 - Esegui il Sito

Ora puoi verificare la tua installazione aprendo https://example.com nel tuo browser. Otterrai la seguente pagina che indica un’installazione riuscita.

Homepage di Ghost

Passo 10 - Completa la Configurazione

Per completare la configurazione del tuo blog Ghost, visita https://example.com/ghost nel tuo browser. L’extra /ghost alla fine del dominio del tuo blog ti reindirizza al Pannello di Amministrazione di Ghost o in questo caso alla configurazione poiché lo stai accedendo per la prima volta.

Qui, ti verrà chiesto di creare il tuo account Amministratore e scegliere un titolo per il blog.

Dettagli di Configurazione di Ghost

Inserisci i tuoi dettagli e fai clic sul pulsante Crea account e inizia a pubblicare per procedere.

Successivamente, verrai portato alla seguente schermata dove ti vengono date opzioni come scrivere il tuo primo post, personalizzare il tuo sito e importare membri.

Suggerimenti per l'Installazione di Ghost

Sceglieremo Esplora l’amministrazione di Ghost per esplorare e andare direttamente al dashboard. Alla fine della configurazione, verrai accolto con il pannello di amministrazione di Ghost.

Dashboard di Amministrazione di Ghost

Se desideri passare alla modalità scura, puoi farlo facendo clic sull’interruttore accanto al pulsante delle impostazioni in basso nella pagina delle impostazioni.

Vedrai un post predefinito. Puoi dispubblicarlo o eliminarlo e iniziare a pubblicare.

Pannello Post di Ghost

Passo 11 - Configurare il Mailer

Ghost non solo funge da piattaforma di blogging, ma anche da gestore di newsletter. Per le operazioni quotidiane, puoi utilizzare qualsiasi servizio di posta transazionale per lavorare con Ghost per inviare email. Ma se desideri inviare newsletter tramite Ghost, l’unico servizio di email di massa ufficialmente supportato è Mailgun. Puoi utilizzare anche un altro servizio di newsletter, ma per questo dovrai utilizzare la funzione di integrazione Zapier di Ghost.

Prima configuriamo un servizio SMTP per le email transazionali. Per questo, apri il file /var/www/html/ghost/config.production.json per la modifica.

$ nano /var/www/html/ghost/config.production.json

Trova le seguenti righe.

 "mail": {
    "transport": "Direct"
  },

Sostituiscile con il seguente codice.

"mail": {
    "from": "'Supporto HowtoForge' [email protected]",
    "transport": "SMTP",
    "options": {
        "host": "YOUR-SES-SERVER-NAME",
        "port": 465,
        "service": "SES",
        "auth": {
            "user": "YOUR-SES-SMTP-ACCESS-KEY-ID",
            "pass": "YOUR-SES-SMTP-SECRET-ACCESS-KEY"
        }
    }
},

Qui stiamo utilizzando il servizio di posta Amazon SES poiché è conveniente e non richiede costi mensili.

Salva il file premendo Ctrl + X e inserendo Y quando richiesto. Una volta terminato, riavvia l’applicazione Ghost affinché le modifiche abbiano effetto.

$ ghost restart

Per configurare le impostazioni della newsletter, visita la sezione Impostazioni >> Newsletter email.

Impostazioni Newsletter Email di Ghost

Fai clic sul collegamento Configurazione Mailgun per espandere.

Compila la tua Regione Mailgun, dominio e chiave API.

Impostazioni Newsletter MailGun di Ghost

Fai clic sul pulsante Salva in alto a destra per salvare le impostazioni.

Per testare la consegna della newsletter, crea un nuovo post di prova, premi pubblica e seleziona l’opzione Solo email. Se desideri pubblicare anche il post, seleziona l’opzione Pubblica e invia email.

Opzione Pubblica/Email di Ghost

Fai clic sul pulsante Continua, revisione finale per procedere. La pagina successiva chiederà nuovamente conferma finale.

Ghost Invia Email Newsletter Conferma

Fai clic sul pulsante Invia email, subito per inviare la newsletter. Riceverai il seguente messaggio una volta inviata l’email.

Messaggio di Consegna della Newsletter di Ghost

Controlla la tua email per il post.

Email Newsletter di Ghost

Passo 12 - Aggiornare Ghost

Ci sono due tipi di aggiornamenti di Ghost - aggiornamenti minori e aggiornamenti maggiori.

Per prima cosa, esegui un backup completo se desideri eseguire un aggiornamento minore. Crea un backup di tutti i post, membri, temi, immagini, file e file di reindirizzamento.

$ cd /var/www/html/ghost
$ ghost backup

Esegui il comando di aggiornamento per eseguire l’aggiornamento minore.

$ ghost update

Per eseguire un aggiornamento maggiore, dovresti seguire la guida ufficiale dettagliata per l’aggiornamento su Ghost. A seconda della versione attuale e della versione maggiore a cui desideri aggiornare, i passaggi varieranno.

Conclusione

Questo conclude il nostro tutorial su come impostare Ghost CMS sul tuo server Debian 12 utilizzando Nginx. Se hai domande o feedback, condividili nei commenti qui sotto.

Share: X/Twitter LinkedIn

Ricevi i nuovi post nella tua casella di posta.

Nessuno spam. Disiscriviti in qualsiasi momento.