No description
  • Shell 86.9%
  • HCL 5.2%
  • Go 3.1%
  • jq 2.4%
  • Makefile 1.2%
  • Other 1.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Sean OMeara aee8fb7ba3
fix(forge): the chain hosts keep time, and the converge scripts default to the production CA
Measured 2026-09-14: freebsd-fsn1 ran 34 s and omnios-hel1 117 s behind UTC.
Nothing synchronised either clock, and snapshot names, certificate validity
and token lifetimes on both tiers read it.

scripts/freebsd/forge-jail.sh gains a "Host clock" step: ntpd_enable and
ntpd_sync_on_start (-g, so a large offset is stepped rather than refused),
started if not running. The host carries its public address on lo0 as well
as em0 (k3s and pf plumbing); ntpd 4.2.8p18 binds every address per
interface, fails the lo0 duplicate with EADDRINUSE and then dies with
SIGSEGV, so ntp.conf gets `interface ignore lo0`. One `interface listen` rule
makes ntpd ignore every address no rule names (measured: with only loopback
listed, em0 got no socket, the pool associations never reached, and the
clock stayed 36 s out), so loopback and the default-route NIC are named
explicitly. Idempotent: each rule is appended once.

scripts/omnios/forge-zone.sh gains the same step with chrony, which OmniOS
ships (service/network/ntp is renamed away): the pool line and `makestep
1.0 3` are ensured in /etc/inet/chrony.conf, the service is enabled without
-s -- on a first enable svcadm reports "unsatisfied dependencies" and exits 4
while they are still coming up, and chrony is online seconds later -- and
the script waits for online itself. Configuration edits restart the
service; nothing else touches it.

Both guards assert the time service (ntpd running / chrony online) and at
most 5 s of skew against the machine running them, which macOS keeps within
milliseconds of NTP.

ACME_CA now defaults to letsencrypt. Both identifiers were approved for
LE-prod earlier today and the first converge issued them; the staging
default was a live footgun, and it fired: one routine converge without
ACME_CA re-issued STAGING certificates on both tiers, and every TLS client
-- the converge's own account step included -- stopped verifying. Re-issue
happens only when the installed CA or CN differs, never on every run
(LE-prod allows five certificates per identifier per 168 h; this used two
of each today).

Both converges ran to EXIT=0 with production certificates back; both guards
pass with the skew now under a second.

Claude-Session: https://claude.ai/code/session_01XdBRc9CHgFhAxCyHbdVtt6
2026-09-14 22:29:24 +02:00
bootstrap fix(bootstrap): repin the dead AMD64 image, and guard every pin 2026-09-12 23:11:39 +02:00
docs Retire AMD PostgreSQL state and host binfmt 2026-09-12 21:21:55 +02:00
kubernetes/flux feat(forge): normalize the off-cluster Forgejo chain to code.packet.town -> code.kri.pt 2026-09-14 19:58:45 +02:00
notes docs: rewrite AGENTS/SECURITY/ARCHITECTURE to ASD-STE100 2026-08-07 19:05:47 +02:00
research docs: rewrite AGENTS/SECURITY/ARCHITECTURE to ASD-STE100 2026-08-07 19:05:47 +02:00
scripts fix(forge): the chain hosts keep time, and the converge scripts default to the production CA 2026-09-14 22:29:24 +02:00
secrets feat(forge): normalize the off-cluster Forgejo chain to code.packet.town -> code.kri.pt 2026-09-14 19:58:45 +02:00
services/hydra-token-hook Fix MinIO IAM crash, BuildKit/Kyverno policies, token hook subject parsing 2026-02-28 10:39:07 +01:00
src chore(mayastor): remove the code, the laptop roll and the dead image bake 2026-09-04 09:41:25 +02:00
terraform feat(rustfs): retire the migration scaffolding; MinIO's Kustomizations prune 2026-09-10 06:19:58 +02:00
tests fix(forge): the chain hosts keep time, and the converge scripts default to the production CA 2026-09-14 22:29:24 +02:00
.checkov.yaml cleanups 2026-04-22 17:38:44 +02:00
.gitattributes chore: adopt semver (VERSION + CHANGELOG) for the gitops-flux release beat 2026-07-06 16:47:46 +02:00
.gitignore fix(security): remove leaked Forgejo credential and stray Python artifacts 2026-09-13 09:33:41 +02:00
.kube-linter.yaml cleanups 2026-04-22 17:38:44 +02:00
.sops.yaml feat(tenants): remove bob (sean.bar) from seanfarm + always GC vault GCP SAs on rebuild 2026-06-11 13:14:50 +02:00
AGENTS.md docs: record that a rebuild is deferred and unproven 2026-09-14 15:40:18 +02:00
CHANGELOG.md fix(forge): the chain hosts keep time, and the converge scripts default to the production CA 2026-09-14 22:29:24 +02:00
CLAUDE.md chore: nuke all jitsi-related files to start fresh 2026-04-21 18:23:36 +02:00
LICENSE chore: add Apache-2.0 LICENSE + NOTICE 2026-06-16 09:20:11 +00:00
Makefile fix(backup): the rebuild guards read the chain, not Codeberg 2026-09-14 22:11:57 +02:00
NOTICE chore: add Apache-2.0 LICENSE + NOTICE 2026-06-16 09:20:11 +00:00
README.md Make Binjovi the sole authority in current CI/CD guidance 2026-09-11 21:15:27 +02:00
SECURITY.md Make Binjovi the sole authority in current CI/CD guidance 2026-09-11 21:15:27 +02:00
VERSION chore: devbump 0.1.130 -> 0.1.131-dev 2026-07-27 14:04:59 +00:00

