Commit Graph
202 Commits
Author SHA1 Message Date
thesabear d9e8b9edf9 observability.md: full 7-step audit, first pass this session
1. Live-verify: journald persistent-storage config confirmed on two
   hosts (1G vs 500M cap, matches the doc's claim exactly), Alloy
   active confirmed across all 11 fleet hosts.
2. Fix KB: Alloy Agent Model was stale - version had moved from
   v1.18.0 to v1.18.1 on all 8 'newer' hosts since last checked,
   role's own default still unreconciled at 1.17.1. Fixed and
   confirmed via re-fetch.
3. Pulled the full Observability Pipeline tree: Alloy Agent Model,
   Log Flow, Metrics Flow.
4. Replaced both mermaid diagrams (broke this repo's Nextcloud-SVG
   convention) with real diagrams built through the proper round-trip.
5. Evidence: real journald config dumps, plus 3 real Grafana
   screenshots (host metrics dashboard, detailed Loki log stream
   showing job=technitium-dns/docker/system, and the fleet-wide log
   volume dashboard) - one screenshot round caught and fixed an
   unredacted internal IP before being used.
6/7. Compelling-proof test passes; sanitize-check clean.
2026-08-28 23:44:06 +03:00
thesabear 8e0a840105 orchestration: add real evidence for hyper2 special case, self-update timer, and 2 real screenshots
Step 5 re-audit, completing the checklist gap that started this whole
detour. Added: the real hyper2 host_vars comment (matches the WARNING
callout's reasoning almost word for word), the real automation-self-
update.timer schedule, the real Kestra flow list (visually confirms
13 total flows), and app-update's real execution topology (visually
confirms wait_for_approval as an actual node, not just a diagram
concept).
2026-08-28 22:08:23 +03:00
thesabear c1c1d093af sso-and-identity: add real evidence for the 10-app native-OIDC table
Step 5 re-audit. The table itself (the file's central correction from
earlier this session) had no embedded evidence - only the corrected
count was asserted. Added the real, freshly-repulled provider list
confirming all 10 by actual model type, not just name.
2026-08-28 21:58:38 +03:00
thesabear cde2f8b9c5 security-monitoring: add real evidence for the queue-overflow fix and SCA score
Step 5 re-audit. The wazuh_agent_tuning root-cause comment adds a
specific fact not previously in the doc (9 of the fleet's agents
affected). The SCA dashboard screenshot is the doc's first visual
evidence - everything else was CLI/text - and shows a real 87% score,
directly proving the 'below 100% is an accepted tradeoff' claim with
an actual number instead of just asserting the policy.
2026-08-28 21:56:10 +03:00
thesabear f4ef56d229 secrets-and-pki: add real evidence for the asymmetric-trust and cert-renewal claims
Step 5 re-audit. Caddyfile contrast (skip-verify default vs Vault's
real cert verification block) shown as text, IP/domain genericized.
The cert-rebuild hook script's real 19-day-expiry story is shown as a
screenshot instead of a text excerpt - the script has a hardcoded P12
password in its body, so a screenshot with that one line blurred shows
the actual guard logic in full without a text-copy risk of the
password ever landing in a file.
2026-08-28 21:48:09 +03:00
thesabear 0186966476 secret-distribution: add real evidence for the shared-secret and admin-exception claims
Step 5 re-audit. Both verified live earlier this session but never
shown: the registry-token shared template entry (proves the shared-
path mechanism), and the technitium_api_token lookup (proves the
flagged admin/runtime-split exception with the actual Jinja syntax).
2026-08-28 21:39:28 +03:00
thesabear c8413c1108 registry-and-build: add real evidence for the 36/41 count and mariadb-mirror mechanism
Step 5 re-audit. Both were verified live earlier this session but
never shown - the strategy breakdown backs the doc's own headline
stat directly, and the mariadb-latest entry proves the specific
shared-mirror mechanism rather than just describing it.
2026-08-28 21:36:04 +03:00
thesabear 4c63712e6a dns-naming: fix fabricated command syntax, add real reverse-zone screenshot
Two fixes from the step 5 re-audit:
1. The joplin/public-tool evidence blocks showed bracketed placeholders
   inside function arguments ('joplin.[app-to-app zone]') - not valid
   syntax, wouldn't produce the shown NXDOMAIN for the claimed reason.
   Replaced with result tables showing the same real data honestly.
2. Added the real Technitium screenshot of the cleaned-up reverse zone.
   Getting this screenshot caught a real methodology error: an earlier
   claim of '2 real PTR records (automation, caddy)' was wrong - the
   automation entry only resolved because I tested it by SSHing into
   automation itself, which satisfied the lookup via its own local
   /etc/hosts, never actually querying Technitium. Querying from a
   different host returns NXDOMAIN, matching the screenshot's real
   3-record zone (NS, SOA, one PTR) exactly. Only 1 real PTR record
   exists. Same error existed in the KB, fixed there too.
2026-08-28 21:29:23 +03:00
thesabear 169a294a00 dashy-soc-board: add the expanded Vault panel screenshot
Step 5 re-audit - real screenshot of the Vault tile's expanded detail
panel (UNSEALED, real lease/token/KV/secret-engine counts, TTL
distribution, CA cert expiry), showing the specialty-widget behavior
the Layout section describes but the existing screenshot doesn't show.
Captured after fixing the metrics-reader token issue found while
requesting this screenshot - first attempt genuinely showed a false
SEALED state, now shows the real healthy panel.
2026-08-28 21:09:59 +03:00
thesabear 055dd3995f dashy-soc-board: fix fabricated grep pattern in the 14-sources evidence
The block added earlier this pass showed a grep pattern with a
bracketed placeholder embedded inside the regex itself
('\.[service-to-service zone]') - not valid regex syntax, would never
produce the shown output if actually run. Replaced with the real
command (matching the _URL constant-naming pattern, which doesn't
need the domain at all) and its real output, domain suffix genericized
in output only. Separated the Authentik/Slack/fleetAudit/pfSense
reasoning into prose, not disguised as more grep output.
2026-08-28 20:50:11 +03:00
thesabear a2313358d2 cron-scheduler: add the raw NocoDB table screenshot
Step 5 re-audit - real screenshot showing the underlying table data
(50 records, all columns) that the Dashy heatmap is rendered from,
distinct from the two existing rendered-widget screenshots.
2026-08-28 20:47:50 +03:00
thesabear 4938aef930 cron-scheduler: fix fabricated command syntax in evidence blocks
The two blocks added earlier this pass showed 'curl | jq' syntax that
was never actually run - the real command was 'curl | python3 -c'
via SSH. The output text was genuinely real either way, but the
command shown wasn't what produced it. Replaced with the literal
command actually executed, re-run fresh to confirm the output still
matches.
2026-08-28 20:44:56 +03:00
thesabear c245fc8a36 dashy-soc-board: add real evidence for the 'fourteen data sources' claim
Step 5 re-pass under the strengthened evidence gate. The 14-source
count was the doc's own opening framing claim but had no evidence
attached - I'd verified it live earlier this session (grepping the
real function for every upstream host it calls) but never actually
showed the work. Added it.
2026-08-28 19:41:14 +03:00
thesabear 9936996116 cron-scheduler: add real evidence for two 'what we found' claims
Step 5 re-pass under the strengthened evidence gate. Both the
app-update duration correction and the Authentik 404 finding were
narrative-only, backed by data I'd already verified live but never
actually shown. Added the real NocoDB row notes as evidence blocks.
Left the other three bullets as-is - the file already has 2 real
screenshots plus these 2 data blocks, judged sufficient rather than
padding every bullet for its own sake.
2026-08-28 19:39:11 +03:00
thesabear dd05ecf0e8 orchestration: fix major mischaracterization - only 1 of 13 flows has a human gate
Live-checked every flow's actual Kestra definition for a Pause task.
Only app-update has one; the other 6 main flows (os-update-vms,
container-update, disk-cleanup, os-update-pbs, os-update-pve,
os-update-pve-verify) run fully automatically with no human checkpoint
at all - their safety net is the automated health-check/rollback path,
not human approval. The doc previously presented check->pause->approve
as the universal pattern for all 13 flows and stated outright that
'nothing gets changed on the fleet without a human explicitly resuming
a paused flow', which was false for the flows that actually change
the fleet. The KB was already correct on this point.

