Skip to content

docs: split local-dev quickstart from cluster deployment guide; add auth demo video - #97

Merged
dev-dull merged 3 commits into
mainfrom
docs/deploy-guide-and-local-dev
Jul 29, 2026
Merged

docs: split local-dev quickstart from cluster deployment guide; add auth demo video#97
dev-dull merged 3 commits into
mainfrom
docs/deploy-guide-and-local-dev

Conversation

@dev-dull

@dev-dull dev-dull commented Jul 29, 2026

Copy link
Copy Markdown
Owner

Why

The README's "Quick Start" conflated two very different audiences: its prerequisites listed local-dev tooling (Docker, k3d) yet step 2 was a production helm install oci://…. A homelabber trying to deploy SUS and a developer trying to hack on SUS were reading the same muddled section.

What changed

  • Quick Start (local development) — now explicitly the make dev / k3d path for evaluating and developing SUS itself. Prerequisites trimmed to the local-dev toolchain; adds a git clone → make dev → port-forward flow and notes that an Anthropic key (via /setup) is only needed to actually build in a session.
  • New Deploying to Kubernetes section — the real deployment story for running SUS on an existing cluster (homelab k3s or managed EKS/GKE/AKS):
    • Prerequisites (a cluster, Helm, an ingress controller with WebSocket support, DNS, an Anthropic key)
    • Fork the starter pack → helm install from GHCR (+ a <details> for building/pushing your own images)
    • Expose it (Ingress) and Authentication (Authelia) — folded in from the old Configuration subsections, since they were deployment concerns, not config reference. Content is preserved verbatim (nginx/Traefik snippets, trusted-proxy hardening, user management).
    • First-run /setup and "build your first app".
  • Demo — adds the second promo video, "Single Use Software (SUS) Demo -- Auth!", alongside the original build demo.
  • Cross-links fixed — the Configuration table now points at the new deploy subsections; the stale #ingress anchor is gone.

