先日Hugo + Netlifyでブログを再構築したよという記事を書きました。Amazonのアフィリンクを簡単に置くためにショートコードを使っていて、記事のビルドの際にはAmazonの情報をを取ってくるサーバーが必要になります。
そのサーバーをインターネットからアクセスできるところに動かしていると書きました。
ローカルで動かしていたWebサーバーをインターネット上に公開する必要がありました
のところ。
サーバー
以前もリンクを貼ったこちらのコードを使わせてもらいました。
longkey1 / amazon-product-json · GitLab
Go言語のechoというWebフレームワークが使われていて、URLにASINを含めてリクエストするとAdvertising APIの結果がJSONとして返ってきます。
ショートコードが生成するHTMLはこのJSONに合わせて作っています。
デプロイ
Goはほとんど使ったことがないのでよくわかっていないのですが、サーバー上にバイナリを置いてデーモンぽく起動させておいて、元々動いてるNginxで外からのリクエストをこのGoのサーバーに振ってあげればいいだろうなーと想像して適当にデプロイしました。デプロイ先は普段から使っているConohaのVPSです。
環境構築にはAnsibleを使っています。秘伝のPlaybookに今回のサーバー用の設定を追記してプロビジョニングしました。
実施したのは
- ファイルの置き場所を作る
- ビルド済のサーバーバイナリをコピーする
- サーバーのconfig.tomlをコピーする(APIキーなどを記載)
- systemd用の定義ファイルを配置
- 起動スクリプトを配置
- 停止スクリプトを配置
です。
後半3つを軽く説明します。
systemd 定義ファイル
バイナリのコマンドをサービス化するためにsystemdの仕組みを使いました。
Wikipediaによると、
systemdはシステム管理デーモン、ライブラリおよびユーティリティの一式であり、管理および設定における中心的プラットフォームとしてLinuxコンピュータオペレーティングシステム用に設計されている。
だそうです。
コマンドをサービス化する件に関してはこのリンクが一通り網羅しているので細かいことは省略します。
Systemdを使ってさくっと自作コマンドをサービス化してみる - Qiita
今回は起動スクリプト、停止スクリプトをも別途用意したのでその部分に関して書きます。
まず作った定義ファイルはこちら。
[Unit]
Description=hugoapi
After=syslog.target network.target
[Service]
Type=forking
EnvironmentFile=-/etc/default/hugoapi
WorkingDirectory=/home/user_name/hugoapi
ExecStart=/usr/local/bin/hugoapi-server-start.sh # 起動スクリプト
ExecStop=/usr/local/bin/hugoapi-server-stop.sh # 停止スクリプト
User=root
Group=root
KillMode=none
Restart = always
[Install]
WantedBy=multi-user.target
色々設定がありますが、どうせ自分用だし細かいことは気にせずに動かしてます。ExecStart
やExecStop
にシェルスクリプトを指定しています。
起動・停止スクリプト
↑の定義ファイルに指定しておいたスクリプトはこんな感じになってます。
まずは起動スクリプト。
#!/bin/bash
[ -d $RUN_DIR ] || mkdir -p ${RUN_DIR}
cd $RUN_DIR
./hugoapi_linux_amd64 -c ./config.toml > $LOG 2>$ERROR_LOG &
echo $! > ${PID_FILE}
ワーキングディレクトリに移動してコマンドを起動し、pidファイルをつくります。
続いて停止スクリプト。
#!/bin/bash
[ -f ${PID_FILE} ] && kill -9 $(cat ${PID_FILE})
[ -f ${PID_FILE} ] && rm ${PID_FILE}
pidファイルに書いてある番号のプロセスを停止し、pidファイルを削除します。
これだけなんだけど、systemdの定義ファイルに書くには長いのでスクリプトに分離しました。これを適当な場所に置いて定義ファイルにパスを書いておいたというわけです。
おわり
これで無事GoのサーバーをVPS上で動かすことができました。
Go、なかなかサクッとデプロイできてよかったです。