Ubuntu 14.04 で Django アプリケーションを Heroku にデプロイする手順

Ubuntu 14.04 に Python の Web アプリケーション・フレームワークである Django の動作環境を構築し、PaaS である Heroku にデプロイする手順をまとめた。

基本的には、下記の流れに沿って進める。

Getting Started with Django on Heroku | Heroku Dev Center https://devcenter.heroku.com/articles/getting-started-with-django

なお Django の環境構築にあたっては、Python 実行環境の仮想化ツールである Virtualenv を利用する。仮想化することで環境構築をやりなおしたり、別の Python 環境を構築する際に Python ライブラリの依存関係 (主にバージョン関係) が上書きされて壊れることを防ぐ、といったメリットがある (Python 2.x と 3.x の実行環境を同居させる、といったことも可能)。

環境情報

  • Ubuntu Sever 14.04.1 LTS
  • Python 2.7.6
  • Virtualenv 1.11.4
  • pip 1.5.4
  • Django 1.7.4
  • Heroku Toolbelt 3.25.0

Heroku のユーザ登録

下記に従ってユーザ登録する。

Heroku | Sign up
https://signup.heroku.com/dc

事前準備

パッケージ情報を最新化しておく。

$ sudo apt-get update
$ sudo apt-get upgrade

Heroku にデプロイするためのツール Heroku Toolbelt をインストール。下記の通り、バージョン情報が出力されたら OK。

$ wget -qO- https://toolbelt.heroku.com/install-ubuntu.sh | sh

$ heroku version
heroku-toolbelt/3.25.0 (x86_64-linux) ruby/1.9.3
You have no installed plugins.

次に、Django の動作に必要となる、Python 関連のライブラリや、Heroku デプロイ時に必要となる PostgreSQL のライブラリ等をインストール。

$ sudo apt-get install python-pip python-virtualenv libpq-dev

$ pip --version
pip 1.5.4 from /usr/lib/python2.7/dist-packages (python 2.7)

Django 環境の構築

まずは Django アプリケーション開発管理用ディレクトリを作成し、移動する。

$ mkdir hellodjango && cd hellodjango

ここでは、「venv」という名前で仮想環境を作成する。venv ディレクトリが作成されていれば OK。

$ virtualenv venv

$ ls -l
total 4
drwxrwxr-x 6 ubuntu ubuntu 4096 Feb  8 20:42 venv

作成した venv 仮想環境を利用するため、アクティベートする。プロンプトの先頭に仮想化環境を意味する (venv) が出力されていれば OK。

$ source venv/bin/activate
(venv) $

続いて、Django と関連ライブラリ一式をインストールする。いろいろと出力されるが、最後に「Successfully installed」と表示されたら OK。念のため、pip list で Django 等がインストールされているか確認する。

(venv) $ pip install django-toolbelt

(venv) $ pip list
argparse (1.2.1)
dj-database-url (0.3.0)
dj-static (0.0.6)
Django (1.7.4)
django-toolbelt (0.0.1)
gunicorn (19.2.1)
pip (1.5.4)
psycopg2 (2.5.4)
setuptools (2.2)
static3 (0.5.1)
wsgiref (0.1.2)

次に、Django プロジェクトを作成。コマンドの最後のドット “.” も忘れずに含めること。hellodjango ディレクトリと manage.py が作成されていれば OK。

(venv) $ django-admin.py startproject hellodjango .

(venv) $ ls -l
total 12
drwxrwxr-x 2 ubuntu ubuntu 4096 Feb  8 21:04 hellodjango
-rwxrwxr-x 1 ubuntu ubuntu  254 Feb  8 21:04 manage.py
drwxrwxr-x 6 ubuntu ubuntu 4096 Feb  8 20:50 venv

続いて、Heroku の実行プロセスである Dynos に渡す実行パラメータを Procfile というテキストファイルに記述する。

(venv) $ echo 'web: gunicorn hellodjango.wsgi --log-file -' | tee Procfile
web: gunicorn hellodjango.wsgi --log-file -

ここで動作確認として、ローカルサーバを起動し Django アプリケーションにアクセスしてみる。foreman を実行すると、下記の通り HTTP プロトコルを 5000 番ポートで待ち受けしていることが分かる。ブラウザや curl 等で HTML が返却されることを確認できれば OK。動作確認後、Ctrl + c で停止する。

(venv) $ foreman start
21:19:03 web.1  | started with pid 18277
21:19:03 web.1  | [2015-02-08 21:19:03 +0000] [18277] [INFO] Starting gunicorn 19.2.1
21:19:03 web.1  | [2015-02-08 21:19:03 +0000] [18277] [INFO] Listening at: http://0.0.0.0:5000 (18277)
21:19:03 web.1  | [2015-02-08 21:19:03 +0000] [18277] [INFO] Using worker: sync
21:19:03 web.1  | [2015-02-08 21:19:03 +0000] [18284] [INFO] Booting worker with pid: 18284

