Come fare self-hosting di Ghost nel 2026: MySQL, newsletter e backup dei contenuti
Una guida pratica al self-hosting di Ghost che tratta Docker, porte, dati persistenti, TLS, sicurezza, backup e problemi che impediscono l'uso in produzione. Passo dopo passo.
Un deployment di Ghost non riuscito non va necessariamente in crash. Potrebbe mostrare una pagina di login mentre l'impostazione url è HTTP oppure il volume dei contenuti è stato sostituito. Inizia invece con un controllo end-to-end: completa la configurazione del proprietario, pubblica un post con un'immagine, iscrivi un membro e invia una newsletter di test tramite l'email configurata.
Questo controllo riflette lo scopo documentato di Ghost: una piattaforma di publishing con membership e newsletter. Inoltre, evidenzia prima di un semplice uptime probe le dipendenze mancanti, le ipotesi errate sul proxy e i dati effimeri.
Definisci i confini del runtime di Ghost
Definisci tre confini intorno a Ghost: l'ingress sulla porta 2368, lo stato persistente e i requisiti di supporto. Il container è sostituibile, ma gli altri due elementi richiedono responsabili espliciti. Il contratto di rete per Ghost prevede MySQL 8, SMTP e, opzionalmente, object storage per i siti con molti contenuti multimediali. Mantieni gli endpoint privati nel DNS interno, consenti solo le chiamate outbound necessarie e assegna a Ghost credenziali di servizio con ambito limitato.
Il diagramma è completo quando un client pulito riesce a completare la configurazione del proprietario, pubblicare un post con un'immagine, iscrivere un membro e inviare una newsletter di test tramite l'email configurata. Raccogli i dati su tempi e risorse per le query MySQL, lo storage delle immagini, il rendering del tema, il numero di membri e i limiti del provider di bulk mail. Se la transazione non riesce, il primo confine che non si comporta come documentato indica se devi analizzare il routing, la capacità locale o un servizio di supporto.
Dimostra che Ghost sopravvive alla sostituzione
Un'immagine container può essere scaricata di nuovo; il database MySQL, insieme a temi, immagini e file dei contenuti, no. Monta /var/lib/ghost/content prima del bootstrap, scrivi dati di esempio innocui e sostituisci il container per dimostrare che quel percorso è effettivamente persistente. Ispeziona il mount effettivo invece di fidarti del nome di un file Compose e verifica che l'utente del runtime possa scrivere nel percorso previsto da Ghost.
Scegli una retention e una destinazione off-host, poi prova il ripristino senza toccare la produzione. La procedura supera il test solo quando post, membri, newsletter, temi e immagini vengono ripristinati e un membro di test riesce ad aprire la pubblicazione recuperata. Per lo stato basato su database, affianca agli snapshot dello storage export coerenti con l'applicazione, come descritto in point-in-time recovery versus snapshots.
Credenziali, ruoli e superfici esposte
Il rischio di sicurezza specifico dell'applicazione consiste nell'usare SQLite per una topologia di produzione non supportata o nell'esporre le credenziali email. La risposta operativa è proteggere Ghost Admin, mantenere le credenziali email e database lato server e impostare l'URL HTTPS definitivo prima della pubblicazione. Completa il bootstrap tramite una route con accesso limitato e rimuovi immediatamente dopo l'accesso temporaneo alla configurazione.
url è una configurazione, non un segreto; mantieni esplicito il suo valore proteggendo separatamente le credenziali utilizzate da Ghost. Concedi al processo Ghost solo i mount e le route delle dipendenze documentati; evita l'accesso alla root dell'host e al socket Docker. Registra gli errori di autenticazione e di configurazione, ma oscura token, connection string e contenuti degli utenti.
Dimostra il funzionamento end-to-end del deployment di Ghost
Il record di rilascio di Ghost deve contenere dati concreti, non un semplice “sembra tutto a posto”. Salva il digest dell'immagine selezionata, il checksum della configurazione, l'hostname pubblico e un risultato con timestamp per: completare la configurazione del proprietario, pubblicare un post con un'immagine, iscrivere un membro e inviare una newsletter di test tramite l'email configurata. Usa dati di esempio non di produzione, così il controllo può essere eseguito dopo ogni deployment.
Dimostra separatamente due eventi del ciclo di vita. La sostituzione di un container deve preservare il normale funzionamento; un ripristino pulito deve dimostrare che post, membri, newsletter, temi e immagini vengono recuperati e che un membro di test riesce ad aprire la pubblicazione ripristinata. Durante i controlli, misura le query MySQL, lo storage delle immagini, il rendering del tema, il numero di membri e i limiti del provider di bulk mail e conserva il risultato come intervallo atteso per questa versione.
Verifica anche una condizione negata o non valida: nega temporaneamente all'identità di test l'accesso a MySQL 8, SMTP e all'object storage opzionale per i siti con molti contenuti multimediali. Ghost dovrebbe fallire in modo diagnosticabile senza sovrascrivere lo stato integro. Ripristina la condizione valida, esegui di nuovo l'esempio e allega i log pertinenti dopo averne oscurato i dati sensibili. Questi artifact forniscono elementi concreti per una futura decisione di rollback.
Una baseline Docker per Ghost
Mantieni l'invocazione iniziale di Ghost sufficientemente riproducibile da poter essere esaminata in una pull request.
docker run -d \
--name ghost \
--restart unless-stopped \
-p 127.0.0.1:2368:2368 \
-v ghost-data:/var/lib/ghost/content \
-e url=https://app.example.com \
-e database__client=mysql \
-e database__connection__host=mysql.internal \
-e database__connection__user=ghost \
-e database__connection__password=replace-with-a-strong-database-password \
-e database__connection__database=ghost \
ghost:latest
Non affidarti a latest quando esistono già dati reali. Registra il digest funzionante, l'utente del container e la proprietà del mount. Segui il log dell'applicazione durante un test completo — completare la configurazione del proprietario, pubblicare un post con un'immagine, iscrivere un membro e inviare una newsletter di test tramite l'email configurata — e annota eventuali migration prima di esporre la route al traffico di produzione.
Il TLS è semplice; gli URL generati no
Imposta url sul dominio HTTPS definitivo prima della pubblicazione. Invia l'hostname scelto alla porta container 2368, inoltra l'host originale e lo schema HTTPS ed evita di pubblicare un secondo origin diretto.
Testa Ghost da un client esterno pulito. Separa il problema di ingress dal confine applicativo noto — l'impostazione url è HTTP oppure il volume dei contenuti è stato sostituito. Un errore di certificato, DNS o 502 appartiene al routing; una richiesta che raggiunge Ghost e fallisce in seguito riguarda lo stato dell'applicazione, la capacità o un suo requisito di supporto. La guida al TLS per domini personalizzati tratta il primo gruppo.
Controlli di capacità e upgrade
I test di capacità devono esercitare le query MySQL, lo storage delle immagini, il rendering del tema, il numero di membri e i limiti del provider di bulk mail, non una richiesta ripetuta a /. Esegui lo scenario “completare la configurazione del proprietario, pubblicare un post con un'immagine, iscrivere un membro e inviare una newsletter di test tramite l'email configurata” con una concorrenza realistica e registra latenza, tasso di errore e crescita dello storage.
La pianificazione dell'upgrade deve tenere conto di questo rischio: le migration di Ghost, i requisiti del runtime Node e i temi personalizzati devono essere testati su un sito clonato. Testa la nuova release con input rappresentativi, quindi ripeti la transazione di acceptance e confrontane il risultato. Se l'impostazione url è HTTP oppure il volume dei contenuti è stato sostituito, acquisisci la transazione fallita e analizza il primo confine coinvolto invece di presumere che la responsabilità sia dell'ingress.
Sposta il lavoro infrastrutturale ripetibile su Dockup
Routing, certificati, sostituzione dei servizi e storage collegato sono obiettivi ragionevoli per l'automazione. Dockup li gestisce per Ghost e può effettuare il provisioning del database gestito correlato oppure connettersi ai servizi sul server del cliente.
Non dovrebbe però inventare la trust policy di Ghost. Dopo il deployment, imposta url sul dominio HTTPS definitivo prima della pubblicazione, applica questo confine — proteggere Ghost Admin, mantenere le credenziali email e database lato server e impostare l'URL HTTPS definitivo prima della pubblicazione — e verifica il risultato di questo scenario: completare la configurazione del proprietario, pubblicare un post con un'immagine, iscrivere un membro e inviare una newsletter di test tramite l'email configurata. Il risultato è un'infrastruttura one-click con un acceptance test specifico per l'applicazione.
Domande frequenti
Di cosa ha bisogno Ghost per un deployment di produzione?
Instrada il container Ghost sulla porta 2368 attraverso un unico origin HTTPS. Il requisito di rete di supporto prevede MySQL 8, SMTP e, opzionalmente, object storage per i siti con molti contenuti multimediali. Non considerare Ghost pronto finché non riesci a completare la configurazione del proprietario, pubblicare un post con un'immagine, iscrivere un membro e inviare una newsletter di test tramite l'email configurata.
Quali dati di Ghost devono essere inclusi in un backup?
Rendi persistente /var/lib/ghost/content e includi nel medesimo manifest di ripristino il database MySQL insieme a temi, immagini e file dei contenuti. Un ripristino pulito di Ghost supera il test solo quando post, membri, newsletter, temi e immagini vengono recuperati e un membro di test riesce ad aprire la pubblicazione ripristinata.
Ghost richiede HTTPS dietro un reverse proxy?
Usa HTTPS per l'origin pubblico di Ghost e mantieni la porta 2368 sulla route interna. Applica correttamente l'impostazione di Ghost: imposta url sul dominio HTTPS definitivo prima della pubblicazione. Per Ghost, HTTPS protegge le credenziali o i contenuti degli utenti durante il transito e mantiene coerente il comportamento del client sensibile all'origin.
Come deve essere testato un upgrade di Ghost?
Ripristina lo stato attuale di Ghost in un deployment isolato, applica la versione candidata e ripeti la relativa transazione di acceptance. Presta particolare attenzione perché le migration di Ghost, i requisiti del runtime Node e i temi personalizzati devono essere testati su un sito clonato. Conserva la precedente immagine Ghost finché non avrai compreso i confini della migrazione dei dati e del rollback.
