Commit graph

44 commits

Author SHA1 Message Date
fluxcdbot
2337bc4dbf chore(hello-app): auto-update image
git.boglabob.com/codegit/hello-app:main-eeb92c5-1788522079
2026-09-04 11:41:27 +00:00
eeb92c5b28 content: tweak hero tagline wording
All checks were successful
build-hello-app / build-and-push (push) Successful in 31s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y4YNpuC2bgT224suQLLJ7B
2026-09-04 12:41:01 +01:00
9d772f68d2 docs: document the ImageUpdateAutomation namespace-scoping requirement
Cross-referencing image-automation.yaml's own comment explaining the
namespace-matching bug that caused Setters to silently no-op for hours
of investigation - worth calling out in the walkthrough itself since it
fails with no error at all, just an endless "repository up-to-date".

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y4YNpuC2bgT224suQLLJ7B
2026-09-04 12:27:06 +01:00
k3s kubernetes
10846d1082 fix: root-cause Flux Setters silent no-op - namespace mismatch
ImageUpdateAutomation only lists ImagePolicy objects in its own
namespace (image-automation-controller's getPolicies() scopes the
List() to obj.Namespace, confirmed by reading v1.2.4 source) - the
$imagepolicy marker's namespace:name is only used to match against
that pre-filtered list, not to broaden the search. Our
ImageUpdateAutomation lived in flux-system while its ImagePolicy
lived in hello-app, so the policy was invisible and Setters always
found zero markers to update ("repository up-to-date" forever),
regardless of correct marker syntax/RBAC/policy resolution.

Moved ImageUpdateAutomation into the hello-app namespace (alongside
its ImagePolicy), keeping a cross-namespace sourceRef back to the
flux-system GitRepository. Also fixed the commit messageTemplate,
which used the removed .Updated field (v1.2.4 requires .Changed).

