Git で push するとデプロイされる便利な諸々を用意する
御託
この文書を作りにあたって用意した環境は Raspberry Pi の上に用意されています。 また、Next.js を利用した環境の代わりに Python の HTTP サーバを利用しています。 まあ問題ないでしょ。 きっと。
とりあえず service 化する
この作業によってサーバを止める操作がとても楽になります。 汚いところは systemd に丸投げしてしまおうという魂胆です。
次のようなファイルを作成して /etc/systemd/system/ 配下に配置します。 ファイル名は、 例えば kohga.service のように *.service の形にします。 これを unit 定義ファイルと呼ぶようです。
code:kohga.service
Description = Kohga Daemon # なにか簡単な説明
Type = simple # コマンドそれ自体は daemonize しない
WorkingDirectory = /opt/kohga # 開始時のワーキングディレクトリ
ExecStart = npm run start # 開始時のコマンド
Restart = always # 誤爆で死んだ時は常に復活を試みる
WantedBy = multi-user.target # たぶんこれで問題ない
Unit 定義ファイルを配置したら service として認識されていることを確認します。
code:console
$ systemctl list-unit-files --type=service | grep kohga
kohga.service disabled enabled
そして service を起動できることを確認します。 当然ですが、service の起動には特権が必要です。
code:console
# systemctl start kohga.local
$ systemctl status kohga.local
● kohga.service - Kohga Daemon
Loaded: loaded (/etc/systemd/system/kohga.service; disabled; vendor preset>
Active: active (running) since Mon 2022-09-26 14:12:27 BST; 2s ago
Main PID: 766 (python3)
Tasks: 1 (limit: 1596)
CPU: 344ms
CGroup: /system.slice/kohga.service
`-766 python3 -m http.server
Sep 26 14:12:27 raspberrypi systemd1: Started Kohga Daemon. $ ss -ltn 'sport == 8000' # 適当なポート番号で実行する
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 5 0.0.0.0:8000 0.0.0.0:*
また、当然ですが systemctl stop kohga.service で停止できますし、 同様に systemctl restart kohga.service で再起動できます。 あなたが望むのならば、systemctl enable kohga.service で システムの起動時に service を自動的に起動するように設定できます。
ユーザを作成する
デプロイ専用のユーザ kohga を作成します。 このユーザを利用して git のレポジトリに push します。
code:console
# adduser kohga
Adding user `kohga' ...
Adding new group `kohga' (1001) ...
Adding new user kohga' (1001) with group kohga' ...
Creating home directory `/home/kohga' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for kohga
Enter the new value, or press ENTER for the default
Full Name []: kohga
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? Y/n y さらに、(行儀の悪いことですが)ユーザ kohga にパスワードなしで sudo する権限を付与します。
code:console
# visudo
kohga ALL=NOPASSWD: ALL
ベアレポジトリを作る
ユーザ kohga に成り代わり、 リモート環境(デプロイ先)にベアレポジトリを作成します。
code:console
# su - kohga
$ whoami; pwd
kohga
/home/kohga
$ mkdir ~/kohga.git
$ cd ~/kohga.git/.
$ git --bare init --shared
$ ls -la
total 40
drwxrwsr-x 7 kohga kohga 4096 Sep 26 14:59 .
drwxr-xr-x 3 root root 4096 Sep 26 14:48 ..
drwxrwsr-x 2 kohga kohga 4096 Sep 26 14:59 branches
-rw-rw-r-- 1 kohga kohga 126 Sep 26 14:59 config
-rw-rw-r-- 1 kohga kohga 73 Sep 26 14:59 description
-rw-rw-r-- 1 kohga kohga 23 Sep 26 14:59 HEAD
drwxrwsr-x 2 kohga kohga 4096 Sep 26 14:59 hooks
drwxrwsr-x 2 kohga kohga 4096 Sep 26 14:59 info
drwxrwsr-x 4 kohga kohga 4096 Sep 26 14:59 objects
drwxrwsr-x 4 kohga kohga 4096 Sep 26 14:59 refs
公開用のディレクトリを整備する
公開用のディレクトリを準備します。 上の unit 定義ファイルで /opt/kohga を指定したのでそこを利用します。
code:console
# cd /opt/.
# git clone ~kohga/kohga.git
Cloning into 'kohga'...
warning: You appear to have cloned an empty repository.
done.
ベアレポジトリの hook 処理を書く
ベアレポジトリが push を受け取ったときに発火する hook を記述します。
code:console
# su - kohga
$ ed ~/kohga.git/hooks/post-receive
/home/kohga/kohga.git/hooks/post-receive: No such file or directory
a
cd /opt/kohga/.
sudo systemctl stop kohga.service
sudo git pull
sudo npm install -y
sudo systemctl start kohga.service
.
w
120
q
$ chmod +x ~/kohga.git/hooks/post-receive
完成
これで動くと思いますよ、たぶん。
2023-09-09 追記
確かこれでは動かなくて、初回のデプロイ時に手動で /opt/kohga を git pull してやる必要があったと思います。 知らんけど。
<hr /><!-- 賢い人にはここに水平線が見える -->
参考文献
この文書はもともと 2022-09-29 に書かれたものであるようです。