Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
DEBUG=
DJANGO_SECRET_KEY=

# Дополнительные домены для изолированных dev-контуров; в боевом окружении переменные необязательны.
EXTRA_ALLOWED_HOSTS=
EXTRA_CSRF_TRUSTED_ORIGINS=
# Пример для react-dev:
# EXTRA_ALLOWED_HOSTS=api-react-dev.procollab.ru,react-dev.procollab.ru
# EXTRA_CSRF_TRUSTED_ORIGINS=https://api-react-dev.procollab.ru,https://react-dev.procollab.ru

EMAIL_USER=
EMAIL_BACKEND=anymail.backends.unisender_go.EmailBackend
VERIFY_EMAIL_REDIRECT_URL=https://app.procollab.ru/auth/verification/
Expand Down
31 changes: 31 additions & 0 deletions docs/react-dev-backend.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# React Dev Backend

## Назначение

Дополнительные домены отдельных dev-контуров настраиваются через окружение. Это позволяет обновлять backend из репозитория без локальных изменений `procollab/settings.py`.

Базовые значения `ALLOWED_HOSTS` и `CSRF_TRUSTED_ORIGINS` остаются прежними. Если новые переменные не заданы или пусты, поведение dev и production не меняется.

## Настройка react-dev

В окружении процесса или контейнера `api-react-dev` задаются:

```dotenv
EXTRA_ALLOWED_HOSTS=api-react-dev.procollab.ru,react-dev.procollab.ru
EXTRA_CSRF_TRUSTED_ORIGINS=https://api-react-dev.procollab.ru,https://react-dev.procollab.ru
```

После изменения окружения настройки применятся при следующем запуске backend-процесса. Этот документ не описывает и не инициирует deploy.

## Правила разбора

- значения разделяются запятыми;
- пробелы по краям удаляются;
- пустые элементы игнорируются;
- дополнительные значения добавляются после базовых;
- для `EXTRA_ALLOWED_HOSTS` указываются домены без схемы;
- для `EXTRA_CSRF_TRUSTED_ORIGINS` указываются полные origins со схемой `http://` или `https://`.

## Ограничения

Настройка не меняет API endpoints, сущности, статусы или бизнес-логику. Она не выполняет проверку доступности доменов и не управляет nginx, Docker или инфраструктурой. Корректность формата trusted origins дополнительно проверяется стандартными проверками Django при запуске.
51 changes: 30 additions & 21 deletions procollab/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@

from decouple import config

from procollab.settings_helpers import extend_with_env_list

mimetypes.add_type("application/javascript", ".js", True)
mimetypes.add_type("text/css", ".css", True)
mimetypes.add_type("text/html", ".html", True)
Expand All @@ -23,28 +25,35 @@

TAGGIT_CASE_INSENSITIVE = True

CSRF_TRUSTED_ORIGINS = [
"http://localhost:8000",
"http://127.0.0.1:8000",
"http://0.0.0.0:8000",
"https://api.procollab.ru",
"https://procollab.ru",
"https://www.procollab.ru",
"https://app.procollab.ru",
"https://dev.procollab.ru",
]
# Дополнительные домены позволяют отдельным dev-контурам обходиться без локальных правок settings.py.
CSRF_TRUSTED_ORIGINS = extend_with_env_list(
[
"http://localhost:8000",
"http://127.0.0.1:8000",
"http://0.0.0.0:8000",
"https://api.procollab.ru",
"https://procollab.ru",
"https://www.procollab.ru",
"https://app.procollab.ru",
"https://dev.procollab.ru",
],
config("EXTRA_CSRF_TRUSTED_ORIGINS", default="", cast=str),
)

ALLOWED_HOSTS = [
"127.0.0.1:8000",
"127.0.0.1",
"localhost",
"0.0.0.0",
"api.procollab.ru",
"app.procollab.ru",
"dev.procollab.ru",
"procollab.ru",
"web", # From Docker
]
ALLOWED_HOSTS = extend_with_env_list(
[
"127.0.0.1:8000",
"127.0.0.1",
"localhost",
"0.0.0.0",
"api.procollab.ru",
"app.procollab.ru",
"dev.procollab.ru",
"procollab.ru",
"web", # Имя сервиса в Docker
],
config("EXTRA_ALLOWED_HOSTS", default="", cast=str),
)

PASSWORD_HASHERS = [
"django.contrib.auth.hashers.BCryptSHA256PasswordHasher",
Expand Down
5 changes: 5 additions & 0 deletions procollab/settings_helpers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
def extend_with_env_list(base_values: list[str], raw_value: str) -> list[str]:
"""Добавляет к базовому списку непустые значения из env-строки через запятую."""
extra_values = [value.strip() for value in raw_value.split(",") if value.strip()]

return [*base_values, *extra_values]
Empty file added procollab/tests/__init__.py
Empty file.
28 changes: 28 additions & 0 deletions procollab/tests/test_settings_helpers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
from unittest import TestCase

from procollab.settings_helpers import extend_with_env_list


class ExtendWithEnvListTests(TestCase):
def test_keeps_base_values_when_env_value_is_empty(self):
base_values = ["localhost", "procollab.ru"]

result = extend_with_env_list(base_values, "")

self.assertEqual(result, base_values)
self.assertIsNot(result, base_values)

def test_trims_and_appends_non_empty_values(self):
result = extend_with_env_list(
["localhost"],
" api-react-dev.procollab.ru, ,react-dev.procollab.ru ,",
)

self.assertEqual(
result,
[
"localhost",
"api-react-dev.procollab.ru",
"react-dev.procollab.ru",
],
)
Loading