lid's stuff

Ghost: le blog nodeJS auto-hébergé

Mon client principal à la gentillesse de mettre à disposition de ses prestataires (moi! Je suis leur sysadmin :)), développeurs et salariés une machine virtuelle individuelle, 2 cœurs, 4Go de RAM, 16Go de disque, l'hyperviseur étant une de nos anciennes machines de bases de données (24 cœurs logiques, 128Go de RAM, 3x120Go SSD RAID-5). Certes on pourrait se dire, à l'époque des Xeons pleins de cœurs bourrés de RAM avec des SSDs de 1To que c'est petit, mais en fait c'est amplement suffisant pour s'héberger un petit site avec peu de trafic: CV, blog, ZNC, serveur de mails, etc… ce ne sont pas les possibilités qui manquent!

Bon, alors, de quoi a-t-on besoin pour autohéberger son propre blog en utilisant Ghost?

En fait, pas vraiment grand chose:

  • Un nom de domaine ou un DNS dynamique
  • Idéalement un certificat SSL (je sais, je n'ai pas encore reçu le mien, pas bien)
  • Une machine (de la brique internet à une machine plus puissante du genre dédié chez un hébergeur (je ne vais pas vous faire la liste ni faire de pub ;))
  • Une distribution GNU/Linux (par exemple Debian) ou une *BSD (FreeBSD, NetBSD, ou ma préférée, OpenBSD
  • HAProxy pour le reverse proxy (et le load balancing si nécessaire) - ou tout autre reverse proxy
  • Sqlite3 (ou toute autre base de données relationnelle prise en charge par Ghost, par exemple PostGreSQL, MySQL/MariaDB…). J'ai choisi Sqlite3 pour la simplicité de mise en place.
  • NodeJS, of course. Version 0.10.x ou plus (ça tombe bien, Debian Jessie intègre la 0.10.29).
  • npm, le gestionnaire de paquets de NodeJS.
  • Screen ou TMux, toujours pratique!
  • Et bien évidemment la dernière version de Ghost, disponible ici: https://ghost.org/download/

Je passerai les étapes nom de domaine, certificat, machine et installation de votre système d'exploitation, si vous êtes ici, je pars du principe que vous savez déjà faire tout ça!

Étape 1: Créer un utilisateur réservé

On va se créer un utilisateur avec des droits limités (on pourrait aussi faire un chroot, ce serait d'ailleurs plus secure, mais on va faire simple, en partant du principe qu'il s'agit d'un blog perso, pas d'un site web en production - pour le coup, là, j'utiliserai des containers ou des chroots, le tout étant distribué par HAProxy) qui va nous servir à lancer le process node de Ghost, stocker les données dans son répertoire $HOME, etc:

  • Pas d'accès sudo. Manquerait plus que ça!
  • Pas d'accès SSH (toujours, toujours, TOUJOURS désactiver le login/mot de passe et TOUJOURS utiliser l'authentification par clefs asymétriques (RSA 4096 bits))
  • Pas de mot de passe (il est donc impossible de se logger en tant que cet utilisateur sans être root)

On peut donc faire:

$ sudo useradd -ms /bin/bash ghost

Puis on se logge en tant que l'utilisateur ghost:

# su ghost

On peut maintenant passer à l'étape 2: la compilation de ghost et de ses dépendances!

Étape 2: Compilation

On procède toujours ici en tant qu'utilisateur ghost.

Idéalement on va créer un répertoire pour y dézipper l'archive de ghost, puis ensuite:

npm install --production

Il est possible sous Debian qu'il y ait un problème lors de la compilation du module sqlite3 de NodeJS, dû à la différence de nommage de NodeJS, qui est ici /usr/bin/nodejs et non /usr/bin/node (un autre programme s'appelant aussi node - normalement non installé sur votre machine). On règle ça par un:

# ln -s /usr/bin/nodejs /usr/bin/node

et on relance la compilation.

On configure ensuite ghost via le fichier config.js. Il faut indiquer:

  • l'url de notre blog
  • L'interface réseau qu'on utilise (loopback dans notre cas, soit 127.0.0.1, je n'ai pas envie qu'on puisse papoter avec nodeJS de l'extérieur - d'où HAProxy!)
  • le port qu'on utilise (personnellement j'utilise le 30001)

dans la partie Production du fichier de configuration.

Une fois fait, on lance (enfin!) l'applicatif nodeJS:

npm start --production

On peut désormais passer à l'étape 3!

Étape 3: Configuration d'HAProxy

HAProxy va nous permettre de faire parvenir les requêtes lui arrivant sur son interface réseau, port 80, vers l'applicatif nodeJS qui tourne lui sur 127.0.0.1:30001

Très simple à mettre en place, il nous suffit de créer notre frontend écoutant sur notre interface WAN, port 80 (ou 443), et router l'intégrale vers notre applicatif nodeJS en backend. On ne modifie pas le début du fichier /etc/haproxy/haproxy.cfg, on les ajoute simplement à la fin:

frontend ghost
    bind *:80
    reqadd X-Forwarded-Proto:\ http
    default_backend ghost_backend

backend ghost_backend
    balance leastconn
    cookie SERVID insert indirect nocache
    server ghost_dog 127.0.0.1:30001 cookie ghost_dog check

Pour être sûr que tout fonctionne, je vous recommande chaudement le logiciel HATop qui est en gros htop, mais pour haproxy!

Il suffit ensuite de se connecter via votre navigateur à l'addresse:

http://host.mondomaine.tld/

Pour accéder au blog lui même, et sur:

http://host.mondomaine.tld/ghost

Pour configurer votre premier utilisateur (avec si possible un gros mot de passe bien balaise même si les mots de passe c'est hasbeen), rédiger vos posts, gérer vos thèmes, etc.

Et voilà!
Prochaine étape: la même, en distribué, et en SSL/TLS!

some_cat


Tagged under: web, sysadmin