Beegoアプリをherokuにアップする
昨日作ったbeegoを使ったゲストブックアプリケーションをherokuにアップしてみた。
以下のエントリを参考にした。
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"