Souhaitant créer mon propre thème Ghost, je n'ai pas trouvé un fichier docker-compose.yaml
ou une méthodologie de création d'environnement de développement qui me convienne. Et oui je suis un peu flemmard parfois et je souhaitais quelque chose de simple à mettre en œuvre !
J'ai donc décidé de réaliser mon environnement... Et juste au cas où, je le partage ici pour ceux qui le souhaitent. 😘
Ghost étant écrit en node.js
, ma première réflexion fut : "Ça va être simple de se faire un petit environnement de développement. Un joli NODE_ENV=development
et fini !".
Et pour être honnête, c'était presque ça ! 😂
🚀 Quickstart 🚀
Afin de faire au plus simple pour ceux qui sont venus chercher l'essentiel, LE docker-compose.yaml
qui va bien. Allons à l'essentiel :
version: '3.8'
services:
ghost:
image: ghost:3
container_name: ghost-dev
restart: unless-stopped
environment:
- NODE_ENV=development
volumes:
- ghost_content:/var/lib/ghost/content
- ./themes/mytheme:/var/lib/ghost/content/themes/mytheme
ports:
- 2368:2368
networks:
- lan
node-tools-init:
image: node:12-buster-slim
container_name: ghost-tools-init
restart: on-failure
volumes:
- ./themes/mytheme:/home/node/app/mytheme
working_dir: /home/node/app/mytheme
command: 'yarn install'
networks:
- lan
node-tools:
image: node:12-buster-slim
container_name: ghost-tools
restart: unless-stopped
volumes:
- ./themes/mytheme:/home/node/app/mytheme
working_dir: /home/node/app/mytheme
command: 'yarn dev'
network_mode: none
networks:
lan:
name: ghost-lan
volumes:
ghost_content:
Il sera bien évidemment nécessaire :
- Que votre thème custom soit dans le dossier themes à la racine.
- Pensez à modifier le fichier
package.json
afin de changer le nom du thème : surtout si vous forkez le thème Casper. - Connectez-vous à l'administration une première fois et modifiez le thème actif.
L'arborescence de mon projet :
.
├── docker-compose.yaml
├── themes
└── └── mytheme
🚗 Pimp My Dev 🚗
Quelques explications tout de même !
Avant tout chose, je souhaitais rester au plus près de mon environnement de production afin de n'avoir aucune mauvaise surprise lors du passage en production !
Dans mon fichier je déclare donc deux services :
- Le CMS Ghost,
- Une boite à outils node.js.
Commençons par la déclaration du CMS :
version: '3.8'
services:
ghost:
image: ghost:3
container_name: ghost-dev
restart: unless-stopped
environment:
- NODE_ENV=development
volumes:
- ghost_content:/var/lib/ghost/content
- ./themes/mytheme:/var/lib/ghost/content/themes/mytheme
ports:
- 2368:2368
networks:
- lan
networks:
lan:
name: ghost-lan
volumes:
ghost_content:
J'utilise donc l'image officielle de Ghost :
version: '3.8'
services:
ghost:
image: ghost:3
Et je lance donc l'instance en mode development
:
environment:
- NODE_ENV=development
J'utilise un volume pour stocker de façon persistante mon installation de Ghost. Je ne souhaite pas refaire l'inscription à l'administration après chaque démarrage !
Je place ensuite mon thème dans le dossier themes
de Ghost :
volumes:
- ghost_content:/var/lib/ghost/content
- ./themes/mytheme:/var/lib/ghost/content/themes/mytheme
Je ne précise pas de base de données, dans ce cas Ghost va utiliser une base de données SQLite qui sera bien suffisante pour mon environnement de développement !
Ensuite je vais lancer une instance à usage unique... ou presque ! Pourquoi ? Il est nécessaire d'exécuter au moins une fois la commande yarn install
dans votre thème. Plusieurs options s'offrent à moi :
- Installer yarn sur mon hôte et lancer la commande depuis celui-ci : Si j'installe Docker, ce n'est pas pour avoir node/yarn ou autre dépendances/logiciels sur mon hôte !
- Exécuter la commande manuellement depuis mon instance Ghost par exemple :
docker exec -it ghost-dev bash
cd /var/lib/ghost/content/themes/mytheme
yarn install
Il est tout à fait possible de réaliser le premier lancement de cette façon.
Je préfère une autre solution, utiliser une instance qui va effectuer cette tâche :
node-tools-init:
image: node:12-buster-slim
container_name: ghost-tools-init
restart: on-failure
volumes:
- ./themes/mytheme:/home/node/app/mytheme
working_dir: /home/node/app/mytheme
command: 'yarn install'
networks:
- lan
Il était également possible d'utiliser un script ( entrypoint.sh ) sur ma dernière instance node
afin de réaliser les deux opérations... Bref il existe énormement de solution, j'utilise celle-ci car :
- facile à mettre en oeuvre,
- pas de build.
Enfin je lance mon dernier conteneur pour exécuter yarn dev
:
node-tools:
image: node:12-buster-slim
container_name: ghost-tools
restart: unless-stopped
volumes:
- ./themes/mytheme:/home/node/app/mytheme
working_dir: /home/node/app/mytheme
command: 'yarn dev'
network_mode: none
J'utilise le mode network_mode: none
car mon conteneur n'a aucun intérêt d'avoir accès à du réseau. Si vous le désirez, vous pouvez retirer cette ligne qui n'a qu'un intérêt très sécuritaire !
Vous voila enfin prêts pour customiser votre thème Ghost ! Il existe bien des façons de mettre en place un environnement de développement pour réaliser cette tâche. Je vous ai présenté ici ma façon de faire, aucun doute sur le fait qu'il existe sûrement d'autres moyens de réaliser cet environnement !
En tout cas, j'espère que cette présentation vous permettra de réaliser votre propre environnement afin de répondre à vos besoins !
Car finalement, la vraie question : un environnement de développement idéal c'est quoi ? Pourquoi je n'ai pas trouvé mon bonheur sur internet ?
En tout cas n'hésitez pas à m'apporter des remarques ou des commentaires sur Twitter ! C'est toujours un plaisir d'avoir des retours ! 😘