この記事の対象

  • 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向けに変換するの面倒臭いなぁ…気が向いたらやります。