Verification

  • All internal anchors resolve to real headings (#deploying-to-kubernetes, #3-expose-it-ingress, #authentication-authelia, #makefile-targets, #quick-start-local-development).
  • Both video IDs embed correctly (thumbnail + watch link).
  • No content dropped — the auth/ingress guidance moved sections but is otherwise unchanged.

Docs-only; no code or chart changes.

🤖 Generated with Claude Code


Update: kept the heading as Authentication (Authelia) (not renamed) so the existing values.yaml/NOTES.txt cross-references stay valid; the review's port and registry-override findings are addressed in follow-up commits.

… demo video

The Quick Start conflated two audiences: its prerequisites (Docker, k3d)
were local-dev tooling, yet it led with a production 'helm install
oci://...'. Split them:

- 'Quick Start (local development)' is now explicitly the make-dev/k3d
  path for evaluating and developing SUS itself.
- New 'Deploying to Kubernetes' section covers running SUS for real on an
  existing cluster: prerequisites, Helm install, ingress exposure,
  first-run setup, and optional Authelia auth (folded in from the old
  Configuration subsections, which were really deployment concerns).

Also add the second promo video (Authelia auth demo) to the Demo section,
and fix cross-links (Configuration now points at the deploy subsections).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Jul 29, 2026

Copy link
Copy Markdown

Claude finished @dev-dull's task in 1m 28s —— View job


Review: docs restructure (README split)

  • Read PR diff and repo context
  • Verify anchors, links, and commands against Makefile / charts/sus/values.yaml
  • Post review

The split is the right call — the old "Quick Start" really was two audiences in one section, and separating make dev from the GHCR/Helm path fixes that. No chart or code changes, so nothing to render or re-test on the security/trust-boundary side.

Verified against the repo:

  • All five internal anchors resolve to real headings (#deploying-to-kubernetes, #3-expose-it-ingress, #authentication-optional, #makefile-targets, #quick-start-local-development), and the stale #ingress link is gone. No other file in the repo links to a heading this PR renamed.
  • buildPod.image.repository / buildPod.image.tag are real values in charts/sus/values.yaml — the added --set lines are correct, and this actually fixes a gap in the old block, which only overrode the landing image.
  • "The catalog works out of the box against the public starter pack" is accurate: GIT_REPO_URL ?= .../sus-starter-pack.git in the Makefile, passed through by make deploy.
  • Switching the ingress/auth examples from helm install ./charts/sus to helm upgrade oci://... (with gitRepo.url carried through) is correct — the old snippets would have wiped gitRepo.url on upgrade.
  • Auth/ingress prose moved intact; nothing dropped.

Two findings, both posted inline:

  1. make build push in the "build your own images" block won't do what the text says (README.md:85-97) — the Makefile hardcodes REGISTRY := localhost:5050, so it pushes to the k3d-local registry while the helm install below points at your-registry/...ImagePullBackOff. := means an env var can't override it; needs make build push REGISTRY=your-registry. Suggestion included. This is the one I'd fix before merge.
  2. Port mismatch (minor) (README.md:48) — README says 9090:80, but make dev prints an 8080:80 hint on completion.

Out-of-diff nit, no action needed here: charts/sus/values.yaml:85 points readers at the README's "Authentication (Authelia)" section, which this PR renames to Authentication (optional). Worth a one-word touch-up whenever that file is next edited.

Otherwise this reads well and I'd merge it after #1.
• branch docs/deploy-guide-and-local-dev

Comment thread README.md
Comment on lines +85 to 97
To run images you've built yourself (e.g. from a fork), push them to a registry your cluster can pull from and point the chart at them:

```bash
git clone https://github.com/dev-dull/single-use-software.git
cd single-use-software
make build push
make build push # builds the landing + build-pod images
helm install sus ./charts/sus \
--set landing.image.repository=your-registry/sus-landing \
--set landing.image.tag=dev \
--set buildPod.image.repository=your-registry/sus-build \
--set buildPod.image.tag=dev \
--set gitRepo.url=https://github.com/you/sus-starter-pack.git
```

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

make build push won't produce images at your-registry/... — the Makefile hardcodes the local k3d registry:

REGISTRY := localhost:5050
LANDING_IMAGE := $(REGISTRY)/sus-landing
BUILD_POD_IMAGE := $(REGISTRY)/sus-build
TAG := dev

So following this block as written builds/pushes localhost:5050/sus-landing:dev (and push fails outright on a machine without the k3d registry running), then installs a chart pointing at your-registry/sus-landing:dev, which was never pushed → ImagePullBackOff.

Because these are :=, an env var won't override them either — it has to be a make command-line assignment:

Suggested change
To run images you've built yourself (e.g. from a fork), push them to a registry your cluster can pull from and point the chart at them:
```bash
git clone https://github.com/dev-dull/single-use-software.git
cd single-use-software
make build push
make build push # builds the landing + build-pod images
helm install sus ./charts/sus \
--set landing.image.repository=your-registry/sus-landing \
--set landing.image.tag=dev \
--set buildPod.image.repository=your-registry/sus-build \
--set buildPod.image.tag=dev \
--set gitRepo.url=https://github.com/you/sus-starter-pack.git
```
To run images you've built yourself (e.g. from a fork), push them to a registry your cluster can pull from and point the chart at them:
```bash
git clone https://github.com/dev-dull/single-use-software.git
cd single-use-software
make build push REGISTRY=your-registry TAG=dev # builds + pushes the landing and build-pod images
helm install sus ./charts/sus \
--set landing.image.repository=your-registry/sus-landing \
--set landing.image.tag=dev \
--set buildPod.image.repository=your-registry/sus-build \
--set buildPod.image.tag=dev \
--set gitRepo.url=https://github.com/you/sus-starter-pack.git

(Nice catch adding the `buildPod.image.*` overrides, by the way — the old block only set `landing.image.*`, so build pods silently ran the GHCR image.)

Comment thread README.md
git clone https://github.com/dev-dull/single-use-software.git
cd single-use-software
make dev # creates a k3d cluster, builds images from source, and deploys the chart
kubectl port-forward -n sus svc/sus-landing 9090:80

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor: make dev finishes by printing its own hint using port 8080:

SUS is running. Access the landing page:
  kubectl port-forward -n sus svc/sus-landing 8080:80

Both work, but now that this is the headline local-dev path, a user copying the README and then reading the terminal output gets two different ports. Worth making them agree (either port is fine — the Makefile echo is the easier one to change if 9090 is deliberate to avoid clashing with the ttyd port).

…ort, auth anchor

Addresses the auto-review findings on #97:

1. The 'build your own images' snippet ran 'make build push', but the
   Makefile hardcodes REGISTRY := localhost:5050 (immediate assignment),
   so it would build/push to the k3d-local registry while the helm install
   pointed at your-registry/... -> ImagePullBackOff. Pass the override as a
   make command-line assignment: 'make build push REGISTRY=your-registry
   TAG=dev' (verified it resolves your-registry/sus-{landing,build}:dev).

2. 'make dev' echoed a 'port-forward ... 8080:80' hint, but host 8080 is
   already taken by the k3d loadbalancer (k3d.yaml maps 8080:80), and the
   README uses 9090. Point the Makefile echo at 9090 so they agree and the
   hint actually works.

3. Renamed the README auth heading back to 'Authentication (Authelia)'
   (optional-ness is already clear in the prose) so the existing references
   in charts/sus/values.yaml and templates/NOTES.txt still resolve; updated
   the two internal links to match.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Jul 29, 2026

Copy link
Copy Markdown

Claude finished @dev-dull's task in 2m 44s —— View job


Review: docs restructure (round 2)

  • Read the new commit and full PR diff
  • Verify the two prior findings are actually resolved
  • Re-check anchors, commands, and values against Makefile / charts/sus/values.yaml / k3d.yaml
  • Post review

Both findings from the last round are fixed. Docs-only plus a one-line Makefile echo change — no chart or code changes, so nothing to render or re-test on the trust-boundary side.

Prior findings — verified resolved:

  1. Registry override (README.md:90) — now make build push REGISTRY=your-registry TAG=dev. This is correct: GNU make discards the makefile's REGISTRY := localhost:5050 assignment when the variable is set on the command line, so the later LANDING_IMAGE := $(REGISTRY)/sus-landing / BUILD_POD_IMAGE := ... expand against your-registry. Both images get built, pushed, and overridden in the helm install.
  2. Port mismatch — resolved by changing the Makefile echo to 9090:80 rather than the README. That's the better direction than I realized: k3d.yaml:13 already binds host port 8080 to the loadbalancer, so the old 8080:80 port-forward hint would have failed with address already in use on a fresh make dev. This is a real fix, not just a consistency touch-up.
  3. values.yaml anchor (my out-of-diff nit last round) — moot. The heading stayed Authentication (Authelia), so charts/sus/values.yaml:85's reference to the README "Authentication (Authelia)" section is still accurate. (The PR description says the section was renamed to "Authentication (optional)" — it wasn't, and keeping the old name is the right call. Worth editing the description before merge so it doesn't mislead.)

Re-verified after the new commit:

  • All six internal anchors resolve to real headings: #deploying-to-kubernetes (:57), #makefile-targets (:268), #authentication-authelia (:144, ×2), #3-expose-it-ingress (:100), #quick-start-local-development (:31). No stale #ingress link, and no other file in the repo links to a heading this PR renamed.
  • landing.image.* and buildPod.image.* are real paths in charts/sus/values.yaml (:10-12, :34-36).
  • Every target named in the Makefile Targets blurb (build/push/upgrade/teardown) exists.
  • Auth and ingress prose moved intact; nothing dropped.

One finding, posted inline (README.md:90, non-blocking): a reader who follows the "build your own images" <details> block then hits 3. Expose it (Ingress), whose helm upgrade sus oci://ghcr.io/… snippet drops the four image overrides and switches chart sources — so the next upgrade silently reverts to the GHCR images. Same class as the gitRepo.url footgun this PR already fixed; one sentence in the details block closes it. Fix this →

Out-of-diff, no action needed here: README.md:216 tells operators using a non-Authelia proxy to set auth.enabled=false … and set auth.trustedProxies. That combination is inert — charts/sus/templates/landing-config.yaml is gated on auth.enabled, so with it false the ConfigMap and SUS_CONFIG_PATH are never rendered and the landing app never switches to proxy-header identity. It fails closed (headers ignored → anonymous) rather than open, so it's not a security hole, but the BYO-proxy path isn't actually reachable through chart values today. Pre-existing text, unchanged by this PR — worth a separate issue.

Structure-wise this reads much better than the old single Quick Start. LGTM to merge; the inline note is optional polish.
• branch docs/deploy-guide-and-local-dev

Comment thread README.md
git clone https://github.com/dev-dull/single-use-software.git
cd single-use-software
make build push
make build push REGISTRY=your-registry TAG=dev # builds + pushes the landing and build-pod images

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The REGISTRY= fix is right — GNU make discards the makefile's REGISTRY := localhost:5050 when the variable is set on the command line, so the later LANDING_IMAGE := $(REGISTRY)/sus-landing expands to your-registry/sus-landing. Both images now get pushed and overridden. 👍

One leftover of the same class you just fixed for gitRepo.url: a reader who takes this path lands on 3. Expose it (Ingress), whose snippet is

helm upgrade sus oci://ghcr.io/dev-dull/charts/sus \
  --set gitRepo.url=... --set ingress.enabled=true ...

That switches the chart source back to the OCI chart and drops the four landing.image.* / buildPod.image.* overrides, so the next upgrade silently reverts to the GHCR images. One sentence closes it:

Suggested change
make build push REGISTRY=your-registry TAG=dev # builds + pushes the landing and build-pod images
make build push REGISTRY=your-registry TAG=dev # builds + pushes the landing and build-pod images

…with a note added after the closing fence, e.g.:

If you go this route, carry the --set landing.image.* / --set buildPod.image.* flags (and ./charts/sus instead of the OCI URL) through the helm upgrade commands in the sections below — otherwise the next upgrade reverts to the GHCR images.

Non-blocking; the mainline GHCR path is unaffected.

Addresses the #97 re-review's one non-blocking finding: a reader who
builds their own images then follows the Ingress/Authentication
'helm upgrade oci://...' snippets would drop the --set image overrides
and revert to the GHCR images — same class as the gitRepo.url footgun.
Add a one-line note to the 'build your own images' block.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Jul 29, 2026

Copy link
Copy Markdown

Claude finished @dev-dull's task in 1m 12s —— View job


Review: docs restructure (round 3)

  • Read the new commit (1833aba) and full PR diff
  • Verify the round-2 finding is resolved
  • Re-check anchors, commands, and values against Makefile / charts/sus/values.yaml / k3d.yaml
  • Post review

The round-2 finding is fixed and I found nothing new. Still docs-only plus the one-line Makefile echo — no chart or code changes, so there's nothing to render or re-test on the trust-boundary side.

Prior finding — verified resolved:

1833aba adds the note after the "build your own images" block (README.md:98). It closes the gap correctly and covers both halves of the footgun: carrying the --set landing.image.* / --set buildPod.image.* flags and substituting ./charts/sus for the oci://… URL, with links to the two helm upgrade snippets it applies to (Ingress, Authentication). Both of those anchors resolve.

Re-verified across the full PR:

  • Anchors — all 8 internal links resolve to real headings: #deploying-to-kubernetes (:57), #makefile-targets (:270), #authentication-authelia (:146, ×4), #3-expose-it-ingress (:102, ×3), #quick-start-local-development (:31). No stale #ingress link, and no other file in the repo links to a heading this PR renamed.
  • Port changek3d.yaml:13 binds host 8080:80 to the loadbalancer, so the old 8080:80 port-forward hint would have collided on a fresh make dev. 9090 appears nowhere else in the repo, so no new conflict, and the README and Makefile echo now agree.
  • Registry overridemake build push REGISTRY=your-registry TAG=dev is correct; a command-line assignment overrides the makefile's REGISTRY := localhost:5050, so LANDING_IMAGE/BUILD_POD_IMAGE expand against your-registry.
  • Chart valueslanding.image.repository/.tag (charts/sus/values.yaml:9-12) and buildPod.image.repository/.tag (:33-36) are real paths; every Makefile target named in the Makefile Targets blurb exists.
  • values.yaml:85 — its reference to the README "Authentication (Authelia)" section is still accurate; the heading kept its name.
  • Auth and ingress prose moved intact; nothing dropped. Both video IDs are well-formed.

One housekeeping item before merge (not a code issue): the PR description says the auth section was renamed to "Authentication (optional)" and lists #authentication-optional under Verification. It wasn't renamed — the heading is still ### Authentication (Authelia), which is the right call since charts/sus/values.yaml:85 points at that name. Worth editing the description so it doesn't mislead.

Out-of-diff, no action needed here (repeating from round 2 so it isn't lost): README.md:216 tells operators using a non-Authelia proxy to set auth.enabled=false and auth.trustedProxies. That combination is inert — charts/sus/templates/landing-config.yaml is gated on auth.enabled, so with it false the ConfigMap and SUS_CONFIG_PATH never render and the landing app never switches to proxy-header identity. It fails closed (headers ignored → anonymous), so not a security hole, but the BYO-proxy path isn't reachable through chart values today. Pre-existing text, untouched by this PR — worth a separate issue.

LGTM. No blocking findings.
• branch docs/deploy-guide-and-local-dev

@dev-dull
dev-dull merged commit 38af2cd into main Jul 29, 2026
1 check passed
@dev-dull
dev-dull deleted the docs/deploy-guide-and-local-dev branch July 29, 2026 17:58
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