hugo, syncthing

Suite à mon switch sur Mac et la découverte de l’excellent éditeur markdown Ulysses1 j’ai décidé de l’utiliser le plus souvent possible, notamment pour écrire sur mon blog.

L’idée est de pouvoir écrire en offline et depuis un éditeur natif, n’utiliser le web uniquement pour la publication ; ce pour quoi il a été conçu à la base …
Il existe depuis longtemps jekyll qui fait le boulot, puis je découvre au détour d’un commentaire chez korben qui présente JustWriting, le fameux Hugo.
Je ne désire plus utiliser de PHPerie ni de Rubyerie, or Hugo est exactement ce que je souhaite utiliser le plus souvent, un service en Golang, et qui dit Go dit léger rapide, ultra portable.

Il tourne sans aucun problème sur OSX ce qui permet de tester et d’écrire en local afin de prévisualiser à la volée ; en effet avec l’option --watch Hugo rafraichi automatiquement la page à mesure que le fichier markdown est sauvegardé, inutile avec Ulysses qui le fait au bout de quelques secondes.

L’installation sur un serveur Linux est plutôt simple grâce à Go version manager (gvm) il permet d’installer la dernière version de Go et d’éviter ainsi celle un peu moisie de la distribution.
Reste à synchroniser les documents markdown entre son desktop et son serveur. J’ai découvert dans la foulée le service de synchronisation syncthing (maintenant Pulse) lui même en Go :) L’occasion de tester et d’éviter d’installer sur un server un client dropbox, même si certains préfèreront utiliser git.

A nouveau une très bonne surprise car il permet de synchroniser des répertoires qui sont nommés différemment entre les noeuds, les répertoires à synchroniser sont simplement associés par un ID unique. Pour que les noeuds se retrouvent ils utilisent le service de recherche announce.syncthing.net si vous avez spécifié un adresse dynamique dans l’ajout d’un périphérique, sinon il vous faudra préciser l’ip et le port du noeud à relier.
De plus contrairement à Dropbox syncthing permet de définir une liste d’exclusion de fichiers et répertoire, on peut définir un master, ici le noeud sur le desktop, afin que le serveur ne soit qu’un client qui recoit les données. L’interface web d’administration est plutôt agréable et elle permet d’imposer un login/pass indispensable pour l’admin du client sur le serveur.
Enfin la connexion entre les 2 noeuds se fait sans problème à la Dropbox.

Dans la liste d’exclusion j’exclue le répertoire public afin que le paramétrage et la génération des pages de rendues en local ne viennent pas perturber l’instance sur le serveur. Le repertoire content possède les fichiers markdown à synchroniser et la synchro de themes permet de modifier en local son thème et impacter immédiatement sur le serveur, ou d’en ajouter.

A savoir qu’il vaut mieux lancer Hugo en local avec l’option --buildDrafts afin qu’il affiche à la volée les documents en cours d’écriture, mais sans cette option sur le serveur pour qu’il ne les publie pas. Par exemple ce fichier a pour en-tête :

+++
date = "2014-10-13T00:30:07+02:00"
draft = true
title = "hugo, syncthing"
tags            = \["hugo", "syncthing"]
+++

le \ est nécessaire dans Ulysses sous peine qu’il transforme les tags en URL et fasse du coup planter Hugo… (personne est parfait). Une fois terminé il suffira que je remplace true par false, pour ce que texte soit publié, magique.

Par défaut Hugo écoute sur le port 1313, il faudra donc sur le serveur configurer un serveur web en reverse proxy. La prochaine étape sera d’importer tous mes articles de wordpress, je ferais peut être un article du setup complet.
En attendant à lire un article d’un utilisateur ravi, Hugo Is Friggin’ Awesome, et le showcase des sites web qui l’utilisent, on appréciera certains sites très classieux pour les fans du CSS.
Bien entendu Hugo n’utilise pas de base de données, pour la gestion des commentaires il suffira d’utiliser Disqus.

Je dois dire que ce workflow me parait extrèment efficace, productif, rapide et donc agréable. Ecrire avec un logiciel natif un texte en markdown qui est publié dans la foulée est à des années lumière de la lourdeur du web… responsive ou pas.

Ma liste d’exclusion syncthing :

*.swp
.DS_Store
.Ulysses-Group.plist
public

Le lancement en local :

hugo server --watch --theme=journal --buildDrafts 

sur le serveur :

hugo server --baseUrl="http://fredix.xyz/" --theme=journal --watch --appendPort=false

One more thing : Hugo gère les tags, les catégories et les flux RSS.

Ulysses étant spécifique Mac et plutôt cher on pourra le remplacer par Marko Editor qui gère tous les OS.