Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
103 commits
Select commit Hold shift + click to select a range
533c5be
Page: migrate from Build Cache Node, Gradle and Maven setup
fosterstack-admin Oct 9, 2026
9e597fa
Page: Jenkins and CI build cache for Gradle and Maven
fosterstack-admin Oct 9, 2026
8a84ddc
Migrate page: localhost-only docker command, direct doc links
fosterstack-admin Oct 9, 2026
144be6c
Page: Build Cache Node replacement FAQ
fosterstack-admin Oct 9, 2026
987f851
FAQ: drop a chatty sentence
fosterstack-admin Oct 9, 2026
5078abe
Page: how FosterStack Cache is built and signed
fosterstack-admin Oct 9, 2026
b983dc2
How we build: drop the no-rebuild phrase pending the README conflict
fosterstack-admin Oct 9, 2026
24e61a6
Home: link the new pages from the notice and footer
fosterstack-admin Oct 9, 2026
ff61479
llms.txt: list the new guides; version line v0.2
fosterstack-admin Oct 9, 2026
e76ba88
Page: Gradle remote build cache not working
fosterstack-admin Oct 9, 2026
9357929
Page: what to check in a replacement build cache
fosterstack-admin Oct 9, 2026
4e8bdd9
How we build: published images are the tested digests, promoted witho…
fosterstack-admin Oct 9, 2026
8c50ab6
Page: long-term support for a build cache, what is supported today
fosterstack-admin Oct 9, 2026
814ca38
LTS page: say only what the policy says
fosterstack-admin Oct 9, 2026
44d3487
Page: how big a server does a build cache need
fosterstack-admin Oct 9, 2026
2cbcaa9
Page: install a build cache on an air-gapped network
fosterstack-admin Oct 9, 2026
60d4551
CI page: the server has a read-only login; say so
fosterstack-admin Oct 9, 2026
7a96f91
FAQ: read-only login exists
fosterstack-admin Oct 9, 2026
78ae476
Verify page: read-only login exists; cut reader assumption
fosterstack-admin Oct 9, 2026
92e336f
LTS: no paid-version implication
fosterstack-admin Oct 9, 2026
f2a0e13
How we build: Maven acceptance wording; drop scan-evidence bullet
fosterstack-admin Oct 9, 2026
a65d20e
Home + llms.txt: link all guides
fosterstack-admin Oct 9, 2026
a0574de
Page: Maven remote build cache setup
fosterstack-admin Oct 9, 2026
962e86c
Air-gapped page: verify image before export; cite proxy reason
fosterstack-admin Oct 9, 2026
4d4950b
CI page: a login, not the password
fosterstack-admin Oct 9, 2026
59b8df8
Home + llms.txt: link the Maven setup page
fosterstack-admin Oct 9, 2026
5716716
Page: security policy, plus /.well-known/security.txt
fosterstack-admin Oct 9, 2026
0d53895
Page: Gradle build cache with Docker Compose
fosterstack-admin Oct 9, 2026
a9c84eb
Page: Gradle build cache on Kubernetes
fosterstack-admin Oct 9, 2026
9dc72a4
Home + llms.txt: link compose, Kubernetes and security pages
fosterstack-admin Oct 9, 2026
a8e427f
Page: changelog, release notes v0.1.0 and v0.2.1 quoted
fosterstack-admin Oct 9, 2026
52008f5
Security page: drop the credit promise
fosterstack-admin Oct 9, 2026
8bf6193
Page: verify a container image signature with cosign
fosterstack-admin Oct 9, 2026
9fcbef4
Changelog: one plain line on what changed since v0.1.0, quoted from R…
fosterstack-admin Oct 9, 2026
37f68b2
Page: is a remote build cache safe, who can write to it
fosterstack-admin Oct 9, 2026
6424a32
Changelog: link the v0.1.0 commit list instead of quoting tool names;…
fosterstack-admin Oct 9, 2026
585eb99
Cache security page: wording nits
fosterstack-admin Oct 9, 2026
bd477b6
Owner cold-read edit: Maven stated without the in-progress hedge
fosterstack-admin Oct 9, 2026
5afd95a
Owner cold-read edit: Maven stated without the in-progress hedge
fosterstack-admin Oct 9, 2026
194d759
Owner cold-read edit: Maven stated without the in-progress hedge
fosterstack-admin Oct 9, 2026
a358596
Owner cold-read edit: Maven stated without the in-progress hedge
fosterstack-admin Oct 9, 2026
2e8d2e3
Owner cold-read edit: Maven stated without the in-progress hedge
fosterstack-admin Oct 9, 2026
0b77ad4
Owner cold-read edit: Maven stated without the in-progress hedge
fosterstack-admin Oct 9, 2026
8abf5e4
Home + llms.txt: Maven stated without the in-progress hedge (owner co…
fosterstack-admin Oct 9, 2026
2f533b4
How we build: Gradle and Maven acceptance tests (proved on the v0.2.1…
fosterstack-admin Oct 9, 2026
d4b3bff
Home: Security is the difference (v0.2.1 facts, each with evidence)
fosterstack-admin Oct 9, 2026
e59b25c
Migration guide: Security is the difference
fosterstack-admin Oct 9, 2026
2b3dec5
FAQ: what makes the security different
fosterstack-admin Oct 9, 2026
aa2ca99
Security section: Signed and verifiable / Supply chain groups, v0.2.1…
fosterstack-admin Oct 9, 2026
ae77288
Security section: Signed and verifiable / Supply chain groups, v0.2.1…
fosterstack-admin Oct 9, 2026
c3bd512
Security section: supply-chain practice items (7-day wait, hash-check…
fosterstack-admin Oct 9, 2026
0025935
Security section: supply-chain practice items (7-day wait, hash-check…
fosterstack-admin Oct 9, 2026
c9dfb2b
Owner cold-read edit: cut the "nobody runs it" line
fosterstack-admin Oct 9, 2026
b8c976d
Owner cold-read edit: cut the "nobody runs it" line
fosterstack-admin Oct 9, 2026
622c5aa
Owner cold-read edit: cut the "nobody runs it" line
fosterstack-admin Oct 9, 2026
24024af
Owner cold-read edit: cut the "nobody runs it" line
fosterstack-admin Oct 9, 2026
a7cfb78
Owner cold-read edit: cut the "nobody runs it" line
fosterstack-admin Oct 9, 2026
03ebc2c
Checklist page: seven questions in the meta description
fosterstack-admin Oct 9, 2026
1da8fe8
llms.txt: cut the "nobody runs it" sentence (owner cold-read edit)
fosterstack-admin Oct 9, 2026
6648b9a
Page: Verify a FosterStack Cache release yourself (every command run …
fosterstack-admin Oct 9, 2026
1d73134
Page: monitor a build cache with Prometheus and Grafana
fosterstack-admin Oct 9, 2026
9a7b5b5
Page: FIPS 140-3 build cache, run the FIPS image and confirm it
fosterstack-admin Oct 9, 2026
054f55f
Regulated page: security block, owner's Maven line, links to the veri…
fosterstack-admin Oct 9, 2026
66c0eab
Kubernetes page: answer the Helm question in the title and a section
fosterstack-admin Oct 9, 2026
8898676
Maven page: title matches the search phrase
fosterstack-admin Oct 9, 2026
82ff93c
FAQ: can it store data in S3 (no)
fosterstack-admin Oct 9, 2026
c58adb6
Regulated page: drop the tier description (unshipped); say paid suppo…
fosterstack-admin Oct 9, 2026
01efebb
Page: Gradle build cache HTTP status codes
fosterstack-admin Oct 9, 2026
372120b
Page: how to clear or reset a self-hosted Gradle build cache
fosterstack-admin Oct 9, 2026
9362544
Home + llms.txt: link the newer guides
fosterstack-admin Oct 9, 2026
7e3ae2c
Plain-HTTP wording: tested on Gradle 9.8.0, localhost name refused, 1…
fosterstack-admin Oct 9, 2026
e6d5c5a
Plain-HTTP wording: tested on Gradle 9.8.0, localhost name refused, 1…
fosterstack-admin Oct 9, 2026
d0cd33b
Page: Gradle build cache tutorial, see FROM-CACHE (real run)
fosterstack-admin Oct 9, 2026
f37189e
Maven page: working config (remote inside configuration, saveToRemote…
fosterstack-admin Oct 9, 2026
615e4c2
Migration guide: working Maven config (remote inside configuration, s…
fosterstack-admin Oct 9, 2026
e1921e4
Fold #20 (www/migrate-guide)
fosterstack-admin Oct 9, 2026
718c40e
Fold #21 (www/ci-runner-page)
fosterstack-admin Oct 9, 2026
74b6d7b
Fold #22 (www/faq-page)
fosterstack-admin Oct 9, 2026
590ca2b
Fold #23 (www/how-we-build)
fosterstack-admin Oct 9, 2026
b61a9f0
Fold #25 (www/gradle-cache-not-working)
fosterstack-admin Oct 9, 2026
b31aca0
Fold #26 (www/verify-replacement)
fosterstack-admin Oct 9, 2026
8626d69
Fold #27 (www/lts-explainer)
fosterstack-admin Oct 9, 2026
89993e8
Fold #28 (www/sizing)
fosterstack-admin Oct 9, 2026
4b361de
Fold #29 (www/air-gapped)
fosterstack-admin Oct 9, 2026
08ac88a
Fold #30 (www/maven-setup)
fosterstack-admin Oct 9, 2026
7aa4e9f
Fold #31 (www/security-policy)
fosterstack-admin Oct 9, 2026
1f5fb0b
Fold #34 (www/compose-page)
fosterstack-admin Oct 9, 2026
4691e9d
Fold #35 (www/kubernetes-page)
fosterstack-admin Oct 9, 2026
9055dfe
Fold #36 (www/changelog)
fosterstack-admin Oct 9, 2026
b1df1de
Fold #37 (www/verify-images-page)
fosterstack-admin Oct 9, 2026
951686e
Fold #38 (www/cache-poisoning)
fosterstack-admin Oct 9, 2026
fda7b3c
Fold #40 (www/verify-a-release)
fosterstack-admin Oct 9, 2026
e6c8334
Fold #42 (www/monitoring-page)
fosterstack-admin Oct 9, 2026
474dc2d
Fold #43 (www/fips-page)
fosterstack-admin Oct 9, 2026
12a12ca
Fold #45 (www/status-codes)
fosterstack-admin Oct 9, 2026
3f1f103
Fold #46 (www/reset-cache)
fosterstack-admin Oct 9, 2026
1788c89
Fold #47 (www/gradle-tutorial)
fosterstack-admin Oct 9, 2026
8d9fc63
Fold #24 (www/plumbing-links)
fosterstack-admin Oct 9, 2026
dfe8032
Fold #39 (www/maven-wording-home)
fosterstack-admin Oct 9, 2026
1c162a2
Fold #44 (www/regulated-refresh)
fosterstack-admin Oct 9, 2026
68197d0
Fold: private-report links point to /security/; every page linked fro…
fosterstack-admin Oct 9, 2026
6f5ad6c
Fold: cut the 'nobody is running it' sentence on the home page; v0.2 …
fosterstack-admin Oct 9, 2026
2029db1
Reset page: Kubernetes needs the claim re-created (tested on a throwa…
fosterstack-admin Oct 9, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .well-known/security.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
Contact: https://github.com/fosterstack/cache/security/advisories/new
Contact: https://github.com/fosterstack/www/security/advisories/new
Expires: 2027-10-08T00:00:00.000Z
Preferred-Languages: en
Canonical: https://fosterstack.com/.well-known/security.txt
Policy: https://fosterstack.com/security/
134 changes: 134 additions & 0 deletions air-gapped-build-cache-install/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Install a build cache on an air-gapped network</title>
<meta name="description" content="How to install a self-hosted Gradle and Maven build cache with no internet: what to download, how to verify the signature before the transfer, and how to run the binary or the container.">
<link rel="canonical" href="https://fosterstack.com/air-gapped-build-cache-install/">
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
<link rel="icon" href="/favicon.ico" sizes="any">
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
<style>
:root {
--bg: #ffffff; --fg: #16181d; --muted: #5b6472; --line: #e4e7ec;
--accent: #0d7a5f; --accent-fg: #ffffff; --card: #f6f8f9; --warn-bg: #fff7ed; --warn-line: #fdba74;
--mark: #0f4d66;
}
@media (prefers-color-scheme: dark) {
:root {
--bg: #101318; --fg: #e8eaf0; --muted: #98a2b3; --line: #262c36;
--accent: #2fbf95; --accent-fg: #08110e; --card: #171c23; --warn-bg: #241a10; --warn-line: #7c4a12;
--mark: #e8eaf0;
}
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
background: var(--bg); color: var(--fg);
font: 16px/1.6 system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
-webkit-font-smoothing: antialiased;
}
main { max-width: 44rem; margin: 0 auto; padding: 0 1.25rem 4rem; }
header.site { max-width: 44rem; margin: 0 auto; padding: 1.25rem; display: flex; align-items: baseline; gap: .6rem; }
.logo { font-weight: 700; font-size: 1.05rem; letter-spacing: -.01em; }
.logo span { color: var(--accent); }
.logo .mark { width: 1.2em; height: 1.2em; vertical-align: -.24em; margin-right: .4em; }
.tag { color: var(--muted); font-size: .85rem; }
.notice {
background: var(--warn-bg); border: 1px solid var(--warn-line); border-radius: 8px;
padding: .7rem 1rem; font-size: .92rem; margin: 1.5rem 0 2.5rem;
}
h1 { font-size: 2rem; line-height: 1.2; letter-spacing: -.02em; margin-bottom: 1rem; }
.lede { font-size: 1.12rem; color: var(--muted); margin-bottom: 2rem; }
h2 { font-size: 1.25rem; margin: 3rem 0 .9rem; letter-spacing: -.01em; }
p + p { margin-top: .8rem; }
.cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr)); gap: .8rem; margin-top: 1rem; }
.card { background: var(--card); border: 1px solid var(--line); border-radius: 10px; padding: 1rem 1.1rem; }
.card h3 { font-size: .98rem; margin-bottom: .35rem; }
.card p { font-size: .9rem; color: var(--muted); }
ul.trust { list-style: none; margin-top: .5rem; }
ul.trust li { padding: .45rem 0 .45rem 1.6rem; position: relative; }
ul.trust li::before { content: "✓"; position: absolute; left: .2rem; color: var(--accent); font-weight: 700; }
code, pre { font-family: ui-monospace, "SF Mono", Menlo, monospace; font-size: .88em; }
code { background: var(--card); border: 1px solid var(--line); border-radius: 5px; padding: .1em .35em; }
pre code { background: none; border: 0; padding: 0; color: inherit; font-size: 1em; }
button {
padding: .7rem 1.3rem; font-size: 1rem; font-weight: 600; cursor: pointer;
background: var(--accent); color: var(--accent-fg); border: 0; border-radius: 8px;
}
button:disabled { opacity: .6; cursor: default; }
table { width: 100%; border-collapse: collapse; font-size: .92rem; margin-top: 1rem; }
th, td { text-align: left; padding: .55rem .6rem; border-bottom: 1px solid var(--line); vertical-align: top; }
th { font-size: .8rem; text-transform: uppercase; letter-spacing: .04em; color: var(--muted); }
pre { background: #0f172a; color: #e2e8f0; padding: .9rem 1rem; border-radius: 8px;
overflow-x: auto; font-size: .9rem; line-height: 1.5; }
.cta-row { display: flex; gap: .6rem; flex-wrap: wrap; margin-top: 1.1rem; }
.btn { display: inline-block; padding: .55rem 1rem; border-radius: 8px; font-weight: 600;
text-decoration: none; background: var(--accent); color: #fff; }
.btn-secondary { background: transparent; color: inherit; border: 1px solid #cbd5e1; }
.muted-note { color: var(--muted); font-size: .93rem; margin-top: 1.1rem; }
footer { border-top: 1px solid var(--line); margin-top: 4rem; padding: 1.5rem 1.25rem 3rem; }
footer div { max-width: 44rem; margin: 0 auto; color: var(--muted); font-size: .82rem; }
a { color: var(--accent); }
</style>
</head>
<body>
<header class="site">
<div class="logo"><svg class="mark" viewBox="0 0 96 96" aria-hidden="true" focusable="false"><rect x="12" y="14" width="72" height="18" rx="5" fill="var(--mark)"/><rect x="12" y="39" width="48" height="18" rx="5" fill="var(--mark)"/><rect x="12" y="64" width="26" height="18" rx="5" fill="var(--accent)"/></svg>foster<span>stack</span></div>
<div class="tag">Infrastructure worth keeping — and kept patched.</div>
</header>
<main>
<h1>Install a build cache on an air-gapped network</h1>
<p class="lede">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.</p>

<h2>What to bring across</h2>
<p>On a machine with internet access, download these from the release page:</p>
<ul class="trust">
<li>The archive for your platform, for example <code>fscache_X.Y.Z_linux_amd64.tar.gz</code>.</li>
<li><code>checksums.txt</code> and <code>checksums.txt.bundle</code>, which is the signature over the checksums.</li>
<li><code>cosign</code>, the signature checker. It is one static binary and will not be on a fresh isolated machine.</li>
<li>If you run containers: the image as a tar file, for example <code>crane pull ghcr.io/fosterstack/cache:X.Y.Z fscache-X.Y.Z.tar</code>. Verify the image with <code>cosign verify</code> before you export it, while you still have registry access (the <a href="https://github.com/fosterstack/cache/blob/main/docs/verify-images.md">image verification guide</a> has the command). Images are published for both <code>linux/amd64</code> and <code>linux/arm64</code>. Across a gap you pick one by hand, so pull on a machine of the destination type, or add <code>--platform</code>.</li>
</ul>

<h2>Verify before you cross the gap</h2>
<p>Do this on the connected side, where the signature check can reach its public log:</p>
<pre><code># 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 &lt;(grep "fscache_X.Y.Z_linux_amd64.tar.gz" checksums.txt)</code></pre>
<p>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.</p>

<h2>Install on the isolated side</h2>
<p>For the binary: unpack the archive and follow the <a href="https://github.com/fosterstack/cache/blob/main/docs/install.md">install guide</a> from the unpack step, including the systemd service. There is no separate offline procedure.</p>
<p>For containers:</p>
<pre><code>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</code></pre>
<p>Real deployments terminate HTTPS at a proxy in front of the server, because Gradle sends the password with every request. The <a href="https://github.com/fosterstack/cache/blob/main/docs/offline-install.md">offline install guide</a> has the full detail, including what to do for later upgrades.</p>

<h2>It does not call out</h2>
<p>The server sends no telemetry and has no update or licence check, so it behaves the same with no route to the internet.</p>

<p class="muted-note">Related: <a href="/how-we-build/">how releases are built and signed</a> and <a href="/build-cache-server-sizing/">server sizing</a>.</p>
<div class="cta-row">
<a class="btn" href="/migrate-build-cache-node/">Gradle and Maven setup</a>
<a class="btn btn-secondary" href="/">FosterStack home</a>
</div>
</main>
<footer>
<div>
<p>FosterStack is not affiliated with, endorsed by, or sponsored by Gradle Inc.
"Gradle" and "Develocity" are trademarks of Gradle Inc., used here only to identify
compatibility. FosterStack contains no Gradle Inc. code; it is a clean-room implementation
of the documented remote build cache HTTP protocol. Apache Maven is a trademark of the
Apache Software Foundation; the Maven Build Cache Extension is Apache's project, not
ours.</p>
<p style="margin-top:.6rem">© 2026 FosterStack · <a href="/regulated/">For regulated markets</a> · <a href="https://github.com/fosterstack/cache">github.com/fosterstack/cache</a> · <a href="mailto:hello@fosterstack.com">hello@fosterstack.com</a></p>
</div>
</footer>
</body>
</html>
1 change: 1 addition & 0 deletions bin/check-file-allowlist.sh
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ ALLOW_PATTERNS=(
'^favicon-(16|32)\.png$'
'^apple-touch-icon\.png$'
'^\.gitignore$'
'^\.well-known/security\.txt$'
'^\.githooks/pre-commit$'
'^bin/check-file-allowlist\.sh$'
'^\.github/workflows/[A-Za-z0-9._-]+\.ya?ml$'
Expand Down
2 changes: 1 addition & 1 deletion build-cache-node-end-of-life/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ <h3>Small, quiet and patched</h3>
<li><strong>Tiny and quiet.</strong> A distroless image with one static program and no shell. It sends no telemetry and makes no outbound connections.</li>
<li><strong>A FIPS build.</strong> A FIPS variant uses Go's validated FIPS 140-3 cryptographic module.</li>
<li><strong>Patched for everyone.</strong> We aim to ship dependency fixes within 48 hours of disclosure. That is a target, not a promise. Security patches are never withheld from the free tier.</li>
<li><strong>Report a problem privately.</strong> Use <a href="https://github.com/fosterstack/cache/security/advisories/new">GitHub's private vulnerability report</a>.</li>
<li><strong>Report a problem privately.</strong> See the <a href="/security/">security policy</a>.</li>
</ul>

<h2>Next step</h2>
Expand Down
Loading
Loading