Welcome Hugo
Par Stun
I) Deux mots de contexte
Fan de générateur de site statiques, j’ai longtemps utilisé Ikiwiki.. Basé sur Svn il génère l’ensemble des html lors d’un svn commit. Néanmoins, svn date d’un autre temps et le rendu d’ikiwiki… aussi.
Il y a quelques temps, j’ai eu l’occasion de jouer avec Hugo, qui permet plus ou moins la même chose mais avec un rendu plus moderne. Je me suis donc lancé pour le déployer 100% en auto hébergement sur mon vieux Nas… Le périple commence.
Mon bon vieux NAS a plus de 10 ans, il tourne sous une architecture exotique (armv5tel) qui est - et c’est génial - encore supporté par Debian. Mais les paquets Hugo sont très largement en retard sur les releases actuelles et ne sont tout bonnement pas utilisables (les thèmes sont incompatibles, etc)…
Donc on tire la bobine de fil : pour un thème récent, il faut compiler un Hugo récent (car pas de binaire précompilé pour mon architecture). Pour un Hugo récent, il faut une version de Go récente… car pas moyen de compiler avec les versions de Go disponibles dans les paquets Debian…
Compte tenu des performances très… limités du CPU, on va faire ça dans la durée, dans un tmux… La manip a pris une bonne grosse semaine…
II) Compiler Go
mkdir GO_BuildFromSources
cd GO_BuildFromSources/
wget https://go.dev/dl/go1.18.1.src.tar.gz
tar -xf go1.18.1.src.tar.gz
cd go/src/
./all.bash
Et c’est partie pour de longues heures/jours…
Malheureusement la commande fini en erreur sur un test spécifique à une instruction CPU…
Je fais le parie que cette instruction ne sera pas utilisée pour compiler Hugo, on croise les doigts…
III) Compiler hugo
mkdir HUGO_BuildFromSources
cd HUGO_BuildFromSources/
git clone https://github.com/gohugoio/hugo.git
cd hugo/
../../GO_BuildFromSources/go/bin/go install --tags extended
C’est surprenant… la commande termine après un long moment sans plus d’info… Un petit find plus tard m’apprend que le binaire est tombé dans
~/go/bin/hugo
Ca y est, la base principale est prête! Maintenant intégrons là!
IV) Créer un serveur Git autohébergé
Supposons que je place ce genre de chose dans un /Service.
Ce n’est pas important, il faut juste être sur d’être sur un lieu en raid 1.
cd /Service
mkdir stun.fdn.fr
cd stun.fdn.fr
git init --bare
Parfait… On peut désormais cloner et push…
#Sur le NAS directement :
git clone /Services/stun.fdn.fr/
#Sur un autre PC :
git clone qnap:/Services/stun.fdn.fr/ stun.fdn.fr
#Oui, il y a quelques subtilités sur ma conf qui font que je dois passer par host déclaré dans ~/.ssh/config
V) Configurer nginx
sudo aptitude install nginx-light
cd /etc/nginx/sites-enabled/
mv default stun.fdn.fr
nano stun.fdn.fr
Le contenu du fichier est le plus simple possible pour un serveur web http :
server {
listen 80 default_server;
listen [::]:80 default_server;
root /PATH_TO_MY_HTML_FILES/stun.fdn.fr;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
try_files $uri $uri/ =404;
}
}
On relance le serveur :
systemctl restart nginx.service
VI) Déploiement (git server hooks)
Dernière étape, celle qui m’a le plus amusé. Générer automatiquement le site lors d’un git push.
La solution que j’ai retenu se déroule en 2 étapes :
- J’ai un hook déclenché côté serveur qui va recloner le repository et appeler un script en gestion de conf. Objectif : ne plus jamais le toucher.
- le script s’assurera de récupérer les submodules et générer correctement le site. Il est simple à changer et géré directement dans le repo git.
1) Le Hook :
#!/bin/bash
TARGET="/tmp/stun.fdn.fr_CI_Deploy"
DEPLOY_ENTRYPOINT="scripts/Deploy.sh"
REPO="/Services/stun.fdn.fr/"
BRANCH="master"
while read oldrev newrev ref
do
# only checking out the master (or whatever branch you would like to deploy)
if [[ $ref = refs/heads/$BRANCH ]];
then
echo "Ref $ref received. Deploying ${BRANCH} branch to production..."
rm -rf ${TARGET}
mkdir -p ${TARGET}
unset GIT_DIR
git clone ${REPO} ${TARGET}
pushd ${TARGET}
if [ -f "${DEPLOY_ENTRYPOINT}" ]; then
bash ${DEPLOY_ENTRYPOINT}
fi
popd
else
echo "Ref $ref received. Doing nothing: only the ${BRANCH} branch may be deployed on this server."
fi
done
2) Le Point d’entrée :
#!/bin/bash
RED='\033[0;31m'
GREEN='\033[0;32m'
ORANGE='\033[0;33m'
NC='\033[0m' # No Color
echo -e "Starting ${GREEN}deployement${NC}..."
echo ""
echo -e "Step 1: get submodules..."
git submodule update --init --recursive
echo ""
echo -e "Step 2 : Call Hugo generator"
HUGO_ENV=production ~/go/bin/hugo -D
echo ""
echo -e "${GREEN}Done!${NC}..."