はじめに
普段は,docker-composeでgolangとMySQLを管理しています.
Herokuへのアプリのアップを試みました.(DBストレージw)
個人開発でDBストレージ消費するサービス運用って,素敵なサーバどうしたものか...
環境
ubuntu16
Herokuアカウント・クレジットカード登録済み.
ローカルではアプリ動きます.
Dockerfileにはマルチステージビルドを採用しています.
herokuへpushするimageは25MBくらいでした.(もっと小さくしたい)
FROM golang:1.12.12-alpine3.9 AS build
ENV GOPATH $GOPATH:/go
ENV PATH $PATH:$GOPATH/bin
RUN apk update && \
apk add --no-cache git ca-certificates tzdata && \
go get "github.com/go-sql-driver/mysql" && \
go get "github.com/beego/bee" && \
go get "github.com/astaxie/beego" && \
go get "github.com/astaxie/beego/session" && \
go get "golang.org/x/crypto/bcrypt" && \
go get "github.com/PuerkitoBio/goquery" && \
go get "github.com/microcosm-cc/bluemonday" && \
rm -rf /var/cache/apk/*
ADD . /go/src/app
WORKDIR /go/src/app
RUN go build -o app main.go
FROM alpine:3.9
RUN apk update && \
apk --no-cache add tzdata ca-certificates && \
rm -rf /var/cache/apk/*
COPY --from=build /go/src/app/ .
CMD ["./app"]
結果
MySQLはイメージのアップができないので,add-onを追加する必要があります.
heroku login
heroku container:login
heroku create -a app_name
heroku git:remote -a app_name
heroku addons:add cleardb:ignite
echo "web: app_name" > Procfile
次にMySQLへの接続情報をゲットします.
heroku config | grep CLEARDB_DATABASE_URL
=> CLEARDB_DATABASE_URL: mysql://38faf8fefeaaef:dfefe44@us-cdbr-iron-east-093823.cleardb.net/heroku_8cfefedfgcd6a?reconnect=true
これをBeegoでよく利用する形に変形して使っています.(文末のreconnect=trueは未検証)
sqlconn = 38faf8fefeaaef:dfefe44@tcp(us-cdbr-iron-east-093823.cleardb.net:3306)/heroku_8cfefedfgcd6a
#sqlconnはmain.goで利用しています↓
orm.RegisterDataBase("default", beego.AppConfig.String("driver"), beego.AppConfig.String("sqlconn")+"?charset=utf8mb4")
herokuはアプリの起動ごとにポート番号が変わるようです.
よって,main.go内でポートを取得し,設定の上書きが必要です.(おそらく,HTTPの文はいらない)
port, err := strconv.Atoi(os.Getenv("PORT"))
beego.BConfig.Listen.HTTPPort = port
beego.BConfig.Listen.HTTPSPort = port
仕上げです!(上2行はいらないかも)
git add .
git commit -m "add procfile"
heroku container:push web -a app_name
heroku container:release web -a app_name
heroku open
heroku logs --tail #ログの確認
アプリによっては,起動後から数分後に接続できたり,キャッシュを消したら接続できたりするみたいです.
私のアプリ内の機能:スクレイピング部分はうまく動かず...
海外サーバだからなのかな.(追記:ca-certificatesをいれたら直りました)
最後に
作成したアプリの削除
heroku apps:destroy -a app_name --confirm app_name
git remote rm heroku