Beego アプリを Heroku で動かす初期設定

Beego アプリを Heroku で動かすための初期設定をご紹介します。

Beego

前提条件

  • go v1.12.5
  • beego v1.11.1

beego アプリは bee new しただけの状態です。

ソースコードは GitHub に公開しており、codenote-net/beego-sandbox@9d2a0ea の commit を checkout して heroku へ push すれば動くはずです。

beego アプリの Heroku 対応

Heroku $PORT

Heroku は PORT が不定なので、process 起動時に環境変数 $PORT を利用する必要があります。

You can refer to your app’s config vars, most usefully $PORT, in the commands you specify.

The web process type – The Procfile | Heroku Dev Center

Web process failed to bind to $PORT エラー

Heroku 用に $PORT 対応しないと以下のようなエラーが発生してしまいます。

Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch

2019-06-04T13:43:30.805065+00:00 heroku[web.1]: State changed from starting to crashed
2019-06-04T13:43:30.821498+00:00 heroku[web.1]: State changed from crashed to starting
2019-06-04T13:43:30.645826+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
2019-06-04T13:43:30.645922+00:00 heroku[web.1]: Stopping process with SIGKILL
2019-06-04T13:43:30.775058+00:00 heroku[web.1]: Process exited with status 137
2019-06-04T13:43:31.427835+00:00 heroku[web.1]: Starting process with command `bin/beego-sandbox`
2019-06-04T13:43:33.934977+00:00 app[web.1]: 2019/06/04 13:43:33.934 [I] [asm_amd64.s:1337]  http server Running on http://:8080

2019-06-04T13:44:20.065228+00:00 heroku[router]: at=error code=H20 desc="App boot timeout" method=GET path="/" host=beego-sandbox.herokuapp.com request_id=38df9122-9d28-46c8-a9f4-22cc76f815b7 fwd="125.197.212.146" dyno= connect= service= status=503 bytes= protocol=https

beego で HTTPPort, HTTPSPort の設定

beego 公式ドキュメントによると Port の設定は beego.BConfig.Listen.HTTPPort, beego.BConfig.Listen.HTTPSPort でそれぞれ行うことができるようです。

HTTPPort

Set the port the app listens on. By default this is 8080

beego.BConfig.Listen.HTTPPort = 8080

HTTPSPort

Set the port the app listens on. By default this is 10443

beego.BConfig.Listen.HTTPSPort = 10443

Configuration – beego: simple & powerful Go app framework

そのため Heroku で beego アプリを動かすためには、以下のように os.Getenv(“PORT”) で環境変数から PORT を取得して beego.BConfig.Listen.HTTPPort, beego.BConfig.Listen.HTTPSPort へそれぞれセットするコードに修正する必要があります。

(サンプルコード) beego for Heroku

package main

import (
	"log"
	"os"
	"strconv"

	"github.com/astaxie/beego"
	_ "github.com/codenote-net/beego-sandbox/routers"
)

func main() {
	log.Println("Env $PORT :", os.Getenv("PORT"))
	if os.Getenv("PORT") != "" {
		port, err := strconv.Atoi(os.Getenv("PORT"))
		if err != nil {
			log.Fatal(err)
			log.Fatal("$PORT must be set")
		}
		log.Println("port : ", port)
		beego.BConfig.Listen.HTTPPort = port
		beego.BConfig.Listen.HTTPSPort = port
	}

	beego.Run()
}

以上、beego アプリを Heroku で動かしたい、現場からお送りしました。

参考情報