renderでpythonデプロイ

公開日 : 2024年3月4日 更新日 : 2024年3月4日
はじめに
  • こちらのページ公式マニュアルを参考に記述しています
  • ローカル環境でアプリケーションやサイトが完成していることが前提
  • このページで、「プロジェクト名」とは、「django-admin startproject <プロジェクト名>」で指定したプロジェクト名とする。今回は「django_web」とした
  • このページで、「アプリケーション名」とは、「python manage.py startapp <アプリケーション名>」で指定したアプリケーション名とする。今回は「web」とした
  • render固有の処理とおそらく全てのサーバーに共通の処理があるので、render固有の処理には「render固有の処理」とつける
  • render以外でデプロイしたい方は、「共通の処理」のセクションを見てほしい
  • デプロイ前とデプロイ後では、以下のファイルが追加される。説明の際は、作成したファイルをどこに配置するかを説明しないので、次の「階層構造」のセクションをよく見て配置してください
    ファイル名 配置場所 役割
    .env django_web/.env settings.pyには隠さなければならない情報がそのまま記述してあるので、それらを.envに記述し、settings.pyから読み込ませる
    .gitignore django_web/.gitignore リモートリポジトリにプッシュしたくないファイルを指定する。gitはいいからとりあえずdjangoをデプロイしたいという人向けの説明もするので安心してほしい
    build.sh django_web/build.sh render側でスーパーユーザーを作成するためのコマンドを記述する
    render.yaml django_web/render.yaml render側でサーバーの初期設定を行う
    requirements.txt django_web/requirements.txt render側で、自分が使用しているモジュールをインポートするため
    superuser.py django_web/web/management/commands/superuser.py 一つのアプリケーション内に配置すればよい
階層構造
デプロイ前
    
└─django_web
│ db.sqlite3
│ manage.py

├─django_web
│ │ asgi.py
│ │ settings.py
│ │ urls.py
│ │ wsgi.py
│ │ __init__.py
│ │
│ └─__pycache__
│ ........


└─web
│ admin.py
│ apps.py
│ models.py
│ tests.py
│ urls.py
│ views.py
│ __init__.py

├─management
│ └─commands
│ superuser.py

├─migrations
│ .....


├─static
│ ......

├─templates
│ └─web
│ └─....

└─__pycache__
.....
デプロイ後
    
└─django_web
│ .env
│ .gitignore
│ build.sh
│ db.sqlite3
│ manage.py
│ render.yaml
│ requirements.txt

├─django_web
│ │ asgi.py
│ │ settings.py
│ │ urls.py
│ │ wsgi.py
│ │ __init__.py
│ │
│ └─__pycache__
│ ........


└─web
│ admin.py
│ apps.py
│ models.py
│ tests.py
│ urls.py
│ views.py
│ __init__.py

├─management
│ └─commands
│ superuser.py

├─migrations
│ .....


├─static
│ ......

├─templates
│ └─web
│ └─....

└─__pycache__
.....
「共通の処理」 : .envの作成
.envを以下のように記述する.
    
# Djangoの秘密鍵 .env
SECRET_KEY="123456789"
# デバッグモード
DEBUG=False
  • SECRET_KEY : settings.pyに書いてある内容をそのまま文字列として「”」で囲んで記述.「=」の前に空白を入れない
  • DEBUG : 必ずFalseにする
「共通の処理」 : settings.pyの変更
以下のようにsettings.pyに追記する
    
