Déployer un site Pelican sur Webfaction

Publié le 26/07/2013

Après plusieurs années à triturer du Wordpress, je suis passé sur un générateur de blog statique. D'une part pour avoir le bonheur de pouvoir écrire mes articles dans la syntaxe qui me convient le plus pour le moment (Markdown/RST), et ensuite pour pouvoir facilement héberger le contenu dans un repository git. Evidemment, il existe des plugins pour écrire en Markdown avec Wordpress, il existe des plugins pour écrire facilement du code avec Wordpress et profiter de la coloration syntaxique, mais j'ai envie d'un truc simple :)

J'ai choisi Pelican parce que c'est en Python, parce que le fichier de conf' n'est pas gargantuesque et parce que ça fonctionne bien (ce dernier point étant le plus pertinent en fait; dans le cas contraire, je suis sûr que Jekyll ou Nicola seraient tout aussi bons).

Configuration

Pour la configuration, je me suis basé sur celle de Tarek Ziadé, et qui ressemble à ceci:

# -*- coding: utf-8 -*-
AUTHOR = u'<author>'
SITENAME = u"<site_name>"
SITEURL = '<site_url>'
TIMEZONE = "Europe/Brussels"
RELATIVE_URLS = True
GITHUB_URL = 'http://github.com/<username>/'
TWITTER_USERNAME = u'twitter'
GOOGLE_ANALYTICS = u''
DISQUS_SITENAME = "disqus"
PDF_GENERATOR = False
REVERSE_CATEGORY_ORDER = True
LOCALE = ""
DEFAULT_PAGINATION = 10
DISPLAY_PAGES_ON_MENU = True
ARTICLE_DIR = 'entries'
PAGE_DIR = 'pages'
OUTPUT_PATH = 'html'
FEED_RSS = 'feed'
TAG_FEED_RSS  = 'tag/%s/feed'
CATEGORY_FEED_RSS = 'category/%s/feed'
MENUITEMS = [('Home', '/'),]
THEME = 'themes/daker'

La structure du repository reste simple, et ne reprend que les dossiers et fichiers suivants:

  • /entries/ pour les différents articles. La catégorie est placée dans les métadonnées du document plutôt que dans un sous-dossier, afin de pouvoir la modifier plus facilement, et pour avoir tous mes articles en un coup d'oeil;
  • /pages/ pour les pages (forcément...), pour écrire le contenu des pages en Markdown/ReStructured-Text plutôt qu'en statique, de nouveau pour pouvoir profiter de Pygments :)
  • /themes/
  • Le fichier settings.py

Publication

Ensuite, au niveau de la configuration du serveur, j'ai ajouté un nouveau site statique dans ~/webapps, destiné à héberger les pages, ainsi qu'un répertoire cloné depuis Git. Une commande cron tourne toutes les 15 minutes, met ce repository à jour, génère les nouveaux fichiers et les copie dans le répertoire du site.

La commande crontab ressemble à ceci:

*/15 * * * * ~/apps/pelican/auto_publish_pelican.sh

Pour avoir les logs de cron, le plus simple est d'ajouter une redirection des outputs standard et erreurs vers un fichier, en ajoutant la commande suivante à la fin de la ligne:

*/15 * * * * auto_publish_pelican.sh > ~/apps/pelican.log 2>&1

Et le fichier auto_publish_pelican.sh est le suivant:


#!/usr/bin/env bash
cd ~/apps/pelican/<site>
virtualenv --no-site-packages .
source bin/activate
pip install pelican --upgrade
pip install Markdown --upgrade
git pull
pelican -s settings.py
rm -rf ~/webapps/<app_name>/*
cp -R html/* ~/webapps/<app_name>/

Finalement, le thème est repris de Daker, et un deuxième se trouve dans le répertoire /themes/dbrewery et est fortement inspiré de la présentation de DataBrewery.

La commande cron est reprise de l'article de Martin Fitzpatrick, qui explique plus en détails la manière de déployer un blog statique sur Webfaction (j'ai un peu tranché dans les étapes pour la mise-en-place ci-dessus...).