Hugo : Déploiement SFTP

Article publié, le et modifié le
5 minute(s) de lecture

Cet article contient 1014 mots.
Source brute de l'article : MD

Description

Pour déployer un site fait avec le générateur de site statique Hugo, il existe plusieurs solutions :

  • la plus simple est l’usage de l’outil rsync .
  • Il existe des “solutions” de déploiement selon le type de services que vous utilisez.
  • je vais vous en présenter une troisième solution tenant compte du fait que votre utilisateur SSH soit soumis au chroot SSH.

Dans le contexte de déploiement “simple”, il suffit de créer le script de déploiement nommé deploy à la racine du projet Hugo !

Documentation

La documentation officielle :

Utilisation

rsync

Déployer un site avec rsync est très simple. rsync est l’outil pour de la synchronisation de données ; il le fait, et il le fait bien.

Après avoir installé l’outil :

  • sous Debian/*Buntu : # apt install rsync
  • sous OpenBSD : # pkg_add rsync - pour information, depuis OpenBSD v6.5, il existe nativement dans le système de base, l’outil openrsync ; reproduisant le comportement de rsync, il est asujetti au même problème décrit ci-dessous -

En assumant le fait que vous avez une authentification SSH sur le serveur où vous désirez vous synchroniser, et mieux une authentification par clé SSH.

Fichier : deploy

1
2
3
4
5
6
7
8
9
#!/bin/sh

user=userid
host=servername
port=22

dir_dist=/remote_folder/

hugo && rsync -avz --delete -e "ssh -p $port" public/ ${user}@${host}:${dir_dist}
  • userid est l’identifiant utilisateur SSH
  • servername est le nom FQDN ou l’adresse IP du serveur SSH vers lequel se connecter
  • remote_folder est le nom réel du répertoire distant sur lequel se connecter.

Cet exemple montre le déploiement d’un site avec rsync utilisant une connexion SSH.

Info
Attention

SshFS

SshFS peut être installé par votre gestionnaire de paquets :

  • sous Debian/*Buntu : # apt install sshfs
  • sous OpenBSD : # pkg_add sshfs

L’avantage de SshFS est que c’est un outil qui permet de se connecter que votre utilisateur SSH soit soumis ou non à un chroot SSH en montant le répertoire distant dans l’espace utilisateur local.

Sous OpenBSD, c’est un peu plus délicat ; du fait de fonctionner principalement sur ce SE , j’expliquerais principalement pour celui-ci. Au cas où, adaptez à votre cas. En effet, sous OpenBSD, il est nécessaire d’avoir des droits administrateur, et il est recommandé d’avoir paramétré doas .

Pour monter localement le système de fichier :
$ doas sshfs -C -p $port -o allow_other -o uid=$(id -u $USER) -o gid=$(id -g $USER) ${id}@${host}:${dir_dist} "${dir_mount}"

Une fois connecté, le répertoire distant est monté localement là où vous le désirez.

C’est le moment d’utiliser rsync mais au lieu de chercher à se connecter - puisque c’est déjà fait -, l’outil va permettre de synchroniser d’un répertoire source local vers le répertoire source distant, monté localement.

rsync s’utilise donc ainsi :
cd "${dir_local}" && rsync -av --delete --human-readable --progress --stats "." "${dir_mount}"

Pour le démonter proprement, ce sera :
$ doas umount "${dir_mount}"

Ceci étant dit, voici à quoi peut ressemble le fichier de déploiement dans ce contexte SshFS + rsync :

Fichier : deploy

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#!/bin/sh
#set -x
[ -n "$TERM" ] && clear

ROOT="$(dirname "$(readlink -f -- "$0")")"

id=userid
host=servername
port=22

### the directory where your web site files should go
## dir_dist: relative to chroot SSH
dir_dist="/www/"
dir_local="$ROOT/public/"
dir_mount="$HOME/servers/${id}/"

rsync_opts="--human-readable --progress --stats "

################################################################################
###
##
#   Fonctions
##
###
################################################################################

_mount() {
    [ ! -d "${dir_mount}" ] && mkdir -p "${dir_mount}"
    [ -d "${dir_mount}" ] && doas sshfs -C -p $port -o allow_other -o uid=$(id -u $USER) -o gid=$(id -g $USER) ${id}@${host}:${dir_dist} "${dir_mount}"
}

_rsync() {

    cd "${dir_local}" || exit
    rsync -av --delete $rsync_opts "." "${dir_mount}"

}

_umount() {
    doas umount "${dir_mount}"
}

################################################################################
###
##
#   Execution
##
###
################################################################################

hugo
status="$?"

if [ "${status}" -eq 0 ]; then
    if _mount; then
        _rsync
        _umount
    fi
fi
  • userid est l’identifiant utilisateur SSH
  • servername est le nom FQDN ou l’adresse IP du serveur SSH vers lequel se connecter
  • dir_mount est le nom du répertoire local vers lequel le répertoire distant va être monté.

lftp

lftp est un couteau suisse de la connexion réseau. Il fait du FTP, FTPS, de la synchronistation de document, sur IPv4, IPv6, au-travers des protocoles HTTP(S) ; il fait même du trafic bittorent, voire partiellement du WebDAV… et il est capable de se connecter en SFTP !

Voilà le “miracle” : un client réseau sachant faire du mirroring de données en SFTP !!!

Donc, installez avec votre gestionnaire de paquets le binaire :

  • sous Debian/*Buntu : # apt install lftp
  • sous OpenBSD : # pkg_add lftp

Fichier : deploy

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/bin/sh
#set -x
[ -n "$TERM" ] && clear

ROOT="$(dirname "$(readlink -f -- "$0")")"

id=userid
host=servername
port=22

### the directory where your web site files should go
## dir_dist: relative to chroot SSH
dir_dist="/www/"
dir_local="$ROOT/public/"

hugo && /usr/local/bin/lftp -e "mirror -e -R ${dir_local} ${dir_dist} ; quit" -p $port sftp://${id}@${host}
  • userid est l’identifiant utilisateur SSH
  • servername est le nom FQDN ou l’adresse IP du serveur SSH vers lequel se connecter

FIN

Voilà, c’est fini.

Maintenant, vous savez déployer votre site statique Hugo, que avec rsync/ssh, sshfs+rsync voire lftp.