Files
crank/docs/schemas/runtime-config.schema.json
T

1025 lines
27 KiB
JSON

{
"schema_version": 1,
"generated_by": "crank-config",
"fields": [
{
"semantic_path": "database.url",
"env_name": "CRANK_DATABASE_URL",
"process": "shared",
"value_type": "url",
"unit": null,
"default": null,
"required": false,
"minimum": null,
"maximum": null,
"sensitivity": "secret",
"mode": "effective",
"compatibility": "legacy URL form",
"rules": [
"takes precedence over generated default-valued POSTGRES_HOST/PORT/DB/USER/PASSWORD",
"conflicts with any non-default decomposed database value"
]
},
{
"semantic_path": "database.host",
"env_name": "POSTGRES_HOST",
"process": "shared",
"value_type": "string",
"unit": null,
"default": "postgres",
"required": false,
"minimum": null,
"maximum": null,
"sensitivity": "internal",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "database.port",
"env_name": "POSTGRES_PORT",
"process": "shared",
"value_type": "u16",
"unit": "port",
"default": "5432",
"required": false,
"minimum": 1,
"maximum": 65535,
"sensitivity": "public",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "database.name",
"env_name": "POSTGRES_DB",
"process": "shared",
"value_type": "string",
"unit": null,
"default": "crank",
"required": false,
"minimum": null,
"maximum": null,
"sensitivity": "internal",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "database.user",
"env_name": "POSTGRES_USER",
"process": "shared",
"value_type": "string",
"unit": null,
"default": "crank",
"required": false,
"minimum": null,
"maximum": null,
"sensitivity": "internal",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "database.password",
"env_name": "POSTGRES_PASSWORD",
"process": "shared",
"value_type": "secret",
"unit": null,
"default": "configured",
"required": false,
"minimum": null,
"maximum": null,
"sensitivity": "secret",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "database.pool.max_connections",
"env_name": "POSTGRES_MAX_CONNECTIONS",
"process": "shared",
"value_type": "u32",
"unit": "connections",
"default": "20",
"required": false,
"minimum": 1,
"maximum": 1024,
"sensitivity": "public",
"mode": "effective",
"compatibility": null,
"rules": [
"must be >= min_connections"
]
},
{
"semantic_path": "database.pool.min_connections",
"env_name": "POSTGRES_MIN_CONNECTIONS",
"process": "shared",
"value_type": "u32",
"unit": "connections",
"default": "2",
"required": false,
"minimum": 0,
"maximum": 1024,
"sensitivity": "public",
"mode": "effective",
"compatibility": null,
"rules": [
"must be <= max_connections"
]
},
{
"semantic_path": "database.pool.acquire_timeout_ms",
"env_name": "POSTGRES_ACQUIRE_TIMEOUT_MS",
"process": "shared",
"value_type": "u64",
"unit": "milliseconds",
"default": "5000",
"required": false,
"minimum": 1,
"maximum": 300000,
"sensitivity": "public",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "database.pool.idle_timeout_ms",
"env_name": "POSTGRES_IDLE_TIMEOUT_MS",
"process": "shared",
"value_type": "u64",
"unit": "milliseconds",
"default": "600000",
"required": false,
"minimum": 1000,
"maximum": 86400000,
"sensitivity": "public",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "database.pool.max_lifetime_ms",
"env_name": "POSTGRES_MAX_LIFETIME_MS",
"process": "shared",
"value_type": "u64",
"unit": "milliseconds",
"default": "1800000",
"required": false,
"minimum": 1000,
"maximum": 86400000,
"sensitivity": "public",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "runtime.master_key",
"env_name": "CRANK_MASTER_KEY",
"process": "shared",
"value_type": "secret",
"unit": null,
"default": null,
"required": true,
"minimum": 32,
"maximum": null,
"sensitivity": "secret",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "runtime.base_url",
"env_name": "CRANK_BASE_URL",
"process": "shared",
"value_type": "url",
"unit": null,
"default": null,
"required": false,
"minimum": null,
"maximum": null,
"sensitivity": "internal",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "runtime.max_concurrent_unary",
"env_name": "CRANK_RUNTIME_MAX_CONCURRENT_UNARY",
"process": "shared",
"value_type": "u32",
"unit": "requests",
"default": "64",
"required": false,
"minimum": 1,
"maximum": 65535,
"sensitivity": "public",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "cache.backend",
"env_name": "CRANK_CACHE_BACKEND",
"process": "shared",
"value_type": "enum",
"unit": null,
"default": "memory",
"required": false,
"minimum": null,
"maximum": null,
"sensitivity": "public",
"mode": "effective",
"compatibility": "redis value is deprecated in favor of valkey",
"rules": [
"external backend requires cache.url"
]
},
{
"semantic_path": "cache.url",
"env_name": "CRANK_CACHE_URL",
"process": "shared",
"value_type": "url",
"unit": null,
"default": null,
"required": false,
"minimum": null,
"maximum": null,
"sensitivity": "secret",
"mode": "effective",
"compatibility": null,
"rules": [
"forbidden with memory backend"
]
},
{
"semantic_path": "cache.default_ttl_ms",
"env_name": "CRANK_CACHE_DEFAULT_TTL_MS",
"process": "shared",
"value_type": "u64",
"unit": "milliseconds",
"default": null,
"required": false,
"minimum": 1,
"maximum": 86400000,
"sensitivity": "public",
"mode": "deprecated_no_effect",
"compatibility": null,
"rules": []
},
{
"semantic_path": "outbound.allowed_hosts",
"env_name": "CRANK_OUTBOUND_ALLOWED_HOSTS",
"process": "shared",
"value_type": "host_list",
"unit": null,
"default": "",
"required": false,
"minimum": null,
"maximum": null,
"sensitivity": "internal",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "outbound.denied_hosts",
"env_name": "CRANK_OUTBOUND_DENIED_HOSTS",
"process": "shared",
"value_type": "host_list",
"unit": null,
"default": "",
"required": false,
"minimum": null,
"maximum": null,
"sensitivity": "internal",
"mode": "effective",
"compatibility": null,
"rules": [
"deny entries override allow entries"
]
},
{
"semantic_path": "outbound.max_request_bytes",
"env_name": "CRANK_OUTBOUND_MAX_REQUEST_BYTES",
"process": "shared",
"value_type": "u64",
"unit": "bytes",
"default": "4194304",
"required": false,
"minimum": 1,
"maximum": 67108864,
"sensitivity": "public",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "outbound.max_response_bytes",
"env_name": "CRANK_OUTBOUND_MAX_RESPONSE_BYTES",
"process": "shared",
"value_type": "u64",
"unit": "bytes",
"default": "4194304",
"required": false,
"minimum": 1,
"maximum": 67108864,
"sensitivity": "public",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "import.external_references.allowed_url_prefixes",
"env_name": "CRANK_IMPORT_EXTERNAL_REFERENCE_ALLOWED_URL_PREFIXES",
"process": "admin_api",
"value_type": "url_prefix_list",
"unit": null,
"default": "",
"required": false,
"minimum": null,
"maximum": null,
"sensitivity": "internal",
"mode": "effective",
"compatibility": null,
"rules": [
"empty list disables external OpenAPI reference fetching",
"each prefix must be canonical HTTP(S) without userinfo, query, or fragment"
]
},
{
"semantic_path": "import.external_references.max_depth",
"env_name": "CRANK_IMPORT_EXTERNAL_REFERENCE_MAX_DEPTH",
"process": "admin_api",
"value_type": "u32",
"unit": "edges",
"default": "8",
"required": false,
"minimum": 1,
"maximum": 32,
"sensitivity": "public",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "import.external_references.max_documents",
"env_name": "CRANK_IMPORT_EXTERNAL_REFERENCE_MAX_DOCUMENTS",
"process": "admin_api",
"value_type": "u32",
"unit": "documents",
"default": "32",
"required": false,
"minimum": 1,
"maximum": 32,
"sensitivity": "public",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "import.external_references.max_fetch_bytes",
"env_name": "CRANK_IMPORT_EXTERNAL_REFERENCE_MAX_FETCH_BYTES",
"process": "admin_api",
"value_type": "u64",
"unit": "bytes",
"default": "262144",
"required": false,
"minimum": 1,
"maximum": 4194304,
"sensitivity": "public",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "import.external_references.fetch_timeout_ms",
"env_name": "CRANK_IMPORT_EXTERNAL_REFERENCE_FETCH_TIMEOUT_MS",
"process": "admin_api",
"value_type": "u64",
"unit": "milliseconds",
"default": "10000",
"required": false,
"minimum": 1,
"maximum": 300000,
"sensitivity": "public",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "import.external_references.max_expanded_nodes",
"env_name": "CRANK_IMPORT_EXTERNAL_REFERENCE_MAX_EXPANDED_NODES",
"process": "admin_api",
"value_type": "u32",
"unit": "nodes",
"default": "10000",
"required": false,
"minimum": 1,
"maximum": 100000,
"sensitivity": "public",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "observability.environment",
"env_name": "CRANK_ENVIRONMENT",
"process": "shared",
"value_type": "label",
"unit": null,
"default": "development",
"required": false,
"minimum": null,
"maximum": null,
"sensitivity": "public",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "observability.log_filter",
"env_name": "CRANK_LOG_LEVEL",
"process": "shared",
"value_type": "string",
"unit": null,
"default": null,
"required": false,
"minimum": null,
"maximum": null,
"sensitivity": "public",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "observability.sentry_dsn",
"env_name": "CRANK_SENTRY_DSN",
"process": "shared",
"value_type": "url",
"unit": null,
"default": null,
"required": false,
"minimum": null,
"maximum": null,
"sensitivity": "secret",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "observability.metrics.enabled",
"env_name": "CRANK_METRICS_ENABLED",
"process": "shared",
"value_type": "bool",
"unit": null,
"default": "true",
"required": false,
"minimum": null,
"maximum": null,
"sensitivity": "public",
"mode": "effective",
"compatibility": "yes/no/on/off spellings are deprecated",
"rules": []
},
{
"semantic_path": "observability.metrics.bearer_token",
"env_name": "CRANK_METRICS_BEARER_TOKEN",
"process": "shared",
"value_type": "secret",
"unit": null,
"default": null,
"required": false,
"minimum": null,
"maximum": null,
"sensitivity": "secret",
"mode": "effective",
"compatibility": null,
"rules": [
"required when an enabled metrics bind is non-loopback"
]
},
{
"semantic_path": "observability.otlp.endpoint",
"env_name": "OTEL_EXPORTER_OTLP_ENDPOINT",
"process": "shared",
"value_type": "url",
"unit": null,
"default": null,
"required": false,
"minimum": null,
"maximum": null,
"sensitivity": "internal",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "observability.otlp.traces_endpoint",
"env_name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
"process": "shared",
"value_type": "url",
"unit": null,
"default": null,
"required": false,
"minimum": null,
"maximum": null,
"sensitivity": "internal",
"mode": "effective",
"compatibility": null,
"rules": [
"overrides generic OTLP endpoint"
]
},
{
"semantic_path": "observability.otlp.protocol",
"env_name": "OTEL_EXPORTER_OTLP_PROTOCOL",
"process": "shared",
"value_type": "enum",
"unit": null,
"default": "http/protobuf",
"required": false,
"minimum": null,
"maximum": null,
"sensitivity": "public",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "observability.otlp.traces_protocol",
"env_name": "OTEL_EXPORTER_OTLP_TRACES_PROTOCOL",
"process": "shared",
"value_type": "enum",
"unit": null,
"default": null,
"required": false,
"minimum": null,
"maximum": null,
"sensitivity": "public",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "observability.otlp.timeout",
"env_name": "OTEL_EXPORTER_OTLP_TIMEOUT",
"process": "shared",
"value_type": "duration",
"unit": "milliseconds",
"default": "10000",
"required": false,
"minimum": 1,
"maximum": 300000,
"sensitivity": "public",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "observability.otlp.traces_timeout",
"env_name": "OTEL_EXPORTER_OTLP_TRACES_TIMEOUT",
"process": "shared",
"value_type": "duration",
"unit": "milliseconds",
"default": null,
"required": false,
"minimum": 1,
"maximum": 300000,
"sensitivity": "public",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "observability.otlp.headers",
"env_name": "OTEL_EXPORTER_OTLP_HEADERS",
"process": "shared",
"value_type": "headers",
"unit": null,
"default": null,
"required": false,
"minimum": null,
"maximum": null,
"sensitivity": "secret",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "observability.otlp.traces_headers",
"env_name": "OTEL_EXPORTER_OTLP_TRACES_HEADERS",
"process": "shared",
"value_type": "headers",
"unit": null,
"default": null,
"required": false,
"minimum": null,
"maximum": null,
"sensitivity": "secret",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "observability.otlp.max_queue_size",
"env_name": "OTEL_BSP_MAX_QUEUE_SIZE",
"process": "shared",
"value_type": "u32",
"unit": "spans",
"default": "2048",
"required": false,
"minimum": 1,
"maximum": 65536,
"sensitivity": "public",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "observability.otlp.max_export_batch_size",
"env_name": "OTEL_BSP_MAX_EXPORT_BATCH_SIZE",
"process": "shared",
"value_type": "u32",
"unit": "spans",
"default": "512",
"required": false,
"minimum": 1,
"maximum": 65536,
"sensitivity": "public",
"mode": "effective",
"compatibility": null,
"rules": [
"must be <= max_queue_size"
]
},
{
"semantic_path": "observability.otlp.schedule_delay",
"env_name": "OTEL_BSP_SCHEDULE_DELAY",
"process": "shared",
"value_type": "duration",
"unit": "milliseconds",
"default": "5000",
"required": false,
"minimum": 1,
"maximum": 300000,
"sensitivity": "public",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "observability.otlp.export_timeout",
"env_name": "OTEL_BSP_EXPORT_TIMEOUT",
"process": "shared",
"value_type": "duration",
"unit": "milliseconds",
"default": "30000",
"required": false,
"minimum": 1,
"maximum": 300000,
"sensitivity": "public",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "admin.bind",
"env_name": "CRANK_ADMIN_BIND",
"process": "admin_api",
"value_type": "socket",
"unit": null,
"default": "0.0.0.0:3001",
"required": false,
"minimum": null,
"maximum": null,
"sensitivity": "internal",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "admin.metrics_bind",
"env_name": "CRANK_ADMIN_METRICS_BIND",
"process": "admin_api",
"value_type": "socket",
"unit": null,
"default": "127.0.0.1:9464",
"required": false,
"minimum": null,
"maximum": null,
"sensitivity": "internal",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "admin.storage_root",
"env_name": "CRANK_STORAGE_ROOT",
"process": "admin_api",
"value_type": "absolute_path",
"unit": null,
"default": "/var/lib/crank/storage",
"required": false,
"minimum": null,
"maximum": null,
"sensitivity": "internal",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "admin.rate_limit.rps",
"env_name": "CRANK_ADMIN_RATE_LIMIT_RPS",
"process": "admin_api",
"value_type": "u32",
"unit": "requests_per_second",
"default": "30",
"required": false,
"minimum": 1,
"maximum": 100000,
"sensitivity": "public",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "admin.rate_limit.burst",
"env_name": "CRANK_ADMIN_RATE_LIMIT_BURST",
"process": "admin_api",
"value_type": "u32",
"unit": "requests",
"default": "60",
"required": false,
"minimum": 1,
"maximum": 1000000,
"sensitivity": "public",
"mode": "effective",
"compatibility": null,
"rules": [
"must be >= admin rate RPS"
]
},
{
"semantic_path": "admin.invocation_log_retention_days",
"env_name": "CRANK_INVOCATION_LOG_RETENTION_DAYS",
"process": "admin_api",
"value_type": "u32",
"unit": "days",
"default": "30",
"required": false,
"minimum": 1,
"maximum": 36500,
"sensitivity": "public",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "admin.session.secret",
"env_name": "CRANK_SESSION_SECRET",
"process": "admin_api",
"value_type": "secret",
"unit": null,
"default": null,
"required": true,
"minimum": null,
"maximum": null,
"sensitivity": "secret",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "admin.password_pepper",
"env_name": "CRANK_PASSWORD_PEPPER",
"process": "admin_api",
"value_type": "secret",
"unit": null,
"default": null,
"required": true,
"minimum": null,
"maximum": null,
"sensitivity": "secret",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "admin.session.ttl_hours",
"env_name": "CRANK_SESSION_TTL_HOURS",
"process": "admin_api",
"value_type": "u32",
"unit": "hours",
"default": "24",
"required": false,
"minimum": 1,
"maximum": 8760,
"sensitivity": "public",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "admin.trust_forwarded_headers",
"env_name": "CRANK_TRUST_FORWARDED_HEADERS",
"process": "admin_api",
"value_type": "bool",
"unit": null,
"default": null,
"required": false,
"minimum": null,
"maximum": null,
"sensitivity": "public",
"mode": "deprecated_no_effect",
"compatibility": "deprecated boolean proxy trust; use CRANK_TRUSTED_PROXY_IPS",
"rules": []
},
{
"semantic_path": "admin.trusted_proxy_ips",
"env_name": "CRANK_TRUSTED_PROXY_IPS",
"process": "admin_api",
"value_type": "ip_list",
"unit": null,
"default": "",
"required": false,
"minimum": null,
"maximum": null,
"sensitivity": "internal",
"mode": "effective",
"compatibility": null,
"rules": [
"only listed immediate peer IPs may supply X-Real-IP/X-Forwarded-For client identity",
"empty value disables forwarded-header trust"
]
},
{
"semantic_path": "admin.bootstrap.email",
"env_name": "CRANK_BOOTSTRAP_ADMIN_EMAIL",
"process": "admin_api",
"value_type": "string",
"unit": null,
"default": null,
"required": true,
"minimum": null,
"maximum": null,
"sensitivity": "internal",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "admin.bootstrap.password",
"env_name": "CRANK_BOOTSTRAP_ADMIN_PASSWORD",
"process": "admin_api",
"value_type": "secret",
"unit": null,
"default": null,
"required": false,
"minimum": null,
"maximum": null,
"sensitivity": "secret",
"mode": "effective",
"compatibility": "deprecated startup-bootstrap password; use local bootstrap contract",
"rules": []
},
{
"semantic_path": "admin.bootstrap.display_name",
"env_name": "CRANK_BOOTSTRAP_ADMIN_DISPLAY_NAME",
"process": "admin_api",
"value_type": "string",
"unit": null,
"default": "Crank Owner",
"required": false,
"minimum": null,
"maximum": null,
"sensitivity": "internal",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "admin.demo_seed",
"env_name": "CRANK_DEMO_SEED",
"process": "admin_api",
"value_type": "bool",
"unit": null,
"default": "false",
"required": false,
"minimum": null,
"maximum": null,
"sensitivity": "public",
"mode": "effective",
"compatibility": "yes/no/on/off spellings are deprecated",
"rules": []
},
{
"semantic_path": "mcp.bind",
"env_name": "CRANK_MCP_BIND",
"process": "mcp_server",
"value_type": "socket",
"unit": null,
"default": "0.0.0.0:3002",
"required": false,
"minimum": null,
"maximum": null,
"sensitivity": "internal",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "mcp.metrics_bind",
"env_name": "CRANK_MCP_METRICS_BIND",
"process": "mcp_server",
"value_type": "socket",
"unit": null,
"default": "127.0.0.1:9465",
"required": false,
"minimum": null,
"maximum": null,
"sensitivity": "internal",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "mcp.refresh_ms",
"env_name": "CRANK_MCP_REFRESH_MS",
"process": "mcp_server",
"value_type": "u64",
"unit": "milliseconds",
"default": "5000",
"required": false,
"minimum": 100,
"maximum": 3600000,
"sensitivity": "public",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "mcp.rate_limit.rps",
"env_name": "CRANK_MCP_RATE_LIMIT_RPS",
"process": "mcp_server",
"value_type": "u32",
"unit": "requests_per_second",
"default": "60",
"required": false,
"minimum": 1,
"maximum": 100000,
"sensitivity": "public",
"mode": "effective",
"compatibility": null,
"rules": []
},
{
"semantic_path": "mcp.rate_limit.burst",
"env_name": "CRANK_MCP_RATE_LIMIT_BURST",
"process": "mcp_server",
"value_type": "u32",
"unit": "requests",
"default": "120",
"required": false,
"minimum": 1,
"maximum": 1000000,
"sensitivity": "public",
"mode": "effective",
"compatibility": null,
"rules": [
"must be >= MCP rate RPS"
]
},
{
"semantic_path": "runtime.max_concurrent_sessions",
"env_name": "CRANK_RUNTIME_MAX_CONCURRENT_SESSIONS",
"process": "mcp_server",
"value_type": "u32",
"unit": "sessions",
"default": "16",
"required": false,
"minimum": 1,
"maximum": 65535,
"sensitivity": "public",
"mode": "effective",
"compatibility": null,
"rules": []
}
],
"deployment_only_fields": [
"COMPOSE_PROJECT_NAME",
"POSTGRES_PUBLISH_BIND",
"POSTGRES_PUBLISH_PORT",
"CRANK_ADMIN_API_IMAGE",
"CRANK_MCP_SERVER_IMAGE",
"CRANK_UI_IMAGE",
"CRANK_PUBLISH_BIND",
"CRANK_ADMIN_PUBLISH_PORT",
"CRANK_MCP_PUBLISH_PORT",
"CRANK_UI_PUBLISH_PORT",
"VALKEY_PUBLISH_BIND",
"VALKEY_PUBLISH_PORT"
]
}