diff options
| author | Doan Luu Duc Tai <doan@luuduct.ai> | 2026-11-01 08:25:58 -0600 |
|---|---|---|
| committer | Doan Luu Duc Tai <doan@luuduct.ai> | 2026-11-01 08:25:58 -0600 |
| commit | 607be5ee239a9b7969eab96145c8af4ee57053d1 (patch) | |
| tree | 582ada863d690ed8f113f266f2afc8252d421c39 /docs/GUIX.txt | |
| parent | 9349a2de648e241da8e00ba7ae25cb2a877ff3e9 (diff) | |
Diffstat (limited to 'docs/GUIX.txt')
| -rw-r--r-- | docs/GUIX.txt | 112 |
1 files changed, 50 insertions, 62 deletions
diff --git a/docs/GUIX.txt b/docs/GUIX.txt index 05aa572..89f4c9a 100644 --- a/docs/GUIX.txt +++ b/docs/GUIX.txt @@ -37,9 +37,8 @@ BUILD LOCAL binaries, browser assets and saved images. No compilation on recovery host. Podman info smoke test is not clean-host/container lifecycle proof. - Ordinary pack uses canonical /gnu/store. Former -RR wrapper creates one-ID - user namespace; privileged helpers cannot map host subordinate IDs there. - Builder's canonical store could bypass relocation and hide this defect. + Ordinary pack uses canonical /gnu/store. Relocatable -RR wrappers create a + one-ID user namespace incompatible with required subordinate UID mappings. https://guix.gnu.org/manual/devel/en/html_node/Invoking-guix-pack.html https://guix.gnu.org/manual/devel/en/html_node/Replicating-Guix.html https://raw.githubusercontent.com/containers/podman/main/docs/tutorials/rootless_tutorial.md @@ -48,7 +47,7 @@ MAKE CARRY FILE Production: create consistent encrypted export; copy and verify it locally: - ./bin/stack backup --include-images + ./bin/run backup --include-images Bundle a trusted freshly checked release with that export: @@ -132,23 +131,19 @@ CHECKS; DEPLOYMENT GATE No strict Rust/Clippy/Rustdoc, typed ESLint, LibreJS or crypto gate weakened. Existing documented lint/dependency exceptions remain unchanged. - Clean-host test exposed missing distro container signature policy. Image load - now supplies a temporary policy: reject by default; accept local Docker/OCI - archives only. Export supplies a separate temporary policy accepting only - containers-storage; registry transport remains rejected. Verified archive - manifests and architecture/layer/image-ID locks - still gate startup. Registry transport is not accepted by this load policy; - global host policy stays unchanged. Policies are generated by AGPL Rust code; - the foreign schema rejects comment/legal metadata, so no headerless source file - is added. The initial failed VM retained decrypted data and pending intent. - - A second clean-host check found legacy backups had collapsed Caddy's /data - and /config into one caddy/ tree. After manifest verification, backup restore - moves credentials into data/caddy and autosave into config/caddy; bytes and - permissions are retained. Conflicting old/new layouts are refused before - publishing a destination. New exports copy /data/. and /config/. separately. - - Before production, in order: + Image import supplies a temporary reject-by-default policy accepting local + Docker/OCI archives only. Export separately accepts containers-storage. + Manifest, architecture/layer/image-ID locks still gate startup; global host + policy stays unchanged. Generated protocol JSON cannot contain legal metadata; + its AGPL Rust generator carries the notice. POLICY.txt. + + Legacy backups may have a collapsed Caddy caddy/ tree. Verified backup restore + moves credentials to data/caddy and autosave to config/caddy, preserving bytes + and permissions. Conflicting layouts are refused before publication. Current + exports copy /data/. and /config/. separately. Keep this compatibility path + while retained backups depend on it. + + For each release, before production: 1. Full checked release with real Guix runtime and source/binary pair. 2. Fresh host without Guix/distro Podman/Git/GPG: offline bootstrap/restore; four services, exact images, detached UID/network helpers. @@ -160,48 +155,41 @@ CHECKS; DEPLOYMENT GATE 6. Fresh verified independent production backup; deploy only prebuilt release; verify public routes/state, retain prior release/runtime and encrypted export. - Rollback: stop new containers before old runtime binds production ports. - Keep .env/var/data; never delete closure entries used by running processes. - -VERIFIED — 2026-11-01 - - Offline KVM guest: official Debian 12 x86_64 image, no initial /gnu, Guix, - Podman, Git or GPG. Host supplies only documented kernel/account prerequisites. - Network restricted before bootstrap; readonly carry file plus separately - forwarded GPG agent; no private key copied. Bootstrap and one restore command - loaded four saved images and started all services without source builds. - - Strict HTTPS verified all four domains using original certificates; both WKD - routes matched the original key. All 651 immutable snapshot files matched - after legacy Caddy path normalization: 18 active TLS keys, 16 certificates. - All 126 release source/binary files matched. Original .env, owner fingerprint - and every canonical SQLite table matched. Production snapshot contained zero - conversations/messages; original real-message decryption therefore untestable. - Disposable Chromium/Firefox tests verified both participant identities, - 54-message history, encrypted snapshots/recovery and GNU LibreJS 7.21.1. - - Full local release gates passed live npm/Rust advisory checks, strict fmt, - Clippy, Rustdoc, typed ESLint and both TypeScript compilers; no suppressions. - Required OpenSSL 3.6.5 hybrid suites, protected OpenPGP v6 identity, wrong-pass - and tamper controls passed. Synthetic shell tests cover bootstrap collisions, - interrupted recovery/retry, lock exclusion and child descriptor closure. - - Runtime: 500687877 bytes, SHA256: + Retain a verified independent export and complete original worktree, + binary/launcher, installed unit, var/state.json, image-lock.json, images.tar + and engine storage. Activation replaces public source and image metadata. + Stop/cancel the new unit and stop Guix containers before rollback; confirm + inactivity before moving engine trees. Retain the new tree, restore old engine + path/metadata/worktree/launcher/unit and reload the user manager. For a Guix + rollback use the restored prior bin/run, which selects its matching runtime. + Only a host-tools release uses host PATH with Guix overrides unset. + Preserve CURRENT .env/var/data; never extract retained copies over live data. + Old releases do not remove newer Guix launcher/runtime files automatically. + Never delete store entries still used by retained/running tools. + +DEPLOYED BASELINE — 2026-11-01 + + Signed commit 9349a2d deployed packed Podman 5.7.0 and four rootless services. + Production .env, owner, every SQLite table and all 34 TLS key/certificate files + matched. All 126 release source/binary files, public HTTPS/WKD, search and + packed conmon paths verified. Only two ACME renewal retry timestamps changed. + + A fresh Debian 12 x86_64 KVM guest had no Guix/Podman/Git/GPG. Network was + restricted before readonly-carry bootstrap/restore; GPG used a restricted + forwarded agent, never a copied secret key. Restore, export/second recovery + and final VM reboot passed; all 651 immutable snapshot files matched. + Production-host reboot was not performed. The production database had zero + conversations/messages; real historical-message decryption was untestable. + Disposable browser tests recovered 54-message history with both identities; + Firefox GNU LibreJS 7.21.1 rejected its unlicensed control. + + Tested runtime SHA256: c5c7b849da152ee7a98b01602a1e91285ce4e3a80021a9cecb5f1e594dfc7810 - Guix channel 230aa373f315f247852ee07dff34146e9b480aec; 113 store entries. - Git 2.52.0, GnuPG 2.4.7, Podman 5.7.0, conmon 2.1.13, crun 1.25.1. - Empty helper lists force PATH lookup, selecting packed conmon/crun. Ordinary - host config stays unchanged. Rootless cleanup handles immutable user-owned - temporary trees without changing symlink targets or the published pack. + Its channel provenance is included in bin/guix-channels.scm. New source/packs + require their own checks. Empty helper lists select Guix tools through PATH; + ordinary host configuration stays unchanged. https://github.com/containers/podman/blob/v5.7.0/vendor/go.podman.io/common/pkg/config/config.go#L849-L875 https://github.com/containers/podman/blob/v5.7.0/cmd/podman/images/save.go#L91-L94 - Deployment gate above still applies to each carried artifact. Retain complete - original worktree, binary/launcher, installed user unit and engine storage - independently before activation. Reload the installed unit after switching to - bin/run. For rollback stop Guix containers first, retain their engine tree, - restore prior engine path, binary/launcher and unit; invoke prior activation - with host PATH and Guix CONTAINERS_CONF overrides unset. Keep current .env and - var/data. An old release alone does not remove a newer Guix launcher/runtime. - Private evidence: var/guix-*.log and .tools/guix-production/. These are ignored - and include private state hashes; do not publish them with public source. + Private evidence: var/guix-*.log and .tools/guix-production/; these include + private state hashes and stay ignored. Do not publish them with source. |
