Skip to content

Commit e945cd5

Browse files
committed
Fix fresh Linux installer asset retention
1 parent 482c1a6 commit e945cd5

11 files changed

Lines changed: 40 additions & 25 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [0.0.27] - 2026-07-29
11+
12+
### Fixed
13+
14+
- Fresh Linux installs pin the intended 1Helm version without consuming
15+
unauthenticated GitHub API quota, and download digest-pinned Ubuntu LXC
16+
payloads retained as 1Helm release assets instead of short-lived upstream
17+
image URLs.
18+
1019
## [0.0.26] - 2026-07-29
1120

1221
### Fixed
@@ -777,7 +786,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
777786
notarization, stapled tickets, Gatekeeper verification, persistent
778787
Application Support, and isolated Apple container machines.
779788

780-
[Unreleased]: https://github.com/gitcommit90/1Helm/compare/v0.0.26...HEAD
789+
[Unreleased]: https://github.com/gitcommit90/1Helm/compare/v0.0.27...HEAD
790+
[0.0.27]: https://github.com/gitcommit90/1Helm/compare/v0.0.26...v0.0.27
781791
[0.0.26]: https://github.com/gitcommit90/1Helm/compare/v0.0.23...v0.0.26
782792
[0.0.25]: https://github.com/gitcommit90/1Helm/compare/v0.0.23...v0.0.25
783793
[0.0.24]: https://github.com/gitcommit90/1Helm/compare/v0.0.23...v0.0.24

‎README.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,7 @@ A fresh data directory opens first-run setup. The source runtime defaults to
307307
| `PORT` | `8123` | HTTP/WebSocket control-plane port. |
308308
| `CTRL_DATA_DIR` | `./data` | Databases, routing state, uploads, and narrow workspace mirrors. |
309309
| `HELM_CHANNEL_COMPUTER_BACKEND` | `apple` on macOS, `lxc` on Linux, `wsl` on Windows | Host isolation backend; `native` and `mock` are explicit development/test overrides. |
310-
| `HELM_CHANNEL_MACHINE_IMAGE` | `local/1helm-channel-machine:0.0.26` | Versioned channel-machine image contract. |
310+
| `HELM_CHANNEL_MACHINE_IMAGE` | `local/1helm-channel-machine:0.0.27` | Versioned channel-machine image contract. |
311311

312312
### Agent-first JSON CLI
313313

‎package-lock.json‎

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎package.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "1helm",
33
"productName": "1Helm",
4-
"version": "0.0.26",
4+
"version": "0.0.27",
55
"private": true,
66
"type": "module",
77
"license": "AGPL-3.0-only",

‎scripts/1helm-lxc-runtime‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ NETWORK_HELPER="/usr/libexec/1helm-lxc-net"
1616
NAME_PATTERN='^1helm-[a-f0-9]{16}-channel-[0-9]+$'
1717
OWNER_PATTERN='^[a-f0-9]{16}:[0-9]+$'
1818

19-
IMAGE_BUILD="20260723_07:42"
20-
AMD64_ROOTFS_SHA256="cbc98489455ce54b5fa8c9abf276f1cb39130376ef70b3b7151d18362cd6354f"
21-
AMD64_META_SHA256="630feddfe5982719a8409cee6356b9abc6297c5bc05c2f6043bc80dee04637cf"
22-
ARM64_ROOTFS_SHA256="f4752ea7e776f329f9f50aca59c1919f3dc841dc3ddf22beef2b1696c4b4e29e"
23-
ARM64_META_SHA256="9ef7cfca774a667f8eb187b1a0a7f47f0fd912b6a7da8dfa1c4d24213631f747"
19+
IMAGE_BUILD="20260726_07:42"
20+
AMD64_ROOTFS_SHA256="9c23724d6d22b3a5adf5d0f79d7e3779ded16a6d45f928bce93e14c48113d955"
21+
AMD64_META_SHA256="f8cdb7423ef4fdb103a134ff3fc7cc10aacd2b3448650ce28e33621de1638288"
22+
ARM64_ROOTFS_SHA256="d5351325dc23e344c4974d7ff546e5e0c91b8e47a9caeb26f39cdc60eaad19e8"
23+
ARM64_META_SHA256="b36e17b74d0d75c4f6e7a624a047ce5a40a39f52b43702f58ecf7b3f713c0b32"
2424

2525
die() { printf '1Helm LXC runtime: %s\n' "$*" >&2; exit 1; }
2626
need_root() { [[ "${EUID}" -eq 0 ]] || die "must run as root"; }

