364 lines
30 KiB
Markdown
364 lines
30 KiB
Markdown
# Конфигурация проекта workflows-engine
|
||
|
||
`workflows-engine` (внутреннее имя образа — `kubernetes-engine`) — это фоновый сервис-оркестратор (демон без REST API), который вычитывает workflow/задачи из PostgreSQL и запускает их либо как Job'ы в Kubernetes, либо публикует в RabbitMQ (AMQP-исполнитель). Конфигурируется исключительно через переменные окружения.
|
||
|
||
## Способы конфигурирования
|
||
|
||
- **Библиотека парсинга:** [`github.com/ilyakaznacheev/cleanenv`](https://github.com/ilyakaznacheev/cleanenv).
|
||
- **Точка входа конфигурации:** `config/config.go`, функция `config.New()` вызывает `cleanenv.ReadEnv(cfg)` и заполняет структуру `Config` из переменных окружения процесса.
|
||
- **Формат тегов:** каждое поле помечено тегом `env:"ИМЯ"`; значение по умолчанию задаётся тегом `env-default:"..."`. Префикса имён переменных нет.
|
||
- **Составная структура `Config`** собирается из встроенных (embedded) структур:
|
||
- `App`, `Log`, `Executor`, `Kubernetes`, `Resources`, `Storages`, `Pooling`, `Workflows`, `Security` — объявлены в `config/config.go`;
|
||
- `pgxconnection.Postgres` — объявлена в `pkg/pgxconnection/postgres.go` (переменные `POSTGRES_*`);
|
||
- `rabbitmq.RabbitMQ` — объявлена в `pkg/rabbitmq/config.go` (переменные `RABBITMQ_*`).
|
||
- **Кастомный парсинг:** поле `WORKFLOW_PRIORITY` имеет тип `entity.WorkflowPriority` с методом `SetValue` (`internal/entity/workflow.go`); допустимые значения: `default`, `high`, `low` (регистр не важен).
|
||
- **Важно:** часть переменных из `config.env` и Helm-чарта **не читается** структурой конфигурации. Они либо читаются напрямую через `os.Getenv(...)` в `pkg/kube_services/services.go` и **пробрасываются в env запускаемых Job-подов** (а не потребляются самим engine), либо не используются кодом вовсе (см. раздел «Замечания и потенциальные проблемы»).
|
||
|
||
### Режимы запуска / исполнители
|
||
|
||
Бинарь один (`cmd/engine`), «режим» определяется набором включённых исполнителей и приоритетом.
|
||
|
||
| Режим | Как включается | Назначение |
|
||
| --- | --- | --- |
|
||
| Kubernetes-исполнитель | `ENABLE_KUBERNETES_EXECUTOR=1` (по умолчанию `true`) | Запуск задач как `batchv1.Job` в кластере Kubernetes |
|
||
| AMQP-исполнитель | `ENABLE_AMQP_EXECUTOR=1` (по умолчанию `false`) | Публикация задач в RabbitMQ и приём результатов |
|
||
| backend (обычный приоритет) | Helm-деплой `backend`, `WORKFLOW_PRIORITY=low` | Обработка обычных workflow |
|
||
| backend-high-priority | Helm-деплой `backend-high-priority`, `WORKFLOW_PRIORITY=high` | Обработка высокоприоритетных workflow |
|
||
|
||
Оба Helm-деплоя разворачивают один и тот же образ; отличаются только значением `WORKFLOW_PRIORITY` (и `MAX_WORKFLOWS_LIMIT`).
|
||
|
||
### Точки входа (entrypoints)
|
||
|
||
| Путь | Тип | Описание |
|
||
| --- | --- | --- |
|
||
| `cmd/engine/main.go` | main-пакет | Единственная точка входа. Поднимает pprof-сервер на `:8081`, читает конфиг, создаёт `engine.New(cfg, logger)` и вызывает `Run()` |
|
||
| `internal/apps/engine/engine.go` | приложение | Основная логика: подключение к Postgres, инициализация исполнителей (K8s/AMQP), pooling-контроллер и оркестратор, graceful shutdown по SIGINT |
|
||
|
||
### Запуск контейнера
|
||
|
||
- **Dockerfile:** multi-stage сборка на `golang:1.20-buster`, финальный образ `FROM scratch`.
|
||
- **CMD/ENTRYPOINT:** `ENTRYPOINT ["/engine"]` — запускается собранный бинарь напрямую, без shell-скрипта/entrypoint-обёртки.
|
||
- Внутри процесса дополнительно поднимается HTTP-сервер `net/http/pprof` на порту `:8081` (профилирование). Полноценного REST API нет (см. раздел про `API_ADDRESS`).
|
||
|
||
## Переменные приложения
|
||
|
||
### Приложение и логирование (`App`, `Log`)
|
||
|
||
| Переменная | Тип | Значение по умолчанию | Назначение |
|
||
| --- | --- | --- | --- |
|
||
| `APP_NAME` | string | `kubernetes-engine` | Имя приложения (в Helm переопределяется на `kubernetes-engine`/`kubernetes-engine-high-priority`) |
|
||
| `APP_VERSION` | string | `v1` | Версия приложения |
|
||
| `LOG_LEVEL` | string | `info` | Уровень логирования |
|
||
|
||
### PostgreSQL (`pkg/pgxconnection`)
|
||
|
||
| Переменная | Тип | Значение по умолчанию | Назначение |
|
||
| --- | --- | --- | --- |
|
||
| `POSTGRES_ADDRESS` | string | `localhost` | Хост БД |
|
||
| `POSTGRES_DB` | string | `processing_db` | Имя базы данных |
|
||
| `POSTGRES_USER` | string | `user` | Пользователь БД |
|
||
| `POSTGRES_PASSWORD` | string | `password` | Пароль БД |
|
||
| `POSTGRES_PORT` | string | `5432` | Порт БД |
|
||
| `POSTGRES_POOL_SIZE` | int | `20` | Размер пула соединений |
|
||
| `ENABLE_SQL_QUERY` | bool | `true` | Логирование SQL-запросов |
|
||
| `YC-PG-CERTIFICATE` | string | `""` | TLS-сертификат CA для подключения к БД (значение сертификата) |
|
||
| `POSTGRES_SSL_USE` | bool | `false` | Использовать SSL при подключении к БД |
|
||
|
||
### RabbitMQ (`pkg/rabbitmq`) — используется только при `ENABLE_AMQP_EXECUTOR=1`
|
||
|
||
| Переменная | Тип | Значение по умолчанию | Назначение |
|
||
| --- | --- | --- | --- |
|
||
| `RABBITMQ_HOST` | string | — | Хост брокера |
|
||
| `RABBITMQ_PORT` | string | — | Порт брокера |
|
||
| `RABBITMQ_USER` | string | — | Пользователь |
|
||
| `RABBITMQ_PASS` | string | — | Пароль |
|
||
| `RABBITMQ_VHOST` | string | — | Виртуальный хост |
|
||
| `RABBITMQ_USE_SSL` | bool | — | Использовать TLS |
|
||
| `RABBITMQ_CERTIFICATE` | string | — | TLS-сертификат |
|
||
| `RABBITMQ_CREATE_EXCHANGE` | string | — | Exchange для отправки задач на запуск |
|
||
| `RABBITMQ_CANCEL_EXCHANGE` | string | — | Exchange для отмены задач |
|
||
| `RABBITMQ_CREATE_ROUTING_KEY` | string | — | Routing key для запуска |
|
||
| `RABBITMQ_CANCEL_TOPIC` | string | — | Topic/ключ отмены |
|
||
| `RABBITMQ_COMPLETENESS_EXCHANGE` | string | — | Exchange для получения результатов выполнения |
|
||
| `RABBITMQ_COMPLETENESS_TOPIC` | string | — | Topic результатов выполнения |
|
||
|
||
> Примечание: в `config.env` присутствуют также `RABBITMQ_CREATE_TOPIC` — переменной `RABBITMQ_CREATE_TOPIC` в коде нет (в структуре есть только `CreateRoutingKey`).
|
||
|
||
### Исполнители и воркеры (`Executor`)
|
||
|
||
| Переменная | Тип | Значение по умолчанию | Назначение |
|
||
| --- | --- | --- | --- |
|
||
| `COUNT_RUNNING_WORKERS` | int | — (0) | Кол-во воркеров запуска задач |
|
||
| `COUNT_CANCELING_WORKERS` | int | — (0) | Кол-во воркеров отмены задач |
|
||
| `COUNT_HANDLE_JOB_WORKERS` | int | — (0) | Кол-во воркеров обработки Job'ов |
|
||
| `ENABLE_AMQP_EXECUTOR` | bool | `false` | Включить AMQP-исполнитель (RabbitMQ) |
|
||
| `ENABLE_KUBERNETES_EXECUTOR` | bool | `true` | Включить Kubernetes-исполнитель |
|
||
|
||
### Kubernetes (`Kubernetes`)
|
||
|
||
| Переменная | Тип | Значение по умолчанию | Назначение |
|
||
| --- | --- | --- | --- |
|
||
| `JOBS_NAMESPACE` | string | — | Namespace, в котором создаются Job'ы задач |
|
||
| `KUBE_CONFIG` | string | — | Путь к kubeconfig. Если **пусто** — используется in-cluster конфигурация; если задан — out-of-cluster |
|
||
| `KUBE_CONTEXT` | string | — | Контекст kubeconfig (для out-of-cluster) |
|
||
| `KUBE_ADDR` | string | — | Адрес API-сервера кластера (для out-of-cluster; используется с `InsecureSkipTLSVerify`) |
|
||
|
||
### Ресурсы и планирование подов (`Resources`)
|
||
|
||
Управляют NodeSelector/Tolerations/requests для запускаемых Job'ов в зависимости от `service_requests` задачи (см. `README.md`).
|
||
|
||
| Переменная | Тип | Значение по умолчанию | Назначение |
|
||
| --- | --- | --- | --- |
|
||
| `CPU_COUNT` | int | — | CPU requests для `high-resources`/`persistent` |
|
||
| `MEMORY_GI` | int | — | Memory (Gi) requests для `high-resources`/`persistent` |
|
||
| `CPU_COUNT_LOW_RESOURCES` | int | — | CPU для `low-resources` |
|
||
| `MEMORY_GI_LOW_RESOURCES` | int | — | Memory (Gi) для `low-resources` |
|
||
| `CPU_COUNT_HIGH_MEM` | int | — | CPU для `super-high-resources` |
|
||
| `MEMORY_GI_HIGH_MEM` | int | — | Memory (Gi) для `super-high-resources` |
|
||
| `ENABLE_TOLERATION` | bool | — | Включить набор сервисов ресурсов (toleration/nodeselector) |
|
||
| `TOLERATION_KEY` | string | — | Ключ toleration/nodeselector для high/low ресурсов |
|
||
| `TOLERATION_VALUE` | string | — | Значение toleration/nodeselector для high/low ресурсов |
|
||
| `TOLERATION_KEY_HIGH_MEM` | string | — | Ключ toleration для `super-high-resources` |
|
||
| `TOLERATION_VALUE_HIGH_MEM` | string | — | Значение toleration для `super-high-resources` |
|
||
| `TOLERATION_KEY_PERSISTENT` | string | — | Ключ toleration для `persistent` |
|
||
| `TOLERATION_VALUE_PERSISTENT` | string | — | Значение toleration для `persistent` |
|
||
| `DJANGO_BASIC_AUTH` | string | — | Базовая авторизация Django (поле присутствует в конфиге, но не используется в бизнес-логике; в под задачи прокидывается хардкод-путь `DJANGO_BASIC_AUTH_PATH`) |
|
||
| `DEFAULT_TOLERATION_KEY` | string | — | Ключ toleration по умолчанию для всех подов |
|
||
| `DEFAULT_TOLERATION_VALUE` | string | — | Значение toleration по умолчанию |
|
||
| `DEFAULT_NODE_SELECTOR_KEY` | string | — | Ключ NodeSelector по умолчанию |
|
||
| `DEFAULT_NODE_SELECTOR_VALUE` | string | — | Значение NodeSelector по умолчанию |
|
||
| `DEFAULT_IMAGE_PULL_POLICY` | string | `always` | ImagePullPolicy для подов задач |
|
||
| `DEFAULT_CPU_REQUESTS` | string | `100m` | CPU requests по умолчанию |
|
||
| `DEFAULT_MEMORY_REQUESTS` | string | `64Mi` | Memory requests по умолчанию |
|
||
|
||
### Хранилища и внешние сервисы (`Storages`)
|
||
|
||
Флаги `ENABLE_*` включают соответствующий «сервис» (набор env/секретов/volume), который добавляется в под задачи в зависимости от `service_requests`. URL'ы прокидываются в поды mesh/pdm-сервисов.
|
||
|
||
| Переменная | Тип | Значение по умолчанию | Назначение |
|
||
| --- | --- | --- | --- |
|
||
| `S3_SERVICE_ACCOUNT` | string | — | Путь к service account JSON для S3 (в коде для подов путь по факту хардкодится) |
|
||
| `ENABLE_S3_STORAGE` | bool | — | Включить сервис `s3` |
|
||
| `ENABLE_S3V2_STORAGE` | bool | — | Включить сервис `s3v2` |
|
||
| `ENABLE_PDM_STORAGE` | bool | — | Включить сервис `pdm` |
|
||
| `ENABLE_URL_STORAGE` | bool | — | Включить сервис `url` |
|
||
| `ENABLE_LOCAL` | bool | — | Включить локальное хранилище |
|
||
| `ENABLE_BIM_API_DB` | bool | — | Включить сервис `bim_api_db` |
|
||
| `ENABLE_BIM_API_CH` | bool | — | Включить сервис `bim_api_ch` (ClickHouse) |
|
||
| `ENABLE_BIM_API_V2_DB` | bool | — | Включить сервисы `bim_api_v2_db` (+ db_2/3/4) |
|
||
| `ENABLE_PDM_API_DB` | bool | — | Включить сервис `pdm_api_db` |
|
||
| `ENABLE_COMPARISONS_API_DB` | bool | — | Включить сервис `comparison-api-db` |
|
||
| `ENABLE_ISSUE_API_DB` | bool | — | Включить сервис `issues-api-db` |
|
||
| `ENABLE_RESOURCES_API` | bool | — | Включить сервис `resources-api` |
|
||
| `ENABLE_MAIL_GUN` | bool | — | Включить сервис `mailgun` |
|
||
| `ENABLE_SMTP` | bool | — | Включить сервис `smtp` |
|
||
| `ENABLE_WORKSPACE_API_DB` | bool | — | Включить сервис `workspace_api_db` |
|
||
| `ENABLE_CROSS_SECTION_API_DB` | bool | — | Включить сервис `cross-section-api-db` |
|
||
| `BIM_API_DEBUG` | bool | — | Флаг debug для BIM API (также пробрасывается в под, см. ниже) |
|
||
| `COMPARISONS_API_DEBUG` | string | — | Флаг debug для Comparisons API (также пробрасывается в под) |
|
||
| `INTERNAL_PDM_URL` | string | — | Внутренний URL PDM |
|
||
| `EXTERNAL_PDM_URL` | string | — | Внешний URL PDM |
|
||
| `INTERNAL_FILESTREAM_URL` | string | — | Внутренний URL filestream |
|
||
| `EXTERNAL_FILESTREAM_URL` | string | — | Внешний URL filestream |
|
||
| `INTERNAL_REMARK_URL` | string | — | Внутренний URL remarks |
|
||
| `EXTERNAL_REMARK_URL` | string | — | Внешний URL remarks |
|
||
| `DJANGO_HOST` | string | — | URL Django-хоста (ЛК) |
|
||
| `INTERNAL_WORKSPACE_URL` | string | — | Внутренний URL workspaces |
|
||
| `EXTERNAL_WORKSPACE_URL` | string | — | Внешний URL workspaces |
|
||
|
||
### Пулинг (`Pooling`)
|
||
|
||
| Переменная | Тип | Значение по умолчанию | Назначение |
|
||
| --- | --- | --- | --- |
|
||
| `MAX_WORKFLOWS_LIMIT` | uint64 | — (0) | Лимит одновременно обрабатываемых workflow при выборке |
|
||
| `MAX_RUNNING_JOBS` | int64 | `200` | Максимум одновременно выполняющихся Job'ов |
|
||
|
||
### Workflow (`Workflows`)
|
||
|
||
| Переменная | Тип | Значение по умолчанию | Назначение |
|
||
| --- | --- | --- | --- |
|
||
| `DEFAULT_GET_SINCE_LAST_HOURS` | uint64 | `168` | Глубина выборки задач в часах (нужно для FIFO; 168 ч = 7 дней) |
|
||
| `WORKFLOW_PRIORITY` | enum (`default`/`high`/`low`) | `default` | Приоритет обрабатываемых workflow (задаёт «роль» инстанса) |
|
||
|
||
### Безопасность (`Security`)
|
||
|
||
| Переменная | Тип | Значение по умолчанию | Назначение |
|
||
| --- | --- | --- | --- |
|
||
| `ENABLE_RUNASUSER` | bool | `false` | Запускать контейнеры задач под фиксированным UID |
|
||
| `USER_RUNASUSER` | int64 | `1000` | UID для `runAsUser` |
|
||
|
||
### Переменные, читаемые через `os.Getenv` и пробрасываемые в под'ы задач
|
||
|
||
Эти переменные **не входят** в структуру `Config` и **не потребляются** самим engine. Они читаются напрямую в `pkg/kube_services/services.go` и добавляются как env в контейнер запускаемой задачи (Job), когда включён соответствующий `ENABLE_*`-флаг. Тип — всегда строка (передаётся «как есть»).
|
||
|
||
| Переменная | Куда прокидывается (условие) | Назначение |
|
||
| --- | --- | --- |
|
||
| `BIM_API_DB` | сервис `bim_api_db` (при `ENABLE_BIM_API_DB`) | Путь к JSON-конфигу БД BIM API |
|
||
| `BIM_API_DEBUG` | сервис `bim_api_db` | Флаг debug |
|
||
| `BIM_API_CH` | сервис `bim_api_ch` (при `ENABLE_BIM_API_CH`) | Путь к JSON-конфигу ClickHouse |
|
||
| `BIM_API_CH_DEBUG` | сервис `bim_api_ch` | Флаг debug |
|
||
| `BIM_API_V2_DB` | сервис `bim_api_v2_db` (при `ENABLE_BIM_API_V2_DB`) — в под прокидывается под именем `BIM_API_DB` | Путь к JSON-конфигу БД BIM API v2 |
|
||
| `BIM_API_V2_DEBUG` | сервис `bim_api_v2_db` | Флаг debug |
|
||
| `BIM_API_V2_DB_2` | сервис `bim_api_v2_db_2` — в под как `BIM_API_DB_2` | Путь к JSON-конфигу 2-й БД BIM v2 |
|
||
| `BIM_API_V2_DB_3` | сервис `bim_api_v2_db_3` — в под как `BIM_API_DB_3` | Путь к JSON-конфигу 3-й БД BIM v2 |
|
||
| `BIM_API_V2_DB_4` | сервис `bim_api_v2_db_4` — в под как `BIM_API_DB_4` | Путь к JSON-конфигу 4-й БД BIM v2 |
|
||
| `COMPARISONS_API_DB` | сервис `comparison-api-db` (при `ENABLE_COMPARISONS_API_DB`) | Путь к JSON-конфигу БД Comparisons |
|
||
| `COMPARISONS_API_DEBUG` | сервис `comparison-api-db` | Флаг debug |
|
||
| `ISSUE_API_DB` | сервис `issues-api-db` (при `ENABLE_ISSUE_API_DB`) | Путь к JSON-конфигу БД Issues |
|
||
| `ISSUE_API_DEBUG` | сервис `issues-api-db` | Флаг debug |
|
||
| `RESOURCES_API_INTERNAL_HOST` | сервис `resources-api` (при `ENABLE_RESOURCES_API`) | Внутренний хост Resources API |
|
||
| `SMTP` | сервис `smtp` (при `ENABLE_SMTP`) — в под как `SMTP_CONFIG_PATH` | Путь к JSON-конфигу SMTP |
|
||
| `PDM_API_DB` | сервис `pdm_api_db` (при `ENABLE_PDM_API_DB`) | Путь к JSON-конфигу БД PDM |
|
||
| `PDM_API_DEBUG` | сервис `pdm_api_db` | Флаг debug |
|
||
| `WORKSPACE_API_DB` | сервис `workspace_api_db` (при `ENABLE_WORKSPACE_API_DB`) | Путь к JSON-конфигу БД Workspace |
|
||
| `WORKSPACE_API_DEBUG` | сервис `workspace_api_db` | Флаг debug |
|
||
| `CROSS_SECTION_API_DB` | сервис `cross-section-api-db` (при `ENABLE_CROSS_SECTION_API_DB`) | Путь к JSON-конфигу БД Cross-section |
|
||
| `CROSS_SECTION_API_DEBUG` | сервис `cross-section-api-db` | Флаг debug |
|
||
| `WORKFLOWS_SENTRY_DSN` | сервис `Default` (всегда) | Sentry DSN для подов задач |
|
||
| `WORKFLOWS_SENTRY_DEBUG` | сервис `Default` (всегда) | Флаг debug Sentry |
|
||
| `ENVIRONMENT` | сервис `Default` (всегда) | Имя окружения для подов задач |
|
||
|
||
> Пути `BIM_API_V2_DB_2/3/4`, `MAILGUN`, `SMTP` и т.п. задаются в Helm-чарте (`.helm/values.yaml`) — в `config.env` присутствуют не все из них.
|
||
|
||
## Переменные инфраструктуры/сборки
|
||
|
||
| Переменная | Где | Назначение |
|
||
| --- | --- | --- |
|
||
| `CGO_ENABLED=0`, `GOOS=linux`, `GOARCH=amd64` | Dockerfile (build stage) | Статическая сборка бинаря под Linux/amd64 |
|
||
| `CI_COMMIT_SHORT_SHA` | `.gitlab-ci.yml` → build-arg | Прокидывается в сборку образа |
|
||
| `SERVICE_NAME=workflows-engine` | `.gitlab-ci.yml` | Имя сервиса/чарта в CI |
|
||
| `DOCKERFILE_PATH=Dockerfile` | `.gitlab-ci.yml` | Путь к Dockerfile |
|
||
| `BUILD_ARGS` | `.gitlab-ci.yml` | Аргументы сборки образа |
|
||
| `CI_TRIGGER_SOURCE=app` | `.gitlab-ci.yml` | Источник триггера пайплайна |
|
||
| `IMAGE_NAME`, `CI_COMMIT_SHA`, `CI_PROJECT_URL`, `CI_JOB_URL`, `CI_PROJECT_NAMESPACE` | `.gitlab-ci.yml` → `HELM_SET_ARGS` | Метаданные деплоя, пробрасываются в universal-chart |
|
||
|
||
Сборка/деплой наследуются из внешних CI-шаблонов проекта `generic/common-ci` (`universal-pipeline.yaml`, `common-security-scan.yaml`). Юнит-тесты: стадия `test`, образ `golang:1.20`, команда `make unit-tests`.
|
||
|
||
## Переменные из Helm-чарта
|
||
|
||
Чарт (`.helm/values.yaml`) построен на `universal-chart`; секреты монтируются как env (`secretEnvs`) и как volume'ы. Ниже — маппинг секретных env (общий для `backend` и `backend-high-priority`). Имя секрета зависит от окружения (`_default` / `stage` / `preprod` / `production`).
|
||
|
||
| Переменная | Секрет (secret_name) | Ключ (secret_key) |
|
||
| --- | --- | --- |
|
||
| `POSTGRES_ADDRESS` | `ya-pg-secret` (stage: `processing-postgresql-secret`) | `host` |
|
||
| `POSTGRES_PORT` | `ya-pg-secret` (stage: `processing-postgresql-secret`) | `port` |
|
||
| `POSTGRES_DB` | `ya-pg-secret` (stage: `processing-postgresql-secret`) | `database` |
|
||
| `POSTGRES_USER` | `ya-pg-secret` (stage: `processing-postgresql-secret`) | `username` |
|
||
| `POSTGRES_PASSWORD` | `ya-pg-secret` (stage: `processing-postgresql-secret`) | `password` |
|
||
| `RABBITMQ_USER` | `rabbitmq-secret` | `username` |
|
||
| `RABBITMQ_PASS` | `rabbitmq-secret` | `password` |
|
||
| `YC-PG-CERTIFICATE` | `yc-pg-certificate` (stage: `processing-postgresql-secret`) | `certificate` (stage: `ca.crt`, preprod/prod: `certificate`) |
|
||
|
||
Секреты, монтируемые как volume'ы (файлы JSON-конфигов внешних БД и т.п.):
|
||
|
||
| Volume / секрет | mountPath |
|
||
| --- | --- |
|
||
| `yc-s3` | `/etc/sarex/yc-s3` |
|
||
| `bim-api-db` | `/etc/sarex` |
|
||
| `bim-api-v2-db-2` | `/etc/sarex/second-bim-bd` |
|
||
| `bim-api-v2-db-3` | `/etc/sarex/third-bim-bd` |
|
||
| `bim-api-v2-db-4` | `/etc/sarex/fourth-bim-bd` |
|
||
| `comparison-api-db` | `/etc/comparisons` |
|
||
| `pdm-api-db` | `/etc/pdm` |
|
||
| `ws-api-db` | `/etc/ws` |
|
||
| `mailgun-secret` | `/etc/mailgun-secret` |
|
||
| `smtp-secret` | `/etc/smtp-secret` |
|
||
| `issues-api-db` | `/etc/issues` |
|
||
| `cross-section-api-db` | `/etc/cross_section` |
|
||
| `tmp-volume` (emptyDir) | `/tmp` |
|
||
|
||
Прочие значимые переменные окружения задаются в `.helm/values.yaml` секцией `envs` для каждого сервиса (значения зависят от окружения `_default/stage/preprod/production`) — в т.ч. пути к JSON-конфигам (`BIM_API_DB`, `PDM_API_DB`, …), URL'ы сервисов, `POD_NAME=$(K8S_POD_NAME)`, `WORKFLOW_PRIORITY` (`low` для `backend`, `high` для `backend-high-priority`). Также в чарте описан `meshConfig` (Istio) — включён только для production.
|
||
|
||
## Переменные в CI
|
||
|
||
Определяются в `workflow.rules` файла `.gitlab-ci.yml` по ветке/тегу:
|
||
|
||
| Триггер | STAND | NAMESPACE | universal-chart env | CHART_VERSION | K8S_HUSTLER_BRANCH |
|
||
| --- | --- | --- | --- | --- | --- |
|
||
| ветка `stage` | `stage` | `platform` | `stage` | `0.0.1-stage` | `universal-chart-stage` |
|
||
| ветка `master` | `preprod` | `processing-preprod` | `preprod` | `0.0.1-preprod` | `universal-chart-preprod` |
|
||
| тег (`CI_COMMIT_TAG`) | `production` | `processing-prod` | `production` | `0.0.1-prod` | `universal-chart-production` |
|
||
| Merge Request | — (сборка образа выключена: `ENABLE_BUILD_IMAGE=false`) | — | — | — | — |
|
||
|
||
`RELEASE_NAME` во всех случаях — `workflows-engine`. Для каждого стенда деплоятся оба сервиса: `backend` и `backend-high-priority`.
|
||
|
||
## Замечания и потенциальные проблемы
|
||
|
||
1. **Нет HTTP REST API, но `API_ADDRESS` присутствует.** Переменная `API_ADDRESS=0.0.0.0:8080` есть в `config.env` и в Helm (`envs`), но **не читается ни одной строкой Go-кода**. Реальный HTTP-сервер — только `net/http/pprof` на `:8081` (`cmd/engine/main.go`). В Helm у сервисов `service.enabled: false`, liveness/readiness-пробы выключены. Переменную стоит либо удалить, либо реализовать сервер. По этой причине `openapi.yaml` для сервиса не создаётся.
|
||
2. **Дубликаты в `config.env`:**
|
||
- `ENABLE_BIM_API_V2_DB=1` указана дважды (строки 18 и 19);
|
||
- `JOBS_NAMESPACE` задаётся дважды с разными значениями: `processing-stage` и `processing-testing` — побеждает последнее;
|
||
- `POD_NAME` задаётся дважды: `fieldRef(v1:metadata.name)` и `workflows-backend-869584d795-b7p2b` — второе значение это «замороженное» имя конкретного пода, что явно ошибочно для шаблона.
|
||
3. **Хардкод локальных путей разработчика в `config.env`:**
|
||
- `S3_SERVICE_ACCOUNT=/Users/khannanov/sarex/yc-s3-service-account.json`;
|
||
- `KUBE_CONFIG=/Users/khannanov/.kube/config`.
|
||
Эти пути специфичны для машины конкретного разработчика и не должны попадать в общий конфиг (в Helm `S3_SERVICE_ACCOUNT` корректно указывает на `/etc/sarex/yc-s3/...`).
|
||
4. **Переменные из `config.env`/Helm, которые не читаются кодом `engine` вообще** (кандидаты на удаление либо потребляются исключительно другими компонентами): `API_ADDRESS`, `CONTROL_PLANE_PERIOD`, `ENABLE_GOOGLE_STORAGE`, `GOOGLE_STORAGE_BUCKET`, `GOOGLE_STORAGE_PROJECT`, `ENABLE_SRX_TMP`, `MAX_TASKS_IN_PERIOD`, `ENABLE_PDM_DB`, `POD_NAME`. Ни `Getenv`, ни struct-тега для них нет.
|
||
5. **`config.env` частично устарел относительно `config/config.go` и Helm.** Ряд переменных, реально используемых кодом/чартом, в `config.env` отсутствует (`WORKFLOW_PRIORITY`, `DEFAULT_TOLERATION_*`, `DEFAULT_NODE_SELECTOR_*`, `ENABLE_ISSUE_API_DB`, `ENABLE_RESOURCES_API`, `ENABLE_WORKSPACE_API_DB`, `ENABLE_CROSS_SECTION_API_DB`, `RESOURCES_API_INTERNAL_HOST`, `WORKFLOWS_SENTRY_DSN`, пути `*_API_DB` для issues/ws/cross_section и т.д.). Источником истины следует считать `config/config.go` + `.helm/values.yaml`, а не `config.env`.
|
||
6. **Расхождение `env-default` и реальных значений.** У ряда флагов (`ENABLE_S3_STORAGE`, `ENABLE_TOLERATION`, `CPU_COUNT`, воркеры и др.) в коде нет `env-default`, поэтому при отсутствии переменной поле останется нулевым (`0`/`false`/`""`) — сервис молча стартует с «пустой» конфигурацией планирования. Значения обязательно должны задаваться через окружение (Helm).
|
||
7. **`DJANGO_BASIC_AUTH` / `COMPARISONS_API_DEBUG` / `BIM_API_DEBUG`** объявлены в структуре конфига, но фактически в бизнес-логике engine не задействованы (debug-флаги повторно читаются через `os.Getenv` и прокидываются в поды; `DJANGO_BASIC_AUTH` не используется — в под задачи попадает хардкод-путь `DJANGO_BASIC_AUTH_PATH=/etc/sarex/django-auth.json`).
|
||
8. **`RABBITMQ_CREATE_TOPIC`** присутствует в `config.env`, но в конфиге RabbitMQ такого поля нет (используется `RABBITMQ_CREATE_ROUTING_KEY`) — переменная не читается.
|
||
|
||
## Минимальный набор для локального запуска
|
||
|
||
Для локального старта достаточно поднять PostgreSQL и указать доступ к нему; исполнители и внешние интеграции можно выключить.
|
||
|
||
```env
|
||
# Логирование
|
||
LOG_LEVEL=debug
|
||
|
||
# PostgreSQL (обязательно — engine сразу подключается к БД)
|
||
POSTGRES_ADDRESS=localhost
|
||
POSTGRES_PORT=5432
|
||
POSTGRES_DB=processing_db
|
||
POSTGRES_USER=user
|
||
POSTGRES_PASSWORD=password
|
||
POSTGRES_POOL_SIZE=5
|
||
POSTGRES_SSL_USE=false
|
||
ENABLE_SQL_QUERY=true
|
||
|
||
# Исполнители: выключаем AMQP; для Kubernetes нужен доступ к кластеру
|
||
ENABLE_AMQP_EXECUTOR=0
|
||
ENABLE_KUBERNETES_EXECUTOR=1
|
||
KUBE_CONFIG=/path/to/your/.kube/config # если пусто — используется in-cluster
|
||
KUBE_CONTEXT=your-context
|
||
JOBS_NAMESPACE=processing-testing
|
||
|
||
# Воркеры
|
||
COUNT_RUNNING_WORKERS=1
|
||
COUNT_CANCELING_WORKERS=1
|
||
COUNT_HANDLE_JOB_WORKERS=1
|
||
|
||
# Пулинг / выборка
|
||
MAX_WORKFLOWS_LIMIT=10
|
||
MAX_RUNNING_JOBS=10
|
||
DEFAULT_GET_SINCE_LAST_HOURS=168
|
||
WORKFLOW_PRIORITY=default
|
||
|
||
# Дефолты планирования подов (иначе будут пустыми)
|
||
DEFAULT_IMAGE_PULL_POLICY=IfNotPresent
|
||
DEFAULT_CPU_REQUESTS=100m
|
||
DEFAULT_MEMORY_REQUESTS=64Mi
|
||
|
||
# Хранилища/внешние БД можно отключить для минимального запуска
|
||
ENABLE_S3_STORAGE=0
|
||
ENABLE_S3V2_STORAGE=0
|
||
ENABLE_PDM_STORAGE=0
|
||
ENABLE_URL_STORAGE=0
|
||
ENABLE_LOCAL=0
|
||
ENABLE_BIM_API_DB=0
|
||
ENABLE_BIM_API_CH=0
|
||
ENABLE_BIM_API_V2_DB=0
|
||
ENABLE_PDM_API_DB=0
|
||
ENABLE_COMPARISONS_API_DB=0
|
||
ENABLE_ISSUE_API_DB=0
|
||
ENABLE_RESOURCES_API=0
|
||
ENABLE_MAIL_GUN=0
|
||
ENABLE_SMTP=0
|
||
ENABLE_WORKSPACE_API_DB=0
|
||
ENABLE_CROSS_SECTION_API_DB=0
|
||
ENABLE_TOLERATION=0
|
||
```
|
||
|
||
Запуск: `go run ./cmd/engine`. Если Kubernetes-исполнитель не нужен вовсе — установите `ENABLE_KUBERNETES_EXECUTOR=0` (тогда `KUBE_*`/`JOBS_NAMESPACE` не требуются), но учтите, что без единого включённого исполнителя сервис не будет запускать задачи. Профилирование доступно на `http://localhost:8081/debug/pprof/`.
|