気ままなタンス*プログラミングなどのノートブック

プログラミングやRPGツクール、DTM、VOCALOIDについてのんびり書きます。

【Django】Herokuにアプリをデプロイするコマンド一覧

最近趣味でDjangoアプリを作成している。
ローカルだけじゃ面白くないので、PaaS環境にデプロイすることを検討した。

本記事では、HerokuにDjangoアプリをデプロイするまでの流れを記録する。

デプロイ前の構成

ROOT
`-- my-django-project-folder
    |-- plugins
    |   `-- local-packages
    |-- my-django-project-folder
    |-- my-django-app-folder
    |-- static
    |-- staticfiles
    `-- templates

virtualenv等の準備

$ source any_venv/bin/activate

Django-Toolbeltをインストール

(以下の記事に記載)rinnegrid.hatenablog.com

Djangoプロジェクトの設定

# gunicornをインストール
(venv)$ pip install gunicorn

# Whitenoiseをインストール
(venv)$ pip install Whitenoise

# runtime.txtを作成
(venv)$ echo python-3.4.1 > runtime.txt

# requirements.txtを作成
(venv)$ pip freeze > requirements.txt

# Procfileを作成
(venv)$ touch Procfile
(venv)$ echo web: gunicorn --env DJANGO_SETTINGS_MODULE=my-django-project.settings my-django-project.wsgi --log-file -

Webサーバー設定等

############################################################
# my-django-project-folder/my-django-project-folder/settings.py
from socket import gethostname
# ローカルマシン名の場合、デバッグを有効
if 'my_deploy_machine' in gethostname():

    DEBUG = True

    TEMPLATE_DEBUG = True

else:

    DEBUG = True

    TEMPLATE_DEBUG = False

    ALLOWED_HOSTS = ['*']

# ローカルマシン名の場合、sqlite3、そうでない場合dj_databas_urlのapiを利用
"""
こちらの記事を参照しました。ありがとうございます
http://qiita.com/nakazye/items/48651e39f07da82fe79e
(Rubyに負けるな!HerokuでPython(Django)動かす方法)
"""
if 'my_deploy_machine' in gethostname():

    DATABASES = {

        'default': {

            'ENGINE': 'django.db.backends.sqlite3',

            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),

        }

    }

else:

    import dj_database_url

    DATABASES = {

        'default': dj_database_url.config()

    }


# gunicornを追記
INSTALLED_APPS = (
  ...
  'gunicorn',
)

STATIC_URL = '/static/'
STATIC_ROOT = 'staticfiles'



############################################################
# my-django-project-folder/my-django-project-folder/urls.py
"""
こちらの記事を参照しました。ありがとうござますhttp://voluntas.hatenablog.com/entry/20110919/1316426034
(Heroku 上で Django を動かす)

"""
# 静的ファイル対応
urlpatterns += patterns('django.contrib.staticfiles.views',
    url(r'^static/(?P<path>.*)$', 'serve', kwargs={"insecure": True}),
)
############################################################
# my-djago-project-folder/my-django-project-folder/wisgi.py(wsgi.pyと同じところ)

# Whitenoise関係追記
from django.core.wsgi import get_wsgi_application
from whitenoise.django import DjangoWhiteNoise

application = get_wsgi_application()
application = DjangoWhiteNoise(application)

############################################################

(オプション)requirements.txtにローカルパッケージを含める

(venv)$ echo ./plugins/local-package >> requirements.txt

gitのローカルリポジトリに追加

(venv)$ git init
(venv)$ git add .
(venv)$ git commit -m "my-django-app-deploy-001"

この時点での構成

ROOT
|-- .git
|-- .gitignore
|-- readme.md
`-- my-django-project-folder
    |-- runtime.txt
    |-- requirements.txt
    |-- Procfile
    |-- plugins
    |   `-- local-packages
    |-- my-django-project-folder
    |   `-- wisgi.py
    |-- my-django-app-folder
    |-- static
    |-- staticfiles
    `-- templates

herokuコマンドの実行

あとは、DevCenterの「Deploy to Heroku」に記載されているコマンドを実行devcenter.heroku.com

(venv)$ heroku login
(venv)$ heroku create
(venv)$ git push heroku master
(venv)$ heroku ps:scale web=1
(venv)$ heroku open

サーバー名.herokuapp.comに自動的に接続される

はまったところ

・ローカルパッケージのインストール
 ⇒requirements.txtに相対パスを追記しつつ、gitリポジトリに一緒に入れてあげる必要がある

・ローカルから、HerokuのPostgreSQLに対してDBアクセスすると、
 アプリがめちゃくちゃ重い
 ⇒リージョンがUSで、DBまでの通信がボトルネック
  ⇒てっきりgunicornの問題と思っていた。
   ⇒デプロイは、同じリージョンなので、さくさく動く

参考記事(ありがとうございました)

qiita.com
voluntas.hatenablog.com
github.com