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:
+-
+
- The archive for your platform, for example
fscache_X.Y.Z_linux_amd64.tar.gz.
+ checksums.txtandchecksums.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. Verify the image withcosign verifybefore you export it, while you still have registry access (the image verification guide has the command). Images are published for bothlinux/amd64andlinux/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
+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
+ 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.
+ +Related: how releases are built and signed and server sizing.
+ +