Ghost è un sistema di gestione dei contenuti open source adatto per blog, newsletter o siti Web di appartenenza.
È superveloce e ottimizzato per la SEO. Lo adoriamo qui su Linux Handbook. Il nostro sito Web utilizza Ghost, ovviamente.
Ora puoi optare per un'istanza Ghost gestita dai creatori di Ghost stesso. Ti costerebbe molto ma non dovrai impegnarti a implementare Ghost, aggiornarlo e mantenerlo. E, naturalmente, aiuta lo sviluppo del progetto Ghost.
Se vuoi evitare di spendere molto o prendere in mano la situazione con un approccio "fai da te", puoi ospitare autonomamente Ghost sul tuo server.
In questo tutorial, ti mostrerò i passaggi per distribuire Ghost con Docker.
Ghosting autonomo con Docker
Ecco la cosa. Alcuni provider di server cloud come DigitalOcean forniscono anche la distribuzione Ghost con un clic. Potrebbe essere la soluzione più semplice se non vuoi il problema della configurazione e configurazione iniziale di Ghost.
A parte questo, vediamo di cosa hai bisogno per distribuire Ghost con Docker su un server Linux.
Requisiti
Oltre alla familiarità con i comandi Linux, anche qui sarà utile conoscere le basi di Docker Compose.
- Un server Linux. Puoi utilizzare un server fisico, una macchina virtuale o server cloud. Puoi registrarti con il nostro partner Linode e ricevere $ 100 in crediti gratuiti.
- Docker e Docker Compose installati sul tuo server.
- Accesso al DNS del tuo dominio in cui desideri implementare Ghost.
- Configurazione del proxy inverso Nginx con reindirizzamento www/non www e limiti di caricamento consentiti.
Passaggio 0:prepara la configurazione iniziale
Devi avere Docker e Docker Compose installati sul tuo sistema. Puoi fare riferimento a questi tutorial per ottenere istruzioni per Ubuntu.
Oltre a questo, devi anche avere la configurazione del proxy inverso Ngnix. Questo è utile se vuoi avere più di un Ghost o qualche altro servizio web installato sullo stesso server.
Ora, ho trattato questo argomento in dettaglio nel tutorial collegato di seguito, quindi non ripeterò gli stessi passaggi qui. Tuttavia, devi avere questa configurazione sul tuo sistema.
Segui questo tutorial fino al passaggio 4:
Passaggio 1:preparazione del dispiegamento di Ghost
Uso il metodo proxy inverso di Jwilder qui perché tiene conto dei certificati SSL, del reindirizzamento www/non www e dei limiti di caricamento consentiti.
Come gestire i certificati SSL è già descritto nel link condiviso sopra nella sezione requisiti. Inoltre, descriverò come abilitare il reindirizzamento www/non www e aumentare i limiti di caricamento consentiti.
Reindirizzamento WWW/non WWW
A seconda delle tue preferenze SEO, potresti voler impostare il reindirizzamento di www a non www o viceversa. Ad esempio, se il tuo blog è ospitato su domain.com, gli utenti che visitano www.domain.com devono essere reindirizzati ad esso (proprio come funziona il dominio di GitHub).
Allo stesso modo, se lo ospiti su www.domain.com, gli utenti che visitano domain.com devono essere reindirizzati (proprio come funziona il dominio di Linode).
Da WWW a non WWW
Crea un file chiamato www.domain.com
all'interno della finestra mobile nginx componi la directory con il seguente contenuto e salvalo:
rewrite ^/(.*)$ https://domain.com/$1 permanent;
Da non WWW a WWW
Crea un file chiamato domain.com
all'interno della finestra mobile nginx componi la directory con il seguente contenuto e salvalo:
rewrite ^/(.*)$ https://www.domain.com/$1 permanent;
Supponiamo ora di voler utilizzare WWW per il reindirizzamento non WWW. Tutto quello che devi fare è montare il file nella sezione dei volumi della configurazione del tuo servizio Nginx:
- ./www.domain.com:/etc/nginx/vhost.d/www.domain.com
Aumenta i limiti di caricamento consentiti
I caricamenti di immagini possono essere influenzati dalla dimensione massima di caricamento predefinita di 50 MB. Per impostare un limite massimo di caricamento ed evitare problemi durante il caricamento di immagini su Docker, ad esempio per 1 GB, crea un file denominato client_max_upload_size.conf
e salvalo con il seguente contenuto:
client_max_body_size 1G;
Successivamente è necessario montarlo proprio come descritto con il file precedente:
- ./client_max_upload_size.conf:/etc/nginx/conf.d/client_max_upload_size.conf
Esegui docker-compose up -d
dalla directory Nginx per aggiornare la configurazione di Nginx.
Innanzitutto, la configurazione della distribuzione di Ghost consiste essenzialmente in due componenti principali:
- Backend del database MariaDB
- Ghost stesso come frontend web
Dato che stai implementando Ghost con Docker, tutti i componenti di cui sopra sono impostati come rispettivi contenitori.
Per il servizio database, utilizzerò una rete interna chiamata ghost
poiché deve essere visibile solo per il servizio Ghost.
networks:
- ghost
Ma per il servizio Ghost, ovviamente, lo stesso net
la rete utilizzata nella configurazione del proxy inverso deve essere specificata insieme a ghost
rete, e solo allora sarebbe possibile farlo funzionare con il contenitore Nginx Docker.
networks:
- net
- ghost
Ora considera come vengono configurati individualmente con Docker Compose:
Per MariaDB, utilizzo l'immagine ufficiale MariaDB 10.5.3 disponibile su Docker Hub:
ghostdb:
image: mariadb:10.5.3
volumes:
- ghostdb:/var/lib/mysql
restart: on-failure
env_file:
- ./mariadb.env
networks:
- ghost
Qui uso un volume chiamato ghostdb
per memorizzare i dati del database in /var/lib/mysql
. Ho anche impostato le variabili di ambiente pertinenti nel env_file
chiamato mariadb.env
:
MYSQL_RANDOM_ROOT_PASSWORD=1
MYSQL_USER=mariadbuser
MYSQL_PASSWORD=mariadbpassword
MYSQL_DATABASE=ghost
Per il servizio Ghost stesso, invece di usare un latest
tag, in particolare preferisco utilizzare il numero di versione taggato su Docker Hub lanciato dagli sviluppatori come versione stabile. Ecco, in questo momento in cui scrivo, è 4.5.0
:
ghost:
image: ghost:4.5.0
volumes:
- ghost:/var/lib/ghost/content
- ./config.json:/var/lib/ghost/config.production.json
env_file:
- ./ghost-mariadb.env
restart: on-failure
depends_on: ghostdb
networks:
- net
- ghost
Il binding montato config.json
il file è costituito da SMTP (Mailgun) e dalle impostazioni essenziali di rotazione del registro (incentrato sull'errore):
{
"url": "http://localhost:2368",
"server": {
"port": 2368,
"host": "0.0.0.0"
},
"mail": {
"transport": "SMTP",
"options": {
"service": "Mailgun",
"host": "smtp.eu.mailgun.org",
"port": 465,
"secureConnection": true,
"auth": {
"user": "replace-me-with-a-mailgun-configured-email-address",
"pass": "replace-me-with-the-relevant-mailgun-apikey-of-50-characters"
}
}
},
"logging": {
"path": "content/logs/",
"level": "error",
"rotation": {
"enabled": true,
"count": 10,
"period": "1d"
},
"transports": [
"file",
"stdout"
]
},
"process": "systemd",
"paths": {
"contentPath": "/var/lib/ghost/content"
}
}
Se deve utilizzare MySQL/MariaDB, il servizio Ghost deve fare affidamento su ghostdb
servizio affinché sia operativo. Questo può essere assicurato solo dopo aver montato il binding di ghost-mariadb.env
file (mostrato nella sezione volumi del servizio di database Ghost) con la corretta configurazione del database secondo mariadb.env
nel servizio database, che sarebbe:database__client
, database__connection__host
, database__connection__user
, database__connection__password
e database__connection__database
.
Assegnerò anche a ciascuna delle variabili di ambiente VIRTUAL_HOST
e LETSENCRYPT_HOST
a entrambi domain.com
così come www.domain.com
rispettivamente, al fine di garantire che entrambi esistano. Ciò garantisce assolutamente che i reindirizzamenti e i certificati SSL funzionino senza problemi. Voglio che il mio URL principale sia senza www, quindi l'ho impostato come url=https://domain.com
. Poiché utilizzerai questa configurazione per l'utilizzo a livello di produzione, il NODE_ENV
la variabile è impostata sulla modalità di produzione. È necessario aggiungere anche questi dettagli.
Pertanto, il file di ambiente completo(ghost-mariadb.env
) per il servizio Ghost sarebbe:
VIRTUAL_HOST=domain.com,www.domain.com
LETSENCRYPT_HOST=domain.com,www.domain.com
url=https://domain.com
NODE_ENV=production
database__client=mysql
database__connection__host=ghostdb
database__connection__user=mariadbuser
database__connection__password=mariadbpassword
database__connection__database=ghost
Le incongruenze nei dati di cui sopra potrebbero far passare erroneamente Ghost a SQLite. Tu non lo vuoi. Quindi assicurati che tutti i parametri sopra corrispondano correttamente al servizio di database discusso per mariadb.env
sopra.
Ciascuno dei servizi di database avrà i propri rispettivi volumi Docker per la memorizzazione dei dati degli utenti e dei contenuti. Li creerò come volumi esterni:
docker volume create ghostdb
docker volume create ghost
Ora devi includere un volumes
sezione all'interno del file di composizione della finestra mobile con i seguenti dettagli:
volumes:
ghost:
external: true
ghostdb:
external: true
Ora hai i componenti necessari per distribuire Ghost.
Fase 2:distribuzione di Ghost
Ora dovresti avere il file docker-compose pronto. È ora di usare questo file.
Crea la directory di composizione della finestra mobile Ghost sul tuo server:
mkdir ghost
Vai nella directory per modificare i file necessari:
cd ghost
Ora crea il seguente file di composizione mobile basato sulle nostre discussioni finora:
version: '3.7'
services:
ghostdb:
image: mariadb:10.5.3
volumes:
- ghostdb:/var/lib/mysql
restart: on-failure
env_file:
- ./mariadb.env
networks:
- ghost
ghost:
image: ghost:4.5.0
volumes:
- ghost:/var/lib/ghost/content
- ./config.json:/var/lib/ghost/config.production.json
env_file:
- ./ghost-mariadb.env
restart: on-failure
depends_on:
- ghostdb
networks:
- net
- ghost
volumes:
ghost:
external: true
ghostdb:
external: true
networks:
net:
external: true
ghost:
internal: true
Inoltre, non dimenticare di creare gli altri file di configurazione come discusso sopra:config.json
, mariadb.env
e ghost-mariadb.env
all'interno della stessa directory.
Avvia l'istanza Ghost:
docker-compose up -d
Accedi al dominio Ghost specificato nella configurazione utilizzando l'URL del dominio specificato.
Fase 3:configurazione del tuo account Ghost Admin
Tieni presente che per configurare il tuo account amministratore, devi andare su domain.com/ghost e segui le istruzioni sullo schermo fino a quando non avrai rivendicato il tuo sito come amministratore fantasma.
Per ricontrollare, conferma che stai effettivamente utilizzando MySQL/MariaDB e non SQLite. Vai alla tua icona utente in basso a sinistra:
Ora puoi essere sicuro che stai effettivamente utilizzando il contenitore del database separato che verrà visualizzato come mysql
indipendentemente dal fatto che tu stia utilizzando un'immagine Docker MySQL o MariaDB:
Puoi anche vedere che gli altri tre parametri:Versione, Ambiente e Posta, sono impostati come previsto in base ai nostri passaggi sopra menzionati. Quindi è tutto! Hai distribuito Ghost con successo come istanza self-hosted sul tuo server!
Suggerimenti per la manutenzione dell'istanza Ghost self-hosted
Ecco alcuni suggerimenti che ti aiuteranno a mantenere la tua istanza Ghost.
Monitoraggio dei log di Ghost in tempo reale
Se desideri controllare i log del contenitore mentre è distribuito in tempo reale, puoi eseguire:
docker logs -f ghost_ghost_1
Backup e ripristino dei volumi Ghost senza tempi di inattività
Utilizzando un approccio cloud + locale, puoi eseguire il backup e il ripristino dei tuoi volumi fantasma senza tempi di inattività.
Aggiorna Ghost Container senza tempi di inattività
Con il --scale
flag su Docker Compose, puoi creare un nuovo contenitore basato sull'ultima versione di Ghost. Al termine, puoi rimuovere quello vecchio. Ciò si traduce in zero tempi di inattività.
Ci sono altri suggerimenti che puoi leggere nell'articolo qui sotto.
Potresti anche voler distribuire e gestire temi Ghost utilizzando le azioni GitHub per semplificare il tuo lavoro.
Se riscontri un bug, hai problemi o hai un suggerimento, faccelo sapere lasciando un commento qui sotto.