Installer Ghost avec Docker
Guide d'installation du CMS Ghost sous Docker.

Au sommaire :
- 1-Qu'est-ce que Ghost ?
- 2-Prérequis
- 3-Déploiement
- 4-Configuration
- 5-Exposer son instance avec Traefik
1-Qu'est-ce que Ghost ?
Ghost est un CMS (Content Management System), un moteur de blog libre et open-source écrit en JavaScript et distribué sous licence MIT.
C'est le CMS que j'utilise pour mes blog car il est épuré, très économe en ressources et très facile à déployer.
Il y a Tech2Rue évidemment qui me permet de partager mes modestes connaissances en informatique au plus grand nombre mais aussi RetroHack plus axé sur la modification de consoles rétro et l'émulation (autre pendant de la virtualisation).
Bref, Ghost me rend de grand services au quotidien et c'est peu de le dire.
Pour ceux qui ont des connaissances en informatique, n'oubliez pas que internet est un espace de partage donc après avoir suivi ce guide et déployé votre première instance, commencez à rédiger vos premiers tutoriels.
Vous êtes prêts ? YIIIIHIIIII!!!!!

2-Prérequis
Pour déployer Ghost, vous devez disposer d'une machine virtuelle fonctionnant sous Ubuntu Server.
Création de la machine virtuelle :
Virtualisation avec Proxmox VE : Si vous partez de zéro, suivez mon guide détaillé pour virtualiser Ubuntu sur Proxmox VE avec des réglages optimisés.

Automatisation avec Cloud-Init : Pour gagner du temps lors de la configuration, utilisez un template Cloud-Init. Cela permet d'automatiser et de simplifier l'initialisation de vos machines virtuelles. Retrouvez les instructions dans ce guide.

Installation des outils nécessaires :
Docker et Docker Compose : Une fois la machine virtuelle prête, installez Docker et Docker Compose, indispensables pour gérer et orchestrer vos conteneurs. Ce guide vous accompagnera dans l'installation.

Exposition de l'application :
Proxy inverse avec Traefik : Pour exposer vos applications sur Internet de manière sécurisée, configurez un proxy inverse. Traefik est une solution recommandée. Suivez ce guide pour l'installation.

3-Déploiement
Commencez par créer un dossier "docker" à la racine du dossier utilisateur"
mkdir -p ~/docker
Créez un fichier nommé "compose.yml"
touch ~/docker/compose.yml
Ouvrez le fichier "compose.yml" et copiez cette configuration.
networks:
# default network
default:
driver: bridge
services:
ghost:
image: ghost
container_name: ghost
hostname: ghost
restart: unless-stopped
ports:
- 2368:2368
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
- ${APPDATA}/ghost:/var/lib/ghost/content
environment:
NODE_ENV: production
url: <votre_nom_de_domaine>
database__client: sqlite3
database__connection__filename: "content/data/ghost.db"
database__useNullAsDefault: true
database__debug: false
- image : l'image officielle de Ghost dans sa dernière version
- container_name : le nom du conteneur
- hostname : le nom d'hôte à l'intérieur du conteneur
- restart : unless-stopped
- ports : 2368
- volumes : accés en lecture à l'horloge et au fuseau horaire du serveur et création d'un dossier pour l'application
- environment : on indique que le blog est en mode production, l'url du blog, le type de base de données (sqlite3 pour plus de simplicité), le chemin de la base de données, useNullAsDefautlt activé (optionnel, seulement pour SQLite) et mode débug désactivé
- labels : le blog passera bien sûr par Traefik en HTTPS avec comme nom de domaine celui que vous souhaitez. Puis vous créez un service et vous indiquez le numéro du port ainsi que l'autorité de certification
Téléchargez l'image et déployez le conteneur.
docker compose pull && docker compose create
Puis démarrez le conteneur.
docker start ghost
Accédez à votre blog via l'adresse IP locale, vous devriez tomber sur la page d'accueil.

4-Configuration
Pour configurer le blog, ajoutez "/ghost" à la suite de l'adresse IP/nom de domaine.
- Site title : le nom du blog qui sera affiché en page d'accueil
- Full name : votre pseudo
- Email address : votre adresse mail
- Password : votre mot de passe
Dés que vous avez fini, cliquez sur "Create account & start publishing".


En bas à gauche, cliquez sur l'icône du rouage pour accédez aux réglages du blog.

General
Cliquez sur "General" :
- Title & description : changez le titre de la page d'accueil et la description si besoin
- Site timezone : sélectionnez votre fuseau horaire
- Publication language : mettez "fr"

Si vous êtes présent sur les réseaux sociaux, n'oubliez pas d'aller dans "SITE META SETTINGS".

Staff
Si vous souhaitez qu'une autre personne rédige pour le blog, c'est par ici pour créé un compte.

Intégration
Pour ajouter de nouvelles fonctionnalités comme un espace commentaire, analyser le trafic de votre blog et j'en passe.

Membership
Pas encore testé mais si vous souhaitez monétiser votre blog, Ghost vous propose de connecté ce dernier à votre compte Stripe (concurrent de Paypal).

Design
Ensuite cliquez sur "Design" et "Change theme". Vous allez pouvoir choisir le thème qui vous correspond ou bien charger un thème téléchargé sur le marketplace.

Voici le lien du marketplace qui propose davantage de choix.

Pour rédiger votre premier article, cliquez sur "Posts" et "New Post"



Comme vous pouvez le voir, c'est simple à déployer et surtout économe en ressources comme vous pouvez le constater avec l'image ci-dessous.

5-Exposer son instance avec Traefik
networks:
# default network
default:
driver: bridge
# Traefik network
web:
name: web
driver: bridge
services:
traefik:
container_name: traefik
image: traefik:v2
restart: always
networks:
- web
ports:
- 80:80
- 443:443
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ${APPDATA}/traefik/traefik.yml:/traefik.yml
- ${APPDATA}/traefik/dynamic.yml:/dynamic.yml
- ${APPDATA}/traefik/letsencrypt/acme.json:/acme.json
- ${APPDATA}/traefik/shared:/shared
labels:
- traefik.enable=true
- traefik.http.routers.traefik.entrypoints=websecure
- traefik.http.routers.traefik.rule=Host(`traefik.<domain_name>`)
- traefik.http.routers.traefik.service=api@internal
- "traefik.http.routers.traefik.middlewares=middlewares-basic-auth@file"
ghost:
image: ghost
container_name: ghost
hostname: ghost
restart: unless-stopped
network:
- web
# ports:
# - 2368:2368
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
- ${APPDATA}/ghost:/var/lib/ghost/content
environment:
NODE_ENV: production
url: <url_du_blog>
database__client: sqlite3
database__connection__filename: "content/data/ghost.db"
database__useNullAsDefault: true
database__debug: false
labels:
- traefik.enable=true
- traefik.http.routers.ghost.entrypoints=websecure
- traefik.http.routers.ghost.rule=Host(`ghost.<domain_name>`)
- traefik.http.routers.ghost.service=ghost-svc
- traefik.http.services.ghost-svc.loadbalancer.server.port=2368
- traefik.http.routers.ghost.tls.certresolver=letsencrypt