Also replaced the mermaid diagram (broke this repo's established
Nextcloud-SVG convention) with a real diagram showing both patterns,
plus live evidence of the Pause-task check itself.
2026-08-28 13:11:37 +03:00
thesabear 5530e35720 sso-and-identity: remove Firefly III from native-OIDC table, verified wrong live
Live-queried Authentik's API directly: firefly (and emby, not in this
doc's table anyway) are both Proxy Provider only, no native OIDC/OAuth2
provider exists for either. Real count is 10 apps with native OIDC,
not the 11/12 both this doc and the KB previously implied. Same gap
existed in the Authentik/SSO Integration KB note, fixed there too.
2026-08-28 12:49:35 +03:00
thesabear a93a75e9a4 registry-and-build: fix mischaracterized holdouts, add the real mirror-stack pattern
Live-checked docker_stacks.yml directly. Total/dockerfile-strategy
counts (41/36) and the pinned_manual holdouts were already accurate.
But docker-socket-proxy and kodi's mariadb service were wrongly listed
as still hitting Docker Hub directly - both actually float a :latest
pull against a dedicated in-fleet mirror stack (docker-socket-proxy-
mirror, mariadb-latest) built via the normal dockerfile pattern. Fixed
the table and documented the real mechanism. Same gap existed in the
KB note, fixed there too.
2026-08-28 12:34:06 +03:00
thesabear 0ecd2e6ba6 dns-naming: genericize the zone domains I missed in the evidence block
The rest of the doc consistently says 'browser-facing zone'/'app-to-app
zone' and never states the literal domain suffixes. One evidence code
block leaked both real domains as part of the FQDNs being resolved -
fixed to match the doc's own established pattern. Caught because I'd
only sanitize-checked my own diff, not the whole file - full-file grep
for thesabear.net now confirms zero literal domain mentions.
2026-08-28 12:20:07 +03:00
thesabear 6c8be5ea7b dns-naming: reverse zone was actually broken, not just stale docs - fixed live
Live audit found 4 records in the reverse zone, all wrong: 2 malformed
PTR entries (name/value swapped, never actually resolved), 1 orphaned
record from a decommissioned host, 1 correct-looking but misleading
record (proxy host's PTR pointing at one proxied app's name instead of
its own identity). All fixed live on Technitium today, not just
documented. Doc updated to describe the real defect and the fix.
2026-08-28 12:13:36 +03:00
thesabear 7db2abdaed dashy-soc-board: drop inaccurate cross-reference to architecture-overview.md
The 6-tier dependency ladder doesn't mirror that doc's trust-boundary
structure (4 boundaries, 3 routing authorities - a different taxonomy).
The 6-tier list only exists in the live code; no public doc documents
it, so the doc now describes it standalone instead of pointing at a
file that doesn't actually contain it.
2026-08-28 11:42:52 +03:00
thesabear 566f5d9f92 cron-scheduler: drop PVE backup-disabled disclosure from public doc
Same status the disaster-recovery.md conversation already ruled out of
the public repo - operationally true, not employer-facing. KB and
NocoDB job notes keep the real detail; only the public prose changes.
2026-08-28 11:36:33 +03:00
thesabear 3562322d50 docs: rewrite disaster-recovery.md following the full standing process in order
Live-verified against real infrastructure: Kopia's real repo/disk,
PBS's real datastore path, os_update role's real batch/abort behavior
against the actual Ansible code, and the real tag-driven
roles_metadata.yml mechanism behind Layer 1's rebuild claim. Caught a
real KB staleness in the process (PBS datastore usage, 3 weeks stale)
and fixed it properly - removed the point-in-time number entirely
rather than refreshing it, since a data-snapshot doesn't belong in
Trilium at all per the existing content-philosophy rule. Replaced
both mermaid diagrams with real branch/decoupling-shaped Nextcloud
diagrams. All 3 source KB notes stamped.
2026-08-28 11:06:40 +03:00
thesabear ab1a2ece1a docs: reframe copy-prompt feature away from AI-debugging framing 2026-08-28 10:23:05 +03:00
thesabear 57e960908d update soc md 2026-08-28 10:19:16 +03:00
thesabear 001903ce32 docs: add real SOC Board screenshot and Copy Debug Prompt finding
Found by actually re-checking the running function instead of stopping
at what was already written: each finding has a "Copy Debug Prompt"
button generating a ready-to-paste AI-triage prompt, with a built-in
"don't act without approval" instruction baked into the template
itself. Embedded the real board screenshot (redacted) - dependency
ladder, Wazuh KPIs, Active Issues strip, per-host tile grid - since a
doc about a visual dashboard needs to actually show it, not just
describe it in command output.
2026-08-28 10:13:39 +03:00
thesabear 9368f26856 docs: rewrite dashy-soc-board.md with real verified evidence
Live-verified every specific claim directly against the real Node-RED
function source (not just trusted from the KB): the 104,443-char
function size, all 5 Wazuh finding categories, Vault's live PKI cert
endpoints, the real DNS Security Signals implementation, the
fleetAudit global pattern, the 12-app Slack channel map, the
acknowledge key format and localStorage key name, and the Mustache
triple-brace URL gotcha. Replaced both mermaid diagrams: the flat
data-sources fan-in became a real specifics table (redundant diagram
cut per the diagramming standing process), and the acknowledge-flow
diagram was rebuilt as a real Nextcloud diagram. Stamped both source
KB notes.
2026-08-28 09:58:49 +03:00
thesabear 8781ce7c11 docs: rewrite dns-naming.md with real evidence and diagram
Live-verified against the real Technitium server: spot-checked
caddy-only/local-only hosts and Postiz's zero-presence claim via
direct DNS resolution, confirmed the forwarder list directly from the
real dns.config (pfSense + Quad9 only, no Cloudflare), and confirmed
the reverse zone's real /24 scope plus its sparse PTR content via
live reverse lookups - fixed the KB stamp accordingly after an
earlier version of it claimed these weren't re-checked. Replaced the
mermaid zone-routing diagram with a real branch-shaped Nextcloud
diagram. Real command output embedded throughout instead of
paraphrased claims.
2026-08-28 09:08:06 +03:00
thesabear 3accb97ff9 docs: rewrite registry-and-build.md with real evidence and diagram
Live-verified the container_update role's strategy_dockerfile.yml
task file exists at the exact path the KB names, stamped the source
note. Replaced the mermaid cheap-check flowchart with a real
branch-shaped Nextcloud diagram. Added: the real Vault-backed push
auth mechanism (Gitea PAT -> Vault Agent -> docker login
--password-stdin, same pattern as everywhere else in the fleet), the
real docker manifest inspect command instead of a vague "digest
check", real app names in the holdouts table instead of generic
descriptions (matching how the rest of this repo already names real
apps), the anonymous-volume-pruning detail, and a real (redacted)
screenshot of the actual Gitea package registry showing genuine
self-built container images.
2026-08-28 08:33:37 +03:00
thesabear 8187e9c1b7 docs: update security-monitoring alert-flow diagram 2026-08-28 08:05:07 +03:00
thesabear c39d78aaa2 docs: rewrite security-monitoring.md with real evidence and diagrams
Live-verified against the real Wazuh manager (agent_control -l: 11
active agents matching exactly; docker ps: real manager container
name) and stamped both source KB notes. Replaced both mermaid
flowcharts with real branch-shaped Nextcloud diagrams (alert-handling
gate, compliance-hardening gate). Added real evidence throughout: the
live agent roster, a real synthetic SSH-failure line piped through
wazuh-logtest showing actual decoding/rule-match output (MITRE ATT&CK
+ compliance tags included), and real rule IDs in the runbook table
instead of vague categories. New content: the fleet-wide agent
log-queue-overflow bug found and fixed via a dedicated tuning role,
and the compose-stack-vs-rules version-control split.
2026-08-28 08:01:04 +03:00
thesabear 846e02e659 update cron scheduler md file 2026-08-28 07:42:33 +03:00
thesabear 613d613535 docs: replace terminal output with real heatmap screenshots in cron-scheduler.md
Swapped the curl/jq text block for what the doc actually needed:
real screenshots of the live Dashy Fleet Schedule Heatmap widget -
one showing a populated cell clicked open (proving the TIP's
click-to-expand claim is real, not just described), one showing the
"no fixed time" section for the 15 jobs excluded from the grid.
2026-08-28 00:52:50 +03:00
thesabear f2d5223437 docs: rewrite cron-scheduler.md with real evidence from the live table
Live-pulled the actual 50-row NocoDB inventory (also caught and fixed
a stale KB fact along the way - the note pointed at the wrong NocoDB
deployment entirely, nocodb-content/automation instead of the real
nocodb/rocky-docker instance). Replaced the vague weight-formula prose
with the real numbers, cut the mermaid diagram that only restated the
prose above it, and added five real stories mined from populating the
table by hand: a three-way monthly collision fix, a cascading
Kopia->ClamAV reschedule, a duration figure corrected 8x after
checking real completed-run data, the heaviest job in the whole fleet
(not a backup), and a 404 that looked like an auth problem and
wasn't. Enriched the pending PBS datastore bug with its real
resolution options and added a second real gap: Technitium's
blocklist auto-update is configured but silently a no-op.
2026-08-28 00:41:34 +03:00
thesabear 08d2f5a196 docs: sanitize real domain names out of OIDC diagram
The zone-band labels spelled out *.local.thesabear.net and
*.caddy.thesabear.net literally - the same internal zone naming
pattern already sanitized out of this doc's prose, missed on the
diagram itself. Replaced with generic zone names, no domain.
2026-08-28 00:21:08 +03:00
thesabear f68f93af64 docs: add OIDC cross-zone redirect diagram to sso-and-identity.md
Sequence diagram showing the browser carries every hop itself -
Authentik and the app never talk directly - with only the OAuth
authorize/token exchange crossing from the browser-facing zone into
the service-to-service zone. Built to the public-repo diagram
conventions in CLAUDE.md (labelBackgroundColor + matching rich-text
span, off-line label positioning, line-color-matched labels, legend
instead of a color-explaining caption).
2026-08-28 00:17:29 +03:00
thesabear dfc8a6abab docs: update firewall-and-network-docker-bypass diagram 2026-08-27 23:54:37 +03:00
thesabear a9518c5381 docs: rename diagram assets to doc-prefixed scheme, update exports
Asset renames (matching the new Nextcloud source naming convention —
doc name first, then description):
- architecture-trust-depth.svg -> architecture-overview-trust-depth.svg
- firewall-docker-bypass.svg -> firewall-and-network-docker-bypass.svg
- secrets-lifecycle.svg -> secrets-and-pki-lifecycle.svg
- trust-boundaries-blast-radius.svg -> readme-trust-boundaries-blast-radius.svg
Updated all 4 markdown references accordingly.

