7K4B blog

猫でも分かる何か

django 6-4 デプロイ

WEB3層


WSGIはWEBサーバー機能も持っているが、リバースプロキシとしてnginxを置くのが一般的
参考 https://blowup-bbs.com/webserver-interface-summary/
参考 https://devcenter.heroku.com/ja/articles/python-gunicorn

Heroku アカウント作成

  • アカウントを作成後、Create a new app をクリックする
  • App name は何でもok
  • Windows SubSystems for Linux の場合はコマンドからCLIをインストールする
$ curl https://cli-assets.heroku.com/install-ubuntu.sh | sh
(venv)$ heroku login

環境設定

  • Heroku Settings -> Config Vars -> Reveal Config Vars


Heroku Setting の KEY に SECRET_KEY、VALUE に settings.py の SECRET_KEY の値を入力

$ pip install python-dotenv

ここでセキュリティ上 Heroku 上にアップロードする setting.py から SECRET_KEY を消す必要がある
しかし settings.py の SECRET_KEY を消すとローカルループバックアドレスでサーバーを立てれなくなって不便
そこで python-dotenv をインストールする

SECRET_KEY = test/bookproject5/bookproject/bookproject/setting.py に書かれている SECRET_KEY の値

test/bookproject5/bookproject/.env を書く

import os
from dotenv import load_dotenv
load_dotenv()
SECRET_KEY = os.getenv('SECRET_KEY')

test/bookproject5/bookproject/bookproject/setting.py を書く
import os 追加
from dotenv import load_dotenv 追加
load_dotenv() 追加
SECRET_KEY = os.getenv('SECRET_KEY') 追加

(venv)$ touch .gitignore
__pycache__/
.env
/venv/
/media/*
!/media/.gitkeep
/static/*
!/static/.gitkeep
db.sqlite3

test/bookproject5/bookproject/.gitignore を書く
__pycache__/ python のキャッシュが自動で生成されているので除外
.env 環境変数は除外
/venv/ 仮想環境は除外
/media/*
!/media/.gitkeep
media ディレクトリに .gitkeep というファイルを作成し、それ以外は除外
/static/*
!/static/.gitkeep
static ディレクトリに .gitkeep というファイルを作成し、それ以外は除外
db.sqlite3 DBは除外

(略)
STATIC_URL = '/static/'
STATIC_ROOT = BASE_DIR / 'static'
MEDIA_URL = '/media/'
(略)

test/bookproject5/bookproject/bookproject/settings.py を書く
STATIC_ROOT = BASE_DIR / 'static' を追加

$ python3 manage.py collectstatic

コマンドを入力して各アプリの static ディレクトリに置いていた static ファイルを移動させる
具体的にはデプロイした場合 test/bookproject5/bookproject/static に static ファイルを置かなければならない
つまりコマンドは BASE_DIR / 'static' ディレクトリに static ファイルを移動させる

$ pip install gunicorn

ウェブサーバ: apache, nginx
アプリサーバ: gunicorn
アプリ: python django
DB: sqlite3
gunicorn がウェブサーバーとアプリの橋渡しになる
参考 https://deecode.net/?p=408

web: python manage.py migrate && gunicorn bookproject.wsgi

test/bookproject5/bookproject/Procfile を書く

asgiref==3.5.2
Django==3.2
gunicorn==20.1.0
Pillow==9.1.1
python-dotenv==0.20.0
pytz==2022.1
sqlparse==0.4.2

test/bookproject5/bookproject/requirements.txt を書く
$ pip freeze で表示されたインストール済みライブラリを書く

#DEBUG = True
#ALLOWED_HOSTS = []
DEBUG = False
ALLOWED_HOSTS = ['tkr987test.herokuapp.com']

test/bookproject5/bookproject/bookproject/settings.py を書く
セキュリティ対策でエラー詳細表示(デバッグ)を false にする
ALLOWED_HOSTS にドメインを書く(herokuなら Setting -> Domains)

Heroku にプロジェクトをアップロードする

(venv)$ git init
(venv)$ heroku git:remote -a tkr987test
(venv)$ git add .
(venv)$ git commit -m 'deploy'
(venv)$ git push heroku master

ドメイン URL

https://tkr987test.herokuapp.com/
(ただし Heroku は画像を保存できないため Amazon S3 などを使う必要がある)