summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2026-07-20f3s zusb README: note AWS CLI dependency for the backup's S3 sync legPaul Buetow
The quarterly backup script travels on the pool; its S3 sync needs awscli + /root/.aws/credentials symlink to /opt/snonux/secrets/aws.credentials on the hosting f-host. Snapshot export still works without it; only the offsite S3 sync is skipped.
2026-07-20f3s: deploy goprecords 0.5.5Paul Buetow
2026-07-20protonbridge: switch to attachable CLI mode, persist self-updated binary, ↵Paul Buetow
add startupProbe - Run bridge via 'protonmail-bridge --cli' with stdin/tty enabled so the CLI is attachable (kubectl attach) for first-time account login instead of a separate --cli process against the gRPC daemon. - Install libfido2-1 at container start (runtime dependency). - Persist /root/.local (Bridge's self-updated binary) on the data PVC. - Add a startupProbe (tcp 1143, 30x10s) so slow first starts aren't killed by the livenessProbe; update the login/setup comments accordingly.
2026-07-20f3s: add zusb removable backup pool scripts (zusb-load/zusb-unload)Paul Buetow
4-disk raidz2 USB-SATA pool used as offline backup storage, loaded ~once per quarter. Migrated from t450 to the f3s USB-key scheme: zusb/data/enc rekeyed from passphrase to a raw key on the F3S_KEYS sticks at /keys/zusb.key. Scripts + key deployed to all f-hosts (f0/f1/f2/f3) so the disk stack can be re-plugged to any host. Not auto-mounted.
2026-07-18immich: Stage B — upgrade server + ML to v3.0.3Paul Buetow
Bump image.tag v2.7.5 -> v3.0.3 for both immich-server and immich-machine-learning. Stage A already migrated Postgres to VectorChord (vchord 0.4.3), which 3.x requires (pgvecto.rs dropped); the postgres bundle image preloads vchord.so + vectors.so per the 3.0.1 requirement. Pre-upgrade ZFS snapshot: zdata/enc/nfsdata@immich-pre-3x-20260718 (f0). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18immich: Stage A — migrate Postgres from pgvecto.rs to VectorChordPaul Buetow
Swap the hand-rolled immich-postgres image from tensorchord/pgvecto-rs:pg16-v0.3.0 to the official Immich bundle ghcr.io/immich-app/postgres:16-vectorchord0.4.3-pgvector0.8.0-pgvectors0.3.0. This makes vchord.so available (still preloading vectors.so) so Immich can migrate smart-search/face vectors off the deprecated pgvecto.rs extension while still on the 2.x server, ahead of the 3.x bump (which drops pgvecto.rs entirely). Tag pins pgvecto.rs 0.3.0 to match the installed 'vectors' 0.3.0 catalog. Pre-upgrade ZFS snapshot taken: zdata/enc/nfsdata@immich-pre-3x-20260718 on f0. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-12Fix swap and FreeBSD memory alert thresholdsPaul Buetow
2026-07-10beets-art: unpin from r1 + cap CPU to 1 (thermal fix)Paul Buetow
The beets-art CronJob was hard-pinned to r1 via nodeSelector, and its CPU limit was 2 (half the 4-core passively-cooled Beelink N100 on f1). The daily noon fetchart/embedart sweep sustained ~35% CPU for ~28 min and pushed f1 to ~95 C, tripping the FreebsdCpuTemperatureHigh alert (>=80 C for 5m). Two changes: 1. Cap the container CPU limit from 2 to 1. The run takes ~2x longer but stays well under the 6h activeDeadlineSeconds and roughly halves the sustained thermal load. 2. Unpin the CronJob from r1 so the scheduler can spread it. This is a manifest/config change, not a storage migration: the music library is already shared NFS (mounted at the same path on all three r-nodes). The only thing forcing r1 was the music PV/PVC being declared RWO (single-node mount) while shared with Navidrome, which is itself pinned to r1 by its local-path SQLite data PVC. Flip navidrome-music PV/PVC to ReadWriteMany so beets-art can mount it on any r-node alongside the read-only Navidrome pod. Also move beets-art-state from local-path (pinned to r1) to a static NFS-backed RWX PV/PVC so the job's SQLite state is reachable from any node. SQLite-over-NFS is acceptable here because concurrencyPolicy: Forbid guarantees a single writer (no lock contention), and the state is regenerable. Application requires recreating the bound music PVC (access-mode changes are immutable on a bound PVC) and the state PVC; see deploy notes.
2026-07-10packages: fail fast on empty DTail version (review follow-up)Paul Buetow
- Makefile: new check-dtail-version target guards dtail-openbsd, dtail-freebsd, and the build-VM stamp recipe — a wrong DTAIL_SRC now aborts with a clear error before any VM start, /tmp cleanup, or remote work runs with an empty version in the file names (dtail-netbsd already had an equivalent inline guard) - Makefile: dtail-openbsd pre-cleans its stale staging tgz like the netbsd target, so a failed run can never silently upload an old package - pkg-dtail-openbsd.sh / pkg-dtail-freebsd.sh: reject a missing version argument like pkg-dtail-netbsd.sh (would otherwise build dtail-.tgz) Verified: make -n renders the guard first for both targets; make dtail-{openbsd,freebsd} DTAIL_SRC=/nonexistent fails fast with the version error before any rm/remote step. Guards only change failure paths — no package rebuild needed. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10packages+frontends: dtail packaging follow-ups (vs0 review items)Paul Buetow
- dtail-freebsd.json.tpl: move HostKeyFile from volatile /var/run/dserver/cache to persistent /var/db/dserver/ssh_host_key — FreeBSD's cleanvar purges /var/run at boot, so the host key was regenerated on every reboot (mirrors the NetBSD/OpenBSD templates) - dserver-freebsd.tpl rc.d: start_precmd now creates /var/db/dserver (0700, dserver-owned) and re-runs dserver-update-key-cache.sh on every start, so the volatile key cache repopulates right after a reboot or restart instead of waiting for the daily periodic job - packages/Makefile: .SHELLFLAGS gains -o pipefail — the "git archive | ssh ... tar" pipeline could mask a git archive failure as long as tar succeeded on the truncated stream (the only recipe-level pipeline; $(shell ...) calls are unaffected) - packages/Makefile: OS-suffixed /tmp staging names for the OpenBSD and NetBSD dtail tgz (dtail-openbsd-*/dtail-netbsd-*) — a dash-less version would have made both targets stage to the same /tmp/dtail-<version>.tgz locally and on f0; the final repo copy keeps the canonical dtail-<version>.tgz name - dserver-update-key-cache.sh.tpl (OpenBSD): port the NetBSD hardening — quote all variable expansions, derive the user via basename suffix stripping instead of cut -d. -f1 (dotted usernames broke), fix the obsolete-cachefile echo that used single quotes and never interpolated $cachefile, add a header comment documenting the rc_pre and /etc/daily.local call sites - dserver.tpl (OpenBSD rc.d): replace 'rc_cmd $1 &' with rc_bg=YES and a plain rc_cmd "$1" — the daemon needs backgrounding because it does not daemonize, but backgrounding the whole rc framework made rc_pre failures and the start result invisible to rcctl; rc_bg is rc.subr's supported way to background only the daemon - dserver-update-key-cache-freebsd.sh.tpl: header now documents the new rc.d start_precmd call site Deployed: FreeBSD pkg republished, f0/f1/f2 upgraded with host key migrated to /var/db/dserver first (sha256 verified identical); f3 unreachable, still on the old package. OpenBSD pkg republished, fishfinger reinstalled + restarted, host key unchanged, dcat verified. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10frontends: OpenBSD dserver rc.d — create /var/run/dserver parent explicitlyPaul Buetow
install -d applies -o/-m only to the final directory, so the previous single 'install -d -o _dserver /var/run/dserver/cache' left the parent /var/run/dserver (the _dserver home dir) implicitly created as root:wheel after a reboot. Create the parent explicitly with the right ownership, matching the NetBSD template (dserver-netbsd.tpl). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10frontends: OpenBSD dserver — absolute CacheDir, persistent host keyPaul Buetow
The OpenBSD dserver template used relative CacheDir "cache" and HostKeyFile "cache/ssh_host_key", which only worked because rc.d starts the daemon via su -l _dserver (CWD = /var/run/dserver). Any start from another directory broke public key lookup — same bug class dtail commit fec2f9d fixed on the server side. Switch to absolute paths like the FreeBSD/NetBSD templates. OpenBSD /etc/rc wipes /var/run/* at boot, so move the SSH host key to persistent /var/db/dserver/ssh_host_key (mirrors the NetBSD template) — a regenerated host key would break clients' known_hosts. The rc.d rc_pre now also creates /var/db/dserver and re-runs the key-cache helper on every service start, so the volatile cache is repopulated right after a reboot instead of waiting for the daily cron job. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09packages: harden NetBSD dtail pipeline (review findings)Paul Buetow
- Makefile: .SHELLFLAGS := -ec — with .ONESHELL a failing intermediate recipe line (remote pkg_create, scp, PV upload) previously did not stop the recipe and make exited 0; also remove stale /tmp package artifacts at target start so a failed build can never silently re-upload an old tgz, guard against an empty extracted version, and quote the tr operand - dtail-netbsd.json.tpl + rc.d: move the SSH host key from volatile /var/run/dserver/cache to persistent /var/db/dserver/ssh_host_key so it survives reboots (clients re-accept the key once after upgrade) - pkg-dtail-netbsd.sh: reject a missing version argument; write the pkg_summary via a temp file so a pkg_info failure cannot publish a truncated pkg_summary.gz; document that the dserver user/group is a deliberate manual install step - key-cache template: comment now states the daily cron entry is added manually at install time (documented in the pkgrepo skill) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09packages: add NetBSD dtail pipeline (pi0/pi1, aarch64)Paul Buetow
- Makefile target dtail-netbsd: cross-compile netbsd/arm64 (CGO_ENABLED=0, nozstd), package natively on pi0 with pkg_create, upload package plus pkg_summary.gz to the PV at netbsd/10.1/packages/aarch64/ via f0 - scripts/pkg-dtail-netbsd.sh: NetBSD pkg_create packaging (prefix /, root-owned files via @owner/@group plist directives) - frontends: NetBSD dserver rc.d script, dtail.json (absolute cache paths), and key-cache helper templates - pkgrepo nginx: serve /netbsd/ with autoindex - Fix stale ROCKY_ARM_BUILD_HOST: pi0 was re-imaged to NetBSD, aarch64 RPMs are built on pi2 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07ychat: bump image to deacb3f (fix chat color picker / POST body parsing)Paul Buetow
2026-07-07ychat: bump image to 1f28ff5 (redirect to login on invalid session)Paul Buetow
2026-07-07ychat: bump image to 4dd00e2 (mobile address-bar + online-frame fix)Paul Buetow
2026-07-07f3s/ychat: bump image to 1db2cfe (fix clipped mobile input link row)Paul Buetow
2026-07-07f3s/ychat: bump image to a3908e1 (fix crash on malformed request line)Paul Buetow
Fixes the crash a vulnerability scanner triggered twice against the live pod (std::out_of_range from a broken string::npos overflow check in the GET/POST request-line parser).
2026-07-04f3s/ychat: bump image to b8d28a1 (trim mobile link row)Paul Buetow
2026-07-04f3s/ychat: bump image to 256e4b2 (fix message-box shrink, Register spacing)Paul Buetow
2026-07-03f3s/ychat: bump image to 64ba6d8 (mobile-friendly chat UI)Paul Buetow
Replaces the frameset-based chat layout with iframes + flexbox and adds viewport meta tags across templates, so the chat is usable on phones.
2026-07-03f3s/ychat: bump image to b8faffb (fix SQLite corruption over NFS)Paul Buetow
Image 67babb2 used PRAGMA journal_mode=WAL, which silently lost writes on the NFS-backed hostPath PV (WAL needs shared-memory mmap of a -shm file that network filesystems don't support reliably) -- a registered user could not log back in because the INSERT never actually landed. b8faffb switches to the default rollback journal, which only needs ordinary byte-range locks that NFS handles correctly. The stale, partially-corrupted ychat.db/-wal/-shm files on the PV were wiped before this rollout so the pod starts from a clean, empty database.
2026-07-03f3s/ychat: add persistent SQLite volume, bump image to 67babb2Paul Buetow
ychat now requires SQLite (no more no-DB build), so registered accounts need to survive pod restarts. Adds a hostPath-backed PV/PVC for /app/data, an NFS sentinel initContainer (same pattern as other f3s charts), and points the image at the SQLite-mandatory build.
2026-07-03clePaul Buetow
2026-07-01jellyfin: self-heal setup-wizard flag via initContainerPaul Buetow
Adds ensure-wizard-completed initContainer after nfs-check-config. If jellyfin.db already exists but IsStartupWizardCompleted flipped to false (interrupted wizard run or partial config restore), restore it to true so a working instance never drops back into the setup wizard. Fresh installs (no jellyfin.db) keep their legitimate first-run wizard. Runs after the sentinel check so config is only rewritten on the real NFS volume.
2026-06-30f3s/ychat: bump image to 6c3a65b (hide no-DB Options menu)Paul Buetow
2026-06-30f3s/ychat: bump image to c46fec1 (codeberg footer links)Paul Buetow
2026-06-30f3s/ychat: bump image to 0cdec77 (remove no-DB registration UI)Paul Buetow
2026-06-30add ychatPaul Buetow
2026-06-30f3s/ychat: bump image to 651f762 (drop no-op Register link)Paul Buetow
2026-06-30f3s/ychat: bump image to f03e160 (oversized-fd reclaim + context ctor UAF fix)Paul Buetow
2026-06-30f3s/ychat: bump image to 6d079fb (flush_stream UAF fix)Paul Buetow
2026-06-30f3s/ychat: bump image to e4de236 (CGI injection fix)Paul Buetow
2026-06-30f3s/ychat: bump image to dadd9f9 (get_user UB fix)Paul Buetow
2026-06-30f3s/ychat: bump image to fed8e7b (READSOCK cap fix)Paul Buetow
2026-06-30f3s/ychat: bump image to 4f8e26d (timer/gc + B1 UAF fixes)Paul Buetow
2026-06-30f3s/ychat: bump image to a0a881f (session ID crash/hijack fix)Paul Buetow
2026-06-30f3s/ychat: bump image to 77c23e3 (unauth op -> /exec RCE fix)Paul Buetow
2026-06-30f3s/ychat: bump image to 11aa279 (path-traversal + dlopen-traversal security ↵Paul Buetow
fixes)
2026-06-30f3s/ychat: bump image to ce5180f (css content-type fix)Paul Buetow
2026-06-30f3s/ychat: bump image to 870459f (streaming chat reimplemented)Paul Buetow
2026-06-30f3s/ychat: bump image to 2adb923 (POST body behind proxy fix)Paul Buetow
2026-06-30f3s/shelly: rack-fan boot-time auto-on rc.d service + plug control scriptPaul Buetow
Add shellyfans rc.d service (boot-time auto-on for the rack fans on the Shelly Plug M Gen 3 at 192.168.1.28) and a standalone shelly-plug.sh helper to query/control the plug over its HTTP RPC API. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30f3s/cert-manager: doc relayd TCP passthrough, drop obsolete cert exportPaul Buetow
relayd on the CARP VIP no longer terminates TLS — it forwards raw TLS to Traefik, which terminates via the f3s-lan-tls ingress secret. The old "export cert to relayd" steps were stale and misleading. Add the restart-not-reload pitfall (a stale relayd process serving an expired cached keypair caused the 2026-06-30 LAN-cert outage). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30f3s/ychat: bump image to 3c50e28 (login crash fixes)Paul Buetow
2026-06-30f3s/ychat: bump image to 85dcf05 (proper HTTP/1.1 responses)Paul Buetow
2026-06-30f3s/ychat: drop TCP probes (crash on empty open+close)Paul Buetow
2026-06-30f3s: add ychat revival (Mode A) Helm chart + ArgoCD appPaul Buetow
In-memory guest chat, no DB. Deployment pulls registry.lan.buetow.org:30001/ychat:f387bac, port 2000, non-root (UID 1000), readOnlyRootFilesystem with emptyDir on /app/log. TCP-socket probes (ychat speaks HTTP/0.9-style responses). Ingress: ychat.f3s.buetow.org + ychat.f3s.lan.buetow.org.
2026-06-29immich: fix stale NFS bind-mount causing 500 on uploadPaul Buetow
After a CARP failover or f-host reboot the node host remounts NFS cleanly but already-running pods keep their old stale bind-mount, causing writes to return ESTALE (errno 116). Three changes to auto-heal: 1. immich-valkey: replace ping-only liveness with a write-probe (valkey-cli ping + echo to /data/.nfs-write-probe), so a stale /data mount fails the probe and kubelet restarts the container with a fresh bind-mount. 2. immich-server: add label nfs.stale-restart/enabled=true so the node-level nfs-mount-monitor can exec a write-probe into the pod and force-delete it if writes fail. Cannot do this via Helm values — the upstream chart hardcodes an httpGet liveness and its Sprig merge refills httpGet even when set to null, producing an invalid dual-handler probe rejected by the k8s API. 3. nfs-mount-monitor/check-nfs-mount.sh: add reap_stale_nfs_pods() function (throttled to every 30 s) that handles two cases invisible to the existing fix_mount probe — Case 1: pods stuck in CreateContainerConfigError with a stale subPath message (git-server, prometheus hit this); Case 2: opt-in Running+Ready pods whose in-container write to the NFS volume fails twice in a row (the immich-server pattern). Deployed to r0/r1/r2 via Rex. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>