[[ともっくす alloc] init]

ともっくすの雑多な日記と技術的なメモ

Heroku上でFlaskを動かしたい

諸事情があって、Webアプリケーションを作ることに。

どうせなら、ちょっとは慣れているFlaskで作りたい。

でも、訳あって自分のサーバは使いたくないし、一時的なものだし…

ということで、Heroku上でFlaskを動かしたい。


アカウントの取得とToolbeltのインストール

Herokuのトップページに行き、アカウントを作成する。

メールアドレスをいれるだけ。簡単。

そして、ここからHeroku Toolbeltのパッケージをダウンロードして、インストール。簡単。

こうすることで、herokuコマンドが使えるようになる。


環境設定

作業ディレクトリをheroku_testとする。

virtualenvで環境をつくる。

そして、pipでflask、gunicorn、psycopg2、flask-sqlalchemyをインストール。

gunicornはデプロイ用。不要なら不要。

Herokuは無料でPostgresqlが使えるので、アダプタとしてpsycopg2。

ORMとして、flask-sqlalchemy。不要なら不要。

インストールが終わったら、必要なモジュールをrequirements.txtに書き出しておく。

こうすることで、Herokuにデプロイしたときに自動でインストールしてくれる。

$ mkdir heroku_test
$ cd heroku_test
$ mkvirtualenv env-heroku
$ workon env-heroku
$ pip install flask, gunicorn, psycopg2, flask-sqlalchemy
$ pip freeze > requirements.txt

HerokuログインとGitリポジトリ

Herokuにログインする。そのときに、登録したメールアドレスとパスワードを入力する。

公開鍵を自動で見つけてくれる。

複数の公開鍵がある場合は、どれを使うか選択できる。

Authentication successfulって出たら成功。

$ heroku login
Enter your Heroku credentials.
Email: hogehoge@hoge.com
Password (typing will be hidden):
〜略〜
Authentication successful.

次に、作業ディレクトリにgitリポジトリを作る。

$ git init
$ git add .
$ git commit -m "first commit"


そして、heroku上にアプリケーションを作成する。

ここでは、o-tomox-appにする。

$ heroku create o-tomox-app
Creating o-tomox-app... done, stack is cedar
http://o-tomox-app.herokuapp.com/ | git@heroku.com:o-tomox-app.git

これで、アプリケーションがhttp://o-tomox-app.herokuapp.comにできる。

現段階だと、こんな感じ?

f:id:o_tomox:20140602230421p:plain

DBの設定

HerokuはPostgresqlが無料で使えるので、使えるものは使う。

「heroku addons:add shared-database」とか「heroku addons:add heroku-postgresql:dev」とか色々書かれてるサイトがあったけど、以下の方法でできた。

$ heroku addons:add heroku-postgresql
Adding heroku-postgresql on stormy-shore-4296... done, v4 (free)
Attached as HEROKU_POSTGRESQL_AQUA_URL
Database has been created and is available
 ! This database is empty. If upgrading, you can transfer
 ! data from another database with pgbackups:restore.
Use `heroku addons:docs heroku-postgresql` to view documentation.

Procfileとmain.py

アプリケーションの実行コマンドをProcfileに書いておく。

gunicornを使うならこんな感じ。

これをProcfileという名前のファイルを作って書く。

web: gunicorn main:app -w 4

次に、適当にmain.pyを作ってみる。

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()

せっかく、flask-sqlalchemyとかインストールしたけど、使わないという。

デプロイ

一応、これでpushすればいける。

$ ls
Procfile          main.py           requirements.txt
$ git add .
$ git commit -m "minimum app"
$ git push heroku master

http://o-tomox-app.herokuapp.com/にアクセスしてみると、こんな感じ。

f:id:o_tomox:20140602230714p:plain

herokuって何やって言われたら、remoteリポジトリがherokuとして登録されていないので、git remote addで、登録する。

例えば、こんな感じ

git remote add heroku git@heroku.com:o-tomox-app.git


こんな感じでいいか。