2
3

Django+Postgres+DockerをHerokuにデプロイ

Posted at

はじめに

少し前に、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を選択します。
スクリーンショット 2024-05-24 22.48.06.png

そこから、今回Herokuにデプロイするアプリケーション名を入力します。入力し終わったらCreate Appを選択します。
スクリーンショット 2024-05-24 22.49.44.png

これでHeroku上に空のアプリケーションができましたが、ここからPostgerSQLの環境を作ります。
下の画像のようになっていると思うので、アプリ名の下の欄からResourcesを選択して、画像中央右にあるFind more add onesをクリックします。
スクリーンショット 2024-05-24 22.51.47.png

すると、いろいろなアイコンが出てくると思うので、そこからHeroku Postgresを探して選択します。
スクリーンショット 2024-05-24 22.52.45.png

Install Heroku Postgresを選択します。
スクリーンショット 2024-05-24 22.53.40.png

Add on planを画像のようにEssential 0にします。
スクリーンショット 2024-05-24 22.54.56.png

今回は、一番安いものに設定しています、自分のしたいことに合わせて選択してください。
今回のようにデプロイしてみたいだけなら、今回の設定で大丈夫だと思います。

App to provision toで先ほど作成したHerokuのアプリ名を入力します。そこから、Submit Order Formを選択します。
スクリーンショット 2024-05-24 22.55.45.png

時間が経つとHeroku Postgresと書かれている部分が押せるようになるので、それを押します。
スクリーンショット 2024-05-24 23.04.34.png

下のような画像になるので、View Credentialsを選択するとDBの情報が閲覧できるようになります。

スクリーンショット 2024-05-24 23.06.19.png

スクリーンショット 2024-05-24 23.10.54.png

ここから、この情報を環境変数で設定します。
アプリ作成後に出てきた画面に戻り、Settingと書かれているところを選択し、Reveal Config Varsを選択します。

スクリーンショット 2024-05-24 23.46.17.png

ここで環境変数を設定できるので、先ほど出てきたDBの情報を、`.envファイルに書いた内容と一致させながら入力します。
スクリーンショット 2024-05-24 23.49.48.png

ここで入力する内容に困った方は、こちらの記事の.envの部分を参考にしてください。

今回は、DB情報でのDatabaseDATABASE_NAMEに入力しています。

これで一旦Heroku側の設定は終わりです。

Django側の設定

ここからDjangoの設定を変更していきます。

requirements.txtにHerokuのデプロイに必要なライブラリを記述します。

requirements.txt
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を追加します。

Setting.py
ALLOWED_HOSTS = [
    '.herokuapp.com',#追加
    '0.0.0.0',
    '127.0.0.1',
    'localhost'
]

MIDDLEWAREwhitenoise.middleware.WhiteNoiseMiddlewareを追加します。

Setting.py
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')を追加します。

setting.py
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

次にアプリを実行した際に行われるコマンドを書いておくProcfileを書きます。

web: gunicorn todolist.wsgi --log-file -

コレを書くことで、gunicornでdjangoを動かすようにしています。

runtime.txtにherokuで動かすpythonのverを指定します。

runtime.txt
python-3.9.19

デプロイ

今回は、gitのリポジトリを使います。

下の画面に移動して、repo nameでリポジトリと該当ブランチを選択します。今回は、Heroku用の設定を適応しているHeroku`というブランチを作ったので、それを使いました。

スクリーンショット 2024-05-24 23.24.50.png

スクリーンショット 2024-05-24 23.27.10.png

ブランチの横にあるDeploy Bramchを選択して、少し待ちます。

するとviewというボタンが出てくるので、それを選択します。

スクリーンショット 2024-05-24 23.28.11.png

見れました。
スクリーンショット 2024-05-25 15.39.11.png

エラーが出て困った時

デプロイできてもアプリがクラッシュしている時があります。
そんな時は以下のコマンドでログを確認してください。

heroku logs --tail -a <あなたのapp名>

-aは、-appの短縮形です。

最後に

コンテナをデプロイする方法もあるそうなので、どこかの機会でやってみたいと思いました。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3