.nr PI 1m .DA 2022\-09\-27 .TL Git で push するとデプロイされる便利な諸々を用意する .AU KusaReMKN .NH S 0 御託 .PP この文書を作るにあたって用意した環境は Raspberry Pi の上に用意されています。 また、Next.js を利用した環境の代わりに Python の HTTP サーバを利用しています。 まあ問題ないでしょ。 きっと。 .NH 1 とりあえず service 化する .PP この作業によってサーバを止める操作がとても楽になります。 汚いところは systemd に丸投げしてしまおうという魂胆です。 .PP 次のようなファイルを作成して \fB/etc/systemd/system/\fP 配下に配置します。 ファイル名は、 例えば \fBkohga.service\fP のように \fB*.service\fP の形にします。 これを unit 定義ファイルと呼ぶようです。 .DS .fam C [Unit] Description = Kohga Daemon # なにか簡単な説明 [Service] Type = simple # コマンドそれ自体は daemonize しない WorkingDirectory = /opt/kohga # 開始時のワーキングディレクトリ ExecStart = npm run start # 開始時のコマンド Restart = always # 誤爆で死んだ時は常に復活を試みる [Install] WantedBy = multi-user.target # たぶんこれで問題ない .fam .DE .PP Unit 定義ファイルを配置したら service として認識されていることを確認します。 .DS L .fam C $ \fBsystemctl list-unit-files --type=service | grep kohga\fP kohga.service disabled enabled .fam .DE .PP そして service を起動できることを確認します。 当然ですが、service の起動には特権が必要です。 .DS L .fam C # \fBsystemctl start kohga.local\fP $ \fBsystemctl status kohga.local\fP \(bu 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 systemd[1]: Started Kohga Daemon. $ \fBss -ltn \(aqsport == 8000\(aq\fP # 適当なポート番号で実行する State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 0 5 0.0.0.0:8000 0.0.0.0:* .fam .DE .PP また、当然ですが \fCsystemctl stop kohga.service\fP で停止できますし、 同様に \fCsystemctl restart kohga.service\fP で再起動できます。 あなたが望むのならば、\fCsystemctl enable kohga.service\fP で システムの起動時に service を自動的に起動するように設定できます。 .NH 1 ユーザを作成する .PP デプロイ専用のユーザ \fBkohga\fP を作成します。 このユーザを利用して git のレポジトリに push します。 .DS L .fam C # \fBadduser kohga\fP 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 .fam .DE .PP さらに、\h'-1.7n'(行儀の悪いことですが)\h'-.6n'ユーザ \fBkohga\fP にパスワードなしで \fCsudo\fP する権限を付与します。 .DS L .fam C # \fBvisudo\fP kohga ALL=NOPASSWD: ALL .fam .DE .NH 1 ベアレポジトリを作る .PP ユーザ \fBkohga\fP に成り代わり、 リモート環境(デプロイ先)にベアレポジトリを作成します。 .DS L .fam C # \fBsu - kohga\fP $ \fBwhoami; pwd\fP kohga /home/kohga $ \fBmkdir \(ti/kohga.git\fP $ \fBcd \(ti/kohga.git/.\fP $ \fBgit --bare init --shared\fP $ \fBls -la\fP 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 .fam .DE .NH 1 公開用のディレクトリを整備する .PP 公開用のディレクトリを準備します。 上の unit 定義ファイルで \fB/opt/kohga\fP を指定したのでそこを利用します。 .DS L .fam C # \fBcd /opt/.\fP # \fBgit clone \(tikohga/kohga.git\fP Cloning into \(aqkohga\(aq... warning: You appear to have cloned an empty repository. done. .fam .DE .NH 1 ベアリポジトリの hook 処理を書く .PP ベアレポジトリが push を受け取ったときに発火する hook を記述します。 .DS L .fam C # \fBsu - kohga\fP $ \fBed \(ti/kohga.git/hooks/post-receive\fP /home/kohga/kohga.git/hooks/post-receive: No such file or directory \fBa #! /bin/sh cd /opt/kohga/. sudo systemctl stop kohga.service sudo git pull sudo npm install -y sudo systemctl start kohga.service \&. w\fP 120 \fBq\fP $ \fBchmod +x \(ti/kohga.git/hooks/post-receive\fP .fam .DE .NH 1 完成 .PP これで動くと思いますよ、たぶん。 .SH 1 参考文献 .IP \(bu 3n https://qiita.com/DQNEO/items/0b5d0bc5d3cf407cb7ff .IP \(bu https://qiita.com/tabimoba/items/e0230eb9d1f943b8708f .IP \(bu https://enakai00.hatenablog.com/entry/20130917/1379374797 .IP \(bu https://zenn.dev/kusaremkn/articles/f5725fd203ecf9