HUGO サイトを自動でFTPアップロードするDockerコンテナを作ってみた
ドメインを取得した時に無料でもらえたサーバーがあって、静的サイトだったのでなんかうまく使えないかなぁと思って、HUGOのサイトを自動でFTPしてくれるDockerコンテナを作ってみました。
公開日: 2019.3.11
目標
HUGOで作成したサイトを、毎回FTPクライアントでアップロードするのが面倒なので、コマンド一発で本番データをアップする機能を目指します。
ちなみに、すでに「hugo new」でローカルにHUGOサイトが作成されている前提です。
「Netlifyならレポジトリにアップして終わりじゃん」というご指摘、ごもっともです。
下準備
HUGO&LFTPのコンテナイメージを作る
HUGOとLFTPさえあればOKなので、それらが入ったコンテナイメージを作成します。
Dockerfileは下記のようになりました。
FROM alpine:latest
RUN wget https://github.com/gohugoio/hugo/releases/download/v0.41/hugo_0.41_Linux-64bit.tar.gz
RUN tar -xzf hugo_0.41_Linux-64bit.tar.gz
RUN mv hugo /usr/local/bin/hugo
RUN mkdir -p /hugo
## Install lftp
RUN apk update && apk add lftp
大元のDockerfileは下記のページを参考にさせていただきました。
[Docker] Alpineを使って軽量なHugoイメージ作って見た。 | nyagosu hanten
これにLFTPを足しただけです。
docker build .
でビルドして、
docker tag
で、イメージに「hugo-ftp」という名前をつけました。
lftpの設定ファイルを用意する
LFTPの設定については、下記を参考にさせていただきました。
今回は、Dockerコンテナ内にlftpを内包しているので、ローカルにインストールする必要はありません。
また、レンタルサーバーにFTPする前提なので、FTPユーザー・パスワードは作成済みとして、必要なのは、lftp.datの作成部分です。
lftp.datの中身は下記の通り。
open -u FTPユーザーID,FTPパスワード FTPサーバー
mirror -R --only-newer --verbose=3 --log=lftp.log ./public /
echo end
close
quit
このファイルをHUGOのプロジェクディレクトリ直下においておきます。
実際に使ってみる
さて、いよいよ実行の時です。
hugo newですでにHUGOプロジェクトが出来ている前提で進めます。
実行コマンド
実行コマンドは下記になります。
docker run -w /hugo -v site/:/hugo --rm --name hugo hugo-ftp /bin/bash -c "hugo && lftp -f lftp.dat"
コンソール上にHUGOコマンドとLFTPのコマンドがずらーっと流れて、エラーがでなければOKです。
FTPサーバー側を見てみると、HUGOプロジェクトのpublicディレクトリの中身がそのままコピーされているはずです。
厳密にはミラーリングしているので、ローカルになかったファイルは削除されます。
dockerコマンドの解説すると、、、
docker run #dockerを実行
-w /hugo #ワークスペースをコンテナ内の/hugoにする
-v site/:/hugo #ローカルディレクトリをコンテナにマウント
--rm #コンテナを実行したら自動削除
--name hugo #コンテナ名
hugo-ftp #使用するコンテナイメージ
/bin/bash -c "hugo && lftp -f lftp.dat" #コンテナ内でhugo && lftpコマンドを実行
という形になります。
最後のコマンドのところで、「hugo = 静的ファイルをジェネレート」して、「lftpコマンドで対象FTPサーバーにミラー」する感じです。
docker runで簡単にHUGOサイトを本番アップロードできました。
これを拡張して、Githubのhookに対応させたり、複数サイトの管理ができるプログラムにしていけば、いろんな静的サイトの管理が楽になりそうですね。