Repository navigation
feat: container image, Fly.io config and deploy workflow (D10) - #12
Merged
Merged
Conversation
- Dockerfile: static Go binary on distroless static-debian13:nonroot, non-root, /data owned by that user; both base images pinned by digest. Built and run locally the way Fly will run it: 9.97 MB, placeholders only to the model, audit verify OK on the volume, no values in logs. - CI job "Container image" builds and smoke-tests it on every PR. - fly.toml: Singapore, 256 MB shared machine that stops when idle, 1 GB volume, /healthz check, Fly-Client-IP for rate limits. Mock only: no upstream is ever configured (ADR 0009). - deploy.yml: from main only, skips without FLY_API_TOKEN, pinned flyctl action, smoke test against the live URL. - docs/DEPLOY.md: the one-time steps only Michael can do. README: live link (once deployed), three-minute demo path, five-minute quickstart. - Build log: merge-helper race (refused safely) and a zsh echo slip. Part of makoydev/vetted#40 (deployment waits for Michael's Fly account) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 5, 2026
makoydev
added a commit
that referenced
this pull request
Oct 5, 2026
- Dockerfile: static Go binary on distroless static-debian13:nonroot, non-root, /data owned by that user; both base images pinned by digest. Built and run locally the way Fly will run it: 9.97 MB, placeholders only to the model, audit verify OK on the volume, no values in logs. - CI job "Container image" builds and smoke-tests it on every PR. - fly.toml: Singapore, 256 MB shared machine that stops when idle, 1 GB volume, /healthz check, Fly-Client-IP for rate limits. Mock only: no upstream is ever configured (ADR 0009). - deploy.yml: from main only, skips without FLY_API_TOKEN, pinned flyctl action, smoke test against the live URL. - docs/DEPLOY.md: the one-time steps only Michael can do. README: live link (once deployed), three-minute demo path, five-minute quickstart. - Build log: merge-helper race (refused safely) and a zsh echo slip. Part of makoydev/vetted#40 (deployment waits for Michael's Fly account) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part of makoydev/vetted#40 (D10). Everything up to the deploy itself; the deploy needs Michael's Fly.io account (
docs/DEPLOY.md, about 10 minutes).static-debian13:nonroot, non-root, images pinned by digestaudit verify, no values in logs)sin, 256 MB shared, stops when idle, 1 GB volume,/healthzcheck,Fly-Client-IPfor rate limits. Mock only: no upstream ever configureddeploy.ymlfrommainonly; skips withoutFLY_API_TOKEN; smoke-tests the live URLdocs/DEPLOY.md(Michael's steps), README live link + 3-minute demo path + 5-minute quickstart, ADR 0009Evidence
nonroot:nonroot; the demo returnedMember <NRIC_1> on <PHONE_1>as what the model saw, upstream mock; page served with CSP;audit verifyOK inside the container on the volume; 0 planted values in the container logs.echomangling JSON in a local test).If asked in an interview
The public demo runs in a tiny container with no shell, as a non-root user, on one small machine in Singapore that sleeps when nobody's using it, so it costs well under a dollar a month. It's mock-only by construction: the configuration never points at a paid model, so nothing a visitor sends can cost money. Every pull request builds the exact image and runs it the way the host will, and every deploy ends by testing the live site. The one step I couldn't do is creating the hosting account, because that needs the owner's card.
🤖 Generated with Claude Code