この記事の対象
- dockerがある程度使える人(私は全然使えないけど)
- GNU/Linuxへの知識がある人
今まではWordpressを使っていたのをHugoに移行してみた。
移行した理由
WordpressはWebからグラフィカルに記事を書けるんだけど、普段Neovimで文字を打ってる人からするととても使い辛かった。管理も面倒臭いしね。 だからMarkdownで投稿を書けたら良いなって思ってHugoに移行してみたって感じです。
どうやって移行したの?
Gitサーバー(forgejo)を立ててあったので、サイトを上げるリポジトリを作って、プッシュしたらWebhookでdocker内に作ったhugoの環境にプッシュを通知するようにした。通知されたらシェルスクリプトを実行するプログラムをpythonで書いてみた。
手順
forgejoでwebhookを設定する
サーバー内にforgejoのdockerとhugoのdockerがあって、forgejo側でサイトのリポジトリにプッシュされたらhugoのdockerに通知を送るようにしたいんだけど、forgejoはデフォルトでプライベートIPへのアクセスを禁止している。だから解除する必要があるよ
forgejo/gitea/conf/app.iniにこれを追加
[webhook]
ALLOWED_HOST_LIST=external,loopback,192.168.0.*(サーバーのIP)
ALLOW_LOCAL_NETWORKS = true
これを追加した後、forgejoを再起動するとサーバーのIPにwebhookを送ることができる。そして、リポジトリの設定からwebhook→webhookを追加→forgejoをリポジトリと組み合せる→ターゲットURLにサーバーのIPを入力 これでforgejo側は完了。 私の書いたコードを使うならポートは9999で。
docker側の設定
dockerfile
FROM ubuntu:latest
WORKDIR /app
COPY ./scripts /app
RUN apt update && apt -y install hugo nginx git ssh neovim rsync python3
CMD ["bash", "-c", "nginx & python3 webhook.py"]
./scriptsの中身は、push.shとwebhook.pyだけです。
このpythonのプログラムは、9999ポートにHTTPリクエストを送ると勝手にpush.shを実行してくれるよ (本当はpythonじゃなくCで書きたかったけど、dockerのコンテナ内でビルドするのが面倒だったのとpythonの練習でpythonにした)
webhook.py
import socket
import subprocess
listening = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listening.bind(('0.0.0.0', 9999))
listening.listen(1)
while 1:
connected, address = listening.accept()
subprocess.run(['bash', 'push.sh'])
connected.sendall(b'HTTP/1.1 200 OK\r\nContent-Length: 0\r\nConnection: close\r\n\r\n')
connected.close()
9999番ポートに大量のアクセスが来たらぶっ壊れるくらい弱いし9999ポートに来たら問答無用で更新しちゃうけど許してね!(そもそも家のLANに怪しい奴を入れたり怪しいソフトを動かしたりはやめろ!)
push.shの中身はただgit pullしてサイトをビルドして/var/www/htmlにコピーするだけです。
このdockerfileをビルドして、docker runをする時に-p 9999:9999でポートを割り当ててあげてね。 そうしたら、docker execでコンテナの中に入って、git cloneでサイトのリポジトリをクローンする。その後push.shを実行してね。
ここまでできたら、もうgitにプッシュするだけで自動で更新されると思います。
移行した感想
- mdをNeovimで書ける!最高!!
- テーマ沢山おしゃれなやつある!!最高!!
- HTMLの初歩的な知識が無いとちょっとキツいかも!! そんな感じです。
おわり
WordPressの記事をhugo向けに変換するの面倒臭いなぁ…気が向いたらやります。