12 KiB
Runtime Config
1. Назначение документа
Этот документ фиксирует конфигурацию окружения, storage и базовые operational assumptions для MVP.
Его задача - убрать неявные решения, которые обычно всплывают уже в процессе написания кода.
2. Базовые решения для MVP
- каноническая БД:
PostgreSQL - локальная разработка и тесты используют ту же
PostgreSQL-модель хранения - artifact storage: локальная файловая система
- MCP transport:
Streamable HTTP - admin API и mcp-server запускаются как отдельные приложения
3. Artifact storage
В MVP sample JSON, .proto, descriptor set и YAML import payload должны храниться в локальном файловом storage.
Требования:
- все файлы кладутся в контролируемый базовый каталог;
- в БД хранится только
storage_ref; - структура каталогов должна быть детерминированной;
- storage слой должен быть абстрагирован, чтобы потом заменить его на S3-compatible backend.
Рекомендуемая структура:
var/crank/
samples/
descriptors/
yaml-imports/
4. Секреты и auth profiles
Для целевой модели:
- operation хранит только
auth_profile_ref; AuthProfileхранит только ссылки наsecret_id;- plaintext секреты не должны попадать в YAML export;
- plaintext секреты не должны логироваться;
- runtime получает секрет только на короткое время перед upstream вызовом.
Стартовая реализация:
PostgreSQL-backed secret store;ciphertextхранится в БД;- шифрование выполняется через
CRANK_MASTER_KEY; - ключ шифрования приходит только из env.
5. Переменные окружения
Минимально ожидаются:
POSTGRES_HOSTPOSTGRES_PORTPOSTGRES_DBPOSTGRES_USERPOSTGRES_PASSWORDPOSTGRES_MAX_CONNECTIONSPOSTGRES_MIN_CONNECTIONSPOSTGRES_ACQUIRE_TIMEOUT_MSPOSTGRES_IDLE_TIMEOUT_MSPOSTGRES_MAX_LIFETIME_MSCRANK_ADMIN_API_IMAGECRANK_MCP_SERVER_IMAGECRANK_UI_IMAGECRANK_STORAGE_ROOTCRANK_PUBLISH_BINDCRANK_ADMIN_BINDCRANK_ADMIN_RATE_LIMIT_RPSCRANK_ADMIN_RATE_LIMIT_BURSTCRANK_MCP_BINDCRANK_MCP_REFRESH_MSCRANK_MCP_RATE_LIMIT_RPSCRANK_MCP_RATE_LIMIT_BURSTCRANK_RUNTIME_MAX_CONCURRENT_UNARYCRANK_RUNTIME_MAX_CONCURRENT_WINDOWCRANK_RUNTIME_MAX_CONCURRENT_SESSIONSCRANK_RUNTIME_MAX_CONCURRENT_JOBSCRANK_LOG_LEVELCRANK_MASTER_KEYCRANK_BASE_URL
Опционально:
CRANK_ADMIN_TOKENCRANK_DEMO_SEEDCRANK_CACHE_BACKENDCRANK_CACHE_URLCRANK_CACHE_DEFAULT_TTL_MS
Стартовое значение для refresh published tools:
CRANK_ADMIN_RATE_LIMIT_RPS=30CRANK_ADMIN_RATE_LIMIT_BURST=60CRANK_MCP_REFRESH_MS=5000CRANK_MCP_RATE_LIMIT_RPS=60CRANK_MCP_RATE_LIMIT_BURST=120
Стартовые значения для runtime concurrency limits:
CRANK_RUNTIME_MAX_CONCURRENT_UNARY=64CRANK_RUNTIME_MAX_CONCURRENT_WINDOW=16CRANK_RUNTIME_MAX_CONCURRENT_SESSIONS=16CRANK_RUNTIME_MAX_CONCURRENT_JOBS=16
6. Логирование и трассировка
Для MVP нужно использовать:
- structured logging через
tracing; - correlation id для test runs и runtime execution;
- раздельные стадии ошибок: schema, mapping, adapter, external service.
7. Таймауты и retries
Рекомендуемые стартовые значения:
- default timeout:
10s - retry default:
1attempt, то есть без автоматического повтора
Причина:
- сначала важнее детерминированность и прозрачность;
- aggressive retries могут маскировать реальные ошибки интеграции.
8. Режимы запуска
Минимально нужны два режима:
- local development
- demo/deployment
Local development:
- локальное окружение должно иметь доступ к
PostgreSQL; - локальный storage;
- app-level auth и bootstrap admin user через
.env. - при необходимости UI можно наполнить живыми demo-данными через
CRANK_DEMO_SEED=true.
Demo/deployment:
PostgreSQL;- локальный или сетевой storage;
- включенная app-level auth-защита admin-api;
- стабильный
Streamable HTTPendpoint для MCP. - containerized runtime через
Dockerиdocker-compose. - optional shared cache layer через
Valkey/Redis. - registry-backed image rollout через Gitea Container Registry или совместимый registry.
Cache env
Для optional cache/coordination layer должны быть предусмотрены:
CRANK_CACHE_BACKENDCRANK_CACHE_URLCRANK_CACHE_DEFAULT_TTL_MS
Рекомендуемая модель:
CRANK_CACHE_BACKEND=memoryпо умолчанию;CRANK_CACHE_BACKEND=valkeyилиredisпри наличии внешнего cache store;- без этих переменных система должна оставаться полностью работоспособной.
Cache boundaries
В платформе должны существовать два разных cache-контура:
platform / coordination cacheresponse cache
Первый контур хранит служебное краткоживущее состояние:
- ingress rate limiting;
- replay guard;
- ephemeral coordination state;
- shared snapshots published MCP catalogs between instances;
- будущие short-lived / one-time token helpers.
Второй контур хранит только кэшируемые ответы операций.
Текущий безопасный runtime scope для response cache:
REST GET;GraphQL query.gRPC unaryтолько приGrpcTarget.read_only = true.
Это не означает автоматическое кэширование всех protocol families. Следующим кандидатом на расширение может быть только следующий отдельно обоснованный protocol path, а не "cache everything".
Эти контуры не должны смешивать ключи друг с другом.
Cache key isolation
Базовое правило изоляции:
- разные
workspaceне должны делить одни и те же cache keys; - разные
agentвнутри одногоworkspaceтоже не должны делить одни и те же response cache keys по умолчанию; - разные
operationвнутри одногоagentне должны попадать в общий response cache namespace.
Стартовая модель namespace для response cache:
workspace + agent + operation + operation version + request fingerprint
Стартовая модель namespace для platform / coordination cache:
workspace + agent + cache scope + logical key
Это позволяет безопасно использовать один внешний Valkey/Redis сразу для нескольких агентов и рабочих областей без взаимного пересечения данных.
Auth env
Для app-level auth нужны:
CRANK_SESSION_SECRETCRANK_PASSWORD_PEPPERCRANK_BOOTSTRAP_ADMIN_EMAILCRANK_BOOTSTRAP_ADMIN_PASSWORDCRANK_BOOTSTRAP_ADMIN_DISPLAY_NAME
Для secret store foundation нужен:
CRANK_MASTER_KEY
CRANK_MASTER_KEY обязателен и для admin-api, и для mcp-server, потому что оба приложения
должны уметь резолвить secret_id в runtime.
Для опционального demo-seed:
CRANK_DEMO_SEED=true
В deployment workflow больше не используется монолитный DEPLOY_ENV_FILE.
.env на сервере собирается из OpenBao. В Gitea Actions хранятся только bootstrap credentials
BAO_ADDR, BAO_TOKEN и BAO_SECRET_PATH, а внутри OpenBao ключи совпадают с именами
runtime env-переменных. Это значит, что:
CRANK_MASTER_KEYхранится в OpenBao как ключCRANK_MASTER_KEY;CRANK_DEMO_SEEDхранится в OpenBao как ключCRANK_DEMO_SEED;- и так же для остальных runtime-переменных.
Для БД основной runtime-контракт теперь компонентный:
POSTGRES_HOSTPOSTGRES_PORTPOSTGRES_DBPOSTGRES_USERPOSTGRES_PASSWORDPOSTGRES_MAX_CONNECTIONSPOSTGRES_MIN_CONNECTIONSPOSTGRES_ACQUIRE_TIMEOUT_MSPOSTGRES_IDLE_TIMEOUT_MSPOSTGRES_MAX_LIFETIME_MS
Для pool behavior используются явные defaults:
POSTGRES_MAX_CONNECTIONS=20POSTGRES_MIN_CONNECTIONS=2POSTGRES_ACQUIRE_TIMEOUT_MS=5000POSTGRES_IDLE_TIMEOUT_MS=600000POSTGRES_MAX_LIFETIME_MS=1800000
Для runtime concurrency используются явные defaults:
CRANK_RUNTIME_MAX_CONCURRENT_UNARY=64CRANK_RUNTIME_MAX_CONCURRENT_WINDOW=16CRANK_RUNTIME_MAX_CONCURRENT_SESSIONS=16CRANK_RUNTIME_MAX_CONCURRENT_JOBS=16
Для MCP transport ingress throttling используются явные defaults:
CRANK_MCP_RATE_LIMIT_RPS=60CRANK_MCP_RATE_LIMIT_BURST=120
Для admin-api ingress throttling используются явные defaults:
CRANK_ADMIN_RATE_LIMIT_RPS=30CRANK_ADMIN_RATE_LIMIT_BURST=60
CRANK_DATABASE_URL допускается только как backward-compatible fallback для локальных тестов и
переходного периода, но не как основная deployment-модель.
8.1. Delivery artifacts
Для production-like запуска проект должен поставляться с:
Dockerfileдля backend приложений;deploy/community/docker-compose.ymlкак canonical Community deployment manifest;deploy/community/.env.exampleкак canonical Community env template;- optional
Valkeyservice как рекомендованный, но не обязательный компонент Community deployment; - root
docker-compose.ymlи root.env.exampleтолько как local development convenience files; - healthcheck endpoints;
- reverse proxy configuration examples.
Подробности вынесены в docs/deployment.md.
9. Что важно не допустить
- пути к storage, зашитые в код;
- секреты в
.yamlexports; - разные конфигурационные модели для local и production без причины;
- смешивание runtime config и business config operation.
10. Практический итог
До старта разработки должны быть приняты как минимум такие решения:
- где лежит БД;
- где лежат artifacts;
- как резолвятся
secret_idи как ротируетсяCRANK_MASTER_KEY; - на каких bind-address запускаются
admin-apiиmcp-server; - какой transport использует MCP server.