ADR-SRV-004. Конфигурация бэка и CORS

ADR Версия: 1.0 accepted

Бэк должен разворачиваться на стенде, где фронт и API — на разных origin. Фиксируем: параметры среды берутся из appsettings (стандартный конфиг ASP.NET, подменяется деплоем), список разрешённых origin фронта — из Cors:AllowedOrigins (allowlist по среде); в локальной разработке (список пуст) CORS разрешает любой origin. Swagger UI — только вне прода.

⟨/⟩ Исходник

1. Контекст и постановка задачи

Сервис разворачивается на стендах (dev/stage/prod). Фронт и API там — на разных origin, поэтому бэку нужен CORS-allowlist: браузер разрешит запрос со страницы фронта, только если его origin в списке разрешённых. Список различается по среде, а артефакт сборки — один, значит origin'ы нельзя «зашивать» в код.

Нужно зафиксировать: откуда бэк берёт параметры среды и как настраивается CORS, чтобы разворачивание было предсказуемым, а локальная разработка не требовала ручной настройки.

2. Драйверы решения

  1. Один билд на все среды — параметры подменяются конфигом, не пересборкой.
  2. Безопасность CORS — на стенде разрешаем только известные origin фронта, не «любой».
  3. Ноль трения локальноng serve на :4200 ходит на бэк без ручной настройки CORS.
  4. Стандартные механизмы ASP.NETappsettings, IConfiguration, без своих слоёв.

3. Рассмотренные варианты

4. Решение

Выбран Вариант A.

4.1. Параметры среды — в appsettings

appsettings.json — стандартный конфиг ASP.NET (IConfiguration). На стенде файл подменяется деплоем (генерится devops/configs-generator вместе с рантайм-конфигом фронта). В репозитории — значения для локальной разработки. Имя окружения задаётся ASPNETCORE_ENVIRONMENT при запуске.

4.2. CORS — allowlist из конфига

"Cors": { "AllowedOrigins": ["https://sok.dev.example"] }
var allowedOrigins = builder.Configuration.GetSection("Cors:AllowedOrigins").Get<string[]>() ?? [];
builder.Services.AddCors(o => o.AddPolicy(policy, p =>
{
    if (allowedOrigins.Length > 0)
        p.WithOrigins(allowedOrigins).AllowAnyHeader().AllowAnyMethod();
    else
        p.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod(); // локальная разработка
}));
app.UseCors(policy);

4.3. Swagger UI — только вне прода

Браузерная страница /swagger включается только при ASPNETCORE_ENVIRONMENT=Development (на проде — выключена). Сам контракт /openapi/v1.json отдаётся всегда.

4.4. Что не делаем

5. Положительные следствия

6. Отрицательные следствия и компромиссы

7. Проверка

8. Открытые вопросы / отложено

Связанные артефакты

Документы