Sommaire

Dans un précédent article, j’évoquais un retour sur le générateur de site Hugo. Je tenais donc faire un article sur le déploiement de Ghost, car même s’il ne correspond plus à mes besoins, ce moteur de blog est clairement une solution à envisager pour le déploiement d’un site Web de type blog.

Description

D’après Wikipédia :

Ghost est un moteur de blog libre et open source écrit en JavaScript et distribué sous licence MIT. Ghost est conçu pour simplifier le processus de publication en ligne par des blogueurs.

L’idée de Ghost a été écrite pour la première fois début novembre 2012 dans un billet de blog par le fondateur John O’Nolan, ancien responsable de l’équipe interface utilisateur de WordPress, à la suite de sa frustration face à la complexité d’utilisation de WordPress en tant que moteur de blog plutôt qu’en tant que système de gestion de contenu.

Le pari est réussi : Ghost va clairement à l’essentiel et replace l’édition de contenu au centre de l’application.

Installation

Les fichiers nécessaires au déploiement de Ghost sont les suivants :

Le fichier docker-compose.yml :

services:
  ghost-db:
    image: docker.io/mysql:8.0
    container_name: ghost-db
    hostname: ghost-db
    env_file: ghost-db.env
    networks:
      - default
    volumes:
      - /opt/ghost/mysql:/var/lib/mysql
    restart: always

  ghost:
    image: docker.io/ghost:latest
    container_name: ghost
    hostname: ghost
    env_file: ghost.env
    networks:
      - default
      - nginx_proxy
    volumes:
      - /opt/ghost/app:/var/lib/ghost/content
    depends_on:
      - ghost-db
    restart: always

networks:
  default:
    external: false
  nginx_proxy:
    external: true

Le fichier ghost-db.env:

MYSQL_ROOT_PASSWORD=PASSWORD

Et son fichier ghost.env :

database__client=mysql
database__connection__host=ghost-db
database__connection__user=root
database__connection__password=PASSWORD
database__connection__database=ghost

url=https://www.foo.bar
mail__from=FooBar <ghost@foo.bar>

Dans ce fichier ghost.env, vous devez modifier les variables PASSWORD, url et mail__from.

Reverse proxy

Les fichiers de configuration ci-dessus sont prévus pour être utilisés avec un reverse proxy.

Pour rappel, un article dédié est disponible ici.

L’image Docker de Linuxserver.io propose un fichier sample de configuration, il vous suffit juste de modifier votre nom de domaine en conséquence :

sudo cp /opt/nginx/nginx/proxy-confs/ghost.subdomain.conf.sample /opt/nginx/nginx/proxy-confs/ghost.subdomain.conf
sudo sed -i "s,server_name ghost,server_name <votre_sous_domaine>,g" /opt/nginx/nginx/proxy-confs/ghost.subdomain.conf

Et enfin, un petit redémarrage pour la prise en compte du nouveau fichier :

sudo docker restart nginx

Configuration

Une fois le déploiement effectué, vous pouvez aller vérifier que tout est en ordre :

Pour accéder a la page d’administration, il faut ajouter /ghost après votre url. Il vous sera alors demandé de choisir un nom de site, et de saisir vos informations de compte principal.

Ghost vous affichera ensuite un assistant de démarrage :

Vous pouvez modifier le design de votre site, afin de changer la couleur, la bannière, l’affichage des articles… Et il est possible de changer de thème utilisé.

Pensez à modifier rapidement les informations comme la langue et le timezone dans le panneau principal :

Utilisation

Une fois votre site personnalisé et correctement configuré, on peut passer à l’édition 😎

Ghost propose une interface d’édition confortable à utiliser :

Résultat des modifications :

L’article :

Conclusion

Redémarrer une instance pour rédiger cet article m’a presque fait regretter d’être revenu sur Hugo. Ghost est rapide, et confortable. Il n’est juste pas pensé pour générer un site statique, ce dont j’avais besoin vu le service d’hébergement gratuit proposé par OVH.

Mais si vous avez l’intention de vous lancer dans l’écriture et que vous partez sans solution distante, Ghost est clairement une solution à considérer. Et il peut très bien fonctionner sur un raspberry pi, si jamais vous en avez un qui traîne 😏