Skip to content

docs: the production stack has now actually been run - #285

Merged
AKogut merged 1 commit into
mainfrom
docs/production-stack-verified
Aug 18, 2026
Merged

docs: the production stack has now actually been run#285
AKogut merged 1 commit into
mainfrom
docs/production-stack-verified

Conversation

@AKogut

@AKogut AKogut commented Aug 18, 2026

Copy link
Copy Markdown
Owner

deploy/compose shipped verified only by docker compose config — I had checked that it parses and that exactly two ports publish, and the README said artifact upload was unproven. That was honest and is no longer true.

Brought the whole thing up behind Caddy on local hostnames and checked every claim it makes.

Claim Result
Only the proxy is exposed caddy 0.0.0.0:80, 0.0.0.0:443; Postgres and MinIO show internal ports only; api/web/worker publish nothing
Both apps answer /health {"service":"api"} and {"service":"web"}, each on its own hostname
The object store refuses unsigned requests 403 AccessDenied
Artifacts round-trip presign → PUT 200 → presigned GET 200 → EXACTLY12BY back

The /health result is the concrete justification for a design decision I had only argued for in prose: the two apps return different bodies on the same path. Collapsing them onto one hostname with path routing would have shadowed one of them, and flakemetry doctor probes exactly that path to tell an unreachable endpoint from a rejected token.

Something nobody had written down

The first round-trip attempt returned 403 on the upload. Not a misconfiguration — a presigned upload is bound to the size it was issued for, and my second test file was 18 bytes against a grant for 12.

So a presign is a bounded grant rather than an open write: a URL issued for a screenshot cannot be spent on a gigabyte. Both the deploy README and the runbook now say so, because a bare 403 reads as "something is broken" to whoever is deploying, and here it is the limit working.

What local testing cannot cover

Certificate issuance. Caddy uses an internal certificate for a .localhost name and only talks to Let's Encrypt for a real domain, so the "point DNS at the host before the first start" instruction stays — and now says why rather than just asserting it.

Docs only; 62/62 turbo tasks unchanged.

deploy/compose shipped verified only by `docker compose config`. The README said
artifact upload was unproven, which was honest and is no longer true.

Brought the whole stack up behind Caddy on local hostnames and checked what it
claims: only 80 and 443 published, Postgres and MinIO reachable only inside the
network, both apps answering /health on their own hostnames with different
bodies — which is the concrete reason they are separate hostnames rather than
paths — the object store refusing an unsigned GET, and an artifact surviving a
presign, a PUT and a presigned GET with the same bytes.

One property nobody had written down turned up on the way. A presigned upload
is bound to the size it was issued for: a body larger than the declared
sizeBytes is refused with 403. That is a grant for a screenshot being unable to
carry a gigabyte, and it is worth reading as the limit working rather than as a
misconfiguration, which is what a bare 403 usually means to someone deploying.

Certificate issuance is the one thing local testing cannot cover — Caddy uses an
internal certificate for a .localhost name — so the DNS-first instruction stays,
and now says why.
@AKogut
AKogut merged commit 4b8e868 into main Aug 18, 2026
5 checks passed
@AKogut
AKogut deleted the docs/production-stack-verified branch August 18, 2026 12:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant