Déployer un site statique avec FTP

Jusqu’ici habitué à exporter les sites statiques à l’aide d’un simple rsync, qui synchronise le répertoire généré en local avec les fichiers présents sur le serveur, je me suis retrouvé avec un serveur mutualisé uniquement accessible grâce à FTP. Il s’agissait pour moi d’un outil que je n’avais plus utilisé depuis les années 2000, avec CuteFTP puis FileZilla, en glissant-déposant les fichiers… Heureusement, l’outil en ligne de commande lftp permet simplement de maintenir une copie distante « en miroir » avec un répertoire local.

Connexion

Pour éviter de taper ses identifiants de connexion dans le terminal ou se connecter automatiquement, on crée un fichier ~/.netrc contenant :

# ~/.netrc
machine yourserver login youruser password yourpassword

On peut alors se connecter via FTP avec :

lftp user@domain.tld

Il est également possible de se connecter avec SFTP, ce qui est plus sécurisé, en précisant le protocole et le port avec la commande suivante :

lftp sftp://user@domain.tld:22

Il est possible que vous vous heurtiez, à la première commande tapée, à l’erreur Fatal error: Host key verification failed. Cela s’explique par l’absence de l’empreinte de clef RSA dans la liste des serveurs connus. Pour y remédier, un simple ssh user@domain.tld suivi de la réponse yes lorsque l’on vous demande si vous acceptez le serveur.

Commandes

Pour obtenir une copie distante dans un répertoire www exactement identique à un répertoire local public, on utilise :

mirror -R public www --delete

J’utilise également les options --ignore-time (pour n’envoyer que les sites nécessaires), --parallel 5 pour avoir plusieurs connexions simultanées, ce qui accélère substantiellement l’envoi (le nombre possible dépend de votre connexion et de votre hôte), et -v pour voir les actions réalisées.

Script automatisé

Pour exécuter automatiquement ces commandes dans un script, il suffit d’utiliser EOF et la commande quit 0 à la fin. Par exemple, avec FTP (sans connexion sécurisée) :

lftp user@domain.tld << EOF
  mirror -R public www --delete --ignore-time --parallel 5 -v
  quit 0
EOF

Et avec SFTP (connexion via SSH) :

lftp sftp://user@domain.tld:22 << EOF
  mirror -R public www --delete --ignore-time --parallel 5 -v
  quit 0
EOF