What's New
⚠️ Breaking Changes
- Execd install path flattened from
/opt/opensandbox/bin/to/opt/opensandbox/— the emptyDir mount in the K8s provider and the Docker bootstrap launcher now use a single/opt/opensandboxdirectory instead of the nested/opt/opensandbox/bin. Binary paths like/opt/opensandbox/bin/execdbecome/opt/opensandbox/execd. The Docker runtime also replaces its inline-generated 15-line bootstrap shim with the fullbootstrap.shfrom the execd image, gaining MITM CA trust, SIGTERM forwarding, and pre-script support. Users running code-interpreter images≤v1.0.2must upgrade tov1.1.0; custom Pool CR templates need updated mountPaths and env vars. See the migration guide for details. (#1014)
✨ Features
- Credential Vault — new credential injection system that lets sandboxes consume secrets (API keys, OAuth tokens, HTTP headers, query parameters) without exposing raw values to user code. Credentials are defined at the platform level and injected through the egress sidecar at request time. Includes server-side plumbing, K8s CRD support, egress integration, SDK surface (Python, Go, JS, Kotlin, Java), CLI commands (
osb credential-vault), and E2E test coverage. (#1009, #1023, #1027)
🐛 Bug Fixes
-
Conflicting endpoint modes now rejected — requests that combine
use_server_proxy=truewithexpires(asking for both a server proxy path and a signed gateway route) now returnSANDBOX::INVALID_PARAMETERinstead of silently resolving a signed URL and then overwriting it with the proxy URL. Lifecycle API spec updated accordingly. (#952) -
Gzip-encoded proxy responses no longer corrupted — the server proxy forwarded backend
Content-Encodingheaders while usinghttpx.aiter_bytes(), which decodes compressed bodies. Clients then received a gzip header on already-decoded bytes, breaking content like noVNC pages. The proxy now streams raw backend bytes so preserved Content-Encoding headers stay correct. (#971) -
Docker bootstrap launcher defaults
EXECD_ENVS— the Docker-generated bootstrap script now exportsEXECD_ENVSbefore starting execd, aligning with the behavior expected bycomponents/execd/bootstrap.sh. Previously the missing variable could cause execd startup issues. (#999) -
Null
spec.templatecrash in platform constraint scope — pool-mode BatchSandbox CRs withspec.template: nullcrashed_workload_platform_constraint_scopeduring status polling (same root cause as #910 but in a different call path). Chained.get(key, {})replaced with.get(key) or {}to handle both absent and null values. (#1007) -
Noneentrypoint crash in pool-mode creation — when SDK callers omitentrypointfor pool-mode sandboxes,Nonepropagated into_create_workload_from_poolwhere it triggeredTypeError: 'NoneType' object is not iterablein_build_task_template. Now normalised toDEFAULT_ENTRYPOINTat the top of the function. (#1017)
📦 Misc
- Dependency: starlette
0.50.0 → 1.0.1— major version bump, includes malformedHostheader handling fix. (#978) - Dependency: idna
3.11 → 3.15— DNS-length cap enforcement and helper cleanups. (#959)
👥 Contributors
Thanks to these contributors ❤️
- PyPI: opensandbox-server==0.2.0
- Docker Hub: opensandbox/server:v0.2.0
- Aliyun Registry: sandbox-registry.cn-zhangjiakou.cr.aliyuncs.com/opensandbox/server:v0.2.0