見出し画像

Djangoで作る初めてのウェブアプリケーション(番外編)herokuデプロイ

本記事は、マガジン(『超入門』Djangoで作る初めてのウェブアプリケーション)で作成した、Djangoアプリを使用します。

今回は、ウェブアプリを簡単にデプロイ(世界に公開)できるPaaS(Platform as a Service)を使用します。

herokuは様々なPaaSの中の一つのサービスです。

※このチュートリアルはherokuとGithubを連携します。Githubで開発中のリポジトリを作っていない人はリポジトリを作成しましょう。尚、Githubの説明は割合させてもらいます。

herokuの準備

まだherokuアカウントを持っていない方は無料なのでこちらのリンクから作っておきましょう。

アカウントの作成が完了したら、Macのターミナルでherokuを操作できるようにするためにheroku toolbeltをターミナルでインストールしましょう。
(OSはMacを想定しています)

スクリーンショット 2020-05-26 12.31.11

Homebrewのインストールはこちらの記事を確認ください。

ターミナルからherokuにログイン

heroku Toolbeltのインストールが完了したら、ターミナルからherokuに下のコマンドでログインします。

heroku login

emailとpasswordを求められたら、heroku新規登録時のemailとpassword入力して下のブラウザに移動するので真ん中Log inをクリックすれば完了です。

スクリーンショット 2020-05-26 12.37.58

これでheroku側の準備が整いました。

herokuにアプリを作成

Djangoを使用して作成したアプリケーションを、置く場所(herokuアプリ上)を作ります。ターミナルで以下コマンドを実行しましょう。

$ heroku create 
$ heroku cerate アプリ名
を使用することで、自由に名前を決めることができます。

スクリーンショット 2021-01-12 18.26.20

アプリが作成できたらheroku listコマンドで確認してみましょう。

$ heroku list

スクリーンショット 2021-01-12 18.26.47

ちゃんとdjango-blog-newがherokuにできました。

デプロイで必要なライブラリをインストール

Djangoには便利なライブラリdjango-herokuがあるのですが、今回は使用しません。(気になる方は調べてみてください)
django-herokuの代わりにwhitenoisegunicornをインストールします。
Djangoでは元来、本番環境で静的ファイルがサポートされていませんが、whitenoiseをインストールすることで解決してくれます。

ターミナルで下のコマンドを実行します。
gunicornは本番環境で使用するサーバーです。

pip install whitenoise gunicorn

これで必要なライブラリは揃いました。

デプロイに必要ファイルを作る

新たに作るファイルは、3つあります。

Procfile / runtime.txt / requirements.txt  

それぞれのファイルの作成場所とコードです。

Procfile / プロジェクトルートに作成します。使用するサーバーをherokuに知らせます。

Procfile

web: gunicorn プロジェクト名.wsgi --log-file -
runtime.txt / プロジェクトルートに作成します。アプリで使用しているpythonのバージョンをherokuに知らせます。

runtime.txt

python-3.7.6 (3.7.6は、あなたのpythonバージョン)
requirements.txt / プロジェクトルートに作成します。herokuにどのライブラリを使用しているのか知らせるために使います。

requirements.txtはターミナルで下のように実行します。

pip freeze > requirements.txt
もしくは
pip3 freeze > requirements.txt

コマンドを実行するとrequirements.txtを自動で作成します。その中に、現在入っている仮想環境でインストールしたライブラリを記述してくれます。

例として、このような感じになります。

スクリーンショット 2020-05-26 12.53.05

これで必要になるファイルは以上です。

settings.pyの編集

DEBUGFalseにして、ALLOWED_HOSTSherokuのURL開発環境のURLだけを許可するようにしましょう。
本番環境のstaticassetsの読み込みも追加しましょう。
herokuのURLの確認の仕方はターミナルでheroku apps:infoと実行しましょう。

$ heroku apps:info

スクリーンショット 2021-01-12 18.59.05

settings.py

# 省略

DEBUG = False
ALLOWED_HOSTS = ['django-blog-new.herokuapp.com', '127.0.0.1']

# 省略

MIDDLEWARE = [
   'django.middleware.security.SecurityMiddleware',
   'django.contrib.sessions.middleware.SessionMiddleware',
   'django.middleware.common.CommonMiddleware',
   'django.middleware.csrf.CsrfViewMiddleware',
   'django.contrib.auth.middleware.AuthenticationMiddleware',
   'django.contrib.messages.middleware.MessageMiddleware',
   'django.middleware.clickjacking.XFrameOptionsMiddleware',
   'whitenoise.middleware.WhiteNoiseMiddleware', # 追加
]

# 省略

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static') # 追加

#画像などのメディアファイルがある場合
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

STATIC_ROOTは本番環境で静的ファイルを読み込むpathを指定しています。

そして下のコマンドを実行して静的ファイルを一箇所に集めておく必要があります。

python manage.py collectstatic 

下の画像のようにstaticフォルダの中にadminフォルダが追加されます。

スクリーンショット 2021-01-12 21.35.20

これでherokuにデプロイ後も、CSSや画像の読み込みも可能になりました。

herokuの設定

まずは、heroku上でデプロイするアプリの言語設定をします。
herokuのアプリ一覧画面から作成したアプリをクリックして、settingsをクリックします。

スクリーンショット 2021-01-12 19.04.03

画像右下Add BuildpackをクリックしてPythonを選びsave changesをクリックします。

スクリーンショット 2021-01-12 19.04.23

続いてgithubと連携します。githubでリポジトリを作ってない人は作成してリモートにpushしましょう。

メニューバーのDeployをクリックします。

スクリーンショット 2021-01-12 19.13.40

そして、Github → search(自身で作成したリポジトリを選択) → Connectの順にクリックすることでherokuとGithubを連携できます。

スクリーンショット 2021-01-12 19.14.08

herokuの設定は以上です。

デプロイしよう

全ての準備が整いました。

herokuのリモートリポジトリに、変更点をadd(追加)して、commitしましょう。(git & githubの説明は割合します)

そしてpushします。

git add . 
git commit -m "deploy"
git push heroku master または git push heroku main

pushに失敗(エラー)してしまった方はターミナルで次のコマンドを実行してもう一度pushしてみてください。

$ heroku config:set DISABLE_COLLECTSTATIC=1

そして

git push heroku master または git push heroku main

デプロイは以上で終了です。

最後に

デプロイの方法は、多様で正解がありません。
環境によってはこのチュートリアル通りに行ってもエラーが出る可能性も十分にあります。
その場合は是非解決してみてください。

この記事が気に入ったらサポートをしてみませんか?