seanfarm

GitOps repo for sean.farm Kubernetes, storage, and build infrastructure.

Facts

  • Flux bootstraps from Codeberg and reconciles kubernetes/flux/clusters/seanfarm/.
  • Most manifests live in this repo. Some components also pull from separate Codeberg repos.
  • Bootstrap secrets live in secrets/*.yaml.enc and are decrypted by make.

Layout

Path Purpose
kubernetes/flux/clusters/seanfarm/ Flux cluster entrypoint
kubernetes/flux/clusters/seanfarm/infrastructure/ Cluster Flux Kustomizations
kubernetes/flux/infrastructure/ Component manifests
terraform/roots/ reusable Terraform roots for tofu-controller
secrets/ encrypted bootstrap inputs
docs/ short operational docs

Common Commands

brew install age sops hcloud kubectl flux
age-keygen -o ~/seanfarm-age-key.txt

make create
make rebuild
make destroy

Makefile reads ~/seanfarm-age-key.txt by default.

Rules

  • Edit manifests, then test them. Land the change through the pipeline: branch from main, push the feature branch to Forgejo, open a pull request, then use binjovictl release seanfarm --build BUILD_ID --wait. The release service integrates the change. The laptop never pushes a default branch. See the full loop in Development Workflow.
  • Prefer declarative changes over imperative cluster changes.
  • Do not use kubectl apply for routine Flux-managed development.
  • Use kubectl apply only for bootstrap/setup, emergency recovery, or temporary local verification before the matching commit is pushed.
  • Use internal service DNS for in-cluster traffic.
  • Pin images by version or digest. Do not use :latest.

Style

  • Prefer manifest.yaml inside component directories.
  • Use a semantic filename only when a directory contains multiple peer manifests.
  • Avoid repeating a long dashed directory name in the filename.
  • Let the directory name carry the component identity.

Docs

  • Architecture — the 4-layer overview, and the DNS, TLS, secrets, and observability cross-cuts
  • Development Workflow — the daily branch, pull request, release, and deploy loop
  • Repos — where each git repo lives and why
  • Pipeline — the workload CI/CD shape and its invariants
  • Kernel Roll — the no-drama CVE-patch path
  • Kernel Deploy Pipeline — LIVE: the in-cluster canary, smoke, gate, and worker-roll contract
  • Node Replace Pipeline — historical design, not current execution instructions
  • Rebuild Drill — PREPARED, NOT RUN: the runbook that proves the estate survives a make rebuild
  • Laptop De-root — a historical assessment. Routine work now uses a non-admin token (2026-08-01).
  • Style — naming, file conventions, commit messages
  • Crossplane Primer — XRD versus Composition, the placeholder pattern, patch types, and gotchas (in the platform repo)
  • AGENTS.md — repo conventions for human and AI contributors

docs/pipeline-security-audit-2026-06-26.md is a dated point-in-time audit. It is not a living document. Read it as a record of that date, not as the current state.

Native pipeline timing

Binjovi uses native agents for this project's Build, Release, and Deploy tasks. The configured deployment target is seanfarm-development. Native agents publish the selected Git revision and observe Flux convergence. Flux remains responsible for reconciliation of the selected resources.

Select an exact successful Build when you release:

binjovictl builds seanfarm
binjovictl release seanfarm --build BUILD_ID --wait
binjovictl status seanfarm

Open the project dashboard and expand an execution attempt to inspect its task timeline and available profiles. The latest completed pipeline summary includes Build and Release time as well as deployment time. Check the Deploy result separately after Release completes. Telemetry explains execution; the stored revision and verification evidence establish completion.

Kernel recovery creates a short-lived identity probe in binjovi-nodes. The control-plane role can delete those probe Pods after it reads the result. This permission does not grant cluster-wide Pod deletion.