はじめに
DjangoでDBを使用するとき、settings.pyにDBの情報を書くと思うんですが、本番と開発で分けるときに少しハマったので備忘録として書いておきます。
今回はGoogleのcloudrunでデプロイしました。
前提条件
・GCPでアカウントを作成している
・cloudsqlでインスタンスとDBを作成している
・cloudmigrate.yamlを作成している
settings.pyを分割する
元々settings.pyがあるディレクトリにsettingsというフォルダを作成します。
作成したら、settings.pyをsettingsに移動します。
settings.pyの名前をbase.pyに変更し、別で_init_.py、local.py、production.pyをsettingsの中に作成します。
以下のようになっていればOKです。
settings/
__init__.py
base.py
local.py
production.py
local.pyとproduction.pyを編集する
base.pyに書いてあるDBの情報を消して、開発のDBと本番(cloudsql)のDBの情報をlocal.pyとproduction.pyにそれぞれ追記します。また、はじめにbase.pyの情報をimportしておきます。
from .base import *
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql'
'NAME': 'DB_NAME'
'USER': 'root'
'PASSWORD': 'password'
'HOST': 'localhost'
'PORT': '3306'
}
}
from .base import *
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql'
'NAME': 'DB_NAME'
'USER': 'USER_NAME'
'PASSWORD': 'password'
'HOST': 'cloudsql/~'
}
}
base.pyを編集する
こちらのファイルではDBの情報を削除します。
またcloudrunにデプロイするときに使うimageをbuildするときにcollectstaticをする必要があるのですが、settingsにファイルを分割したことでディレクトリ構造が変わったため、base.pyの記述を少し変えます。
from .base import *
STATIC_URL = '/static/'
STATICFILES_DIRS = {
os.path.join(BASE_DIR, '../static'), #..を追加
}
STATIC_ROOT = os.path.join(BASE_DIR, '../staticfiles') #..を追加
他にも少し修正する
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.production') #productionを追加
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.production')#productionを追加
manage.pyをproductionしているので、ローカルサーバを立ち上げるときは以下のコマンドを入力します。
% python manage.py runserver --settings config.settings.local
おわりに
本番用にbuildするときは、通常通り以下のようにすれば大丈夫だと思います。
% gcloud builds submit --config cloudmigrate.yaml
--substitutions _INSTANCE_NAME=~~~, _REGION=~~~
他にも本番と開発のsettingsファイルで分割できるところはあると思いますが、今回はDB中心に書きました。
参考になれば幸いです。