From 2cbcaa93f79dfaebec182e511e8510a10a63c77b Mon Sep 17 00:00:00 2001 From: FosterStack Admin <317177128+fosterstack-admin@users.noreply.github.com> Date: Thu, 8 Oct 2026 20:23:02 -0400 Subject: [PATCH 1/2] Page: install a build cache on an air-gapped network --- air-gapped-build-cache-install/index.html | 134 ++++++++++++++++++++++ sitemap.xml | 4 + 2 files changed, 138 insertions(+) create mode 100644 air-gapped-build-cache-install/index.html diff --git a/air-gapped-build-cache-install/index.html b/air-gapped-build-cache-install/index.html new file mode 100644 index 0000000..01d5f75 --- /dev/null +++ b/air-gapped-build-cache-install/index.html @@ -0,0 +1,134 @@ + + + + + +Install a build cache on an air-gapped network + + + + + + + + +
+ +
Infrastructure worth keeping — and kept patched.
+
+
+

Install a build cache on an air-gapped network

+

The server is one static program with nothing to download at install time and nothing it reaches out for at startup. So an air-gapped install is short: move the files across, verify them, run.

+ +

What to bring across

+

On a machine with internet access, download these from the release page:

+ + +

Verify before you cross the gap

+

Do this on the connected side, where the signature check can reach its public log:

+
# 1. Prove the checksums file is ours
+cosign verify-blob \
+  --bundle checksums.txt.bundle \
+  --certificate-identity-regexp='^https://github.com/fosterstack/cache/' \
+  --certificate-oidc-issuer='https://token.actions.githubusercontent.com' \
+  checksums.txt
+
+# 2. Prove your archive matches it
+sha256sum -c <(grep "fscache_X.Y.Z_linux_amd64.tar.gz" checksums.txt)
+

Both steps matter. The checksum alone only shows the archive matches a file you carried beside it. The signature is what ties that file to us.

+ +

Install on the isolated side

+

For the binary: unpack the archive and follow the install guide from the unpack step, including the systemd service. There is no separate offline procedure.

+

For containers:

+
docker load -i fscache-X.Y.Z.tar
+docker run -d -p 127.0.0.1:8080:8080 -v fscache-data:/home/nonroot ghcr.io/fosterstack/cache:X.Y.Z
+

Put an HTTPS proxy in front of it before other machines use it. The offline install guide has the full detail, including what to do for later upgrades.

+ +

It does not call out

+

The server sends no telemetry and has no update or licence check, so it behaves the same with no route to the internet.

+ +

Related: how releases are built and signed and server sizing.

+
+ Gradle and Maven setup + FosterStack home +
+
+ + + diff --git a/sitemap.xml b/sitemap.xml index 8c1e470..1cd1ffe 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -16,4 +16,8 @@ weekly 1.0 + + https://fosterstack.com/air-gapped-build-cache-install/ + 2026-10-08 + From 962e86cef6233c6a759bf95c581846e3cf717012 Mon Sep 17 00:00:00 2001 From: FosterStack Admin <317177128+fosterstack-admin@users.noreply.github.com> Date: Thu, 8 Oct 2026 20:25:19 -0400 Subject: [PATCH 2/2] Air-gapped page: verify image before export; cite proxy reason --- air-gapped-build-cache-install/index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/air-gapped-build-cache-install/index.html b/air-gapped-build-cache-install/index.html index 01d5f75..0f3a50f 100644 --- a/air-gapped-build-cache-install/index.html +++ b/air-gapped-build-cache-install/index.html @@ -87,7 +87,7 @@

What to bring across

  • The archive for your platform, for example fscache_X.Y.Z_linux_amd64.tar.gz.
  • checksums.txt and checksums.txt.bundle, which is the signature over the checksums.
  • cosign, the signature checker. It is one static binary and will not be on a fresh isolated machine.
  • -
  • If you run containers: the image as a tar file, for example crane pull ghcr.io/fosterstack/cache:X.Y.Z fscache-X.Y.Z.tar. Images are published for both linux/amd64 and linux/arm64. Across a gap you pick one by hand, so pull on a machine of the destination type, or add --platform.
  • +
  • If you run containers: the image as a tar file, for example crane pull ghcr.io/fosterstack/cache:X.Y.Z fscache-X.Y.Z.tar. Verify the image with cosign verify before you export it, while you still have registry access (the image verification guide has the command). Images are published for both linux/amd64 and linux/arm64. Across a gap you pick one by hand, so pull on a machine of the destination type, or add --platform.
  • Verify before you cross the gap

    @@ -108,7 +108,7 @@

    Install on the isolated side

    For containers:

    docker load -i fscache-X.Y.Z.tar
     docker run -d -p 127.0.0.1:8080:8080 -v fscache-data:/home/nonroot ghcr.io/fosterstack/cache:X.Y.Z
    -

    Put an HTTPS proxy in front of it before other machines use it. The offline install guide has the full detail, including what to do for later upgrades.

    +

    Real deployments terminate HTTPS at a proxy in front of the server, because Gradle sends the password with every request. The offline install guide has the full detail, including what to do for later upgrades.

    It does not call out

    The server sends no telemetry and has no update or licence check, so it behaves the same with no route to the internet.