• Onebox v32.10.0
    Release / build-and-release (push) Successful in 21m10s
    Stable

    jkunz released this 2026-09-25 08:00:04 +00:00 | 13 commits to main since this release

    2026-09-25 - 32.10.0

    Features

    • Move the backup archive to the index generations of @serve.zone/containerarchive 0.7.0. The data version moves to 0.23.0 through the step backup-archive-index-generations, which converts an existing repository with ContainerArchive.migrate() at the first start, before the archive is opened, and logs the previous format and the number of indexed chunks and index segments. An install without a repository passes; a repository that cannot be inspected or converted refuses the boot as backup-archive-migration-blocked: <stage>, and the ContainerArchive error behind it is logged. The conversion is one-way: Onebox releases up to 32.9.0 refuse the 0.23.0 ledger by name, and ContainerArchive 0.6.x refuses the converted repository, so recovery after the upgrade is forward only unless a copy of both the database and the backup repository was taken before it.
    • Reclaim the storage of deleted backups. The daily archive prune now runs as garbage collection only, prune({}, false): it keeps every snapshot and deletes the whole packs that no remaining snapshot references. Onebox's backup rows alone decide which backups expire. Each run logs one line with the packs removed, the bytes freed, the snapshots kept, the interrupted deletions it finished and left, and the ids of the snapshots that no backup row names and no pin holds, which are kept. A prune result that removed a snapshot is reported as backup-archive-prune-removed-snapshots.
    • Mark a backup before deleting it. A deletion sets deletionStartedAt on the row, deletes the snapshot, then deletes the row; a marked row is hidden from listing, restore, download and retention, and is finished when the archive opens and before each archive prune, so a crash between the two deletions no longer leaves a row that names a missing snapshot.
    • onebox auth reset-passkeys takes --state-root <path> instead of --database-path <path> and defaults to the daemon's state root (/var/lib/onebox, or ONEBOX_STATE_ROOT), because opening the database runs the startup migrations, and the backup archive step resolves the repository against the state root. OneboxDatabase is now constructed from the runtime paths, and the backup archive path is resolved in one place for the daemon, offline commands and the data migration. The old --database-path and a --state-root without a path are refused by name before any database is opened, so the command never falls back to the default state root.

    Fixes

    • Keep backups when the archive prune runs under ContainerArchive 0.7.0. The prune passed the most generous schedule retention as a repository-wide policy, which 0.6.x refused and 0.7.0 would have applied: it keeps one snapshot per calendar day, week or month across all services, so it would have deleted the snapshots of other services, of manual and of imported backups while their rows remained.
    • Refuse by name, as backup-archive-migration-required, a backup repository that is still in ContainerArchive's index/ layout when the archive is opened, instead of attempting to initialize a new repository over it. A non-empty repository path that can be neither opened nor inspected is refused as backup-archive-unreadable with both errors named.

    Maintenance

    • Update @serve.zone/containerarchive from 0.6.2 to 0.7.0 in package.json, pnpm-lock.yaml and the binary's deno.lock. Add the development dependency containerarchive-legacy-index, an npm alias of @serve.zone/containerarchive@0.6.2, which writes repositories in the index/ layout for the migration tests.
    Downloads