DjangoをVPSにデプロイする4〜Nginx編〜の続きです。
この記事では本番環境でDjangoを動かせるようにDjango側の設定をしていきます。
前提
- ローカルに仮想環境を構築できている
- ローカルに.envファイルを用意できている
settings.py
ここまでこられた方は既に、開発環境と本番環境を「django-environ」等で分けられていると思いますので、settings.pyは軽く説明します。
以前も書きましたが、DATABASESのユーザー名やパスワードは本番環境と同じにすると楽です。
import environ
env = environ.Env()
environ.Env.read_env(os.path.join(BASE_DIR, '.env'))
SECRET_KEY = env('SECRET_KEY')
DEBUG = env.bool('DEBUG', False)
ALLOWED_HOSTS = ['example.com', 'www.example.com', '127.0.0.1', 'localhost']
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': env('DATABASE_NAME'),
'USER': env('USER'),
'PASSWORD': env('PASSWORD'),
'HOST': '',
'PORT': '',
}
}
STATIC_ROOT = '/usr/share/nginx/html/プロジェクト名/static'
MEDIA_ROOT = '/usr/share/nginx/html/プロジェクト名/media'
# これを追加して下さい。
SECURE_CROSS_ORIGIN_OPENER_POLICY = None
DEBUG
デフォルトはFalesで、.envファイルにDEBUGがあれば読み込みます。
DEBUG = env.bool('DEBUG', False)
ALLOWED_HOSTS
プロジェクトのドメインやIPアドレスを記入します。
ALLOWED_HOSTS = ['example.com', 'www.example.com', '127.0.0.1', 'localhost']
DATABASES
このシリーズではPostgreSQLを使っているので、ポスグレの設定です。
env(‘ ‘)の部分は、「.env」ファイルに書いてあります。後で本番環境(VPS側)にも「.env」ファイルを作成します。
HOST
PostgreSQLを使用している場合、空のHOSTでのデータベースへの接続はUNIXドメインソケット(pg_hba.confの「local」行)を介して行われます。
UNIXドメインソケットが標準の場所にない場合は、postgresql.confのunix_socket_directoryの値と同じものを使用します。
TCPソケットで接続する場合、HOSTを’localhost’または’127.0.0.1’に設定します(pg_hba.confの’host’行)。Windowsでは、UNIXドメインソケットは使用できないため、常にHOSTを定義する必要があります。
PORT
空文字列はデフォルトのポート「5432」を意味します。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': env('DATABASE_NAME'),
'USER': env('USER'),
'PASSWORD': env('PASSWORD'),
'HOST': '',
'PORT': '',
}
}
ROOT
「python3 manage.py collectstatic」を実行した時、静的ファイルを本番環境のどのディレクトリにファイルを集めるかを指定します。
Nginxで書いた「location /static」と「location /media」と同じパスになります。
STATIC_ROOT = '/usr/share/nginx/html/プロジェクト名/static'
MEDIA_ROOT = '/usr/share/nginx/html/プロジェクト名/media'
SECURE_CROSS_ORIGIN_OPENER_POLICY
Cross Origin Opener Policy関連の設定です。Django 4.0からの新機能です。
Gunicornのインストール
ローカルのパッケージにGunicornを追加インストールしておきます。
本番環境にクローンした時にパッケージを一緒に入れるためです。
仮想環境を有効化
$ source env/bin/activate
gunicornをインストール
(env)$ pip install gunicorn
pipの依存関係をチェックしおく
(env)$ pip check
No broken requirements found.
requirements.txtにパッケージを書き込む
(env)$ pip freeze > requirements.txt
.gitignore
既にこのファイルがある方は次に進んで下さい。
「.gitignore」はGitHubに上げないファイルやディレクトリを指定するものです。
manage.pyと同じ階層に、.gitignoreファイルを作成してください。
gitignore.ioでDjangoを検索して、内容をまるごとコピーして、自身の.gitignoreに貼り付けてください。
GitHub
GitHubに上げてください。
構造
これから作るディレクトリやファイルは、USERNAMEより下がローカルの環境と同じ構造になります。
🗂 home
┗🗂 USERNAME
┗🗂 プロジェクト名(前回作成済)
┣🗂 仮想環境名(これから作成)
┗🗂 プロジェクト名(クローンする)
┣📄 manage.py
┗📄 .env(これから作成)
VPSに仮想環境作成
SSH接続します。
$ ssh COMAND_NAME
前回作成した「USERNAME/プロジェクト名」のディレクトリに移動します。
USERNAME@xxx.xxx.xxx.xxx:~$ cd プロジェクト名
現在の位置を確認
USERNAME@xxx.xxx.xxx.xxx:プロジェクト名$ pwd
/home/USERNAME/プロジェクト名
仮想環境を作成します。
USERNAME@xxx.xxx.xxx.xxx:プロジェクト名$ python3 -m venv 仮想環境名
GithubからVPSにクローン
仮想環境があるディレクトリ(プロジェクト名のディレクトリ)にクローンします。
「https://~」は自身のものに置き換えて下さい。
$ git clone https://~
GitHubのユーザー名とトークン(パスワード)を入力するとクローンされます。
GitHubのトークンはメニューの「setting > Developer settings > Personal access tokens」で取得できます。
基本的に「repo」にチェックを入れていれば大丈夫ですが各設定は各々で。
VPSにパッケージをインストール
VPSにクローンすることができたので、仮想環境にパッケージをインストールします。
$ source 仮想環境名/bin/activate
requirements.txtからまとめてインストールします。
(仮想環境名)$ pip install -r requirements.txt
.envファイルを作成・編集
Djangoアプリに移動
(仮想環境名)$ cd プロジェクト名
.envファイルを作成
(仮想環境名)$ vi .env
ローカルにある.envの中身をコピーして貼り付けて下さい。
.envにDEBUG=Trueを書いてる方は、本番環境の.envはFalseするか消しておきましょう!
migrate
GitHubにmigrationsファイルがある方は、python3 manage.py migrateだけで大丈夫です。
(仮想環境名)$ python3 manage.py migrate
静的ファイルを集める
静的ファイルをNginxのディレクトリに集めるのでcollectstaticを実行します。
(仮想環境名)$ python3 manage.py collectstatic
これでNginxで設定した「/usr/share/nginx/html/プロジェクト名/static」に静的ファイルが集まります。
Nginxの再起動
Djangoアプリを更新した(git pull)場合はcollectstaticとNginxの再起動を毎回行います。
$ sudo systemctl restart nginx
所有者の変更
もしPermissionのエラーがでたら対象のディレクトリの所有者をUSERNAMEに変更してください。
$ sudo chown -R USERNAME ディレクトリ名
これでDjangoの設定編は終了です!