HerokuへPythonアプリ(Django)をデブロイする方法

HerokuへPythonアプリ(Django)をデブロイする方法を試したので、メモ。

最初、Django Girls Tutorial にあったHerokuへのデブロイ方法を試したのですが、Herokuの公式ドキュメント をみると、pipenvを使用したアプリのデブロイ方法で更新されていたのでそちらで試してみました。

Djangoの理解は、下記2つのページが大変役に立ちました。

Herokuとは


  • PaaSを提供する事業者、および提供サービスであるPaaSの1つ
  • PasS(Platform as a Service)は、アプリケーションを実行するためのプラットフォームをインターネット越しに使えるサービス

Herokuにアプリを公開するための準備


  • Herokuアカウントのサインアップ => a free Heroku account
  • Heroku Toolbeltのインストール  => Heroku CLI
  • Pipenv をインストール (pythonアプリの場合)
  • Postgres をインストール(ローカルでアプリを動かしたい場合)
    • Heroku 上でsqllite3 は使えないようです

Herokuを使うにあたり必要な知識


Herokuにデブロイする方法


Python on Heroku

  • 上記チュートリアルを一通りやると、DjangoのアプリをHerokuにデブロイする方法を一通り体験できます
  • 英語ですが、とてもわかりやすいので、最初にここをみるのがオススメです!
  • Python のpipenvを使った方法でかかれています

◆Heroku へデブロイする流れ

1. Herokuへのログイン、メールアドレスとパスワードを入力

$ heroku login 

一度heroku loginを行うと、明示的にheroku logoutコマンドでログアウトしない限り、以降のコマンド実行はそのアカウントとして実行されます。

2. サンプルアプリのクローン(Djangoアプリ)

今回Heroku公式ドキュメントに沿ってサンプルアプリを使用したので、とりあえずクローン

$ git clone https://github.com/heroku/python-getting-started.git
$ cd python-getting-started

3. Herokuへデプロイ

$ heroku create
$ git push heroku master 
  • heroku create [APPNAME]
    • [APPNAME]を省略するとHerokuが自動生成してくれる
    • URLが作成される (https://[APPNAME].herokuapp.com/)
    • 「git@heroku.com:[APPNAME].git」というgitリポジトリが用意される
    • ローカルのgit remoteに「heroku」という参照名が追加される
  $ git remote -v
    heroku  https://git.heroku.com/stark-dusk-55796.git (fetch)
    heroku  https://git.heroku.com/stark-dusk-55796.git (push)
    origin  https://github.com/heroku/python-getting-started.git (fetch)
    origin  https://github.com/heroku/python-getting-started.git (push)
  • リポジトリのmasterブランチにアプリケーションをpushすることで、それがコンパイルされHerokuアプリケーションとしてリリースされる
  • origin は、cloneに使用したリポジトリ

4. 確認

$ heroku open                     #URLをデフォルトブラウザで開く
$ heroku logs --tail             #ログを確認
$ heroku ps
  === web (Free): gunicorn gettingstarted.wsgi (1)

たったこれだけ!!

◆ローカルでコードを変更してHerokuにデプロイ

1. ローカルでコードを修正する

下記、pipenvで作成した仮想環境上で動作させる

$ pipenv --three   #python3を指定
$ pipenv install     #仮想環境を作成し、依存関係をインストール
$ pipenv shell       #仮想環境への切り替え
$ python manage.py collectstatic  #Djangoで必要処理(静的ファイルを一カ所に集める)

2. ローカルで確認する

$ heroku local 

http://localhost:5000 にアクセスしてローカルで変更を確認

3. 修正のgitリポジトリへの反映

$ git add .
$ git commit -m "Demo"

4. 修正のHerokuへの反映

$ git push heroku master

5. 確認

$ heroku open

Herokuに必要なファイル


Procfile

  • Dynoがアプリケーションを起動する際の起動コマンドを指定するファイル
  • Dynoとは作成したプログラムを動かすLinuxコンテナ
  • Procfileは、アプリケーションのルートディレクトリに置く
web: gunicorn gettingstarted.wsgi
  • 最初の「web:」はDynoの種別の指定で、Httpリクエストを受け付けるWebアプリケーションの場合は「web」を指定する。
  • それに続くコマンドがアプリケーションの起動コマンド

Pipfile または requirement.txt 

  • Pipfile または requirement.txt のどちらかのファイルがある場合、Pythonと判断されるらしい。

Heroku Postgres


$  heroku addons # アプリに追加されているAdd-onの一覧を表示
Add-on                                           Plan       Price  State  
───────────────────────────────────────────────  ─────────  ─────  ───────
heroku-postgresql (postgresql-horizontal-81279)  hobby-dev  free   created
 └─ as DATABASE
  • heroku-postgresql のaddons はデフォルトで追加される
  • ローカル環境にpsqlコマンド(PostgreSQLコマンドラインクライアント)がインストールされている場合には、「heroku pg:psql」コマンドでデータベースにアクセスすることが可能

感想など


  • アプリのデブロイはgit pushするだけ!
  • 今回pipenvを使用しましたが、最初brew コマンドでpipenvをインストールしようとしてエラーになりそこではまりました…. (Herokuへのデプロイとは全く関係なし...)

最初から素直に下記でインストールすればよかった…。

$ pip3 install pipenv 
  • こんな簡単にWEB公開できるとは知らなかった。よいです。