Also refreshed diagram exports (secret-distribution-flows.svg, and the
4 renamed ones) with today's fixes, and folded in the earlier pending
sso-and-identity.md work: precise live-verified native-OIDC app list
(12 apps, not ~9), the Proxmox no-Proxy-Provider exception, real API
evidence for it, and the automation-bot migration story.
2026-08-27 23:48:41 +03:00
thesabear 426ef7f133 docs: update secrets-lifecycle diagram (labels off lines) 2026-08-27 11:43:26 +03:00
thesabear 675026f1f2 docs: fix secrets-lifecycle label backgrounds via labelBackgroundColor
Root cause was the edge's own labelBackgroundColor style property,
left enabled with no explicit value in the app, distinct from the
label's HTML text styling entirely. Set it explicitly to #1C1D1E,
then stripped a competing plain-white background layer draw.io's
export was still injecting on top of it.
2026-08-27 11:30:02 +03:00
thesabear c0ed9b55ea docs: remove label backgrounds from secrets-lifecycle diagram
draw.io's export was auto-injecting its own adaptive-background CSS
onto edge labels regardless of source content, with a fallback that
didn't match the page. Stripped background-color entirely so labels
sit directly on the page background with nothing to mismatch.
2026-08-27 11:08:48 +03:00
thesabear a6fd273c36 docs: fix mismatched label backgrounds in secrets-lifecycle diagram
Nextcloud's draw.io export was inconsistently applying its own
page-level adaptive-background variable to some edge labels instead
of the authored value, making them render darker than the rest.
Post-processed the exported SVG to normalize every label to the same
background value.
2026-08-27 10:54:09 +03:00
thesabear f05ade4313 docs: update secrets-lifecycle diagram 2026-08-27 10:40:21 +03:00
thesabear 527ef8f3ef docs: update secrets-lifecycle diagram 2026-08-26 18:50:14 +03:00
thesabear f36bcd1602 docs: update secrets-lifecycle diagram 2026-08-26 18:41:03 +03:00
thesabear 3cc00689e0 docs: update trust-depth diagram 2026-08-26 18:31:14 +03:00
thesabear e94952597c docs: update README architecture-overview diagram 2026-08-26 18:25:47 +03:00
thesabear e1ee97327a docs: deepen edge-firewall section in firewall-and-network.md
Add the Suricata dual-layer detail (DNS lockdown, Vault protection
each enforced independently at two layers) and honest live-backend
churn instead of a flat inventory list. Drop the disabled-LAN-frontend
TIP entirely — not worth keeping in the public doc.
2026-08-26 13:12:42 +03:00
thesabear 656da0e81c docs: add Docker/firewalld bypass diagram to firewall-and-network.md
Visualizes the documented gap: pfSense always applies, firewalld only
covers native services, Docker-published ports skip straight past it.
2026-08-26 13:02:55 +03:00
thesabear 033140f65d firewall-and-network: verify against live-checked KB, fix stale CrowdSec claim, add real depth and evidence
Pulled every pfSense child note (Default Policy, Proxmox Firewall Usage,
VM-Level Firewalld Strategy, WAN Rules, Security Tooling, Failure Impact,
HAProxy, Aliases, DNS & Resolver Config, LAN Rules, NAT, VPN), not just
the originally-scoped subset. Live-verified firewalld defaults, SSH
rich-rule restrictions, and Vault's per-client rules directly against
the running hosts - all matched exactly.

