Ospitare Ghost su un VPS gestito significa pubblicare i vostri articoli, riunire i vostri membri e inviare le vostre newsletter da una macchina tutta vostra, che i nostri team tengono aggiornata e supervisionano giorno e notte. Ghost è un software libero con licenza MIT. Questa guida segue la sua documentazione ufficiale: Ghost-CLI o Docker Compose, MySQL, HTTPS, le e-mail, i backup e gli aggiornamenti.
Di Simon Vasconcelos Lee
Pubblicato il 9 novembre 2026Lettura: 13 minuti
content, poi aggiornate con ghost update o docker compose pull: il progetto pubblica aggiornamenti ogni settimana.Ghost è una piattaforma di pubblicazione professionale e libera, scritta per Node.js. Riunisce in un unico posto ciò che una pubblicazione indipendente assembla spesso a partire da più strumenti.
Secondo la documentazione, il prodotto ha le stesse funzioni in self-hosting. Ciò che lo circonda spetta a voi: l'invio delle newsletter, l'analytics web, una CDN e i backup completi del sito.
Ghost è pubblicato con licenza MIT. Autorizza a usare, copiare, modificare, unire, pubblicare, distribuire, concedere in sublicenza e vendere il software, a una condizione: conservare la nota di copyright e il testo della licenza in ogni copia. Potete quindi far girare Ghost in azienda, adattarlo e pubblicarvi per i vostri clienti, senza alcuna licenza da acquistare.
La licenza copre il codice. Il nome e il logo appartengono a Ghost Foundation e dipendono dalla sua politica sul marchio: leggetela se costruite un'offerta attorno al software. Ghost è un marchio registrato di Ghost Foundation.
This publication is independent of and not affiliated with, authorized, sponsored, or approved by Ghost Foundation. In italiano: questa pubblicazione è indipendente da Ghost Foundation e non è affiliata, autorizzata, sponsorizzata né approvata da essa.
Il progetto documenta due strade per la produzione. Ghost-CLI è l'installazione che raccomanda ufficialmente, e Docker Compose è una «preview», che definisce del tutto nuova. Indica anche di avanzare verso questo strumentario Docker anziché far evolvere Ghost-CLI, e fornisce una procedura guidata per passare dall'uno all'altro.
| Punto | Ghost-CLI | Docker Compose (preview) |
|---|---|---|
| Sistema | Ubuntu 22.04, 24.04 o 26.04 | Un server Linux con Docker 20.10.13 o più recente |
| Memoria | Almeno 1 GB | Il progetto cita come esempio un server da 2 GB e 1 processore |
| Server web e HTTPS | Nginx e un certificato Let's Encrypt, installati da Ghost-CLI | Caddy, in un container, che gestisce TLS |
| Database | MySQL 8.0 o 8.4 installato sul server | MySQL in un container |
| Analytics web | Non compatibile | Disponibile, con un account Tinybird |
| Rete sociale (ActivityPub) | Il servizio ospitato dal progetto, gratuito entro i suoi limiti d'uso | Lo stesso servizio per impostazione predefinita, oppure il vostro, in self-hosting |
Fate puntare il dominio al server prima dell'installazione: il certificato viene installato durante la configurazione. Su un VPS Simafri, i visitatori arrivano sulle porte 80 e 443, con il nome di dominio del server, tramite record A e AAAA. L'indirizzo del sito si scrive per intero, con il suo protocollo, come https://example.com: un indirizzo IP provoca errori.
Oltre alla memoria indicata qui sopra, il progetto non indica né il disco né il carico: la taglia dipende dal vostro traffico, dalle vostre immagini e dai vostri media. Su un VPS gestito, descrivetici la vostra pubblicazione e vi raccomandiamo la taglia adatta.
Ghost-CLI si usa con un utente che non sia root e il cui nome non sia ghost, perché questo nome entra in conflitto con lo strumento. Createlo dall'account root, sostituendo user con il nome scelto:
adduser <user>
usermod -aG sudo <user>
su - <user>
Aggiornate il sistema, installate Nginx (1.9.5 come minimo per SSL) e MySQL. La riga ufw apre HTTP e HTTPS se questo firewall è attivo:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install nginx
sudo ufw allow 'Nginx Full'
sudo apt-get install mysql-server
Sulle versioni recenti di Ubuntu, l'account root di MySQL si autentica tramite socket, cosa che Ghost non supporta. Assegnategli una password:
sudo mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH 'caching_sha2_password' BY '<your-new-root-password>';
FLUSH PRIVILEGES;
exit
Ghost richiede Node.js 22: le versioni 20, 21, 23 e successive non sono supportate. Il progetto chiede di installarlo per tutto il sistema, in questo modo:
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
NODE_MAJOR=22
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list
sudo apt-get update
sudo apt-get install nodejs -y
sudo npm install ghost-cli@latest -g
Ghost si installa nella propria cartella, con un proprietario e permessi precisi. Sostituite sitename con il nome che preferite:
sudo mkdir -p /var/www/sitename
sudo chown <user>:<user> /var/www/sitename
sudo chmod 775 /var/www/sitename
cd /var/www/sitename
ghost install
Il comando pone allora le sue domande, e il progetto raccomanda di rispondere sì a ogni passaggio proposto:
https://.localhost per l'host, root e la password impostata sopra, poi il nome del database, che Ghost-CLI crea.Il sito risponde allora, e https://example.com/ghost vi invita a creare l'account del proprietario. Se l'installazione viene interrotta, ghost setup riprende la configurazione; se fallisce, ghost uninstall pulisce meglio dell'eliminazione della cartella. ghost doctor verifica il sistema in qualsiasi momento.
Il progetto presenta questo metodo come una «preview»: ai suoi occhi è del tutto nuovo. È l'unico che consente di ospitare in proprio l'analytics web e ActivityPub.
Su un server in cui Docker è installato, scaricate lo strumentario ufficiale in /opt/ghost e copiate i suoi due file di esempio:
git clone https://github.com/TryGhost/ghost-docker.git /opt/ghost && cd /opt/ghost
cp .env.example .env
cp caddy/Caddyfile.example caddy/Caddyfile
Nel file .env, compilate questi valori:
DOMAIN: il dominio del sito, per esempio example.com.ADMIN_DOMAIN: un dominio separato per l'amministrazione, se lo desiderate.DATABASE_ROOT_PASSWORD e DATABASE_PASSWORD: due password generate con openssl rand -hex 32. Si fissano una volta per tutte: una volta inizializzato il database, cambiarle interrompe la connessione.In caddy/Caddyfile, decommentate il blocco che corrisponde al vostro caso: reindirizzamento da www al dominio senza prefisso, o l'inverso, oppure dominio di amministrazione separato. Avviate poi Ghost e completate la configurazione su /ghost:
docker compose pull
docker compose up -d
HTTP_PORT e HTTPS_PORT se Ghost passa dietro un altro reverse proxy. MySQL resta sulla rete interna dei container.data/ghost e il database in data/mysql, due percorsi regolabili nel .env.-f compose.yml -f compose.ipv6.yml ai vostri comandi docker compose up.L'analytics richiede un account Tinybird, servizio esterno. Da /opt/ghost, accedete, distribuite la sua configurazione e recuperate i token da incollare nel .env, sezione «Tinybird configuration»:
docker compose run --rm tinybird-login
docker compose run --rm tinybird-sync
docker compose run --rm tinybird-deploy
docker compose run --rm tinybird-login get-tokens
ActivityPub funziona subito con il servizio ospitato dal progetto, gratuito entro limiti d'uso che la sua documentazione pubblica. Per ospitare il vostro, decommentate ACTIVITYPUB_TARGET=activitypub:8080. Attivate poi nel .env il profilo o i profili desiderati, poi riavviate i container:
COMPOSE_PROFILES=analytics,activitypub
docker compose pull
docker compose up -d
Per ActivityPub, il progetto chiede di ricreare anche Ghost e Caddy, con docker compose up -d --force-recreate ghost caddy.
Dopo la clonazione e la configurazione, bash scripts/migrate.sh copia la cartella content, importa il database nel container MySQL e avvia Caddy al posto di Nginx. Propone di fermare Nginx, il che mette il sito offline: rispondete no se sul server girano altri siti. Non elimina alcun dato. bash recovery_instructions.sh ripristina il sito d'origine se interrompete la migrazione.
L'amministrazione di Ghost deve passare da HTTPS, e il progetto raccomanda HTTPS per tutto il sito: senza di esso, identificativi e password circolano in chiaro. Con Docker Compose, se ne occupa Caddy. Con Ghost-CLI, l'installazione installa il certificato, e un comando lo fa anche in un secondo momento:
ghost setup ssl
Per cambiare l'indirizzo di un sito installato con Ghost-CLI, ghost config url https://example.com aggiorna la configurazione, e ghost restart la applica.
Il progetto consiglia anche un dominio di amministrazione separato, che riduce la superficie d'attacco. Il percorso resta /ghost/. Lato Ghost-CLI, si dichiara in config.production.json:
"admin": {
"url": "https://admin.example.com"
}
Lato Docker Compose, compilate ADMIN_DOMAIN, decommentate il suo blocco nel Caddyfile e lanciate docker compose up -d --force-recreate ghost caddy. Anche questo dominio ha bisogno dei suoi record A e AAAA.
MySQL 8 è l'unico database che il progetto supporta in produzione. Ghost-CLI si installa con MySQL 8.0 o 8.4, e il file Compose fornisce un'immagine MySQL 8.0.
ghost config database.client, nella cartella del sito, indica il database in uso.Ghost distingue due invii, che non passano dallo stesso percorso. È il punto più importante da impostare dopo l'installazione.
| Invio | Esempi | Che cosa lo sostiene |
|---|---|---|
| Transazionale | Inviti del team, password dimenticate, iscrizioni e link di accesso dei membri, codice di accesso da un nuovo dispositivo | La configurazione mail di Ghost, in SMTP |
| Newsletter | Gli articoli inviati ai vostri membri | L'API di Mailgun, le cui chiavi si inseriscono nelle impostazioni «Email newsletter» |
La documentazione classifica questa configurazione come obbligatoria in produzione. Ghost invia anche un codice per e-mail quando rileva un accesso da un nuovo dispositivo: impostate questo relay prima di invitare il vostro team.
Su un VPS Simafri, l'invio passa da un relay SMTP autenticato, sulla porta 587: l'indirizzo di un account di posta che avete già, oppure Simafri Suite.
"mail": {
"transport": "SMTP",
"from": "'Acme Support' <support@example.com>",
"options": {
"host": "smtp.example.com",
"port": 587,
"secure": false,
"requireTLS": true,
"auth": {
"user": "support@example.com",
"pass": "1234567890"
}
}
}
mail__transport=SMTP
mail__options__host=smtp.example.com
mail__options__port=587
mail__options__secure=false
mail__options__requireTLS=true
mail__options__auth__user=support@example.com
mail__options__auth__pass=1234567890
mail__from="'Acme Support' <support@example.com>"
docker compose up -d --force-recreate ghost
secure e requireTLS: Ghost invia tramite Nodemailer, la cui documentazione richiede secure su false sulla porta 587, con la connessione che passa poi in STARTTLS. requireTLS rifiuta l'invio se questo passaggio fallisce. Il file di esempio del repository indica la porta 465 e secure=true: sostituite queste due righe.from contiene un indirizzo reale e letto, il che migliora la recapitabilità secondo il progetto, e i record SPF, DKIM e DMARC del dominio di invio completano l'impostazione.Il relay SMTP non copre le newsletter. Secondo la documentazione, l'invio massivo non si fa in SMTP e Mailgun è, a oggi, l'unico servizio di invio massivo che Ghost supporta. Create il vostro account Mailgun e inserite le sue chiavi API nelle impostazioni di Ghost.
Se non inviate i vostri articoli per e-mail, non vi serve alcun account Mailgun: queste impostazioni si ignorano. Se preferite un altro strumento di newsletter, il progetto propone di sincronizzare i vostri membri verso di esso, per esempio con Zapier o con le sue guide di integrazione.
Ghost offre tre livelli di copia, e non contengono la stessa cosa. Per ricostruire un sito identico, il progetto chiede di salvare direttamente il database e la cartella content.
| Metodo | Che cosa contiene | Per quale uso |
|---|---|---|
ghost backup (Ghost-CLI) | Uno zip: contenuti in JSON, membri in CSV, temi, immagini, file e media, route e reindirizzamenti | La precauzione prima di un aggiornamento |
| Esportazione dall'amministrazione | Uno zip: contenuti e impostazioni, membri, statistiche degli articoli, temi, route e reindirizzamenti, a scelta. Né commenti, né cronologia di attività dei membri, né media | Lo spostamento dei contenuti verso un altro sito |
Database e cartella content | La totalità dei dati | Il ripristino dopo un disastro, o una copia esatta |
L'esportazione si trova in «Settings», «Advanced», «Import/Export», scheda «Export», pulsante «All data». Per la copia completa, con Ghost-CLI, l'account MySQL e il nome del database da riportare sono in config.production.json:
mkdir -p ~/ghost-backups
mysqldump -u ghost_user -p ghost_production > ~/ghost-backups/ghost_backup.sql
cd /var/www/sitename
tar czf ~/ghost-backups/ghost_content_backup.tar.gz content/
Con Docker Compose, lo strumentario ufficiale conserva i contenuti in data/ghost. Il dump riprende la forma data dall'immagine MySQL, e la password root è già nel container. Conservate anche una copia di .env e del Caddyfile.
cd /opt/ghost
mkdir -p ~/ghost-backups
docker compose exec -T db sh -c 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" ghost' > ~/ghost-backups/ghost_backup.sql
tar czf ~/ghost-backups/ghost_content_backup.tar.gz data/ghost
cd /var/www/sitename
ghost stop
mysql -u ghost_user -p ghost_production < ~/ghost-backups/ghost_backup.sql
tar xzf ~/ghost-backups/ghost_content_backup.tar.gz
sudo chown -R ghost:ghost content
ghost restart
cd /opt/ghost
docker compose stop ghost
docker compose exec -T db sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" ghost' < ~/ghost-backups/ghost_backup.sql
tar xzf ~/ghost-backups/ghost_content_backup.tar.gz
docker compose start ghost
Copiate questi file fuori dal server, con rsync o scp, e fate una prova di ripristino su una macchina di test. Se ripartite da un'esportazione con membri a pagamento, collegate lo stesso account Stripe prima di importare i vostri membri.
Il progetto pubblica aggiornamenti ogni settimana e ricorda che un server web pubblico deve restare aggiornato. Leggete le note di rilascio, poi lanciate il comando del vostro metodo.
ghost check-update
ghost backup
ghost update
ghost update --rollback torna alla versione precedente se un aggiornamento va male.content resta al suo posto durante gli aggiornamenti.ghost update [version] --force con la vostra versione attuale, perché le sue dipendenze binarie sono compilate per una versione precisa di Node.js.cd /opt/ghost
git pull
docker compose pull
docker compose up -d
docker image prune
L'ultima riga, facoltativa, elimina le vecchie immagini. Lasciate GHOST_VERSION commentato nel .env: fissare una versione blocca questi comandi di aggiornamento.
La documentazione indica diverse impostazioni per un server in produzione:
mysql_secure_installation dopo un'installazione Ghost-CLI riuscita.Per il carico, il progetto colloca una CDN e uno strato di cache davanti a Ghost. Precisa che il clustering e lo sharding non sono supportati: una sola istanza serve il sito, e la cache assorbe il traffico.
Il self-hosting richiede di occuparsi del server oltre che dell'applicazione. Su un VPS gestito, i nostri team prendono in carico il server e seguono la vostra istanza in modo proattivo; Ghost resta il vostro software, con le sue impostazioni e i suoi dati.
| Argomento | I nostri team | Voi |
|---|---|---|
| Il server | Aggiornamenti del sistema e della sicurezza, interventi sul server compresi | Il momento più adatto alla vostra attività |
| La supervisione | Server seguito 24 ore su 24, 7 giorni su 7, con intervento senza attendere la vostra chiamata | I vostri contenuti, i vostri membri e i vostri abbonamenti |
| Ghost | Monitoraggio proattivo: errori, rallentamenti e spazio su disco individuati, correzione raccomandata | La sua installazione, i suoi aggiornamenti, le sue impostazioni, il suo relay SMTP e il suo account Mailgun, che applicate voi o il vostro assistente IA |
| I backup | Ogni notte, cifrati e conservati fuori dalla macchina; ripristino compreso | La richiesta di ripristino, quando ne avete bisogno |
| La migrazione | Il vostro server attuale migrato, in omaggio | Il momento del passaggio |
Se preferite che i nostri team intervengano nell'applicazione stessa, questa prestazione si fattura a ore o a forfait, con un preventivo comunicato prima dell'intervento.
Con un VPS gestito Simafri, i nostri team tengono aggiornato il server della vostra istanza Ghost, lo sorvegliano giorno e notte e intervengono senza attendere la vostra chiamata; seguono anche la vostra istanza in modo proattivo e vi raccomandano le correzioni utili, che applicate voi o il vostro assistente IA. I backup sono cifrati ogni notte e conservati fuori dalla macchina, il loro ripristino è compreso e la migrazione del vostro server attuale è in omaggio.
Sì. Ghost ha licenza MIT: potete usarlo in azienda e adattarlo, conservandone la nota di licenza. Restano i servizi che lo circondano: il server, il relay di e-mail, Mailgun se inviate newsletter, Tinybird se volete la sua analytics.
Il progetto raccomanda Ubuntu 22.04, 24.04 o 26.04, Nginx, Node.js 22, MySQL 8.0 o 8.4, systemd, almeno 1 GB di memoria, un dominio e un utente che non sia root. Per Docker Compose, cita come esempio un server da 2 GB e 1 processore.
Ghost-CLI è l'installazione che il progetto raccomanda per la produzione. Docker Compose è una preview, l'unica a consentire l'analytics web e ActivityPub in self-hosting, e il progetto dice di avanzare verso questo strumentario. Una procedura guidata permette di passare da Ghost-CLI a Docker Compose.
In produzione, MySQL 8 è l'unico database supportato. Il progetto raccomanda una reinstallazione su MySQL 8 da SQLite, e una migrazione a MySQL 8 da MariaDB. La sua documentazione non prevede PostgreSQL.
No. L'SMTP serve alle e-mail transazionali: inviti, password, link di accesso dei membri. Le newsletter richiedono l'API di Mailgun, unico servizio di invio massivo supportato. Senza invio di articoli per e-mail, non serve alcun account Mailgun.
Per un ripristino completo, salvate il database MySQL con mysqldump e la cartella content con tar. Il comando ghost backup produce uno zip prima di un aggiornamento. L'esportazione dell'amministrazione lascia da parte i commenti, la cronologia di attività dei membri e i media.
Con Ghost-CLI, lanciate ghost backup poi ghost update nella cartella del sito, e ghost update --rollback in caso di problemi. Con Docker Compose, lanciate git pull, docker compose pull e docker compose up -d in /opt/ghost.
Un VPS gestito copre il server: sistema, sicurezza, supervisione e backup. I nostri team seguono anche la vostra istanza in modo proattivo e vi raccomandano le correzioni utili, che applicate voi. Un intervento nell'applicazione si fattura a ore o a forfait.
Simafri
Parliamo del vostro progetto
Diteci in due parole ciò che vi serve: vi rispondiamo rapidamente.
Grazie! La tua richiesta è stata inviata. Ti risponderemo a breve.
Preferite l'email? Scriveteci a support@simafri.com.