Skip to content

Commit 29bb30b

Browse files
committed
Add env-based host configuration
1 parent fb4658a commit 29bb30b

6 files changed

Lines changed: 101 additions & 21 deletions

File tree

.env.example

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
DEBUG=
22
DJANGO_SECRET_KEY=
33

4+
# Дополнительные домены для изолированных dev-контуров; в боевом окружении переменные необязательны.
5+
EXTRA_ALLOWED_HOSTS=
6+
EXTRA_CSRF_TRUSTED_ORIGINS=
7+
# Пример для react-dev:
8+
# EXTRA_ALLOWED_HOSTS=api-react-dev.procollab.ru,react-dev.procollab.ru
9+
# EXTRA_CSRF_TRUSTED_ORIGINS=https://api-react-dev.procollab.ru,https://react-dev.procollab.ru
10+
411
EMAIL_USER=
512
EMAIL_BACKEND=anymail.backends.unisender_go.EmailBackend
613
VERIFY_EMAIL_REDIRECT_URL=https://app.procollab.ru/auth/verification/

docs/react-dev-backend.md

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# React Dev Backend
2+
3+
## Назначение
4+
5+
Дополнительные домены отдельных dev-контуров настраиваются через окружение. Это позволяет обновлять backend из репозитория без локальных изменений `procollab/settings.py`.
6+
7+
Базовые значения `ALLOWED_HOSTS` и `CSRF_TRUSTED_ORIGINS` остаются прежними. Если новые переменные не заданы или пусты, поведение dev и production не меняется.
8+
9+
## Настройка react-dev
10+
11+
В окружении процесса или контейнера `api-react-dev` задаются:
12+
13+
```dotenv
14+
EXTRA_ALLOWED_HOSTS=api-react-dev.procollab.ru,react-dev.procollab.ru
15+
EXTRA_CSRF_TRUSTED_ORIGINS=https://api-react-dev.procollab.ru,https://react-dev.procollab.ru
16+
```
17+
18+
После изменения окружения настройки применятся при следующем запуске backend-процесса. Этот документ не описывает и не инициирует deploy.
19+
20+
## Правила разбора
21+
22+
- значения разделяются запятыми;
23+
- пробелы по краям удаляются;
24+
- пустые элементы игнорируются;
25+
- дополнительные значения добавляются после базовых;
26+
- для `EXTRA_ALLOWED_HOSTS` указываются домены без схемы;
27+
- для `EXTRA_CSRF_TRUSTED_ORIGINS` указываются полные origins со схемой `http://` или `https://`.
28+
29+
## Ограничения
30+
31+
Настройка не меняет API endpoints, сущности, статусы или бизнес-логику. Она не выполняет проверку доступности доменов и не управляет nginx, Docker или инфраструктурой. Корректность формата trusted origins дополнительно проверяется стандартными проверками Django при запуске.

procollab/settings.py

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
from decouple import config
88

9+
from procollab.settings_helpers import extend_with_env_list
10+
911
mimetypes.add_type("application/javascript", ".js", True)
1012
mimetypes.add_type("text/css", ".css", True)
1113
mimetypes.add_type("text/html", ".html", True)
@@ -23,28 +25,35 @@
2325

2426
TAGGIT_CASE_INSENSITIVE = True
2527

26-
CSRF_TRUSTED_ORIGINS = [
27-
"http://localhost:8000",
28-
"http://127.0.0.1:8000",
29-
"http://0.0.0.0:8000",
30-
"https://api.procollab.ru",
31-
"https://procollab.ru",
32-
"https://www.procollab.ru",
33-
"https://app.procollab.ru",
34-
"https://dev.procollab.ru",
35-
]
28+
# Дополнительные домены позволяют отдельным dev-контурам обходиться без локальных правок settings.py.
29+
CSRF_TRUSTED_ORIGINS = extend_with_env_list(
30+
[
31+
"http://localhost:8000",
32+
"http://127.0.0.1:8000",
33+
"http://0.0.0.0:8000",
34+
"https://api.procollab.ru",
35+
"https://procollab.ru",
36+
"https://www.procollab.ru",
37+
"https://app.procollab.ru",
38+
"https://dev.procollab.ru",
39+
],
40+
config("EXTRA_CSRF_TRUSTED_ORIGINS", default="", cast=str),
41+
)
3642

37-
ALLOWED_HOSTS = [
38-
"127.0.0.1:8000",
39-
"127.0.0.1",
40-
"localhost",
41-
"0.0.0.0",
42-
"api.procollab.ru",
43-
"app.procollab.ru",
44-
"dev.procollab.ru",
45-
"procollab.ru",
46-
"web", # From Docker
47-
]
43+
ALLOWED_HOSTS = extend_with_env_list(
44+
[
45+
"127.0.0.1:8000",
46+
"127.0.0.1",
47+
"localhost",
48+
"0.0.0.0",
49+
"api.procollab.ru",
50+
"app.procollab.ru",
51+
"dev.procollab.ru",
52+
"procollab.ru",
53+
"web", # Имя сервиса в Docker
54+
],
55+
config("EXTRA_ALLOWED_HOSTS", default="", cast=str),
56+
)
4857

4958
PASSWORD_HASHERS = [
5059
"django.contrib.auth.hashers.BCryptSHA256PasswordHasher",

procollab/settings_helpers.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
def extend_with_env_list(base_values: list[str], raw_value: str) -> list[str]:
2+
"""Добавляет к базовому списку непустые значения из env-строки через запятую."""
3+
extra_values = [value.strip() for value in raw_value.split(",") if value.strip()]
4+
5+
return [*base_values, *extra_values]

procollab/tests/__init__.py

Whitespace-only changes.
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
from unittest import TestCase
2+
3+
from procollab.settings_helpers import extend_with_env_list
4+
5+
6+
class ExtendWithEnvListTests(TestCase):
7+
def test_keeps_base_values_when_env_value_is_empty(self):
8+
base_values = ["localhost", "procollab.ru"]
9+
10+
result = extend_with_env_list(base_values, "")
11+
12+
self.assertEqual(result, base_values)
13+
self.assertIsNot(result, base_values)
14+
15+
def test_trims_and_appends_non_empty_values(self):
16+
result = extend_with_env_list(
17+
["localhost"],
18+
" api-react-dev.procollab.ru, ,react-dev.procollab.ru ,",
19+
)
20+
21+
self.assertEqual(
22+
result,
23+
[
24+
"localhost",
25+
"api-react-dev.procollab.ru",
26+
"react-dev.procollab.ru",
27+
],
28+
)

0 commit comments

Comments
 (0)