Heroku は、ホスティングサービスを提供するクラウドプラットフォームです。PHP、Node.js、Pythonなど複数のプログラミング言語に対応しています。Heroku は Platform-as-a-Service (PaaS) であり、サーバー、ネットワーク、ストレージ、その他のクラウドコンポーネントを管理しながら、Web サイトアプリケーションを管理することが可能です。
この記事では、Gitを使用して、DjangoアプリケーションをHerokuにデプロイする方法を紹介します。
同じ手順で、GitHub でホストされているアプリケーションを GitHub からデプロイすることができます。
前提条件
以下は、デプロイを開始する前に行う必要があることのリストです。
- Git
- Heroku のアカウントと CLI
- Django アプリケーション
Heroku のコマンドラインインターフェース (CLI) は、ターミナルから直接 Heroku アプリケーションを簡単に作成、管理できるようにするものです。Herokuを使用する上で欠かせないものです。
Heroku CLI (a.k.a. Heroku Toolbelt) をインストールするには、公式サイトの指示に従ってください。
Django アプリケーションが仮想環境上で動作していることを確認し、デプロイプロセスの間、アクティブにしておく必要があります。
Herokuのアカウント
これらのインストールが完了したら、次に、まだアカウントを持っていない場合は、ここで無料のHerokuアカウントを作成します。
ターミナルで以下のように記述した後
$ heroku login
というようなメッセージがターミナルに表示されるはずです。
heroku: Press any key to open up the browser to login or q to exit:
何かキーを押して、ブラウザでログインしてください。すると、ターミナルに次のようなメッセージが表示されます。
Logged in as email@domain.com
Heroku用Djangoアプリケーションの設定
さて、前提条件が整ったので、Heroku 用の Django アプリケーションを準備しましょう。
プロックファイル
Procfile は、アプリケーションのルートに置かれる、拡張子のない Procfile
という名前のファイルです。アプリケーションのプロセスタイプを列挙し、各プロセスタイプは、そのプロセスタイプのコンテナ/Dynoが起動したときに実行されるコマンドの宣言である。
Procfileを作成する前に、プロジェクトディレクトリに
django gunicorn` をインストールしておくとよいでしょう。
$ pip install django gunicorn
Django には独自の WSGI サーバが付属していますが、この Procfile
は Heroku に対して、アプリケーションを提供するために Gunicorn を使用するように指示します。
さて、親ディレクトリに Procfile
を作成し、以下の行を追加します。
web: gunicorn yourdjangoweb.wsgi --log-file -
yourdjangoweb`は実際のプロジェクト名で置き換えてください。
ランタイム.txt
procfileと同じディレクトリに
runtime.txtというテキストファイルを作成します。このファイルは、アプリケーションがどのバージョンのPythonを使用しているかをHerokuに伝えます。もしバージョンが分からない場合は、Django の仮想環境を有効にした状態で、ターミナルに
python –version` と入力してください。
その後、 runtime.txt
にそのバージョンを追加してください。
python-x.x.x
Heroku でサポートされている Python のバージョンはこちらで確認してください。
許可されたホスト
これは Django の特別なセキュリティ対策で、 ALLOWED_HOSTS
リストに追加されたホスト/ドメインでのみサイトを提供することで、HTTP ホストヘッダ攻撃を防止します。もし Debug = True
で ALLOWED_HOSTS
が []
ならば、デフォルトでは localhost
のみが許可されます。HerokuにWebアプリケーションをデプロイして提供するには、このリストに追加してください。
ALLOWED_HOSTS = ['herokuappname.herokuapp.com']
また、以下のようにアプリ名を省略することで、Herokuからのすべてのアプリを許可することができます。
ALLOWED_HOSTS = ['.herokuapp.com']
また、['*']
を使用すると、すべてのホストを許可することができます。詳しくはドキュメントをご覧ください。
パッケージのインストール
以下は、仮想環境にインストールする必要がある追加パッケージです。
Django のデータベースを Heroku に接続するために、 dj-database-url
をコールしてインストールします。
$ pip install dj-database-url
Heroku は Postgres データベースを使用しているので、Python 用のアダプタも必要です。
$ pip install psycog2
最後に、本番サーバで静的ファイルを提供するためにWhiteNoiseを使用します。インストールは
$ pip install whitenoise
すでに gunicorn
を設定したので、whitenoise
と dj-database-url
の設定を追加しましょう。
静的ファイルの設定
まず、どの Django プロジェクトでも、静的ファイルを提供するための基本的な設定 を追加します。以下の設定を settings.py
にコピー&ペーストしてください。
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/
PROJECT_ROOT = os.path.join(os.path.abspath(__file__))
STATIC_ROOT = os.path.join(PROJECT_ROOT, 'staticfiles')
STATIC_URL = '/static/'
# Extra lookup directories for collectstatic to find static files
STATICFILES_DIRS = (
os.path.join(PROJECT_ROOT, 'static'),
)
- SecurityMiddleware
のすぐ後にある
MIDDLEWARE` リストに WhiteNoise を追加してください。
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
]
-
settings.py
.0 にSTATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
を追加してください。
データベースの設定
ここでは、データベースの設定に dj-database-url
を使用します。以下の行を settings.py
の末尾に追加してください。
import dj_database_url
prod_db = dj_database_url.config(conn_max_age=500)
DATABASES['default'].update(prod_db)
要件.txt
Herokuは、ルートディレクトリに requirements.txt
ファイルがある場合のみ、デプロイされたアプリケーションをPythonアプリケーションとして認識します。これは、アプリケーションを実行するために必要なパッケージをHerokuに伝えるものです。
このために pip freeze
を使い、出力を requirements.txt
ファイルにパイプすることができます。
$ pip freeze > requirements.txt
requirements.txt
には以下の内容を記述してください。
whitenoise==5.2.0
dj-database-url==0.5.0
Django==3.0.9
gunicorn==20.0.4
psycopg2==2.8.5
pytz==2020.1
Note: 上記のバージョンは私たちの Django アプリケーションで使用されているものであり、あなたのアプリケーションでは異なる可能性があります。
HerokuアプリケーションとGitの連携
次に、Herokuアプリケーションを作成します。
$ heroku create herokuappname
完了」メッセージが表示され、次のようなふたつの URL が表示されます。
Creating ⬢ herokuappname... done

