Commit Graph

2 Commits

Author SHA1 Message Date
Ken Eucker d5d2301679 feat(install): --use-local-images so a bundle can carry an unreleased build
management_compose.yaml pins the published Command Center image and the
builder pulls it unconditionally, so a bundle always carries the *released*
admin application. That makes an admin-side change impossible to test on an
air-gapped target until it ships in an image — including the Easy Setup
offline fixes in this branch.

With --use-local-images, an image already in the daemon is bundled as-is.
Anything not present locally is still pulled, so the flag cannot quietly
produce a bundle with a gap in it. It is opt-in because it deliberately does
not verify that a local image resembles the tag it claims.

Bundles built this way record USED_LOCAL_IMAGES=1 in the manifest and carry a
"not for distribution" note in README.txt. The manifest is read key-by-key by
the installer, so the added key needs no format bump.

The docker wrapper forwards the flag through its existing catch-all, and
`docker image inspect` inside the build container resolves against the host
daemon via the mounted socket, so host-built images are visible.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-15 20:19:27 -07:00
Ken Eucker 40ee026938 feat(install): add offline artifact installation mode
A normal install needs the internet: the installer fetches Docker from
get.docker.com, host packages from APT, container images from registries,
and its own helper scripts from GitHub. That leaves no way to provision a
machine that has no connectivity, or to rebuild one after connectivity is
gone.

Artifact mode closes that bootstrap gap without adding a second installer.
install_nomad.sh gains --artifacts <dir> (and NOMAD_ARTIFACT_PATH); with no
such argument it behaves exactly as before. When a bundle is selected every
dependency comes from that bundle and the installer is fail-closed: it
never falls back to the network, and a missing input is an error.

build_offline_bundle.sh prepares a bundle on a connected machine from a
source checkout, resolving the package closure and discovering images from
management_compose.yaml rather than hardcoding them, so the bundle tracks
the compose file. build_offline_bundle_docker.sh wraps it so the build only
needs Docker on the host. verify_offline_bundle.sh inspects a bundle before
transfer; capture_installed_images.sh exports images from a populated host.

APT is isolated to a bundle-local file: repository so package installation
cannot resolve through a configured remote, image archives are loaded from
disk, and Compose starts with pulls disabled via a generated override that
leaves the canonical management compose file untouched.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-14 14:17:03 -07:00