‎site/public/install-lxc-runtime.sh‎

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ CONFIG_PATH="/etc/1helm/lxc-unprivileged.conf"
1919
IDMAP_PATH="/etc/1helm/lxc-idmap"
2020
SUDOERS_PATH="/etc/sudoers.d/1helm-lxc-runtime"
2121
SERVICE_USER="1helm"
22-
IMAGE_BUILD="20260723_07:42"
22+
IMAGE_BUILD="20260726_07:42"
23+
IMAGE_RELEASE="0.0.27"
2324

2425
# v0.0.11's updater unit made the exact destination files writable under
2526
# ProtectSystem=strict. Atomic replacement still requires write access to each
@@ -70,13 +71,13 @@ fi
7071
case "$(uname -m)" in
7172
x86_64|amd64)
7273
IMAGE_ARCH="amd64"
73-
ROOTFS_SHA256="cbc98489455ce54b5fa8c9abf276f1cb39130376ef70b3b7151d18362cd6354f"
74-
META_SHA256="630feddfe5982719a8409cee6356b9abc6297c5bc05c2f6043bc80dee04637cf"
74+
ROOTFS_SHA256="9c23724d6d22b3a5adf5d0f79d7e3779ded16a6d45f928bce93e14c48113d955"
75+
META_SHA256="f8cdb7423ef4fdb103a134ff3fc7cc10aacd2b3448650ce28e33621de1638288"
7576
;;
7677
aarch64|arm64)
7778
IMAGE_ARCH="arm64"
78-
ROOTFS_SHA256="f4752ea7e776f329f9f50aca59c1919f3dc841dc3ddf22beef2b1696c4b4e29e"
79-
META_SHA256="9ef7cfca774a667f8eb187b1a0a7f47f0fd912b6a7da8dfa1c4d24213631f747"
79+
ROOTFS_SHA256="d5351325dc23e344c4974d7ff546e5e0c91b8e47a9caeb26f39cdc60eaad19e8"
80+
META_SHA256="b36e17b74d0d75c4f6e7a624a047ce5a40a39f52b43702f58ecf7b3f713c0b32"
8081
;;
8182
*) echo "Unsupported LXC architecture: $(uname -m)" >&2; exit 1 ;;
8283
esac
@@ -109,7 +110,7 @@ install -d -o root -g root -m 0755 "$NETWORK_STATE" "$NETWORK_STATE/misc"
109110

110111
TEMP_ROOT="$(mktemp -d)"
111112
trap 'rm -rf -- "$TEMP_ROOT"' EXIT
112-
ASSET_URL="https://images.linuxcontainers.org/images/ubuntu/noble/$IMAGE_ARCH/default/$IMAGE_BUILD"
113+
ASSET_URL="https://github.com/gitcommit90/1Helm/releases/download/v$IMAGE_RELEASE/1Helm-$IMAGE_RELEASE-lxc-ubuntu-noble-$IMAGE_ARCH"
113114
ASSET_DIR="$RUNTIME_ROOT/$IMAGE_ARCH"
114115
install -d -o root -g root -m 0700 "$ASSET_DIR"
115116
for asset in rootfs.tar.xz meta.tar.xz; do
@@ -118,7 +119,7 @@ for asset in rootfs.tar.xz meta.tar.xz; do
118119
if [[ -f "$ASSET_DIR/$asset" ]] && printf '%s %s\n' "$expected" "$ASSET_DIR/$asset" | sha256sum -c - >/dev/null 2>&1; then
119120
continue
120121
fi
121-
curl -fsSL --proto '=https' --tlsv1.2 --retry 3 --max-time 1800 -o "$TEMP_ROOT/$asset" "$ASSET_URL/$asset"
122+
curl -fsSL --proto '=https' --tlsv1.2 --retry 3 --max-time 1800 -o "$TEMP_ROOT/$asset" "$ASSET_URL-$asset"
122123
printf '%s %s\n' "$expected" "$TEMP_ROOT/$asset" | sha256sum -c - >/dev/null \
123124
|| { echo "Pinned LXC $asset failed SHA-256 verification." >&2; exit 1; }
124125
install -o root -g root -m 0600 "$TEMP_ROOT/$asset" "$ASSET_DIR/$asset"