Home page | https://git.heroku.com/herokuappname.git
これは、Herokuクラウド上にアプリケーション用のGitリポジトリが作成されたことを意味します。URL https://herokuappname.herokuapp.com/
はどこからでもアプリケーションにアクセスできるようになりますが、アプリケーションを実行する前にもう一段階必要なことがあります。
プロジェクトディレクトリに空のリポジトリを初期化します。
$ git init
> Initialized empty Git repository in /herokuappname/.git/
Herokuアプリと空の git
リポジトリを接続します。
$ heroku git:remote -a herokuappname
> set git remote heroku to https://git.heroku.com/herokuappname.git
ステージングエリアにファイルを追加します。
ステージングエリアにファイルを追加する: “`
$ git add .
変更・ファイルをコミットします。
$ git commit -m “first commit for all files”
最後に、Herokuにある `git` リポジトリにプロジェクトをプッシュします。
$ git push master heroku
うまくいくと、このような出力が表示されます。
Counting objects: 26, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (20/20), done.
Writing objects: 100% (26/26), 32.13 KiB | 0 bytes/s, done.
Total 26 (delta 1), reused 0 (delta 0)
remote: Compressing source files… done.
remote: Building source:
…..
…..
remote: —– Launching…
remote: Released v1
remote: https://herokuappname.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy… done.
To https://git.heroku.com/herokuappname.git
[new branch] master – master
#### コレクトスタティックエラー
git push heroku master`コマンドを実行すると、`collectstatic`に関連するエラーが発生することがあります。これは静的ファイルディレクトリに関連するもので、以下のコマンドで回避することができます。
$ heroku config:set DISABLE_COLLECTSTATIC=1
Setting DISABLE_COLLECTSTATIC and restarting ⬢ herokuappname… done, v2
DISABLE_COLLECSTATIC: 1
このコマンドは、アプリケーションのデプロイ時に `collectstatic` コマンドを実行しないようにHerokuに指示します。後で `bower` を使って実行することができます。
$ heroku run ‘bower install –config.interactive=false;grunt prep;python manage.py collectstatic –noinput’
この問題は、以下のような理由で発生することがあります。
* `settings.py` の `STATICFILES_DIRS` のリストが空であるか、適切に設定されていない。
* 静的ディレクトリに `git` が追跡するファイルがない。静的ディレクトリに任意の一時ファイルを追加することで、動作させることができます。
#### データベースの移行
最後に、Migrations を実行して、`models` を Heroku データベースに反映させます。
$ heroku run python manage.py migrate
“`
以上で、heroku上でアプリケーションを稼働させることができました。これで、あなたのアプリケーションはheroku上で稼働しています!アクセスは [appname].herokuapp.com
です。この場合のURLは、http://herokuappname.herokuapp.com/
です。
カスタムドメイン名の追加
Heroku上のすべてのアプリは .herokuapp.com
でホストされていますが、ドメイン名を所有している場合は、それを変更することができます。手続きは簡単です。
- Heroku Dashboardにログインします。
- Heroku Dashboardにログインし、リストから現在のアプリを選択します。
- ナビバーからSettingsを選択し、スクロールダウンしてDomainのセクションを見つけます。
- ドメインを追加するをクリックすると、ドメイン名を追加することができます。
このオプションは、認証されたアカウントのみです。アカウントを確認するために、Heroku上でクレジットカードの詳細を入力するよう求められます。ドメインとサブドメインの追加に関する詳細は、こちらのページでご覧いただけます。
結論
今回は、Heroku上にカスタムドメイン名でDjangoアプリケーションをGitを使ってデプロイしました。
Herokuは様々なクラウドサービスの他に、サーバーの稼働時間や24時間365日の運用・セキュリティチームによるサポートなど、トップクラスのサービスを提供しています。