16 KiB
Конфигурация workspaces-api
Документ описывает все переменные окружения и способы конфигурирования сервиса workspaces-api (репозиторий pdm/workspaces-api) и его развёртывания из этого infra-репозитория (iac/apps/workspaces).
workspaces-api — HTTP-сервис (cmd/api), хранит рабочие пространства (workspaces) и приложения (apps) в PostgreSQL, обращается к сервису documentation и к bundle-сервису. Вместе с ним из одного образа собираются утилиты миграций (cmd/migrations) и CLI (cmd/workspaces-cli).
Способы конфигурирования
Сервис настраивается только через переменные окружения. Разбор выполняется в config/config.go через библиотеку envconfig (функция config.FromEnv() → envconfig.Process). Отдельного конфиг-файла (yaml/toml) у приложения нет.
В отличие от env-required-подхода, envconfig здесь не помечает переменные обязательными — при отсутствии значения FromEnv() не завершает процесс, поле остаётся нулевым. Поэтому «обязательность» переменных БД/documentation фактическая, а не форсированная кодом: без них сервис стартует, но работать не будет.
Источники переменных по способам запуска:
| Способ запуска | Откуда берутся переменные |
|---|---|
| Локально (docker-compose + бинарник) | Файл .env в корне репозитория. docker-compose.yml (env_file: .env) поднимает только контейнер Postgres (postgres:13); сам API-сервис в compose закомментирован и запускается бинарником. Makefile (make docker) прокидывает .env в docker-compose |
| Kubernetes — собственный Helm-чарт репозитория | .helm/values.yaml (universal-chart): блоки envs (обычные значения по окружениям _default/stage/preprod/production) и secretEnvs (значения из k8s-секретов). Деплой запускается пайплайнами generic/common-ci |
Kubernetes — этот infra-репозиторий (iac/apps/workspaces) |
base/ — kustomize-манифесты с инъекцией секретов через HashiCorp Vault (annotations vault.hashicorp.com/*), обычные переменные заданы инлайн в env:. Оверлеи: yc-k8s-test (base + postgresql через Flux), brusnika-stage и brusnika-prod (Flux HelmRelease на universal-chart, блоки envs/secretEnvs) |
| CI/CD (GitLab) | .gitlab-ci.yml подключает шаблоны generic/common-ci (universal-pipeline.yaml); в workflow.rules задаются переменные пайплайна (STAND, NAMESPACE, RELEASE_NAME, CHART_NAME, CHART_VERSION, HELM_SET_ARGS и т.п.), а также build-args образа |
Миграции БД. Отдельного env-флага для миграций нет: порядок запуска задаёт entrypoint.sh — сначала выполняется /migrations migrate, затем стартует /api. Утилита миграций читает тот же конфиг (config/config.go) и использует ENABLE_SSL/YC-PG-CERTIFICATE для TLS-подключения к БД (cmd/migrations/main.go). В kustomize-/Helm-манифестах миграции запускаются той же командой в args/command контейнера (set -e; /migrations migrate; exec /api).
Переменные приложения (config.Config)
Читаются структурой config.Config (config/config.go). Тип bool в envconfig принимает 1/0, true/false, t/f.
HTTP-сервер
| Переменная | Тип | По умолчанию | Назначение |
|---|---|---|---|
API_ADDRESS |
string | — | Адрес прослушивания HTTP-сервера (host:port), напр. 0.0.0.0:8000. Эндпоинт /ping — liveness/readiness |
PostgreSQL
| Переменная | Тип | По умолчанию | Назначение |
|---|---|---|---|
POSTGRES_ADDRESS |
string | — | Хост PostgreSQL |
POSTGRES_PORT |
string | — | Порт PostgreSQL |
POSTGRES_DB |
string | — | Имя базы данных |
POSTGRES_USER |
string | — | Пользователь БД |
POSTGRES_PASSWORD |
string | — | Пароль пользователя БД |
POSTGRES_POOL_SIZE |
int | 0 |
Размер пула соединений к БД |
ENABLE_SQL_QUERY |
bool | false |
Логировать SQL-запросы (query-hook в go-pg) |
ENABLE_SSL |
bool | false |
Подключаться к PostgreSQL по TLS с проверкой по YC-PG-CERTIFICATE; читается и в api, и в миграциях |
YC-PG-CERTIFICATE |
string | — | Содержимое (PEM) CA-сертификата PostgreSQL; используется при ENABLE_SSL=1 (cmd/api/main.go, cmd/migrations/main.go) |
Сервис documentation
| Переменная | Тип | По умолчанию | Назначение |
|---|---|---|---|
DOCUMENTATION_HOST |
string | — | Базовый URL сервиса documentation |
DOCUMENTATION_ORIGINATOR |
string | — | Идентификатор источника, передаваемый в сервис documentation |
DOCUMENTATION_LOGGER_FEATURE |
bool | false |
Включает фичу логирования обращений к сервису documentation |
Bundles
| Переменная | Тип | По умолчанию | Назначение |
|---|---|---|---|
BUNDLES_RETRY_COUNT |
int | 3 |
Кол-во ретраев клиента bundles; при значении <= 0 в FromEnv() принудительно берётся 3 |
BUNDLES_NJOBS |
int | 3 |
Кол-во параллельных задач при работе с bundles; при значении <= 0 берётся 3 |
Sentry
| Переменная | Тип | По умолчанию | Назначение |
|---|---|---|---|
SENTRY_DSN |
string | — | DSN для отправки ошибок в Sentry |
SENTRY_DEBUG |
bool | false |
Debug-режим Sentry |
ENVIRONMENT |
string | — | Имя окружения (передаётся в Sentry как environment) |
Трейсинг (OpenTelemetry)
| Переменная | Тип | По умолчанию | Назначение |
|---|---|---|---|
TRACER_USE |
bool | false |
Включает OpenTelemetry-трейсинг и otel-логгер |
TRACER_HOST |
string | localhost:4317 |
Адрес OTLP-коллектора |
TRACER_USE_INSECURE |
bool | true |
Небезопасное (без TLS) подключение к коллектору |
SERVICE_NAME |
string | workspaces |
Имя сервиса в трейсах |
TRACER_LOGGER_NAME |
string | tracer_logger |
Имя otel-логгера |
Дефолты
TRACER_*иSERVICE_NAMEзаданы прямо в тегахdefault:"..."структурыconfig.Config; остальные поля дефолтов не имеют (нулевое значение типа).
Инфраструктурные, сборочные и вспомогательные переменные
Не читаются основным кодом приложения (config.Config), но участвуют в запуске/сборке/деплое.
| Переменная | Где используется | Назначение |
|---|---|---|
POSTGRES_EXTERNAL_PORT |
.env, docker-compose.yml |
Внешний порт проброса контейнера Postgres |
API_PORT |
.env, docker-compose.yml (закомментированный сервис api) |
Порт API при локальном запуске в контейнере |
FAKE_API_ADDRESS |
fake_bundle_api/main.go (envconfig) |
Адрес фейкового bundle-API для локальной разработки/тестов; читается отдельной утилитой, не основным сервисом |
GITLAB_CREDENTIALS |
api.Dockerfile (build-arg) |
Креды https://<user>:<token>@gitlab.sarex.io для доступа к приватным Go-модулям при сборке |
CI_COMMIT_SHORT_SHA |
api.Dockerfile (build-arg) → APP_VERSION |
Хэш коммита, прокидываемый в сборку make api |
APP_VERSION |
Makefile (make api) |
Версия приложения при сборке (значение — из CI_COMMIT_SHORT_SHA) |
NAMESPACE |
.helm/values.yaml, base/*.yaml, brusnika-оверлеи |
Задаётся в манифестах, но кодом приложения не читается |
INTERNAL_PATH |
.helm/values.yaml |
Задаётся в чарте, но кодом приложения не читается |
DJANGO_HOST, DJANGO_ORIGINATOR |
base/backend-deployment.yaml, brusnika-оверлеи |
Заданы в манифестах, но config.Config их не читает (в текущем коде полей Django нет) |
DJANGO_BASIC_AUTH |
base/backend-deployment.yaml (Vault), brusnika secretEnvs |
Инъектируется из секрета, но config.Config его не читает |
Деплой из этого репозитория (iac/apps/workspaces)
Здесь используется kustomize (base/ + оверлеи), а не собственный Helm-чарт сервиса. Секреты БД и Django инъектируются агентом Vault и подгружаются в окружение процесса до старта (set -a; . /vault/secrets/...; exec /api).
base/
backend-deployment.yaml(api, namespaceworkspaces) — обычные переменные заданы инлайн вenv:(POSTGRES_POOL_SIZE,BUNDLES_*,API_ADDRESS,NAMESPACE,ENABLE_SQL_QUERY,ENABLE_SSL,DOCUMENTATION_*,ENVIRONMENT,DJANGO_HOST,DJANGO_ORIGINATOR). Vault-шаблоны формируют файл/vault/secrets/workspaces-dbсPOSTGRES_ADDRESS/PORT/DB/USER/PASSWORD(изsecrets/data/postgresql/apps/workspaces) и/vault/secrets/workspaces-django-authсDJANGO_BASIC_AUTH(изsecrets/data/vault/common/django_auth). Контейнер стартует черезcommand: /bin/sh -ec+args, который подгружает эти файлы (set -a; . /vault/secrets/...) иexec /api. Vault-роль —workspaces, ServiceAccount —workspaces-vault. Namespace размеченistio-injection: enabled.frontend-deployment.yaml(frontend, образworkspaces-v2-frontend) иfrontend-service.yaml— статический фронтенд, переменных окружения не имеет.backend-service.yaml(backend-svc,:80 → 8000),namespace.yaml,serviceaccount.yaml.kustomization.yamlсобирает namespace, serviceaccount, backend/frontend deployments и services (namespaceworkspaces).
Оверлеи
yc-k8s-test—../base+postgresql.yaml(FluxHelmReleasepostgresql-contour: БДworkspaces_db, пользовательworkspaces, расширениеuuid-ossp, восстановление из дампа, интеграция с Vault). Патчreplicas.yaml(replicas: 1дляworkspaces-api).brusnika-stageиbrusnika-prod— FluxHelmReleaseнаuniversal-chart(0.1.7) для api и фронтенда. Переменные — вenvs, секреты — вsecretEnvs(postgres-secret→POSTGRES_USER/POSTGRES_PASSWORD,django-auth→DJANGO_BASIC_AUTH). Отличаются значениямиPOSTGRES_ADDRESSиDOCUMENTATION_HOST(stage:192.168.2.45/https://test.sarex.brusnika.tech/documentations; prod:postgres-service/https://cde.brusnika.ru/documentations). Api-под запускает/migrations migrateперед/apiвargs.
JWT-ключи
RSA-ключи для JWT лежат в .pub_keys/ (prod.rsa.pub, stage.rsa.pub, test.rsa*) и при сборке образа копируются в /etc/sarex/keys (см. api.Dockerfile). Пути к ключам передаются в код работы с токенами как аргументы; отдельной переменной окружения для пути к ключам в текущем коде нет.
Замечания и потенциальные проблемы
- Опечатка в
.env: переменная названаPOSTGRES_POLL_SIZE, тогда как код читаетPOSTGRES_POOL_SIZE. При локальном запуске из.envразмер пула не применится и останется0. env-requiredне используется: отсутствие обязательных значений (БД, documentation) не приводит к ошибкеFromEnv()— процесс стартует с пустыми полями и падает позже при обращении к БД/сервисам.- Django-переменные не читаются кодом:
DJANGO_HOST,DJANGO_ORIGINATOR,DJANGO_BASIC_AUTHзаданы в манифестахiac(base + brusnika-оверлеи), но вconfig.Configсоответствующих полей нет — значения игнорируются приложением. NAMESPACEиINTERNAL_PATHзадаются в манифестах/чарте, но кодом приложения не читаются.- Имя переменной
YC-PG-CERTIFICATEсодержит дефисы — envconfig сопоставляет её по точному совпадению тега. - Расхождение секретов между источниками деплоя: в
.helm/values.yamlsecretEnvs.POSTGRES_PORT._default.secretNameуказан какa-pg-secret(похоже на опечатку отya-pg-secret); ключи секрета БД различаются между окружениями (workspaces-postgresql-secretс ключамиusername/ca.crtvsya-pg-secret/yc-pg-certificate). В kustomize (base/) те же значения приходят из Vault, а не из k8s-секретов. - Порты различаются по окружениям: локально/
_default—8000, в preprod/production Helm-чарта —8080(см.API_ADDRESSи probes).
Минимальный набор для локального запуска
Postgres — через docker-compose, api — бинарником (миграции применяются entrypoint.sh/вручную перед стартом):
API_ADDRESS(напр.0.0.0.0:6666)POSTGRES_ADDRESS,POSTGRES_PORT,POSTGRES_DB,POSTGRES_USER,POSTGRES_PASSWORDDOCUMENTATION_HOST,DOCUMENTATION_ORIGINATORENVIRONMENT(напр.local)- при необходимости —
ENABLE_SQL_QUERY,SENTRY_DSN,ENABLE_SSL(+YC-PG-CERTIFICATE),TRACER_*
См. пример значений в .env / .env.example.