Django+PostgreSQL+Heroku開発環境構築
この記事では初心者がつまづきやすいDjango + PostgreSQL + Heroku開発環境構築の手順をまとめました。技術構成は以下のとおりです。
- 開発環境:AWS EC2+ローカルMacのVSCode ※Cloud9の説明もあります
- フレームワーク:Django
- データベース:PostgreSQL
- デプロイ:Heroku
- バージョン管理:GitHub
初期設定手順
ステップ1: 開発環境の構築
AWS EC2+ローカルMacのVSCodeは、以下の記事をご覧ください。
Cloud9はこちらです。

ステップ2: 開発環境の設定
2-1 仮想環境の準備
開発環境のライブラリやパッケージのバージョンを本番環境でも再現して、依存関係によるエラーを起こさないよう、開発環境では仮想環境を利用します。まずは、ターミナルで以下のコマンドを実行し、プロジェクトディレクトリを作成して移動。<your-project>はプロジェクト名に修正してください(以下の画像ではanalysis-project)。<>は不要です。
# ターミナル
mkdir ~/environment/<your-project>
cd ~/environment/<your-project>

次に仮想環境を作成します。
# ターミナル
python3 -m venv venv
そして、仮想環境を有効化します。有効化されている場合、ターミナルのプロンプトに (venv) が表示されます。開発するときには、その都度、仮想環境を有効化する必要があります。
# ターミナル
source venv/bin/activate

2-2 データベースPostgreSQLのインストール
さて、どんどん行きましょう。次はPostgreSQLの設定です。まずは、PostgreSQLをCloud9にインストールします。
# ターミナル
sudo dnf install -y postgresql15-server # PostgreSQLをインストール
sudo postgresql-setup --initdb --unit postgresql # PostgreSQLを初期化
sudo systemctl start postgresql # PostgreSQLを起動
sudo systemctl enable postgresql # 起動時に自動で開始するよう設定
以下のコードで、PostgreSQLのステータスを確認することができます。activeとなっていればOK。
# ターミナル
sudo systemctl status postgresql

2-3 PostgreSQLの設定
次に、Django用のデータベース作成していきます。まずは、PostgreSQLのログインします。
# ターミナル
sudo -u postgres psql
以下のSQLコマンドを実行し、Django用のデータベースとユーザーを作成します。<your_db>、<your_db_user>、<your_db_password>は修正してください。
# postgres
CREATE DATABASE <your_db>;
CREATE USER <your_db_user> WITH PASSWORD '<your_db_password>';
ALTER ROLE <your_db_user> SET client_encoding TO 'utf8';
ALTER ROLE <your_db_user> SET default_transaction_isolation TO 'read committed';
ALTER ROLE <your_db_user> SET timezone TO 'UTC';
ALTER DATABASE <your_db> OWNER TO <your_db_user>;
\q -- postgresを終了

設定は続きます。PostgreSQLの認証方式をmd5に変更します。
# postgres
sudo nano /var/lib/pgsql/data/pg_hba.conf
nanoというエディターで、127.0.0.1/32のidentをmd5に修正します。^Xで保存して終了。
# nano
- host all all 127.0.0.1/32 ident
+ host all all 127.0.0.1/32 md5

設定が完了したら、PostgreSQLを再起動します。
# ターミナル
sudo systemctl restart postgresql
ステップ3: Djangoプロジェクトの作成
3-1 Djangoプロジェクトの作成
いよいよ、Djangoプロジェクトの作成です。必要なパッケージをインストールします。
# ターミナル
pip install --upgrade pip
pip install django psycopg2-binary whitenoise
pip install gunicorn # Heroku本番環境でDjangoを起動するWSGIサーバ
pip install dj-database-url # DATABASE_URLを利用してデータベース接続設定を簡略化
pip install python-decouple # 環境変数管理を簡素化するライブラリ
Djangoプロジェクトを作成します。<your-django-app>はプロジェクト名に変更してください(ここではanalysis)。プロジェクト名のディレクトリが作成されます。
# ターミナル
django-admin startproject <your-django-app> .

<your-django-app>ディレクトリ配下のsettings.pyをクリックして開きます。そして、DATABASES部分を以下のように修正します。<your_db_password>などには、先ほどPostgreSQLで設定したパスワードを入力してください。
# settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': '<your-db>',
'USER': '<your_db_user>',
'PASSWORD': '<your_db_password>',
'HOST': '127.0.0.1',
'PORT': '5432',
}
}
初期マイグレーションを適用します。
# ターミナル
python manage.py migrate

3-2 開発サーバーの起動とsettings.pyの修正
settings.pyのALLOWED_HOSTSの部分を以下のように修正します。
# settings.py
ALLOWED_HOSTS = [
'localhost', # ローカルホスト
]
以下で、Djangoの開発サーバーを起動すると以下の画面が表示されます。これでDjangoプロジェクトの作成が完了です。
# ターミナル
python manage.py runserver 0.0.0.0:8080

ステップ4: Gitの初期設定
4-1 初回コミット
Gitを使ってプロジェクトのバージョン管理を開始するために、リポジトリを作成します。
# ターミナル
git init
<your-project>ディレクトリ配下に.gitignoreを作成して、以下の内容を貼り付けます。
# .gitignore
__pycache__/
*.pyc
*.pyo
# 環境ファイル
.env
# 仮想環境
venv/
プロジェクトの初期状態をGitに記録します。
# ターミナル
git add .
git commit -m "Initial commit"
4-2 GitHubリポジトリの作成
GitHub上にリモートリポジトリを作成して、ローカルのリポジトリと連携します。GitHubにログインし、右上の「+」ボタンをクリックして「New repository」を選択します。リポジトリ名としてプロジェクト名を入力して、「Create repository」をクリック。