(例) Ctrl + z でプロセス一時停止 & bg でバックグラウンド実行 & curl でアクセス

^Z
[1]+  Stopped                 foreman start

(venv) $ bg
[1]+ foreman start &

(venv) $ curl http://127.0.0.1:5000
(Django の生成した HTML が出力される)

(venv) $ fg
foreman start
(Ctrl + c でプロセス停止)
^C
21:30:43 web.1 | [2015-02-08 12:30:43 +0000] [18284] [INFO] Worker exiting (pid: 18284) 
SIGINT received 
21:30:43 system | sending SIGTERM to all processes 
21:30:43 web.1 | exited with code 0

Heroku へのデプロイ

作成した Django アプリケーションを Heroku へデプロイするには、git 経由でファイルをコミットすることになる。

まず、pip の依存関係を表す requirements.txt を作成する。Heroku はこのファイルを参照して、必要なライブラリとそのバージョンを準備する。

(venv) $ pip freeze > requirements.txt

次に、git にコミット不要なファイルやディレクトリを .gitignore ファイルに記載する。cat して3行出力されたら OK。

(venv) $ cat << EOF > .gitignore
> venv
> *.pyc
> staticfiles
> EOF

(venv) $ cat .gitignore
venv
*.pyc
staticfiles

続けて、ローカルに git リポジトリを作成する。

(venv) $ git config --global user.email "<メールアドレス>"
(venv) $ git config --global user.name "<ユーザ名>"
(venv) $ git init
(venv) $ git add .
(venv) $ git commit -m "my django app"

最後に、Heroku 上にアプリケーションを作成し、作成した Django アプリケーションをデプロイする。[app-name] にはユニークな名前を指定すること。他の人のアプリケーション名と重複すると「Name is already taken」と怒られる。[app-name] を指定しなかった場合は、ランダムな文字列でアプリケーション名が付けられる (後で変更も可能)。

git push heroku master を実行し、やや時間が経過して「remote: Verifying deploy… done.」と出力されたら OK。ブラウザを起動して「https://[app-name].herokuapp.com/」へアクセスし、「It worked!」と表示されたら OK。

(venv) $ heroku create [app-name]
Enter your Heroku credentials.
Email: (Heroku に登録したメールアドレスを入力)
Password (typing will be hidden): (Heroku に登録したパスワードを入力)
Creating [app-name]... done, stack is cedar-**
https://[app-name].herokuapp.com/ | https://git.heroku.com/[app-name].git
Git remote heroku added

(venv) $ git push heroku master

(以下のエラーが出た場合は、下記コマンド実行の後、再度 git push)
fatal: 'heroku' does not appear to be a git repository
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

(venv) $ git remote add heroku git@heroku.com:[app-name].git

(venv) $ git push heroku master

サイトによっては heroku create 時に –stack cedar (あるいは -s cedar) オプションを指定せよ、とあるが、自動で最新の実行環境である cedar が選ばれた (requirement.txt を見て自動で判断した?)。

なお、virtualenv 環境から抜ける場合は、deactivate コマンドを実行する。プロンプトの (venv) 表記が無くなれば OK。ちなみに再度 virtualenv 環境に入る場合は、上述の activate を実行する。

(venv) $ deactivate
$

今回の手順で正しく構築できた場合のディレクトリ階層は下記の通りとなる。

.
├── .git
│   └── (git の構成ファイル/ディレクトリ群)
├── .gitignore
├── hellodjango
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── manage.py
├── Procfile
├── requirements.txt
└── venv
     ├── bin
     ├── include
     ├── lib
     └── local

その他、Heroku の便利コマンド

環境によって上記の通りうまくいかなかったときのために、いくつか便利な heroku コマンドを紹介する。

ヘルプを出力
$ heroku help

heroku のログを出力
$ heroku logs

dyno プロセスを出力
$ heroku ps

heroku プロセスを再起動
$ heroku restart

heroku 上で bash を起動
$ heroku run bash

アプリケーション名を変更
$ heroku apps:rename [new-app-name] --app [old-app-name]

yktmnb について

IT土方兼社畜を生業としています。 入社以来 Java を用いた社内向け Web アプリの開発に携わっていました。 最近は IaaS 関連の仕事をしています。 個人的に Android アプリ開発をしたり、ゆるべんという勉強会 (http://wooven.org/) をのんびりとやってます。
カテゴリー: Django, Heroku, Linux, Python, Ubuntu パーマリンク