1バイナリでデプロイ
置くだけで動く
第1章で「1バイナリ」の話をしました。ここでそれを使います。
プレーンテキスト
go build -o fleama-go
scp fleama-go server:/opt/fleama/
ssh server /opt/fleama/fleama-go3行です。サーバーに Go を入れる必要も、依存を取ってくる必要もありません。
プレーンテキスト
Node.js node を入れる → npm install → node_modules が数万ファイル
Go ファイルを1つ置く別の OS 向けに作る
手元が Mac で、サーバーが Linux ということがほとんどです。Go はその場で相手向けに作れます。
プレーンテキスト
GOOS=linux GOARCH=amd64 go build -o fleama-goプレーンテキスト
GOOS 動かす OS。linux / darwin / windows
GOARCH CPU の種類。amd64 / arm64クロスコンパイルと呼びます。他の言語では専用の環境を用意することが多い作業が、環境変数2つで済みます。
間違えると動きません。 Mac 向けに作ったものを Linux に置くと cannot execute binary file と言われます。
常駐させる
そのまま実行すると、端末を閉じた時点で止まります。サーバーで動かし続けるには、OS に面倒を見てもらいます。Linux では systemd が担当します。
プレーンテキスト
[Unit]
Description=fleama-go API
[Service]
ExecStart=/opt/fleama/fleama-go
Restart=always
User=fleama
[Install]
WantedBy=multi-user.targetこれを /etc/systemd/system/fleama-go.service に置きます。
プレーンテキスト
sudo systemctl daemon-reload
sudo systemctl enable fleama-go
sudo systemctl start fleama-go
sudo systemctl status fleama-goRestart=always があるので、落ちても自動で起き上がります。enable しておくと、サーバーを再起動しても勝手に立ち上がります。
更新するとき
プレーンテキスト
GOOS=linux GOARCH=amd64 go build -o fleama-go
scp fleama-go server:/opt/fleama/fleama-go.new
ssh server 'mv /opt/fleama/fleama-go.new /opt/fleama/fleama-go && systemctl restart fleama-go'新しいファイルを別名で置いてから入れ替えます。転送の途中で壊れた状態が動くのを防ぐためです。
実行中のファイルをそのまま上書きしようとすると text file busy で拒まれることもあります。別名で置いて mv するのが確実です。
設定は環境変数で渡す
Go
port := os.Getenv("PORT")
if port == "" {
port = "8080"
}
http.ListenAndServe(":"+port, mux)バイナリに設定を埋め込むと、環境ごとに作り直すことになります。外から渡して、無ければ既定値にするのが定石です。第5章のカンマokと同じ、「無いときどうするか」を決める話です。
要件
- 空文字の項目は既定値を使う(port は 8080、env は development、goos は linux)
- ポートが数値に変換できないときは
不正なポートですを返す listen=:PORT env=ENV build=GOOS/amd64の形を返す
入出力例
buildConfig("8080", "production", "linux") → "listen=:8080 env=production build=linux/amd64"
buildConfig("", "", "") → "listen=:8080 env=development build=linux/amd64"
buildConfig("3000", "", "") → "listen=:3000 env=development build=linux/amd64"
buildConfig("8080", "production", "darwin") → "listen=:8080 env=production build=darwin/amd64"
buildConfig("abc", "production", "linux") → "不正なポートです"ヒント
編集 ゆめさく編集部