リモートリポジトリをCloud9の開発環境に追加します。
# ターミナル
git remote add origin https://github.com/<ユーザー名>/<リポジトリ名>.git
ローカルの変更をリモートリポジトリに反映します。
# ターミナル
git branch -M main # ブランチ名を 'main' に設定
git push -u origin main # -u でリモートブランチとの追跡関係を設定
無事、GitHubリポジトリにアップロードされました。

4-3 以降の運用
初回のコミットはこれで完了です。それ以降の変更は以下でプッシュします。
# ターミナル
git add . # 変更をステージング
git commit -m "変更内容を記述" # 変更をコミット
git push # 変更をリポジトリにプッシュ
ステップ5: Herokuへのデプロイ
5-1 Herokuアプリの作成
いよいよHerokuへのデプロイです。まずはHeroku CLI(コマンドラインインターフェース)をインストールします。
# ターミナル
curl https://cli-assets.heroku.com/install.sh | sh # インストール
heroku --version # バージョンを確認
heroku update
Heroku CLIを使い、アプリを作成します。https://<your-heroku-app>.herokuapp.com/のURLが割り当てられ、herokuというリモートがGitに追加されます。
# ターミナル
heroku login -i # herokuにログイン
heroku create
次に、Heroku ダッシュボードからHeroku Postgresアドオンを追加します。
- Heroku ダッシュボード (https://dashboard.heroku.com/apps) にアクセス
- Postgres アドオンを追加したいアプリ (例:
nameless-sugar-69236) を選択 ResourcesタブをクリックAdd-onsセクションの検索ボックスにHeroku Postgresと入力- 検索結果から
Heroku Postgresを選択 - プランを選択します。開発やテストには無料の
Hobby Devプランで十分 Submit Order Formをクリック

5-2 本番対応
デプロイのための準備をしていきます。まずは<your-project>ディレクトリ配下に.envファイルを作成して、以下の内容を記入します。.envファイルは#のコメントや半角スペースを入れるだけでエラー発生することがあるので注意。
# .env
SECRET_KEY='your-secret-key'
DATABASE_URL='postgres://<your_db_user>:<your_db_password>@127.0.0.1:5432/<your_db>'
DEBUG='True'
ALLOWED_HOSTS='127.0.0.1,<your-host>.vfs.cloud9.us-east-1.amazonaws.com'
- SECRET_KEY:
'your-secret-key'はsettings.pyに記載されているもの - DATABASE_URL:PostgreSQLで設定したもの
- ALLOWED_HOSTS:開発サーバーの起動で設定したもの
次にsettings.pyを修正していきます。修正箇所が結構あります。まずは.envファイルから情報を読み込むための設定です。DEBUGの制御も環境変数で行います。
# settings.py
from decouple import config # ファイル上部にimport関係はまとめて記載
SECRET_KEY = config('SECRET_KEY') # 修正
DEBUG = config('DEBUG', default=False, cast=bool) # 修正
Heroku上での静的ファイル配信を安定させるために、Whitenoiseを導入。そして、Herokuでは静的ファイルをcollectstaticコマンドでstaticfilesディレクトリに集約するため、STATIC_ROOTを定義。
# settings.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware', # この行を追加
'django.contrib.sessions.middleware.SessionMiddleware', ...
]
STATIC_ROOT = BASE_DIR / 'staticfiles' # この行を追加
STATIC_URL = 'static/'
ALLOWED_HOSTSを本番環境向けに柔軟化します。
# settings.py
ALLOWED_HOSTS = config('ALLOWED_HOSTS').split(',') # 修正
データベース設定のHeroku対応です。
# settings.py
import dj_database_url # 追加
DATABASES = {
'default': dj_database_url.config(
default=config('DATABASE_URL'),
conn_max_age=600,
ssl_require=False if '127.0.0.1' in config('DATABASE_URL', '') else True
)
}
URLパスに対応するビューを設定するため、<your-django-app>ディレクトリ配下のurls.pyを以下のように修正してください。
# <your-django-app>/urls.py
from django.http import HttpResponse # 追加
def home(request):
return HttpResponse("<h1>Welcome to the Django App</h1>")
urlpatterns = [
path('admin/', admin.site.urls),
path('', home, name='home'), # 追加、ルートパスに対応
]
5-3 Heroku環境変数を設定
Herokuの環境変数も設定していきます。
# ターミナル
heroku config:set SECRET_KEY='your-production-secret-key'
heroku config:set DEBUG='False'
heroku config:set ALLOWED_HOSTS='<Herokuアプリ名>.herokuapp.com'
<Herokuアプリ名>はheroku createで表示されたもので、例えばnameless-sugar-69236-d9a3e1aa942bです。
5-4 デプロイ
デプロイのために必要なファイルを作成してきます。
# ターミナル
pip freeze > requirements.txt # 仮想環境でインストール済みパッケージ一覧を出力
<your-project>ディレクトリ配下にProcfileファイルを作成して、以下の内容を入力。<your-django-app>は、startproject時に指定したプロジェクト名に置き換えてください。
# Procfile
web: gunicorn <your-django-app>.wsgi --log-file -
同じように<your-project>ディレクトリ配下にruntime.txtファイルを作成して、Cloud9で使用しているPythonバージョンを指定。
# ターミナル
python --version # Pythonバージョンを確認
# runtime.txt
python-3.9.20
準備は完了です。GitでHerokuにデプロイしていきましょう。
# ターミナル
git add .
git commit -m "Add Heroku deployment files"
git push heroku main
Heroku環境でもデータベースマイグレーションを実行する必要があります。
# ターミナル
heroku run python manage.py migrate
https://<herokuアプリ名>.herokuapp.comでデプロイできているか確認してください。以下の画面が表示されていればOKです。

お疲れさまでした!

コメント