|
12 | 12 | import os
|
13 | 13 | import sys
|
14 | 14 | from pathlib import Path
|
| 15 | +from urllib.parse import quote |
| 16 | + |
| 17 | +from celery.schedules import crontab |
15 | 18 |
|
16 | 19 | # Build paths inside the project like this: BASE_DIR / 'subdir'.
|
17 | 20 | BASE_DIR = Path(__file__).resolve().parent.parent
|
|
27 | 30 | DEBUG = os.getenv("ENV", "production") != "production"
|
28 | 31 | TESTING = sys.argv[1:2] == ["test"] or os.getenv("TESTING")
|
29 | 32 |
|
| 33 | +# Static and Media |
30 | 34 | STATIC_URL = os.getenv("STATIC_URL", "/assets/static/")
|
31 | 35 | MEDIA_URL = os.getenv("MEDIA_URL", "/assets/media/")
|
32 | 36 | STATIC_ROOT = os.path.join(BASE_DIR, "assets/static")
|
|
42 | 46 | ALLOWED_HOSTS = ["*"]
|
43 | 47 |
|
44 | 48 | # Application definition
|
| 49 | +# URLs |
| 50 | +ROOT_URLCONF = "controller.urls" |
45 | 51 |
|
| 52 | +# WSGI |
| 53 | +WSGI_APPLICATION = "controller.wsgi.application" |
| 54 | + |
| 55 | +# Application definition |
46 | 56 | INSTALLED_APPS = [
|
47 | 57 | "admin_action_tools",
|
48 | 58 | "django.contrib.admin",
|
|
62 | 72 | "health_check.db", # stock Django health checkers
|
63 | 73 | "health_check.cache",
|
64 | 74 | "health_check.storage",
|
| 75 | + "django_celery_results", |
65 | 76 | "controller.sentry",
|
66 | 77 | ]
|
67 | 78 |
|
68 |
| -AUTHENTICATION_BACKENDS = ( |
69 |
| - # "django.contrib.auth.backends.ModelBackend", |
70 |
| - "controller.sentry.auth.ControllerOIDCAuthenticationBackend", |
71 |
| -) |
72 |
| - |
73 |
| -OIDC_RP_CLIENT_ID = os.getenv("OIDC_RP_CLIENT_ID") |
74 |
| -OIDC_RP_CLIENT_SECRET = os.getenv("OIDC_RP_CLIENT_SECRET") |
75 |
| -# "<URL of the OIDC OP authorization endpoint>" |
76 |
| -OIDC_OP_AUTHORIZATION_ENDPOINT = os.getenv("OIDC_OP_AUTHORIZATION_ENDPOINT") |
77 |
| -# "<URL of the OIDC OP token endpoint>" |
78 |
| -OIDC_OP_TOKEN_ENDPOINT = os.getenv("OIDC_OP_TOKEN_ENDPOINT") |
79 |
| -# "<URL of the OIDC OP userinfo endpoint>" |
80 |
| -OIDC_OP_USER_ENDPOINT = os.getenv("OIDC_OP_USER_ENDPOINT") |
81 |
| -# "<URL path to redirect to after login>" |
82 |
| -LOGIN_REDIRECT_URL = os.getenv("LOGIN_REDIRECT_URL") |
83 |
| -# "<URL path to redirect to after logout>" |
84 |
| -LOGOUT_REDIRECT_URL = os.getenv("LOGOUT_REDIRECT_URL") |
85 |
| - |
86 |
| -OIDC_RP_SIGN_ALGO = os.getenv("OIDC_RP_SIGN_ALGO", "RS256") |
87 |
| - |
88 |
| -OIDC_OP_JWKS_ENDPOINT = os.getenv("OIDC_OP_JWKS_ENDPOINT") |
89 |
| - |
90 |
| - |
91 |
| -DEVELOPER_GROUP = os.getenv("DEVELOPER_GROUP", "Developer") |
92 |
| - |
93 |
| - |
94 | 79 | MIDDLEWARE = [
|
95 | 80 | "django.middleware.security.SecurityMiddleware",
|
96 | 81 | "django.contrib.sessions.middleware.SessionMiddleware",
|
|
101 | 86 | "django.middleware.clickjacking.XFrameOptionsMiddleware",
|
102 | 87 | ]
|
103 | 88 |
|
104 |
| -ROOT_URLCONF = "controller.urls" |
105 | 89 |
|
| 90 | +# template |
106 | 91 | TEMPLATES = [
|
107 | 92 | {
|
108 | 93 | "BACKEND": "django.template.backends.django.DjangoTemplates",
|
|
120 | 105 | },
|
121 | 106 | ]
|
122 | 107 |
|
123 |
| -WSGI_APPLICATION = "controller.wsgi.application" |
| 108 | +# Authentication |
| 109 | +AUTHENTICATION_BACKENDS = ( |
| 110 | + # "django.contrib.auth.backends.ModelBackend", |
| 111 | + "controller.sentry.auth.ControllerOIDCAuthenticationBackend", |
| 112 | +) |
| 113 | + |
| 114 | +OIDC_RP_CLIENT_ID = os.getenv("OIDC_RP_CLIENT_ID") |
| 115 | +OIDC_RP_CLIENT_SECRET = os.getenv("OIDC_RP_CLIENT_SECRET") |
| 116 | +# "<URL of the OIDC OP authorization endpoint>" |
| 117 | +OIDC_OP_AUTHORIZATION_ENDPOINT = os.getenv("OIDC_OP_AUTHORIZATION_ENDPOINT") |
| 118 | +# "<URL of the OIDC OP token endpoint>" |
| 119 | +OIDC_OP_TOKEN_ENDPOINT = os.getenv("OIDC_OP_TOKEN_ENDPOINT") |
| 120 | +# "<URL of the OIDC OP userinfo endpoint>" |
| 121 | +OIDC_OP_USER_ENDPOINT = os.getenv("OIDC_OP_USER_ENDPOINT") |
| 122 | +# "<URL path to redirect to after login>" |
| 123 | +LOGIN_REDIRECT_URL = os.getenv("LOGIN_REDIRECT_URL") |
| 124 | +# "<URL path to redirect to after logout>" |
| 125 | +LOGOUT_REDIRECT_URL = os.getenv("LOGOUT_REDIRECT_URL") |
| 126 | + |
| 127 | +OIDC_RP_SIGN_ALGO = os.getenv("OIDC_RP_SIGN_ALGO", "RS256") |
| 128 | + |
| 129 | +OIDC_OP_JWKS_ENDPOINT = os.getenv("OIDC_OP_JWKS_ENDPOINT") |
124 | 130 |
|
125 | 131 |
|
126 | 132 | # Database
|
|
172 | 178 |
|
173 | 179 | DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
|
174 | 180 |
|
| 181 | + |
| 182 | +# Reuse db connection |
175 | 183 | CONN_MAX_AGE = None
|
| 184 | + |
| 185 | +# CACHE |
176 | 186 | APP_CACHE_TIMEOUT = 0
|
177 | 187 |
|
178 | 188 | if not TESTING:
|
|
190 | 200 | }
|
191 | 201 |
|
192 | 202 |
|
| 203 | +# App config |
193 | 204 | DEFAULT_SAMPLE_RATE = float(os.getenv("DEFAULT_SAMPLE_RATE", "0.1"))
|
| 205 | + |
194 | 206 | DEFAULT_WSGI_IGNORE_PATHS = os.getenv("DEFAULT_WSGI_IGNORE_PATHS", "/health,/healthz,/health/,/healthz/").split(",")
|
195 | 207 |
|
196 | 208 |
|
197 | 209 | DEFAULT_CELERY_IGNORE_TASKS = []
|
198 | 210 |
|
199 |
| - |
200 | 211 | CACHE_META_INVALIDATION = {
|
201 | 212 | "SERVER_NAME": os.getenv("CACHE_META_SERVER_NAME", "localhost"),
|
202 | 213 | "SERVER_PORT": int(os.getenv("CACHE_META_SERVER_PORT", "8000")),
|
203 | 214 | "HTTP_ACCEPT": os.getenv("CACHE_META_HTTP_ACCEPT", "*/*"),
|
204 | 215 | }
|
205 | 216 |
|
206 |
| - |
207 | 217 | MAX_BUMP_TIME_SEC = int(os.getenv("MAX_BUMP_TIME_SEC", "0"))
|
208 | 218 | if MAX_BUMP_TIME_SEC == 0:
|
209 | 219 | MAX_BUMP_TIME_SEC = 30 * 60 # 30 minutes
|
210 | 220 |
|
| 221 | +# CACHE KEY for panic |
211 | 222 | PANIC_KEY = "PANIC"
|
| 223 | + |
| 224 | +DEVELOPER_GROUP = os.getenv("DEVELOPER_GROUP", "Developer") |
| 225 | + |
| 226 | +APP_AUTO_PRUNE = os.getenv("APP_AUTO_PRUNE", "true").lower() == "true" |
| 227 | +APP_AUTO_PRUNE_MAX_AGE_DAY = int(os.getenv("APP_AUTO_PRUNE_MAX_AGE_DAY", "5")) |
| 228 | + |
| 229 | + |
| 230 | +# Celery |
| 231 | +BROKER_USER = quote(os.environ.get("CELERY_BROKER_USER", "rabbitmq")) |
| 232 | +BROKER_PASSWORD = quote(os.environ.get("CELERY_BROKER_PASSWORD", "rabbitmq")) |
| 233 | +BROKER_HOST = os.environ.get("CELERY_BROKER_HOST", "localhost") |
| 234 | +BROKER_PORT = os.environ.get("CELERY_BROKER_PORT", "5672") |
| 235 | +BROKER_VHOST = quote(os.environ.get("CELERY_BROKER_VHOST", "/")) |
| 236 | + |
| 237 | + |
| 238 | +CELERY_ACCEPT_CONTENT = ["json"] |
| 239 | +CELERY_ACKS_LATE = True |
| 240 | +CELERY_PREFETCH_MULTIPLIER = 1 |
| 241 | +CELERY_RESULT_BACKEND = "django-db" |
| 242 | +CELERY_BROKER_URL = f"amqp://{BROKER_USER}:{BROKER_PASSWORD}@{BROKER_HOST}:{BROKER_PORT}/{BROKER_VHOST}" |
| 243 | + |
| 244 | +CELERY_BEAT_SCHEDULE = { |
| 245 | + "close-window": { |
| 246 | + "task": "controller.sentry.tasks.close_window", |
| 247 | + "schedule": crontab(), |
| 248 | + } |
| 249 | +} |
| 250 | + |
| 251 | +if APP_AUTO_PRUNE: |
| 252 | + CELERY_BEAT_SCHEDULE["prune-inactive"] = { |
| 253 | + "task": "controller.sentry.tasks.prune_inactive_app", |
| 254 | + "schedule": crontab(minute="0", hour="*"), |
| 255 | + } |
0 commit comments