# Конфигурация проекта Attachments
# Версия: 0.11.1

Документ описывает все переменные окружения и способы конфигурирования сервиса.

## Способы конфигурирования

Настройка сервиса выполняется **только через переменные окружения**. Отдельного файла с настройками (yaml/toml) в приложении нет — за конфигурацию отвечает `internal/config/settings.py` на базе `pydantic.BaseSettings`.

Источники переменных окружения по способам запуска:

| Способ запуска | Откуда берутся переменные |
| --- | --- |
| Локально (docker-compose) | Файл `.env` в корне (`env_file: .env` в `docker-compose.yml`), плюс `POSTGRES_PASSWORD` для контейнера БД |
| Kubernetes (Helm) | `.helm/values.yaml`: блок `envs` (обычные значения) и `secretEnvs` (значения из k8s-секретов) |
| CI/CD (GitLab) | `.gitlab-ci.yml`: переменные пайплайна и build-args |

Дополнительно секреты доступа к S3 не задаются напрямую, а читаются из JSON-файла (см. `YANDEX_S3_ACCOUNT_PATH` ниже).

## Переменные приложения (класс `Settings`)

Читаются напрямую по имени (регистрозависимо, `case_sensitive = True`). Переменные без значения по умолчанию **обязательны** — без них приложение не стартует.

| Переменная | Тип | Обязательна | Значение по умолчанию | Назначение |
| --- | --- | --- | --- | --- |
| `API` | str | нет | `/api` | Префикс всех HTTP-роутов |
| `NAME` | str | нет | `Attachments` | Имя сервиса (title в FastAPI/OpenAPI) |
| `VERSION` | str | нет | `0.0.1` | Версия сервиса |
| `DESCRIPTION` | str | нет | `Attachments` | Описание сервиса |
| `YANDEX_S3_ENDPOINT_URL` | str | да* | — | Endpoint S3 (без схемы; `https://`/`http://` добавляется в коде по `YANDEX_S3_USE_SSL`) |
| `YANDEX_S3_ACCESS_KEY_ID` | str | да* | — | Access Key ID для S3 |
| `YANDEX_S3_SECRET_ACCESS_KEY` | str | да* | — | Secret Access Key для S3 |
| `YANDEX_S3_USE_SSL` | bool | нет | `True` | Использовать ли HTTPS при обращении к S3 |
| `YANDEX_S3_REGION` | str | нет | `ru-central1` | Регион S3 |
| `YANDEX_S3_VERIFY` | bool | да | — | Проверять ли SSL-сертификат S3 |
| `BUCKET_NAME` | str | да | — | Имя бакета для вложений |
| `DATABASE_NAME` | str | да | — | Имя базы данных PostgreSQL |
| `DATABASE_USER` | str | да | — | Пользователь БД |
| `DATABASE_PASSWORD` | str | да | — | Пароль пользователя БД |
| `DATABASE_HOST` | str | да | — | Хост БД |
| `DATABASE_PORT` | int | да | — | Порт БД |
| `DATABASE_SSL_MODE` | str | да | — | Режим SSL при подключении к БД (напр. `disable`, `require`, `verify-full`) |

\* Три переменные `YANDEX_S3_ENDPOINT_URL`, `YANDEX_S3_ACCESS_KEY_ID`, `YANDEX_S3_SECRET_ACCESS_KEY` формально обязательны, но при старте приложения они **проставляются автоматически** функцией `json_config_s3_account_settings()` из JSON-файла (см. `YANDEX_S3_ACCOUNT_PATH`). Задавать их вручную не нужно, если задан путь к файлу.

## Настройки S3 через JSON-файл

| Переменная | Обязательна | Назначение |
| --- | --- | --- |
| `YANDEX_S3_ACCOUNT_PATH` | да | Путь к JSON-файлу с реквизитами сервисного аккаунта S3 |

При старте функция `json_config_s3_account_settings()` читает файл по этому пути и выставляет переменные окружения `YANDEX_S3_ENDPOINT_URL`, `YANDEX_S3_ACCESS_KEY_ID`, `YANDEX_S3_SECRET_ACCESS_KEY`.

Ожидаемая структура JSON-файла:

```json
{
  "endpoint": "storage.yandexcloud.net",
  "access_key_id": "<ключ>",
  "secret_access_key": "<секрет>"
}
```

В Kubernetes файл монтируется из секрета `attachments-s3-secret` (в prod — `yc-s3`) в `/etc/sarex/yc-s3-storage/yc-s3-service-account.json`.