‎site/public/install.sh‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ NODE_LINK="$INSTALL_ROOT/node-current"
1010
STATE_ROOT="/var/lib/1helm"
1111
SERVICE_USER="1helm"
1212
NODE_VERSION="22.23.1"
13+
RELEASE_VERSION="0.0.27"
1314
HOST_CONTRACT_PATHS=(
1415
/usr/libexec/1helm-lxc-runtime
1516
/usr/libexec/1helm-lxc-net
@@ -147,8 +148,7 @@ fi
147148
ln -sfn "$NODE_RELEASE" "$TEMP_ROOT/node-current"
148149
mv -Tf "$TEMP_ROOT/node-current" "$NODE_LINK"
149150

150-
VERSION="$(curl -fsSL https://api.github.com/repos/gitcommit90/1Helm/releases/latest | sed -n 's/.*"tag_name"[[:space:]]*:[[:space:]]*"v\([^"]*\)".*/\1/p' | head -n1)"
151-
[[ -n "$VERSION" ]] || { echo "Could not resolve the latest public 1Helm release." >&2; exit 1; }
151+
VERSION="$RELEASE_VERSION"
152152
git clone --depth 1 --branch "v$VERSION" "$REPO" "$TEMP_ROOT/source"
153153
RELEASE_SHA="$(git -C "$TEMP_ROOT/source" rev-parse HEAD)"
154154
[[ "$RELEASE_SHA" =~ ^[a-f0-9]{40}$ ]] || { echo "Could not resolve the checked-out release commit." >&2; exit 1; }

‎src/server/channel-computers.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ const APPLE_RUNTIME_VERSION = "1.1.0";
6767
export const APPLE_RUNTIME_PACKAGE = `container-${APPLE_RUNTIME_VERSION}-installer-signed.pkg`;
6868
export const APPLE_RUNTIME_URL = `https://github.com/apple/container/releases/download/${APPLE_RUNTIME_VERSION}/${APPLE_RUNTIME_PACKAGE}`;
6969
export const APPLE_RUNTIME_SHA256 = "0ca1c42a2269c2557efb1d82b1b38ac553e6a3a3da1b1179c439bcee1e7d6714";
70-
export const DEFAULT_CHANNEL_IMAGE = process.env.HELM_CHANNEL_MACHINE_IMAGE || "local/1helm-channel-machine:0.0.26";
70+
export const DEFAULT_CHANNEL_IMAGE = process.env.HELM_CHANNEL_MACHINE_IMAGE || "local/1helm-channel-machine:0.0.27";
7171
const CONTAINER_CANDIDATES = [process.env.HELM_CONTAINER_CLI, "/usr/local/bin/container", "/opt/homebrew/bin/container", "container"].filter(Boolean) as string[];
7272
const LXC_RUNTIME_VERSION = "1helm-lxc-runtime-v1";
7373
const LXC_HELPER_CANDIDATES = [

‎src/server/db.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1009,7 +1009,7 @@ export function migrate(): void {
10091009
const platformBackend = process.platform === "darwin" ? "apple" : process.platform === "win32" ? "wsl" : "lxc";
10101010
const configuredBackend = String(process.env.HELM_CHANNEL_COMPUTER_BACKEND || platformBackend);
10111011
const backend = ["apple", "lxc", "wsl", "native", "mock"].includes(configuredBackend) ? configuredBackend : platformBackend;
1012-
const image = String(process.env.HELM_CHANNEL_MACHINE_IMAGE || "local/1helm-channel-machine:0.0.26");
1012+
const image = String(process.env.HELM_CHANNEL_MACHINE_IMAGE || "local/1helm-channel-machine:0.0.27");
10131013
// Earlier Linux/Windows releases persisted the compatibility `native`
10141014
// seam into every channel row. A production host update must actually
10151015
// move those rows onto the platform isolation backend; changing the unit's

‎test/channel-computers.mjs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ test("Apple channel-computer contract preserves isolation, files, wakes, archive
168168
test("runtime digest and packaged image recipe stay pinned", async () => {
169169
assert.equal(computers.APPLE_RUNTIME_SHA256, "0ca1c42a2269c2557efb1d82b1b38ac553e6a3a3da1b1179c439bcee1e7d6714");
170170
assert.match(computers.APPLE_RUNTIME_URL, /\/1\.1\.0\/container-1\.1\.0-installer-signed\.pkg$/);
171-
assert.equal(computers.DEFAULT_CHANNEL_IMAGE, "local/1helm-channel-machine:0.0.26");
171+
assert.equal(computers.DEFAULT_CHANNEL_IMAGE, "local/1helm-channel-machine:0.0.27");
172172
const packaging = await readFile(join(root, "scripts", "package-mac-dmg.cjs"), "utf8");
173173
assert.match(packaging, /container\(\?:\$\|\\\/\)/, "release packaging includes container/ image assets");
174174
const image = await readFile(join(root, "container", "Containerfile"), "utf8");

0 commit comments

Comments
 (0)