Verified live: Flux pushed commit 0273f15 updating deployment.yaml's
tag on its own, and the cluster rolled out that image without any CI
involvement. Removed the update-deployment-tag CI workaround job
accordingly - it's redundant now and would otherwise race with
Flux's own commits.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GJNvvV3RrvX6TRZGAKEUeY
2026-09-04 12:05:43 +01:00
fluxcdbot
0273f15f06 chore(hello-app): auto-update image
git.boglabob.com/codegit/hello-app:main-b7b929d-1788518841
2026-09-04 11:04:27 +00:00
b7b929d202 ci: retrigger hello-app build to test CI-side tag commit
Some checks failed
build-hello-app / build-and-push (push) Successful in 31s
build-hello-app / update-deployment-tag (push) Failing after 19s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y4YNpuC2bgT224suQLLJ7B
2026-09-04 11:47:02 +01:00
f62dac1b7c ci: commit the image tag directly from CI instead of relying on Flux Setters
ImageUpdateAutomation's Setters strategy never actually commits despite a
verified-correct $imagepolicy marker, correct ImagePolicy resolution, and
a from-scratch Flux bootstrap against a fresh controller - root cause
unresolved after extensive investigation. Add a second job that commits
the built tag straight to deployment.yaml using git (the kaniko image has
no git/node, hence the separate alpine/git container), passing the tag
via job outputs from the build step. ImageRepository/ImagePolicy stay in
place for visibility into available tags even though nothing consumes
their resolution anymore.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y4YNpuC2bgT224suQLLJ7B
2026-09-04 11:46:51 +01:00
fd905cd3bc debug: clean up Setters investigation debris
Remove the throwaway setter-test.yaml and revert update.path to
./apps/hello-app. Root cause of ImageUpdateAutomation never committing a
tag update remains unresolved after exhausting marker syntax, path
scoping, field structure, namespace placement, RBAC, and version
compatibility as candidates - all checked out fine individually. Moving
on to docs/04-tofu.md; may retest after Flux gets a fresh bootstrap
against the new cluster there.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y4YNpuC2bgT224suQLLJ7B
2026-09-04 11:40:13 +01:00
a22034d81d debug: test same-namespace ImagePolicy for Setters resolution
Every official Flux example uses the same namespace for ImagePolicy and
ImageUpdateAutomation; our setup splits them (ImagePolicy in hello-app,
ImageUpdateAutomation in flux-system). Testing whether that cross-namespace
split is the actual blocker, despite being documented as supported.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y4YNpuC2bgT224suQLLJ7B
2026-09-04 11:34:07 +01:00
3970d6acfc debug: add minimal flat test file for Setters diagnosis
Isolating whether Setters can find/update anything at all in this repo,
independent of the Deployment's nested containers[].image structure -
throwaway, will be removed once resolved.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y4YNpuC2bgT224suQLLJ7B
2026-09-04 11:21:08 +01:00
99b6178a88 debug: test ImageUpdateAutomation with repo-root update.path
Diagnostic change - narrower ./apps/hello-app path never found anything
to update despite a byte-verified-correct marker, matching ImagePolicy
resolution, and no RBAC/duplicate-resource issues. Testing whether the
nested path itself is the problem before looking further.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y4YNpuC2bgT224suQLLJ7B
2026-09-04 11:14:45 +01:00
cd87435d8e fix: move Flux image-automation marker to a trailing comment
The $imagepolicy marker was on the line above image:, not a trailing
comment on that line. Flux's Setters strategy attaches YAML comments to
the node on their own line, so a marker on a preceding line never
associates with the field below it - the marker silently matched nothing,
which is why ImageUpdateAutomation logged "repository up-to-date" on
every reconcile regardless of what ImagePolicy resolved to, and never
once committed a tag update despite two successful image builds.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y4YNpuC2bgT224suQLLJ7B
2026-09-04 10:59:25 +01:00
b3da26e337 docs+ui: explain why podinfo/hello share a Caddy target; genericize hero copy
All checks were successful
build-hello-app / build-and-push (push) Successful in 32s
docs/03-flux.md: clarify that podinfo/hello-app pointing at the same
<VM_IP> in Caddy isn't a routing choice - there's only one VM right now,
doubling as both control plane and workload node, and Traefik is what
actually does per-hostname routing once the request lands there.

