@@ -25,9 +25,28 @@ def load_local_env():
2525
2626load_local_env ()
2727
28- SECRET_KEY = "development-only"
29- DEBUG = True
30- ALLOWED_HOSTS = []
28+ # 배포 환경에서는 아래 값들을 모두 환경변수로 주입한다.
29+ # 기본값은 로컬 개발 기준이라, .env 없이도 로컬 실행은 그대로 동작한다.
30+ SECRET_KEY = os .environ .get ("DJANGO_SECRET_KEY" , "development-only" )
31+
32+ # 서버용 compose 파일에 DJANGO_DEBUG=False가 박혀 있으므로
33+ # 누가 .env를 빠뜨려도 프로덕션에서 DEBUG가 켜지지 않는다.
34+ DEBUG = os .environ .get ("DJANGO_DEBUG" , "True" ).lower () not in ("false" , "0" , "no" )
35+
36+ # "1.2.3.4,example.com" 형태의 콤마 구분 문자열을 받는다.
37+ ALLOWED_HOSTS = [
38+ host .strip ()
39+ for host in os .environ .get ("DJANGO_ALLOWED_HOSTS" , "" ).split ("," )
40+ if host .strip ()
41+ ]
42+
43+ # nginx 뒤에 있을 때 POST 요청의 CSRF origin 검사를 통과시키기 위한 값.
44+ # "http://1.2.3.4" 처럼 스킴을 반드시 포함해야 한다.
45+ CSRF_TRUSTED_ORIGINS = [
46+ origin .strip ()
47+ for origin in os .environ .get ("DJANGO_CSRF_TRUSTED_ORIGINS" , "" ).split ("," )
48+ if origin .strip ()
49+ ]
3150
3251INSTALLED_APPS = [
3352 "django.contrib.admin" ,
@@ -84,10 +103,23 @@ def load_local_env():
84103]
85104WSGI_APPLICATION = "config.wsgi.application"
86105
106+ # 컨테이너에서는 DB 파일을 /app/data 아래에 둔다.
107+ # BASE_DIR(=/app)에 볼륨을 마운트하면 코드가 덮여버리므로 경로를 분리했다.
108+ DB_PATH = os .environ .get ("DJANGO_DB_PATH" ) or (BASE_DIR / "db.sqlite3" )
109+
87110DATABASES = {
88111 "default" : {
89112 "ENGINE" : "django.db.backends.sqlite3" ,
90- "NAME" : BASE_DIR / "db.sqlite3" ,
113+ "NAME" : DB_PATH ,
114+ "OPTIONS" : {
115+ # WAL 모드는 읽기와 쓰기가 서로를 막지 않게 해준다.
116+ # gunicorn 워커가 여러 개인 환경에서 "database is locked"를 크게 줄여준다.
117+ "init_command" : "PRAGMA journal_mode=WAL; PRAGMA synchronous=NORMAL;" ,
118+ # 잠금이 걸렸을 때 바로 실패하지 않고 최대 20초까지 기다린다.
119+ "timeout" : 20 ,
120+ # 쓰기 트랜잭션의 잠금을 시작 시점에 잡아 갱신 충돌을 방지한다.
121+ "transaction_mode" : "IMMEDIATE" ,
122+ },
91123 }
92124}
93125
@@ -96,9 +128,16 @@ def load_local_env():
96128USE_I18N = True
97129USE_TZ = True
98130STATIC_URL = "static/"
99- STATICFILES_DIRS = [BASE_DIR / "static" ]
131+
132+ # collectstatic이 각 앱의 static/을 모아두는 위치. nginx가 이 디렉토리를 서빙한다.
133+ STATIC_ROOT = os .environ .get ("DJANGO_STATIC_ROOT" ) or (BASE_DIR / "staticfiles" )
134+
135+ # 프로젝트 루트의 static/은 현재 존재하지 않는다.
136+ # 없는 경로를 그대로 두면 collectstatic이 W004 경고를 내므로 있을 때만 넣는다.
137+ STATICFILES_DIRS = [BASE_DIR / "static" ] if (BASE_DIR / "static" ).exists () else []
138+
100139MEDIA_URL = "media/"
101- MEDIA_ROOT = BASE_DIR / "media"
140+ MEDIA_ROOT = os . environ . get ( "DJANGO_MEDIA_ROOT" ) or ( BASE_DIR / "media" )
102141
103142LOGIN_URL = "/accounts/login/"
104143DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
0 commit comments