DjangoをRenderにdeployしてみる – deploy編(2/2)

前の記事からの続きです。

Render用に環境変数を整える

settings.py

DEBUG = 'RENDER' not in os.environ
SECRET_KEY = os.environ.get('SECRET_KEY')
ALLOWED_HOSTS = os.environ.get('ALLOWED_HOSTS')

RENDER_EXTERNAL_HOSTNAME = os.environ.get('RENDER_EXTERNAL_HOSTNAME')
if RENDER_EXTERNAL_HOSTNAME:
    ALLOWED_HOSTS.append(RENDER_EXTERNAL_HOSTNAME)

環境変数にRENDERが定義されていたら DEBUG=False にする。

ALLOWED_HOSTSにRENDER_EXTERNAL_HOSTNAMEを追加する。

PostgreSQLサポートを追加

Render側のデータベース PostgreSQL に合わせてローカル環境に PostgreSQL をインストールします。

https://docs.render.com/deploy-django#adding-postgresql-support

pip install dj-database-url psycopg2-binary
pip freeze > requirements.txt

brewを使って PostgreSQL をインストール(MacOS)

https://qiita.com/sakana_gao/items/999bbb1cad90dc35a8b4

brew install postgresql

PostgreSQLサービスを起動

brew services start postgresql

データベースを作成

CREATE DATABASE postgresdb;
CREATE USER postgres WITH PASSWORD 'postgres';
ALTER ROLE postgres SET client_encoding TO 'utf8';
ALTER ROLE postgres SET default_transaction_isolation TO 'read committed';
ALTER ROLE postgres SET timezone TO 'UTC';
GRANT ALL PRIVILEGES ON DATABASE postgresdb TO postgres;

settings.pyを編集

import dj_database_url
    ...
    'default': dj_database_url.config(
default='postgresql://postgres:postgres@localhost:5432/postgresdb',
        conn_max_age=600
    )

マイグレーション

python manage.py migrate

staticファイル提供の設定

https://docs.render.com/deploy-django#updating-an-existing-django-project

pip install 'whitenoise[brotli]'
pip freeze > requirements.txt

settings.pyにwhitenoiseを追加

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware',
    ...
]

build.shを作成(下記の内容を貼り付け)

#!/usr/bin/env bash
# Exit on error
set -o errexit

# Modify this line as needed for your package manager (pip, poetry, etc.)
pip install -r requirements.txt

# Convert static asset files
python manage.py collectstatic --no-input

# Apply any outstanding database migrations
python manage.py migrate

build.shの実行を可能にする。

chmod a+x build.sh

gunicorn, uvicornをインストール

pip install gunicorn uvicorn
pip freeze > requirements.txt

ローカルで起動してみる。

python -m gunicorn myrender.asgi:application -k uvicorn.workers.UvicornWorker

Renderへデプロイ

https://docs.render.com/deploy-django#deploying-to-render

render.yamlを作成

databases:
  - name: postgresdb
    plan: free
    databaseName: myrender
    user: postgres

services:
  - type: web
    plan: free
    name: myrender
    runtime: python
    buildCommand: "./build.sh"
    startCommand: "python -m gunicorn myrender.asgi:application -k uvicorn.workers.UvicornWorker"
    envVars:
      - key: DATABASE_URL
        fromDatabase:
          name: postgresdb
          property: connectionString
      - key: SECRET_KEY
        generateValue: true
      - key: WEB_CONCURRENCY
        value: 4

上記の中で DATABASE_URL, SECRET_KEY はRender側から提供されます。

Render側のデータベースを作成

https://docs.render.com/databases#create-your-database

RenderのdashboardからPostgreSQLデータベースを作成します。

Freeプランを選択

データベースを作成すると Internal Database URL の値で環境変数 DATABASE_URL が自動生成されます。

BlueprintのResourcesで対象のサービスをクリック。

Environmentメニューを開く。

画面下の方の

Linked Environment Groups
Environment groups are collections of environment variables and secret files that you can share across multiple services.

ここで作成したEnv Groupをサービスにリンクする。

Blueprint instanceを追加

GitHubリポジトリに接続します。

blueprintのプロジェクト名を入力して Apply をクリックすると、

*.onrender.com のようなURLで公開されます。