Beegoアプリをherokuにアップする

昨日作ったbeegoを使ったゲストブックアプリケーションをherokuにアップしてみた。

Beego GuestBook


以下のエントリを参考にした。
Getting Started with Go on Heroku



適当にやったことをメモする


依存パッケージの管理のためにgodepを入れる。
godeps saveでGodepsディレクトリが作成され、依存ライブラリが_workspaceにコピーされる。

$ go get github.com/kr/godep
$ godeps save


Procfile

$ echo 'web: beego-guestbook' > Procfile

.godir

$ echo 'beego-guestbook' > .godir

heroku create

$ heroku create -b https://github.com/kr/heroku-buildpack-go.git
Creating warm-bastion-1124... done, stack is cedar
BUILDPACK_URL=https://github.com/kr/heroku-buildpack-go.git
http://warm-bastion-1124.herokuapp.com/ | git@heroku.com:warm-bastion-1124.git
Git remote heroku added


cleardbを使う

$ heroku addons:add cleardb:ignite
Adding cleardb:ignite on warm-bastion-1124... done, v4 (free)
Use `heroku addons:docs cleardb` to view documentation.


データソースを確認

$ heroku config | grep CLEARDB_DATABASE_URL
CLEARDB_DATABASE_URL: mysql://user:pass@us-cdbr-east-04.cleardb.com/heroku_589101040fae16d?reconnect=true


PORTとデータソースは環境変数から取得するようにした。

package main

import (
	"beego-guestbook/models"
	_ "beego-guestbook/routers"
	"fmt"
	"github.com/astaxie/beego"
	"github.com/astaxie/beego/orm"
	_ "github.com/go-sql-driver/mysql"
	"net/url"
	"os"
	"strconv"
	"strings"
	"time"
)

// time.Timeオブジェクトを見やすい表示にする関数
func dateformat(in time.Time) (out string) {
	out = in.Format("2006-01-02 15:04:05")
	return
}

// 改行文字をbrタグに置き換える関数
func nl2br(in string) (out string) {
	out = strings.Replace(in, "\n", "<br>", -1)
	return
}

// テーブルがなければ作成する
func syncdb() {
	err := orm.RunSyncdb("default", false, true)
	if err != nil {
		panic(err)
	}
}

// データソース文字列を変換
func convert_datasource(ds string) (result string) {
	url, _ := url.Parse(ds)
	result = fmt.Sprintf("%s@tcp(%s:3306)%s", url.User.String(), url.Host, url.Path)
	beego.Info(result)
	return
}

func init() {

	var datasource string
	// for heroku with cleardb
	if os.Getenv("CLEARDB_DATABASE_URL") != "" {
		datasource = convert_datasource(os.Getenv("CLEARDB_DATABASE_URL"))
	} else {
		datasource = "user:pass@/database_name?charset=utf8"
	}
	orm.RegisterDataBase("default", "mysql", datasource, 30)
	orm.RegisterModel(new(models.Greeting))

	beego.AddFuncMap("dateformat", dateformat)
	beego.AddFuncMap("nl2br", nl2br)

}

func main() {
	port, err := strconv.Atoi(os.Getenv("PORT"))
	if err == nil {
		beego.HttpPort = port
	}

	syncdb()
	beego.Run()
}


db接続できなかったのでデータソース文字列をちょっといじっている。


そのまま使うと

export CLEARDB_DATABASE_URL="mysql://user:pass@us-cdbr-east-04.cleardb.com/heroku_589101040fae16d?reconnect=true"

こんなエラーになる

register db `default`, Default addr for network 'us-cdbr-east-04.cleardb.com' unknown

mysql://を外し、host名をtcp()で囲んでみると

export CLEARDB_DATABASE_URL="user:pass@tcp(us-cdbr-east-04.cleardb.com)/heroku_589101040fae16d"

こんなエラー

register db `default`, dial tcp: missing port in address us-cdbr-east-04.cleardb.com


ポート番号をつけるとこれでつながった。
reconnect=trueもエラーになったので外している。

export CLEARDB_DATABASE_URL="user:pass@tcp(us-cdbr-east-04.cleardb.com:3306)/heroku_589101040fae16d"