index.html: drop the specific "Dell T630" hardware reference from the
public-facing tagline in favor of a generic "Home server".

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y4YNpuC2bgT224suQLLJ7B
2026-09-04 10:48:17 +01:00
a803eda2c0 docs: fix podinfo/hello-app CNAME target to match actual DNS pattern
An earlier commit (22acad8) pointed these at git.boglabob.com under the
assumption it was a canonical alias target for the server. Checking the
real zone file shows every other hostname (git, photos, music, etc.) is
a CNAME straight to the bare apex boglabob.com instead - git.boglabob.com
isn't special, just one more independent CNAME. Fix podinfo/hello-app to
match.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y4YNpuC2bgT224suQLLJ7B
2026-09-04 10:20:17 +01:00
854780c2bf ci: retrigger hello-app build with dual-scope FORGEJO_TOKEN
All checks were successful
build-hello-app / build-and-push (push) Successful in 33s
FORGEJO_TOKEN now has both repository read (needed for the archive-based
checkout) and write:package (needed for the kaniko push) - confirmed via
a direct curl test against the archive endpoint returning 200.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y4YNpuC2bgT224suQLLJ7B
2026-09-04 10:09:00 +01:00
0106254827 ci: retrigger hello-app build with corrected token/vars
Some checks failed
build-hello-app / build-and-push (push) Failing after 20s
FORGEJO_TOKEN now has package:write scope, and FORGEJO_USER/FORGEJO_ORG
have been moved from repo Secrets to repo Variables where ${{ vars.X }}
actually reads from.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y4YNpuC2bgT224suQLLJ7B
2026-09-04 09:53:51 +01:00
93a9943a7d ci: retrigger hello-app build with workspace mkdir fix
Some checks failed
build-hello-app / build-and-push (push) Failing after 25s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y4YNpuC2bgT224suQLLJ7B
2026-09-04 09:25:53 +01:00
5d025ef55c ci: mkdir workspace before writing into it
The last failure was identical to the one before the /tmp -> workspace
fix, byte for byte - meaning github.workspace resolves to /tmp itself in
this runner, and the real gap was that nothing creates that directory
before our step runs (actions/checkout@v4 normally does this itself;
plain wget doesn't). mkdir -p it first, and echo the resolved path so a
third failure isn't another blind guess.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y4YNpuC2bgT224suQLLJ7B
2026-09-04 09:25:44 +01:00
bfdc9704cb ci: retrigger hello-app build with fixed checkout step
Some checks failed
build-hello-app / build-and-push (push) Failing after 27s
Forgejo's re-run replayed the workflow file as it was at the original
triggering commit, not the fixed version now on main - needs an actual
new push touching apps/hello-app/src/** to pick it up.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y4YNpuC2bgT224suQLLJ7B
2026-09-04 07:51:15 +01:00
7919d37fcc ci: fix manual checkout writing to nonexistent /tmp in kaniko image
/tmp doesn't exist in the kaniko executor:debug image (confirmed - no
standard FHS layout there at all), so the wget -O target failed with
"No such file or directory". Write into github.workspace instead, which
is known to exist since the build step already uses it.

Also adds the step-7 desktop-vs-k8s clarification from earlier.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y4YNpuC2bgT224suQLLJ7B
2026-09-04 07:48:02 +01:00
baf3ac1724 test the pipeline
Some checks failed
build-hello-app / build-and-push (push) Failing after 20s
2026-09-04 07:32:40 +01:00
912cd596e0 ci: replace actions/checkout with manual tarball fetch in build-hello-app
actions/checkout@v4 needs a Node.js runtime, which the kaniko executor:debug
image doesn't have and has no package manager to install it with (confirmed
via a throwaway podman run - no git, no node, not even /etc/os-release).
Fetch the repo as a tarball from Forgejo's archive endpoint instead, using
wget/tar, which are actually present in the image.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y4YNpuC2bgT224suQLLJ7B
2026-09-04 07:28:23 +01:00
89f738885c docs: fix Forgejo runner setup gaps in stage 3 step 6
- Distinguish the runner registration token from FORGEJO_TOKEN explicitly
  (easy to mix up, causes a confusing "registration token not found" error)
- Split register/daemon into two commands: register is one-shot and exits,
  running only it under --restart unless-stopped silently loops forever
  instead of ever listening for a job
- Add --userns=keep-id, needed so the container can open the rootless
  Podman socket (owned by k8s's host UID, not the container's remapped one)
- Note that <FORGEJO_USER>/<FORGEJO_TOKEN> are placeholders to replace,
  not literal syntax, since bash reads a bare <word> as redirection

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y4YNpuC2bgT224suQLLJ7B
2026-09-04 07:18:52 +01:00
bf6246d577 docs: clarify podinfo's helm CLI snippet is illustrative only
The two commands under step 4 show what imperative Helm install would
look like for comparison, not something to actually run - helm isn't
installed anywhere in this project since Flux handles it declaratively.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y4YNpuC2bgT224suQLLJ7B
2026-09-04 06:34:02 +01:00
354b68b30a Merge branch 'main' of https://git.boglabob.com/codegit/cloud-demo 2026-09-04 00:26:50 +01:00
267e57d1fc Updated docs to describe installation of all required flux components 2026-09-04 00:25:27 +01:00
Flux
ae604b2082 Add Flux v2.9.4 component manifests 2026-09-04 00:20:32 +01:00
af5c1cf010 Updated to reference env variable 2026-09-04 00:16:37 +01:00
5eb5ea5f25 added manual kubernetes clean up script 2026-09-03 22:41:11 +01:00
4ea6d8b9e5 Updated project to improve guidance
Some checks failed
terraform / validate (push) Failing after 37s
2026-09-03 19:06:27 +01:00
63008b3ab9 Switching from unmaintained kubernetes-dashboard to headlamp 2026-08-19 13:24:16 +01:00
68c111b969 docs: full rewrite of QUICKSTART with real explanations, not just steps
Previous version listed commands with light justification; this
explains the actual mechanism at each stage - qemu:///system vs
session, why pools mediate permissions, COW overlays, what cloud-init's
two data files are for, what each virt-install flag does, what a
kubeconfig actually contains, and (the deepest gap) what flux bootstrap
concretely does under the hood: the controllers/CRDs involved, what
GitRepository and Kustomization objects actually do on their reconcile
loops, why apps.yaml gets picked up automatically, and how the auth
Secret works - with kubectl/flux commands to go verify each claim
against the already-bootstrapped cluster rather than take it on faith.
2026-08-19 10:32:39 +01:00
71415dae21 docs: add Caddy exposure guidance specific to QUICKSTART's DHCP networking 2026-08-19 10:13:13 +01:00
22acad855d docs: use CNAME records for podinfo/hello-app, matching existing DNS pattern 2026-08-19 09:25:29 +01:00
Flux
f6e52eb3f0 Add Flux sync manifests 2026-08-19 08:58:31 +01:00
Flux
ecb2e7e0c0 Add Flux v2.9.4 component manifests 2026-08-19 08:58:29 +01:00
92203f004c docs: install flux CLI without brew (no-sudo, matches kubectl pattern) 2026-08-19 08:57:37 +01:00
73d9f92a2e docs: use default SSH key name, install kubectl, fix .kube dir
Some checks failed
terraform / validate (push) Has been cancelled
Rename k8s's key from the custom k3s_homelab to the default
id_ed25519 - the custom name had no real justification (k8s is a
fresh account with nothing to collide with) and caused a real bug:
OpenSSH only auto-offers default-named keys, so ssh commands lacking
an explicit -i silently failed to authenticate. Also add the
never-actually-documented kubectl install step, and mkdir -p ~/.kube
before the first redirect into it, in both SETUP.md and QUICKSTART.md.
2026-08-19 08:40:08 +01:00
a6123398bc docs: fix QUICKSTART - missing default pool/network, tilde-in-arg bug, os-variant
Debian's libvirt-daemon-system doesn't auto-create a default storage
pool (network exists but inactive) - added explicit pool-define/build/
start and net-start steps. Also fixed --cloud-init user-data=~/... not
expanding (tilde only expands at start of a shell word, not after =),
and noted why --os-variant may need to be an older release than the
actual image if osinfo-db is stale.
2026-08-19 08:31:52 +01:00
25eba8fd8b docs: add missing mkdir ~/vms step in QUICKSTART 2026-08-19 07:30:19 +01:00
440cb2077f docs: fix QUICKSTART manual VM storage for system libvirt
Disk images under k8s's home directory aren't readable by the
libvirt-qemu user that actually runs VMs under qemu:///system. Use
libvirt's own default storage pool (vol-create-as/vol-upload) instead,
so libvirtd handles file ownership rather than k8s directly, and pin
LIBVIRT_DEFAULT_URI=qemu:///system throughout.
2026-08-19 07:29:32 +01:00
a3cfba3d6a Split setup into 2 phases and updated docs 2026-08-19 00:03:05 +01:00
dc2f1e85e0 Updated docs to cover tokens for k8s and flux users 2026-08-18 23:26:46 +01:00
5c2080a73b initial scaffold
Some checks failed
terraform / validate (push) Waiting to run
build-hello-app / build-and-push (push) Has been cancelled
2026-08-18 20:22:42 +01:00