## Логирование (класс `LoggerSettings`, префикс `LOG_`)

| Переменная | Тип | Значение по умолчанию | Назначение |
| --- | --- | --- | --- |
| `LOG_LEVEL` | str | `INFO` | Уровень логирования (`DEBUG`, `INFO`, `WARNING`, ...). При неизвестном значении откатывается на `INFO` |
| `LOG_FORMAT` | str | JSON-шаблон с полями `timestamp`, `level`, `message` | Формат строк лога (используется `pythonjsonlogger`) |

## Трейсинг / OpenTelemetry (класс `TraceSettings`, префикс `TRACING_`)

| Переменная | Тип | Значение по умолчанию | Назначение |
| --- | --- | --- | --- |
| `TRACING_USE` | bool | `False` | Включает OTEL-трейсинг, логгер и middleware |
| `TRACING_HOST` | str | `localhost:4317` | Адрес OTLP-коллектора |
| `TRACING_SERVICE_NAME` | str | `attachments` | Имя сервиса в трейсах |
| `TRACING_INSECURE` | bool | `False` | Небезопасное (без TLS) подключение к коллектору |

Трейсинг активируется только при `TRACING_USE=true`.

## Переменные инфраструктуры и сборки

Не читаются кодом приложения, но нужны для запуска/сборки/деплоя.

| Переменная | Где используется | Назначение |
| --- | --- | --- |
| `POSTGRES_PASSWORD` | `docker-compose.yml` (контейнер `db`) | Пароль суперпользователя PostgreSQL при локальном запуске |
| `PIP_EXTRA_INDEX_URL` | `docker/Dockerfile` (build-arg) | Доп. индекс pip для установки приватных пакетов при сборке образа |
| `GITLAB_PYPI_EXTRA_INDEX_URL` | `.gitlab-ci.yml` | Значение, пробрасываемое в `PIP_EXTRA_INDEX_URL` при сборке в CI |

### Переменные CI/CD (`.gitlab-ci.yml`)

Служебные переменные пайплайна: `SERVICE_NAME`, `DOCKERFILE_PATH`, `BUILD_ARGS`, `CI_TRIGGER_SOURCE`, а также подставляемые по окружениям `STAND`, `NAMESPACE`, `RELEASE_NAME`, `CHART_NAME`, `CHART_VERSION`, `K8S_HUSTLER_BRANCH`, `HELM_SET_ARGS`. Окружение выбирается по ветке/тегу: `stage` → ветка `stage`, `preprod` → ветка `master`, `production` → git-тег.

## Переменные из Helm-чарта (`.helm/values.yaml`)

Обычные переменные (`envs`):

| Переменная | Значение | Примечание |
| --- | --- | --- |
| `API_ADDRESS` | `0.0.0.0:8000` | Задаётся в чарте, но **кодом приложения не читается** |
| `POSTGRES_POOL_SIZE` | `10` | Задаётся в чарте, но **кодом приложения не читается** |
| `DATABASE_SSL_MODE` | `verify-full` | |
| `YANDEX_S3_VERIFY` | `true` | |
| `YANDEX_S3_ACCOUNT_PATH` | `/etc/sarex/yc-s3-storage/yc-s3-service-account.json` | |
| `BUCKET_NAME` | `attachments-stage-2` / `attachments-prod-2` | Зависит от окружения |

Переменные из секретов (`secretEnvs`, секрет `attachments-postgresql-secret` / `ya-pg-secret`):

| Переменная | Ключ секрета | Примечание |
| --- | --- | --- |
| `DATABASE_PORT` | `port` | |
| `DATABASE_HOST` | `host` | |
| `DATABASE_USER` | `username` | |
| `DATABASE_PASSWORD` | `password` | |
| `DATABASE_NAME` | `database` | |
| `YC-PG-CERTIFICATE` | `ca.crt` | CA-сертификат PostgreSQL; также монтируется файлом в `/root/.postgresql/root.crt` |

## Минимальный набор для локального запуска

Для запуска через `docker-compose` в файле `.env` достаточно задать (см. `.env.example`):

- `POSTGRES_PASSWORD` — для контейнера БД
- `DATABASE_*` — параметры подключения к БД
- `BUCKET_NAME`, `YANDEX_S3_VERIFY`
- `YANDEX_S3_ACCOUNT_PATH` **или** напрямую `YANDEX_S3_ENDPOINT_URL` + `YANDEX_S3_ACCESS_KEY_ID` + `YANDEX_S3_SECRET_ACCESS_KEY`
