Gitit を systemd のサービスとして起動する

さくらVPSのOSをCentOS7にしたので,Wikiも新しくしようと思いGititを動かし始めました.
GititのインストールなどについてはgithubのREADMEを参考に,cabalでインストールすると良いと思います.

さて,このGititをサーバとして動かす際にちょっと調べたことがあったのでメモします.

Serviceを定義する上で注意したこと

  1. 実行ユーザを固定したい(セキュリティ的な意味で)
  2. gititコマンドがサーバの本体なので,動かし続けなければならない
  3. Wikiのデータが配置される場所でgititコマンドを実行する必要がある

systemd用のserviceについてはsystemd徹底入門のスライドがとても詳しいので参考にすると良いと思います.

まずは真似する

兎にも角にも,serviceの書き方がよくわからなかったので,同じサーバアプリケーションである(?)Nginxのserviceをコピーしました.(いいのかどうかはよくわからないですが)

# cp /usr/lib/systemd/system/nginx.service /usr/lib/systemd/system/gitit.service 

network.targetとかmulti-user.targetとか既に書いてあるので便利ですね(・∀・)

これを元に,以降書き換えand追記していきます.
最後にgitit.serviceのファイル全体を載せるので,せっかちな人はスクロールしてください(´・ω・`)

実行ユーザの変更

実行ユーザは[Service]セクションのUser,Group値を設定すれば良いらしいです.
なので,以下のように追記.

...
[Service]
User=gitit
Group=gitit
...

サーバプログラムを動かし続ける

ServiceにはTypeという値が与えられます.Typeは実行するコマンドの動作によって決めます.今回は"ずっと動かし続ける"プログラムなので,Typeとしてsimpleを設定します.(フォアグランドで動き続けるプログラムなので)

...
[Service]
Type=simple
...

コマンドを実行する場所を変える

3番目の問題である,Wikiデータの置いてある場所でコマンドを実行させる方法について.
bashとかだと"cd hoge && foo"みたいに普段は書いてしまうので,同じように最初書いたらsystemctlさんに怒られてしまいました(;_;)

serviceではコマンドを実行する場所は,WorkingDirectoryという値で決められるらしく,この値をWikiデータのある場所に設定します.

...
[Service]
WorkingDirectory=/path/to/wiki
...

実行方法

serviceを/usr/lib/systemd/system以下に配置すれば,他のサービスと同様にsystemctlコマンドで実行することができます.

# systemctl enable gitit
# systemctl start gitit

今回つくったファイル

$ cat /usr/lib/systemd/system/gitit.service
[Unit]
Description=The Gitit Wiki server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=simple
PIDFile=/run/gitit.pid
User=gitit
Group=gitit
WorkingDirectory=/path/to/wiki
ExecStart=/path/to/.cabal/bin/gitit -f /path/to/gitit.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

参考:
Linux女子部 systemd徹底入門
systemd の .service ファイルの書き方
[systemd-devel] WorkingDirectory in service file
Haskell パッケージのインストール方法

未分類

Posted by tanitanin