env = environ.Env()
env.read_env(os.path.join(BASE_DIR, \'.env\'))
SECRET_KEY = env('SECRET_KEY')
DEBUG = env('DEBUG')
  • pip install django-environ : でモジュールのインポート
  • settings.pyから、SECRET_KEY、DEBUGとあった行を削除する
「共通の処理」 : requirements.txtの作成
  • pip freeze > requirements.txt : をpythonが実行できる環境で実行することでrequirements.txtを作成できる
  • その際、モジュールのバージョンに注意する。render側のpythonバージョンに合わないモジュールをインポートすることはできない
  • この記事を閲覧しているときに、pythonのどのバージョンがどのモジュールに対応しているか確認してほしい。
  • render側でpythonのバージョンは選択することができる
  • 以下は筆者の環境で作成されたrequirements.txt
    
asgiref==3.7.2
Django==4.2.4
django-environ==0.11.2
pillow==10.2.0
sqlparse==0.4.4
typing_extensions==4.10.0
tzdata==2024.1
whitenoise
「共通の処理」 : .gitignoreの作成
リモートリポジトリにプッシュしたくないファイルを記述する。以下は例
    
/myvenv
/.vscode
*/__pycache__/
/*.pyc
/.DS_Store
/.env
「render固有の処理」: requirements.txtの変更
以下をrequirements.txtに追記する.これはrender側で必要になるモジュール
    
gunicorn==20.0.4
uvicorn==0.15.0
「render固有の処理」: settings.pyの変更
以下を追記する。すでに記述してある方は追記しなくてよいです
    
MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"whitenoise.middleware.WhiteNoiseMiddleware", # 追加
"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",
]

default_dburl = "sqlite:///" + str(BASE_DIR / "db.sqlite3")

DATABASES = {
"default": config("DATABASE_URL", default=default_dburl, cast=dburl),
}

STATIC_URL = "static/"
STATIC_ROOT = str(BASE_DIR / "staticfiles")
STATICFILES_STORAGE = "whitenoise.storage.CompressedManifestStaticFilesStorage"

DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"

SUPERUSER_NAME = env("SUPERUSER_NAME")
SUPERUSER_EMAIL = env("SUPERUSER_EMAIL")
SUPERUSER_PASSWORD = env("SUPERUSER_PASSWORD")
「render固有の処理」: .envの変更
    
SUPERUSER_NAME=111111
SUPERUSER_EMAIL=2222222gmail.com
SUPERUSER_PASSWORD=333333
  • SUPERUSER_NAME : 管理者の名前.「”」で囲まずそのままかく
  • SUPERUSER_EMAIL : 管理者のメールアドレス.「”」で囲まずそのままかく
  • SUPERUSER_PASSWORD : 管理者のパスワード.「”」で囲まずそのままかく
  • 上の値はあくまでも例なので、ご自身の値を入力してください
「render固有の処理」: build.shの作成
    
#!/usr/bin/env bash
# exit on error
set -o errexit

pip install -r requirements.txt

python manage.py collectstatic --no-input
python manage.py migrate
python manage.py superuser
「render固有の処理」: render.yamlの作成
servicesのnameと、servicesのstartCommadnは変更してください
    
databases:
- name: mysitedb
plan: free
databaseName: mysite
user: mysite

services:
- type: web
plan: free
name: django_web
runtime: python
buildCommand: "./build.sh"
startCommand: 'gunicorn django_web.asgi:application -k uvicorn.workers.UvicornWorker'

envVars:
- key: DATABASE_URL
fromDatabase:
name: mysitedb
property: connectionString
- key: SECRET_KEY
generateValue: true
- key: WEB_CONCURRENCY
value: 4
- key: DEBUG # この行を追加
value: "False" # 本番環境では通常Falseに設定
  • services name : ドメインの先頭に指定したいフレーズをしている
  • services startCommadn : 'gunicorn <プロジェクト名>.asgi:application -k uvicorn.workers.UvicornWorker'のように記述
  • 文字列のように「”」で囲むところと囲まない場所があるので、上の例のように適切に行うこと。上の二つ以外は変更しなくても問題ない
「共通の処理」 : リモートリポジトリにプッシュ
  • gitをインストールし、githubに登録し、ホームページでローカルリポジトリを作成
  • django_webディレクトリ(manage.pyがあるディレクトリ)にて以下を実行。
    • git init
    • git branch -m main
    • git add .
    • git commit -m "first commit"
    • git remote add origin https://<ユーザー名>:<アクセストークン>@
    • git push -u origin main
  • ユーザー名 : なんでもいい
  • アクセストークン : このページにで取得するアクセストークン
  • git remoteは以下のような構成のとき、次にようになる。
    • ユーザー名 : tanaka
    • アクセストークン : geiwheingeknegeinge
    • HTTPSでcloneするときに使うURL : https://github.com/UserName/RepositoryName.git
    • 実際に入力するremoteコマンド : git remote add origin https://tanaka:geiwheingeknegeinge@github.com/UserName/RepositoryName.git
「render固有の処理」 : デプロイ
  • https://dashboard.render.com/ ; にアクセス
  • githubでSign inすれば、自動的に自分のローカルリポジトリを参照してくれるので、githubでSign inすることがおすすめ
  • 上のBlueprintsをクリック
  • New Blueprint Instance ボタンをクリック
  • Name : services nameで設定した名前を指定
  • Branch : mainを指定する
  • Applyボタンをクリックする。この時点では失敗する
  • Dashboard に「services nameで設定した名前」が表示される。
  • Enviroment をクリック
  • Add Environment Variableをクリック
  • 以下の環境変数を設定する
    • python : django4を使うためには3.8以上を設定。好きな値でいい
    • SUPERUSER_NAME : 管理者の名前.「”」で囲まずそのままかく
    • SUPERUSER_EMAIL : 管理者のメールアドレス.「”」で囲まずそのままかく
    • SUPERUSER_PASSWORD : 管理者のパスワード.「”」で囲まずそのままかく
  • Save Changeで保存
  • Manual Deploy ボタンのDeploy last commitでもう一度デプロイ
  • デプロイに成功すると「Live」と表示される
  • 失敗したならば、ログの内容をコピーし、chatgptに質問を投げればよい。ここまでのやり方に従ってきたならば、容易に直るエラーなはず。
  • この時点ではまだサイトは動かせない
「共通の処理」 : settings.pyのALLOWED_HOSTSの変更
  • 本番環境の場合、ALLOWED_HOSTSが適切に設定されていなければページは一切動作しない
  • renderのDashboardをクリック
  • 「services nameで設定した名前」をクリック
  • Manual Deploy ボタンのDeploy last commitでもう一度デプロイ
  • 左上に、「[https://~~~~~.onrender.com/](https://django-web-efjb.onrender.com/)」のようなアドレスが表示される。これがドメイン
  • 以下、「[https://djangowww.onrender.com/](https://django-web-efjb.onrender.com/)」というアドレスが表示されたとする
  • settings.pyのALLOWED_HOSTSを以下のように変更する
        ALLOWED_HOSTS = ['djangowww.onrender.com']
    
  • ここまで来て、やっとページが作動するようになる。
  • renderの仕様で15分サーバーが使用されていない場合、サーバーを落とすので、ページにアクセスしようとすると時間がかかる。