패키지 생성

project를 시작할때 만든 settings.py의 위치에서 settings package를 생성

settings.py 이동

settings.py 를 base.py로 이름 변경 후 settings 패키지로 이동

local, deploy 파일 생성

settings 패키지안에 local.py, deploy.py 생성

환경변수 분리

공통 사항은 base.py

  • apps
  • static path ...

로컬 환경은 local.py

  • local에서 사용하는 db
  • debug, allowed host 등

배포 환경은 deploy.py

  • docker secrets 에서 가져오는 비밀번호 및 키
  • 배포환경에서 사용하는 db
# local.py

import os, environ
from .base import *

env = environ.Env(
    # set casting, default value
    DEBUG=(bool, False)
)
# reading .env file
environ.Env.read_env(env_file=os.path.join(BASE_DIR, ".env"))

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = env("SECRET_KEY")

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = env("DEBUG")

ALLOWED_HOSTS = ["*"]


# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.sqlite3",
        "NAME": BASE_DIR / "db.sqlite3",
    }
}
# deploy.py

import os, environ
from .base import *

# docker secrets에서 가져오는 비밀키
def read_secret(secret_name):
    file = open("/run/secrets/" + secret_name)
    secret = file.read()
    secret = secret.rstrip().lstrip()
    file.close()

    return secret


env = environ.Env(
    # set casting, default value
    DEBUG=(bool, False)
)
# reading .env file
environ.Env.read_env(env_file=os.path.join(BASE_DIR, ".env"))

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = read_secret("DJANGO_SECRET_KEY")

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False

ALLOWED_HOSTS = ["*"]


# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.mysql",
        "NAME": "django",
        "USER": "django",
        "PASSWORD": read_secret("MYSQL_PASSWORD"),
        "HOST": "mariadb",
        "PORT": "3306",
    }
}

manage.py 설정

아래의 os.environ.setdefault 부분 수정

두번째 인자에 python manage.py runserver 명령어를 사용할때 실행할 파일 연결

# root 폴더의 manage.py

#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys


def main():
    """Run administrative tasks."""
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.local")
    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)


if __name__ == "__main__":
    main()

배포 파일 실행

아래와 같이 runserver 에 --settings 옵션을 줘서 실행

python manage.py runserver --settings=config.settings.deploy
728x90

'Study > Django' 카테고리의 다른 글

[Docker] portainer를 활용한 docker secrets, swarm, stack, image  (0) 2021.05.28
[Django] gunicorn  (0) 2021.05.28
[Django] field lookup  (0) 2021.05.25
[Django] decorator  (0) 2021.05.25
[Django] code formatting black 설치 및 적용  (0) 2021.05.20

+ Recent posts