MENU

Django+PostgreSQL+Heroku:初期設定まとめ

Django+PostgreSQL+Heroku開発環境構築

この記事では初心者がつまづきやすいDjango + PostgreSQL + Heroku開発環境構築の手順をまとめました。技術構成は以下のとおりです。

  • 開発環境:AWS EC2+ローカルMacのVSCode ※Cloud9の説明もあります
  • フレームワーク:Django
  • データベース:PostgreSQL
  • デプロイ:Heroku
  • バージョン管理:GitHub
目次

初期設定手順

ステップ1: 開発環境の構築

AWS EC2+ローカルMacのVSCodeは、以下の記事をご覧ください。

Cloud9はこちらです。

あわせて読みたい
Django+PostgreSQL+Heroku|Cloud9開発環境 Cloud9用メモ Cloud9は新規アカウント発行が停止されていますが、備忘用として残しておきます。 Cloud9向け初期設定手順 ステップ1: Cloud9環境の作成 1-1 AWS 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のidentmd5に修正します。^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です。

お疲れさまでした!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

霞ヶ関を経て、現在はメガベンチャーのBtoBマーケティング組織の部長
筑波大学ビジネス科学研究科博士課程修了(博士(経営学))
得意分野は、施策効果の検証、インセンティブ最適化、セールス生産性の改善といったデータサイエンス活用

コメント

コメントする

目次