はじめに
少し前に、DockerでDjango+Postgresの環境でTodolistを作ったのですが、今回はそれをHerokuにデプロイしてみました。
コンテナをデプロイする方法もあるらしいですが、今回はやっていません。ご了承ください。
GithubStudent
学生であれば、申請すればHerokuが月$13分の合計24ヶ月分無料で使えるようになります。詳しくはこちらをご覧ください。
そもそもHerokuとは
Herokuとは、Passと呼ばれるアプリケーションを実行するためのサービスを提供しているプラットフォームのことです.
Pass
"Platform as Service"の略称です。アプリケーションの稼働に必要なネットワーク、OS、サーバー、ミドルウェアをプラットフォームとして提供しているサービスのことです。
Iaas
"Infrastructure as Service"の略称です。サーバーやストレージやネットワークなどのインフラ環境を提供するサービスのことです。AWSやGCPはコレにあたります。
Saas
"Software as Service"の略称です。ソフトウェアをクラウド上で提供し、利用できるサービスのことです。Office365とかがコレに該当します。
デプロイの準備
Heroku側
今回は、Herokuのアカウントは作成済みの状態で進めます。
まず、New
と書かれている箇所を押し、Create New App
を選択します。
そこから、今回Herokuにデプロイするアプリケーション名を入力します。入力し終わったらCreate App
を選択します。
これでHeroku上に空のアプリケーションができましたが、ここからPostgerSQLの環境を作ります。
下の画像のようになっていると思うので、アプリ名の下の欄からResources
を選択して、画像中央右にあるFind more add ones
をクリックします。
すると、いろいろなアイコンが出てくると思うので、そこからHeroku Postgres
を探して選択します。
Install Heroku Postgres
を選択します。
Add on plan
を画像のようにEssential 0
にします。
今回は、一番安いものに設定しています、自分のしたいことに合わせて選択してください。
今回のようにデプロイしてみたいだけなら、今回の設定で大丈夫だと思います。
App to provision to
で先ほど作成したHerokuのアプリ名を入力します。そこから、Submit Order Form
を選択します。
時間が経つとHeroku Postgres
と書かれている部分が押せるようになるので、それを押します。
下のような画像になるので、View Credentials
を選択するとDBの情報が閲覧できるようになります。
ここから、この情報を環境変数で設定します。
アプリ作成後に出てきた画面に戻り、Setting
と書かれているところを選択し、Reveal Config Vars
を選択します。
ここで環境変数を設定できるので、先ほど出てきたDBの情報を、`.envファイルに書いた内容と一致させながら入力します。
ここで入力する内容に困った方は、こちらの記事の
.env
の部分を参考にしてください。
今回は、DB情報でのDatabase
をDATABASE_NAME
に入力しています。
これで一旦Heroku側の設定は終わりです。
Django側の設定
ここからDjangoの設定を変更していきます。
requirements.txt
にHerokuのデプロイに必要なライブラリを記述します。
Django==4.1
psycopg2
#ここから下を追加
dj-database-url
gunicorn
whitenoise
dj-database-url
DBの接続情報を管理するのに役に立つライブラリ、正直どこで使ってるかわかりませんが書きました。
gunicorn
djangoやFlaskなどのWSGIアプリケーションを動かすためのWSGI HTTPサーバーのこと
WSGI
Web Server Gateway Interfaceの略
Webサーバー、アプリケーションサーバー、データベースサーバーの中継地点となり、リクエストの窓口となるものをいう。
whitenoise
静的ファイルを提供を容易にするためのライブラリ
ローカルでは、URIが***static/test.png
となるが、リモートでは、static/test.28487bbbe8b5.png
みたいにハッシュ値が挟まれるのでうまく静的ファイルを参照できないので、これを参照できるようにしてくれる。
Setting.py
を編集します。
ALLOWED_HOSTS
に.herokuapp.com
を追加します。
ALLOWED_HOSTS = [
'.herokuapp.com',#追加
'0.0.0.0',
'127.0.0.1',
'localhost'
]
MIDDLEWARE
にwhitenoise.middleware.WhiteNoiseMiddleware
を追加します。
MIDDLEWARE = [
'whitenoise.middleware.WhiteNoiseMiddleware',#追加
'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',
]
Webサーバーでは、静的ファイルをすべて一つの箇所に集める必要があります。
そのためにSTATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
を追加します。
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
次にアプリを実行した際に行われるコマンドを書いておくProcfile
を書きます。
web: gunicorn todolist.wsgi --log-file -
コレを書くことで、gunicornでdjangoを動かすようにしています。
runtime.txt
にherokuで動かすpythonのverを指定します。
python-3.9.19
デプロイ
今回は、gitのリポジトリを使います。
下の画面に移動して、repo nameでリポジトリと該当ブランチを選択します。今回は、Heroku用の設定を適応している
Heroku`というブランチを作ったので、それを使いました。
ブランチの横にあるDeploy Bramch
を選択して、少し待ちます。
するとview
というボタンが出てくるので、それを選択します。
エラーが出て困った時
デプロイできてもアプリがクラッシュしている時があります。
そんな時は以下のコマンドでログを確認してください。
heroku logs --tail -a <あなたのapp名>
-aは、-appの短縮形です。
最後に
コンテナをデプロイする方法もあるそうなので、どこかの機会でやってみたいと思いました。