J’ai commencé mon blog il y a quelques mois avec Pelican, le générateur de site statique en Python. Plus tard, je suis passé sur Ghost qui me semblait plus intéressant, répondant d’avantage à mes besoins. Depuis que j’ai découvert Docker, j’ai toujours eu l’idée de stocker l’ensemble de mon blog dans un conteneur et ce d’une façon simple. Ainsi, Ghost ne répondait plus à ma problématique, je suis reparti avec les générateurs de sites statiques. Étant donnée les louanges que j’entends sur le langage Go et ses performances, j’ai privilégié mes recherches sur un générateur en Go. C’est là qu’intervient Hugo, un générateur de site statique pure Go, avec une grosse communauté derrière. Très simple en prendre en main, beaucoup de fonctionnalités, léger et parfait pour être dockerizé.
Migration Ghost -> Hugo
Rien de plus simple, il suffit d’exporter ses articles depuis l’interface Ghost, et d’utiliser ce script https://github.com/jbarone/ghostToHugo.
Docker
Une fois votre blog configuré (thème, articles…), il est temps de passer à sa dockérization. Pour ma part, j’ai décidé d’utiliser le serveur intégré dans Hugo plutôt que de rajouter Nginx ou Apache. Il me suffit pour le moment.
Mon Dockerfile :
FROM debian:wheezy
ENV HUGO_VERSION 0.15
ENV HUGO_BINARY hugo_${HUGO_VERSION}_linux_amd64
ADD https://github.com/spf13/hugo/releases/download/v${HUGO_VERSION}/${HUGO_BINARY}.tar.gz /usr/local/
RUN tar xzf /usr/local/${HUGO_BINARY}.tar.gz -C /usr/local/ \
&& ln -s /usr/local/${HUGO_BINARY}/${HUGO_BINARY} /usr/local/bin/hugo \
&& rm /usr/local/${HUGO_BINARY}.tar.gz
ADD site/ /usr/share/blog
WORKDIR /usr/share/blog
EXPOSE 1313
CMD hugo server --watch --baseUrl=${HUGO_BASE_URL} --port=1313 --appendPort=False --bind=0.0.0.0
Architecture du repository :
On crée l’image :
docker build -t blog .
Et on lance le conteneur :
docker run -d -p 80:1313 -e HUGO_BASE_URL=http://192.168.99.100 blog
Déploiement Continue
Prérequis :
- un repository github
- un compte Docker Hub
- un compte Tutum (connexion avec le compte Docker Hub)
La première étape pour le déploiement continue va être de créer un “automated build” sur le Hub de Docker et de le lier avec votre repository Github.
Choisissez votre répertoire Github, la visibilité de votre image et écrivez une description.
Pour tester le lien, soit vous pousser une modification sur Github soit vous allez dans Build Settings et vous cliquez sur Trigger
Un build va être lancé, visible dans Build Details :
De plus, si vous allez dans les settings de votre repository Github ( Settings -> Webhooks & services), le lien est bien visible :
À chaque modification sur Github, l’image sera recrée avec les dernières modifications. Un bon début, mais comment faire pour que mon blog en production se mette à jour tout seul ?
Tutum
Tutum, récemment racheté par Docker Inc est un service cloud pour déployer et gérer des conteneurs. Il permet de gérer plusieurs types de nodes (AWS, DigitalOcean, serveur personnel…). Très facile pour déployer un simple conteneur ou bien une stack plus complète avec du load balancing. Pour ma part, je trouve que c’est un super outil qui pour le moment est grauit puisqu’il est en béta. Reste à voir la politique tarifaire une fois la béta finie.
Néanmoins, une fois connecté sur l’interface avec votre compte Docker Hub, il faut tout d’abord rajouter un node.
Lorsque vous êtes sur la page “Nodes”, deux choix possibles :
- Soit vous utilisez votre propre serveur, dans ce cas là choisissez : Bring your own node
- Soit (ce qui est mon cas) vous passez par un IaaS comme DigitalOcean : Launch new node cluster
Je ne vais pas détailler l’utilisation de son propre serveur, tant la mise en place est simple (il suffit de copier une commande sur sa machine).
Création du noeud DigitalOcean
J’ai choisi de créer une seule droplet DigitalOcean, si vous voulez que votre blog/site soit en load balacing, vous pouvez créer plusieurs noeuds.
Une fois le noeud crée, et déployé, passons au service.
Création du service
Prochaine étape, création du service, c’est-à-dire déployer le blog sur mon noeud. Pour ce faire, une fois sur la page des services, cherchez votre image Docker :
Quelques configurations :
Il faut également renseigner la variable d’environnement HUGO_BASE_URL
pour ne pas avoir de problème pour le statique du site :
Pour finir, cliquez sur “Create and Deploy“
Votre conteneur est maintenant déployé sur votre serveur, et votre blog est accessible.
La dernière étape pour terminer ce déploiement continu va être de rajouter un lien entre Tutum et le Hub de Docker.
Tutum + Docker Hub
Lorsque vous êtes sur votre service dans Tutum, allez sur le menu Triggers.
Création du trigger
Copiez l’url, et retournez sur l’interface du Hub de Docker.
Création du webhook sur Docker Hub
Sur l’interface du Docker Hub, allez dans la partie “Webhooks” et créez un webhook avec l’url copié.
Fini ! Maintenant, lorsque vous effectuerez une modification sur votre blog, une nouvelle image sera crée, votre conteneur en production sera détruit, et un nouveau sera déployé.