diff --git a/README.md b/README.md index 3d1e097f3..b5db6d274 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ The name comes from **金継ぎ**, the Japanese art of repairing pottery with go ## Installation -The current release is [v0.4.6](https://github.com/rcarmo/kintsugi/releases/tag/v0.4.6); see the [release notes](https://github.com/rcarmo/kintsugi/releases/tag/v0.4.6). Releases publish app, System and workspace images and advance `latest`; `stable` is promoted separately. Publishing does not update or restart an installation. +The current release is [v0.4.7](https://github.com/rcarmo/kintsugi/releases/tag/v0.4.7); see the [release notes](release_notes/v0.4.7.md). Releases publish app, System and workspace images and advance `latest`; `stable` is promoted separately. Publishing does not update or restart an installation. Use a dedicated Linux server with Docker. The installer defaults to `ghcr.io/rcarmo/kintsugi` and `ghcr.io/rcarmo/kintsugi-system`; matching images must be available before installation. diff --git a/apps/web/src/version.ts b/apps/web/src/version.ts index b80f3fd67..aa34a3ee8 100644 --- a/apps/web/src/version.ts +++ b/apps/web/src/version.ts @@ -1 +1 @@ -export const kintsugiVersion = "v0.4.6"; +export const kintsugiVersion = "v0.4.7"; diff --git a/images/system/Dockerfile b/images/system/Dockerfile index 56cc9790d..0dff28f3b 100644 --- a/images/system/Dockerfile +++ b/images/system/Dockerfile @@ -1,4 +1,4 @@ -ARG RUNTIME_IMAGE=ghcr.io/rcarmo/kintsugi-docker@sha256:927bea2d5276f87de04d7934b19124c48f9bd1c877743cace382bd5271ffbfe4 +ARG RUNTIME_IMAGE=ghcr.io/rcarmo/kintsugi-docker@sha256:7ccb0ce9fb643060ef1eb54162f7e42db000f8c7b0a7f716d8ce684369899018 FROM oven/bun:1.4.4@sha256:1d22548f177f4ff38e0c15baa3c2c46c6c2060ba2d1bc573bb4720b407548f1d AS bun FROM ghcr.io/tailscale/tailscale:v1.102.3@sha256:8c42c4574ab066384fcb72f69e086a2ff1dd3652eb6f56856cee34bcf0d2f680 AS tailscale FROM ${RUNTIME_IMAGE} diff --git a/packages/workspace-image/runtime-image b/packages/workspace-image/runtime-image index b1f6fb568..7fe813d12 100644 --- a/packages/workspace-image/runtime-image +++ b/packages/workspace-image/runtime-image @@ -1 +1 @@ -ghcr.io/rcarmo/kintsugi-docker@sha256:927bea2d5276f87de04d7934b19124c48f9bd1c877743cace382bd5271ffbfe4 +ghcr.io/rcarmo/kintsugi-docker@sha256:7ccb0ce9fb643060ef1eb54162f7e42db000f8c7b0a7f716d8ce684369899018 diff --git a/release_notes/v0.4.7.md b/release_notes/v0.4.7.md new file mode 100644 index 000000000..a8b81533d --- /dev/null +++ b/release_notes/v0.4.7.md @@ -0,0 +1,24 @@ +# Kintsugi v0.4.7 + +## Workspace exec with delegated cgroups + +Fixes `docker exec failed` / `error starting setns process: exec: already started` in systemd-based workspaces after the Go 1.26 runtime rebuild. + +Systemd moves its init process into a child cgroup and enables controllers in the parent. Linux then rejects runc's `CLONE_INTO_CGROUP` launch into that parent with `EBUSY`. runc 1.4.0 tried its fallback using the same `exec.Cmd`; Go 1.26 forbids calling `Start` twice, even after a failed launch. This prevented otherwise healthy workspaces from starting their helpers or accepting terminal commands. + +The pinned Ubuntu runc source and distribution patches are retained, with the complete upstream [runc #5091](https://github.com/opencontainers/runc/pull/5091) source fix backported: check command-construction errors and use a fresh command for the fallback. The runtime reports `1.4.0-0ubuntu1+kintsugi-exec-retry` and retains Go **1.26.10**, seccomp and the existing resource/network boundaries. No cgroup controllers are disabled and no policy limits or stored formats change. + +## Verification + +- Full fix PR [#11](https://github.com/rcarmo/kintsugi/pull/11) CI passed before exact-head merge. +- Exact Ubuntu-plus-fix `libcontainer` tests, module generation, lint and TypeScript passed locally. +- On the affected Orange Pi 6 Plus (CIX P1 ARM64, 12 cores, approximately 14.85 GiB usable RAM, Debian Trixie/Linux 6.6.89-cix, OverlayFS), the old binary failed in all five running workspace namespaces. The fixed binary succeeded in each without restarting the workspaces. +- A disposable cgroup-v2 fixture reproduced the original failure by moving init into a child and enabling the parent's memory controller; repeated fixed execs joined the correct child. The same regression is now part of both native runtime smoke gates. +- [Verified runtime run 40082057502](https://github.com/rcarmo/kintsugi/actions/runs/40082057502) passed on **AMD64 and ARM64**, including shipped-binary Go toolchain checks, the cgroup exec regression, EROFS cache/build/restart smoke tests and manifest assembly. The outer fixture uses the same host cgroup namespace as production System ([#12](https://github.com/rcarmo/kintsugi/pull/12)). System and workspace now pin `ghcr.io/rcarmo/kintsugi-docker@sha256:7ccb0ce9fb643060ef1eb54162f7e42db000f8c7b0a7f716d8ce684369899018`. +- The tagged release then runs full checks and native System/workspace/app verification before publication. A source note or tag is not proof of successful publication; consult the workflow receipts. + +## Update scope + +A paired installation update is needed: the System image provides the runtime that executes workspace processes. Updating only the app does not fix this failure. Existing workspace containers, data, configuration and saved parked intent are retained; the installation update interrupts running workspaces. + +Publication advances `latest` and does not move `stable` or update an installation automatically. The local installation is upgraded separately through the supported updater after verified publication. No fresh physical-host reboot or sustained stress acceptance is implied.