Git CLIでDjangoアプリケーションをHerokuにデプロイする方法

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 = TrueALLOWED_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 を設定したので、whitenoisedj-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日の運用・セキュリティチームによるサポートなど、トップクラスのサービスを提供しています。

タイトルとURLをコピーしました