Ghost est un système de gestion de contenu open source qui convient à un blog, une newsletter ou un site Web d'adhésion.
Il est ultra-rapide et optimisé pour le référencement. Nous l'aimons ici au Linux Handbook. Notre site Web utilise Ghost, bien sûr.
Maintenant, vous pouvez opter pour une instance Ghost gérée par les créateurs de Ghost lui-même. Cela vous coûterait cher mais vous n'aurez pas à déployer d'efforts pour déployer Ghost, le mettre à jour et le maintenir. Et bien sûr, cela aide au développement du projet Ghost.
Si vous voulez éviter de dépenser beaucoup ou prendre les choses en main avec une approche "faites-le vous-même", vous pouvez auto-héberger Ghost sur votre serveur.
Dans ce tutoriel, je vais vous montrer les étapes pour déployer Ghost avec Docker.
Ghost auto-hébergé avec Docker
Voici la chose. Certains fournisseurs de serveurs cloud comme DigitalOcean proposent également un déploiement Ghost en un clic. Cela pourrait être la solution de facilité si vous ne voulez pas les problèmes liés à l'installation et à la configuration initiales de Ghost.
Cela mis à part, voyons ce dont vous avez besoin pour déployer Ghost avec Docker sur un serveur Linux.
Exigences
Outre la familiarité avec les commandes Linux, connaître les bases de Docker Compose sera également utile ici.
- Un serveur Linux. Vous pouvez utiliser un serveur physique, une machine virtuelle ou des serveurs cloud. Vous pouvez vous inscrire auprès de notre partenaire Linode et obtenir 100 $ de crédits gratuits.
- Docker et Docker Compose installés sur votre serveur.
- Accès au DNS de votre domaine sur lequel vous souhaitez déployer Ghost.
- Configuration du proxy inverse Nginx avec redirection www/non-www et limites de téléchargement autorisées.
Étape 0 :préparez la configuration initiale
Vous devez avoir Docker et Docker Compose installés sur votre système. Vous pouvez vous référer à ces tutoriels pour obtenir des instructions pour Ubuntu.
En dehors de cela, vous devez également avoir configuré le proxy inverse Ngnix. Ceci est utile si vous souhaitez installer plus d'un Ghost ou un autre service Web sur le même serveur.
Maintenant, j'ai couvert ce sujet en détail dans le tutoriel lié ci-dessous, donc je ne vais pas répéter les mêmes étapes ici. Cependant, vous devez avoir cette configuration sur votre système.
Suivez ce tutoriel jusqu'à l'étape 4 :
Étape 1 :Préparer le déploiement de Ghost
J'utilise ici la méthode de proxy inverse Jwilder car elle prend en compte les certificats SSL, la redirection www/non-www et les limites de téléchargement autorisées.
La gestion des certificats SSL est déjà décrite dans le lien partagé ci-dessus dans la section des exigences. De plus, je décrirai comment activer la redirection www/non-www et augmenter les limites de téléchargement autorisées.
Redirection WWW/non-WWW
En fonction de vos préférences de référencement, vous souhaiterez peut-être définir la redirection de www vers non-www ou vice versa. Par exemple, si votre blog est hébergé sur domain.com, les utilisateurs visitant www.domain.com doivent y être redirigés (comme fonctionne le domaine de GitHub).
De même, si vous l'hébergez sur www.domain.com, les utilisateurs visitant domain.com doivent être redirigés (comme fonctionne le domaine de Linode).
WWW vers non-WWW
Créez un fichier nommé www.domain.com
dans le répertoire de composition du menu fixe nginx avec le contenu suivant et enregistrez-le :
rewrite ^/(.*)$ https://domain.com/$1 permanent;
Non-WWW à WWW
Créez un fichier nommé domain.com
dans le répertoire de composition du menu fixe nginx avec le contenu suivant et enregistrez-le :
rewrite ^/(.*)$ https://www.domain.com/$1 permanent;
Maintenant, supposons que vous vouliez utiliser la redirection WWW vers non-WWW. Tout ce que vous avez à faire est de lier le montage du fichier dans la section des volumes de votre configuration de service Nginx :
- ./www.domain.com:/etc/nginx/vhost.d/www.domain.com
Augmenter les limites de téléchargement autorisées
Les téléchargements d'images peuvent être affectés par la taille de téléchargement maximale par défaut de 50 Mo. Pour définir une limite de téléchargement maximale et éviter les problèmes lors du téléchargement d'images sur Docker, par exemple pour 1 Go, créez un fichier nommé client_max_upload_size.conf
et enregistrez-le avec le contenu suivant :
client_max_body_size 1G;
Plus tard, vous devrez le monter comme décrit avec le fichier précédent :
- ./client_max_upload_size.conf:/etc/nginx/conf.d/client_max_upload_size.conf
Exécutez docker-compose up -d
depuis le répertoire Nginx pour mettre à jour votre configuration Nginx.
Tout d'abord, la configuration du déploiement de Ghost se compose essentiellement de deux composants principaux :
- Backend de la base de données MariaDB
- Ghost lui-même en tant qu'interface Web
Puisque vous déployez Ghost avec Docker, tous les composants ci-dessus sont configurés comme leurs propres conteneurs respectifs.
Pour le service de base de données, j'utiliserai un réseau interne appelé ghost
car il ne doit être visible que pour le service Ghost.
networks:
- ghost
Mais pour le service Ghost, bien sûr, le même net
réseau utilisé sur la configuration du proxy inverse doit être spécifié avec le ghost
réseau, et alors seulement il serait possible de le faire fonctionner avec le conteneur Nginx Docker.
networks:
- net
- ghost
Considérez maintenant comment ils sont configurés individuellement avec Docker Compose :
Pour MariaDB, j'utilise l'image officielle MariaDB 10.5.3 qui est disponible sur Docker Hub :
ghostdb:
image: mariadb:10.5.3
volumes:
- ghostdb:/var/lib/mysql
restart: on-failure
env_file:
- ./mariadb.env
networks:
- ghost
Ici, j'utilise un volume appelé ghostdb
pour stocker les données de la base de données dans /var/lib/mysql
. J'ai également défini les variables d'environnement pertinentes dans le env_file
appelé mariadb.env
:
MYSQL_RANDOM_ROOT_PASSWORD=1
MYSQL_USER=mariadbuser
MYSQL_PASSWORD=mariadbpassword
MYSQL_DATABASE=ghost
Pour le service Ghost lui-même, au lieu d'utiliser un latest
tag, je préfère spécifiquement utiliser le numéro de version marqué sur Docker Hub lancé par les développeurs comme une version stable. Ici, à l'heure où j'écris, c'est 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
Le lien monté config.json
Le fichier se compose des paramètres SMTP (Mailgun) et de la rotation des journaux essentiels (focalisés sur les erreurs) :
{
"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"
}
}
S'il doit utiliser MySQL/MariaDB, le service Ghost doit s'appuyer sur ghostdb
service pour qu'il soit opérationnel. Cela ne peut être assuré que lorsque vous avez monté la liaison ghost-mariadb.env
fichier (affiché dans la section volumes du service de base de données Ghost) avec la configuration de base de données correcte selon mariadb.env
dans le service de base de données, qui serait :database__client
, database__connection__host
, database__connection__user
, database__connection__password
et database__connection__database
.
Je vais également attribuer chacune des variables d'environnement VIRTUAL_HOST
et LETSENCRYPT_HOST
à la fois domain.com
ainsi que www.domain.com
respectivement, afin de s'assurer que les deux existent. Cela garantit absolument que les redirections et les certificats SSL fonctionnent sans problème. Je veux que mon URL principale soit sans www donc je l'ai définie comme url=https://domain.com
. Étant donné que vous utiliserez cette configuration pour une utilisation au niveau de la production, le NODE_ENV
variable est définie sur le mode de production. Ces détails doivent également être ajoutés.
Par conséquent, le fichier d'environnement complet (ghost-mariadb.env
) pour le service Ghost serait :
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
Des incohérences dans les données ci-dessus pourraient faire basculer par erreur Ghost vers SQLite. Vous ne voulez pas ça. Assurez-vous donc que tous les paramètres ci-dessus correspondent correctement au service de base de données discuté pour mariadb.env
ci-dessus.
Chacun des services de base de données aura ses propres volumes Docker respectifs pour stocker les données utilisateur et de contenu. Je vais les créer en tant que volumes externes :
docker volume create ghostdb
docker volume create ghost
Vous devez maintenant inclure un volumes
section dans le fichier de composition docker avec les détails suivants :
volumes:
ghost:
external: true
ghostdb:
external: true
Vous disposez maintenant des composants nécessaires au déploiement de Ghost.
Étape 2 :Déployer Ghost
Le fichier docker-compose devrait maintenant être prêt. Il est temps d'utiliser ce fichier.
Créez le répertoire de composition du docker Ghost sur votre serveur :
mkdir ghost
Allez dans le répertoire pour éditer les fichiers nécessaires :
cd ghost
Créez maintenant le fichier docker-compose suivant basé sur nos discussions jusqu'à présent :
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
N'oubliez pas non plus de créer les autres fichiers de configuration comme indiqué ci-dessus :config.json
, mariadb.env
et ghost-mariadb.env
dans le même répertoire.
Démarrez l'instance Ghost :
docker-compose up -d
Accédez au domaine Ghost spécifié dans la configuration à l'aide de l'URL de votre domaine spécifié.
Étape 3 :Configurer votre compte Ghost Admin
Notez que pour configurer votre compte administrateur, vous devez vous rendre sur domain.com/ghost et suivez les instructions à l'écran jusqu'à ce que vous ayez revendiqué votre site en tant qu'administrateur fantôme.
Pour revérifier, confirmez que vous utilisez bien MySQL/MariaDB et non SQLite. Accédez à votre icône d'utilisateur en bas à gauche :
Vous pouvez maintenant être sûr que vous utilisez réellement le conteneur de base de données séparé qui s'affichera sous la forme mysql
que vous utilisiez une image Docker MySQL ou MariaDB :
Vous pouvez également voir que les trois autres paramètres :Version, Environnement et Courrier, sont définis comme prévu en fonction de nos étapes mentionnées ci-dessus. Alors c'est tout! Vous avez déployé avec succès Ghost en tant qu'instance auto-hébergée sur votre serveur !
Conseils pour maintenir votre instance Ghost auto-hébergée
Voici quelques conseils qui vous aideront à maintenir votre instance Ghost.
Surveiller les journaux fantômes en temps réel
Si vous souhaitez vérifier les journaux du conteneur pendant son déploiement en temps réel, vous pouvez exécuter :
docker logs -f ghost_ghost_1
Sauvegarder et restaurer des volumes fantômes sans temps d'arrêt
En utilisant une approche cloud + locale, vous pouvez sauvegarder et restaurer vos volumes fantômes sans temps d'arrêt.
Mettre à jour les conteneurs fantômes sans temps d'arrêt
Avec le --scale
flag sur Docker Compose, vous pouvez créer un nouveau conteneur basé sur la dernière version de Ghost. Lorsque c'est fait, vous pouvez supprimer l'ancien. Cela se traduit par zéro temps d'arrêt.
Vous pouvez lire quelques conseils supplémentaires dans l'article ci-dessous.
Vous pouvez également déployer et gérer des thèmes fantômes à l'aide d'actions GitHub pour simplifier votre travail.
Si vous rencontrez un bug, avez des problèmes ou avez une suggestion, faites-le moi savoir en laissant un commentaire ci-dessous.