#はじめに
Container Registryを使ってHerokuにデプロイする記事が、Railsが多い一方でDjangoではそんなにヒットしなかったので、アウトプットがてら書いていきます。まだ勉強中の身なので、もし間違えていたら指摘お願いします。
#Heroku CLIをダウンロード
始めにこのリンクからHeroku CLIをダウンロードします。僕はwindows 10を使っているので、64ビットインストーラを使ってダウンロードしました。
他のOSを使っている人でも、やり方は詳しく(英語で)書かれているので、その通りにダウンロードしてください。
#Heroku上でアプリを作成、アドオン等設定
Herokuにログインしてアプリを作成し、OverviewのところからHeroku PostgresをAdd-onsとして設定します。このとき、Hobby Devを選択することで無料で使えるっぽい。(ただし遅いとかなんとか…)
Herokuではvolumeが使えないため、データの永続化をするためにこのようにDBを利用しています。
#requirement.txtに追記
gunicorn
dj-database-url
whitenoise
django_heroku
#setting.pyに追記
以下のようにsetting.pyの下の方にstatic_rootとデータベースの設定を書いていきます。
STATIC_ROOTを設定することで本番環境でも静的ファイルを扱えるようになります。
import django_heroku
DEBUG = False
ALLOWED_HOSTS = ['自分のドメイン']
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware', #これの後ろにwhitenoiseを追記
'whitenoise.middleware.WhiteNoiseMiddleware',
(略)
]
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATIC_URL = '/static/'
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
import dj_database_url
DATABASES['default'] = dj_database_url.config(conn_max_age=600, ssl_require=True)
if not DEBUG:
django_heroku.settings(locals())
#Procfileを用意
Dockerfileと同じディレクトリにProcfileという名前のファイルを準備し、以下のように記述します。
web: gunicorn [プロジェクト名].wsgi
プロジェクト名はご自身のプロジェクト名に置き換えてください。
#Dockerfileに追記
以下のようにDockerfileの一番下に追記します。参考
RUN python manage.py collectstatic --noinput
CMD gunicorn --bind 0.0.0.0:$PORT [プロジェクト名].wsgi
こちらも同様にプロジェクト名を置き換えてください。
#コマンドを実行
プロジェクトがあるディレクトリ上でコマンドを実行していきます。
$ heroku login
$ heroku container:login
$ heroku container:push web -a [アプリ名]
$ heroku container:release web -a [アプリ名]
$ heroku open -a [アプリ名]
No webprocess runningエラーが出たら以下のコマンドを実行しましょう。
$ heroku ps:scale web=1 -a [アプリ名]
#コンテナとHeroku Postgresを結び付ける
$ heroku addons:attach [postgresコンテナ名] -a [アプリ名]
postgresコンテナ名はHerokuのアプリ管理サイトのOverviewのInstalled add-onsから確認することができます。また、最初以外にもマイグレーションが失敗するときなどにこのコマンドを再度実行し、再び結び付け直すことで上手くいくようになることがあります。
マイグレーションの実行
以下のコマンドでマイグレーションを実行します。
$ heroku run python manage.py migrate -a [アプリ名]
#メモ
以下のコマンドでどういう状況かチェックできる。
$ heroku run bash -a [アプリ名]
以下のコマンドでプロセスを確認したり、停止したりできる。
$ heroku ps -a [アプリ名] #プロセス確認
$ heroku ps:stop [プロセス名] -a [アプリ名] #プロセス停止
#おわりに
静的ファイルもなんとか扱えるようになりました!