Heroku 上で Django を動かす

Heroku | Cloud Application Platform

Heroku と言えば Ruby/Clojure/Node ですが、
Django アプリ(というか Python アプリ)がデプロイできるようになったらしいので試してみました。

変更履歴

  • 2011-09-21 gunicorn 対応しました

環境

Mac OS X Lion でやっているので、Linux や Windows だとまた別だと思います。

必須

  • Git
  • Python 2.7
  • Ruby (gem install heroku するためにいる)

heroku にアカウントを作る

というかそもそも Heroku のアカウントすら持っていなかったので、アカウント作るところから。

https://api.heroku.com/signup

ここでメールアドレスを登録すればあとはまぁ普通のアカウント作成です。

heroku コマンドをインストールする

初めての gem install

$ sudo gem install heroku

Django をデプロイする準備

最低限必要なのは virtualenv です。

easy_install なり pip で virtualenv が使える環境は作っておきましょう。

とりあえずプロジェクトフォルダを作成

$ mkdir heroku-django
$ cd heroku-django

virtualenv 環境をフォルダに展開します

$ virtualenv --no-site-packages .
$ source bin/activate

何はともあれ Django をインストール

$ bin/pip install django

heroku は PostgresSQL なので psycopg2 をインストールします、これが結構やっかいですが ...

$ env ARCHFLAGS="-arch i386 -arch x86_64" bin/pip install psycopg2

デプロイ用に gunicorn をインストール

$ bin/pip install gunicorn

ここでインストールしたサイトパッケージに必要なファイルを書き出します

$ bin/pip freeze > requirements.txt

プロジェクトを作ります

$ bin/django-admin.py startproject snowflake

snowflake/settings.py を開いて admin や admindocs を有効にします

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    'django.contrib.admindocs',
)

Procfile というファイルを作っておきます(中身はこんなの)
gunicorn を使います

$ cat Procfile
web: bin/gunicorn_django -b 0.0.0.0:$PORT snowflake/settings.py

snowflake/urls.py を開いて home 関数との結びつけや管理画面への URL を有効にします
あと gunicorn を使うので静的ファイルの対応も

from django.conf.urls.defaults import patterns, include, url                    

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    # Examples:
    url(r'^$', 'snowflake.views.home', name='home'),
    # url(r'^snowflake/', include('snowflake.foo.urls')),

    # Uncomment the admin/doc line below to enable admin documentation:
    url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

    # Uncomment the next line to enable the admin:
    url(r'^admin/', include(admin.site.urls)),
)

urlpatterns += patterns('django.contrib.staticfiles.views',
    url(r'^static/(?P<path>.*)$', 'serve', kwargs={"insecure": True}),
)

snowflake/views.py は無いので、つくります

from django.http import HttpResponse
 
def home(request):
    return HttpResponse("Django on Heroku!")

Django をデプロイする

さてここからデプロイ作業です。heroku ではデプロイは git を使います。

まずは不要なファイルがコミットされるのを防ぐため、無視リストを作りましょう。
無視リストは heroku-django ディレクトリ直下に作ります

$ cat >.gitignore <<EOF
bin/
include/
lib/
*.pyc
EOF

ファイルの確認をしましょう。以下のようなファイルがあるはずです

.git/
.gitignore
Procfile
bin/
include/
lib/
requirements.txt
snowflake/__init__.py
snowflake/manage.py
snowflake/settings.py
snowflake/urls.py
snowflake/views.py

さて次に初期化とファイルの追加です

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

ここで一番はじめにインストールした heroku コマンドを使います
アプリケーション名が表示されるはずなのでそれを覚えておいて下さい
初めて打った場合はメールアドレスやパスワードそして、公開鍵のアップロードが始まるはずです。

$ heroku create --stack cedar
Creating あなたのアプリ名... done, stack is cedar
http://あなたのアプリ名.herokuapp.com/ | git@heroku.com:あなたのアプリ名.git

ここでは smooth-samurai-8095 と出ていますが、違う表示がされるはずです。それが貴方のアプリ ID です。

heroku create 打つと git に heroku という remote が追加されるはずですので、確認してみて下さい。

$ git remote show heroku
* remote heroku
  Fetch URL: git@heroku.com:あなたのアプリ名
  Push  URL: git@heroku.com:あなたのアプリ名
  HEAD branch: (unknown)

remote heroku の URL にアプリケーション名が登録されていれば問題ありません。

あとは push するだけです。

git push heroku master

これで、デプロイは完了しました。
さて syncdb してみましょう。syncdb は heroku コマンドから使います。

$ heroku run bin/python snowflake/manage.py syncdb

あとはいつも見慣れた画面ですね、ユーザを追加したらデプロイ先へアクセスしてみましょう

トップ画面
http://あなたのアプリ名.herokuapp.com/
管理画面
http://あなたのアプリ名.com/admin

まずはこんなところでしょうか

デモ

トップ画面
http://floating-mountain-8115.herokuapp.com/
管理画面
http://floating-mountain-8115.herokuapp.com/admin

管理画面には ユーザ名 django パスワード django でログインできます(何も出来ませんが)

感想

heroku を使ったことが無かったので、不慣れで色々良くわからない点がありましたが、比較的デプロイしやすい気がしました。

AppEngine と比べると、自由度が高い分面倒に感じてしまいますが:-)
そうそう、デプロイ方式が Git というのはいいですね、fluxflex の時も思いましたが、気軽でイイですね。

heroku が Python に対応したことで、自由が好きな Python な人は Heorku を使うとイイと思います。
Add-On が沢山あり、色々なことが出来る様です、ただお金がかかるので趣味で ... というのは厳しそうです。

デプロイ先の一つとしてかなりありなのではないでしょうか。