dockerでhugoのサイトを静的ジェネレート

ありがちな話だが、wordpressを自鯖に導入してweblogを運営していたのだが、wordpressのアップデートについていくのが面倒になってきたので、静的ジェネレートしたサイトをAmazon S3に置いて、webhosting機能で公開することにした。 最初はwordpressから静的サイトを出力できる拡張機能と、S3連携ができる拡張機能を使っていたが、S3連携が動かなくなったので構成をまるっと見直すことにした。

構成図

構成図

設定

まず静的ジェネレートするdockerコンテナを用意する。

docker-compose.yml

コンテナは、製作者の公式イメージがなさそうなので、Docker Hubで検索して、Dockerfileなどから問題がなさそうなものを選択する。 私の場合は、base imageがalpineで軽量かつbuild工程が単純そうなpeaceiris/hugoを利用することにした。 UID, GIDは、指定しておかないと生成されたファイルがroot権限になってしまうため、host上で操作する時はいちいちsudoをつければいいが、samba越しに操作する時には障害となるのでsambaで共有する予定のユーザのUID, GIDにしておく。 その際、dockerコンテナ内のpasswd, groupにそのUID, GIDがないとエラーになるため、read onlyモードで読み込んでおく。 ソースはどこにおいても良いが、私は/opt/hugoに置くことにした。samba共有する時のパス指定に関わってくるので、その点を念頭に決定すること。

version: '3'

services:
    hugo:
        image: peaceiris/hugo
        user: "1000:1000"
        volumes:
            - /opt/hugo:/src
            - /etc/localtime:/etc/localtime:ro
            - /etc/passwd:/etc/passwd:ro
            - /etc/group:/etc/group:ro

archetypesの中にあるテンプレートに従って新規ポストを生成するには、投稿するファイル名をNEWPOSTFILEとすると

docker-compose run --rm hugo new post/NEWPOSTNAME.md

作成したファイルを元に静的ジェネレータを走らせるのは、適用するテーマ名をTHEMEとすると

docker-compose run --rm hugo -t THEME

goofysの導入・使い方

生成したファイル群を、S3にコピーする。 s3cmdを使ったり、いちいち手でアップロードしても良いが、面倒なのでファイルシステムとしてマウントしてコピーをできるようにする。

ツールは、応答速度の速いgoofysを使うことにする。 goofysを使ってAmazon LinuxにS3をマウントする。 - Qiita

上の記事を参考に、ubuntuユーザならyumをaptにする。

aws cliでコンフィグが生成されていることを前提に、FQDNをFQDN、マウント先を/MNTとすると

sudo /home/hada/go/bin/goofys -o allow_other --uid=1000 --gid=1000 --use-content-type FQDN /MNT

あとは、publicフォルダを配置したいパスへコピーするだけ。 例えば、このサイトの場合、hugoというフォルダにコンテンツをコピーするので、

cp -r /opt/hugo/public/* /MNT/hugo/

とする。

comments powered by Disqus