Caught and fixed a real staleness bug in the KB itself: WAN Rules and
Security Tooling (both dated a week old) still described CrowdSec as
active, but the more recent Aliases note (updated yesterday, checked
against pfSense's actual config.xml) confirmed the package has been
fully purged. Fixed both stale notes and the public doc, which had
already inherited the wrong claim.

Folded in the staged PAM defense-in-depth note properly - found the
fuller, better story directly in the Ansible role's source comments
(the bug hit twice, on two different hosts, before the permanent fix).
Added the LAN lockdown narrative this doc was missing, the DNS
bypass-block defense-in-depth story, and the this-week port-alias
conversion. Cut two redundant Mermaid diagrams. Added real evidence:
four pfSense screenshots already validated for architecture-overview.md
reused here since they directly prove this doc's own claims, plus two
real firewall-cmd command outputs from live verification this session.
2026-08-26 12:32:47 +03:00
thesabear 3e91e426d1 sso-and-identity: verify against live-checked KB, expand real depth, add evidence
Source Trilium notes (Authentik/SSO Integration, Gitea Access Model)
live-verified and stamped this session - authentik_api_token confirmed
in vault.yml, automation-bot confirmed as a real non-admin Gitea account
via the API.

Cut the redundant Mermaid diagram (prose right below it said the same
thing). Restored the LDAP/superuser-outpost exception from the source
note as a compact callout rather than a full section, proportionate to
its actual weight. Added the real reasoning for centralizing auth and
the proxy-layer defense-in-depth argument, a table of the ~9 apps
running real native OIDC/SAML on top of the universal Proxy Provider
baseline (corrected after initially misstating it as either/or), the
provider-removal discipline, and two screenshots proving the Write/
Read-only access split instead of just asserting it.
2026-08-26 11:54:29 +03:00