Commit Graph
201 Commits
Author SHA1 Message Date
automation-bot 249ee949ed docs: re-verify dns-naming.md, no content drift found
Live-checked every specific claim (all 6 per-app zone-presence
examples, forwarders, corrected reverse-zone PTR, DNS-bypass firewall
rule) against Technitium and the firewall directly - all still
accurate. Bumping verified date only.
2026-09-18 23:36:52 +03:00
automation-bot a1e5732d1f docs: fix disaster-recovery.md drift (Kopia stack count, stale evidence)
Kopia's coverage claim conflated the public repo's curated stacks/
folder (a documentation subset) with the real live stack count on
rocky-docker - fixed to the actual live figure (41, cross-checked
against docker_stacks.yml and the real repo directory count), same
fix applied to the source KB note which had its own stale ~38 figure
and an incorrect hyper1 backup mode (suspend -> stop, confirmed
against live /etc/pve/jobs.cfg). Refreshed the ls/df and
roles_metadata.yml command-output evidence to match current state.
2026-09-18 23:26:42 +03:00
automation-bot 9be8e25c3b docs: fix cron-scheduler.md job-count drift (50->49, phantom PBS prune entry)
Live NocoDB now has 49 jobs/14 without a fixed time, not 50/15 - traced
to a removed inventory row for a "PBS prune job" that never actually
existed (confirmed against live data and the KB note, which states PBS
runs no prune job at all). Updated counts and refreshed all three
screenshots to match current state.
2026-09-18 23:20:34 +03:00
automation-bot 6b3bea7f6f docs: fix architecture-overview.md drift (WAN rule count, LAN enforcement mechanism)
Live-verification found two real inaccuracies: WAN now passes 4 things
inbound (NetBird's STUN forward was added, undocumented), and the "third
fix" LAN-to-LAN narrative credited pfSense's ruleset when the actual
enforcement for host-to-host traffic is each host's own firewalld (pfSense
never sees same-subnet traffic on this flat LAN). Refreshed the WAN rules
screenshot and reworded the boundary table + narrative to match. Also
cleaned up the "Other Six Traffic Laws" table formatting per feedback.
2026-09-18 11:48:37 +03:00
automation-bot 6fb00e1444 orchestration: refresh for the public-docs-drift flow (14→15)
The Kestra namespace gained public-docs-drift since this doc was last
verified. New flow-list screenshot (Total: 15), flow-patterns diagram
re-exported to 14 of 15 no-gate, and the pause-step snippet now includes
it. Also corrects the "only two things write to Trilium" claim — that
flow stamps #pendingPublicDoc labels, making it a third writer (labels
only, never content). Same correction applied to the KB source note.
2026-09-07 09:02:14 +03:00
automation-bot e5b6e8a77d docs: add homelab-inventory — the machine-derived fleet inventory layer
New doc for the weekly self-deriving inventory pipeline: a three-tier
Ansible collection (hardware off the hypervisors/firewall, VMs/LXCs from
the Proxmox APIs, listening sockets off every guest) writing three linked
NocoDB tables, read live behind a Dashy page.

Covers the design decisions worth defending: ss -tlnp over systemctl for
"what does this host serve", merge-only-by-omission on Tier 1 to protect
the one hand-entered field a lying SMBIOS can't provide, API-only Tier 2
because the two Proxmox nodes aren't clustered, stdlib-only push scripts,
and the deliberate KB-vs-machine-layer separation.

Pipeline diagram + four screenshots (Dashy page, all three NocoDB tables).
Provenance comment wired to the ansible roles/playbooks, the rocky Caddy/
dashy config, and KB note O0d4fqw0mr05. Indexed in README under Systems.
2026-09-07 08:22:29 +03:00
automation-bot bcfcb0d1d5 docs: dashy-soc-board — add the flat-searchable-list widget shape (card [77]) 2026-09-06 15:09:14 +03:00
automation-bot f9737456a8 docs: orchestration — add homelab-inventory-sync flow (card [77]) 2026-09-06 15:08:27 +03:00
automation-bot 75e8b3f694 docs: add source-provenance comment to sso-and-identity (card [91] backfill 16/16) 2026-09-06 11:50:26 +03:00
automation-bot 99e7e1504f docs: add source-provenance comment to security-monitoring (card [91] backfill 15/16) 2026-09-06 11:49:04 +03:00
automation-bot 5c4d641b2e docs: add source-provenance comment to registry-and-build (card [91] backfill 14/16) 2026-09-06 11:46:17 +03:00
automation-bot 334dc9e027 docs: add source-provenance comment to orchestration (card [91] backfill 13/16) 2026-09-06 11:44:35 +03:00
automation-bot fecaef10e3 docs: add source-provenance comment to observability (card [91] backfill 12/16) 2026-09-06 11:42:14 +03:00
automation-bot 6d6b55077e docs: add source-provenance comment to notifications (card [91] backfill 11/16) 2026-09-06 11:40:40 +03:00
automation-bot efaf2455dd docs: add source-provenance comment to netbird-zero-trust (card [91] backfill 10/16) 2026-09-06 11:37:00 +03:00
automation-bot f49f65bbbd docs: add source-provenance comment to iac-pipeline (card [91] backfill 9/16) 2026-09-06 11:35:10 +03:00
automation-bot 3f4c45ccbe docs: add source-provenance comment to firewall-and-network (card [91] backfill 8/16) 2026-09-06 11:32:23 +03:00
automation-bot 33f1eeb942 docs: add source-provenance comment to dns-naming (card [91] backfill 7/16) 2026-09-06 11:28:22 +03:00
automation-bot 65f2bdb75e docs: add source-provenance comment to disaster-recovery (card [91] backfill 6/16) 2026-09-06 11:27:18 +03:00
automation-bot feeb4a540b docs: add source-provenance comment to dashy-soc-board (card [91] backfill 5/16) 2026-09-06 11:24:25 +03:00
automation-bot 397f11816d docs: add source-provenance comment to cron-scheduler (card [91] backfill 4/16) 2026-09-06 11:18:38 +03:00
automation-bot 014b2c4cb4 docs: add source-provenance comment to architecture-overview (card [91] backfill 3/16) 2026-09-06 11:16:58 +03:00
automation-bot e7f74e496e docs: add source-provenance comment to secret-distribution (card [91] backfill 2/16) 2026-09-06 11:11:56 +03:00
automation-bot 0801ce8566 docs: add source-provenance comment to secrets-and-pki (card [91] backfill 1/16) 2026-09-06 10:57:31 +03:00
automation-bot 942c59449f docs: refresh Dashy Vault panel screenshot post-root-token-retirement
Previous screenshot's token counts/TTL distribution predated card 59
(11 active tokens, 20m/1h/no-expiry split including the standing root
token). Current state: 14 active tokens, 1h/no-expiry split - no root
token in the mix anymore.
2026-09-05 13:27:31 +03:00
automation-bot 63c16c3375 docs: refresh ACL policies screenshot with the vault-provisioner policy
Previous screenshot predated card 59 (root-token retirement) and was
missing the new vault-provisioner policy - 18 vs the current 19.
2026-09-05 12:49:48 +03:00
automation-bot 19269e4d0f docs: update auth flows for the root-token retirement (card 59)
The standing root token this doc described is retired. Replaced the
2-flow table with the real 3-flow model now in place: routine AppRole
auth, a narrowly-scoped provisioner AppRole for occasional bootstrap
work, and a break-glass generate-root path for the rare cases the
provisioner deliberately can't cover. Alerting row corrected to note
the audit-log check fires on any root-policy token generically, not
a specific standing one.
2026-09-05 12:44:31 +03:00
automation-bot bd0897a7c7 node-red: remove dead VAULT_TOKEN reference from secrets template
Mirrors the same cleanup in the private automation-vm repo - the stored
value was already a revoked credential with no functional consumer.
2026-09-05 10:44:33 +03:00
automation-bot 2c865f90f0 fix: redact live identity/CA specifics from today's SSH-CA command output
Two command-block "evidence" snippets added earlier today pasted real,
live-captured values verbatim: the exact cert file path, the fleet's
actual CA fingerprint, today's real issuance timestamp, and the live
Vault role/principal name. All of it identified real infrastructure
in a way the rest of this repo's established redaction convention
(see docs/firewall-and-network.md's [admin workstation]-style
placeholders) already exists specifically to avoid. Redacted to
bracket placeholders; the structural/format evidence (cert type,
extensions, TTLs) stays genuine.
2026-09-05 09:46:39 +03:00
automation-bot ff3ca1d8f1 docs: correct the Secrets law's failure-behavior claim for the SSH exception
"No immediate disruption" was true for TLS certs and app secrets but not
for the SSH certificate refresh, which has no static-key fallback and
eventually locks the automation identity out entirely during a sustained
Vault outage. The "always talks through a local agent" law also had an
unstated exception worth naming rather than leaving implicit.
2026-09-05 09:38:25 +03:00
automation-bot 1ae3aee4d6 docs: add the SSH Certificate Flow as its own contract, not folded into #1
Vault's ssh-client-signer mount was undocumented here entirely. Adds it
as flow 2/5 rather than merging into Certificate Flow, since the actual
mechanism differs (own systemd timer, bypasses Vault Agent's render
cycle, only reuses its cached token) - and explains why that distinction
matters for debugging. Diagram updated to match: a third data-plane box
feeding fleet-wide sshd trust instead of a container.
2026-09-05 09:36:19 +03:00
automation-bot 91a7ec1e9e docs: document the Vault SSH certificate authority in secrets-and-pki
The SSH CA mount (ssh-client-signer/) existed live in Vault but was
missing from this doc's capability list entirely. Adds it as a fourth
"What It Does" bullet with real role config and a live screenshot of
the secrets engines list, and refreshes the stale ACL policies
screenshot (was showing 15 policies, live is 18).
2026-09-05 09:19:54 +03:00
automation-bot 9fd60f3f3b orchestration.md: fix the Kestra identity claim, add live evidence
The old claim described two flows sharing one keypair under different
usernames as a deliberate scoping decision. That was actually a stale,
half-migrated credential mismatch, not a design choice - the real fix was
giving Kestra a dedicated keypair with zero relation to the ansible
automation identity's own key, so a leak of one can never expose the other.
Kestra's SSH plugin has no certificate support at all (a plain Java client,
confirmed via its own plugin schema), which is the actual reason it needs
its own static key regardless of what the fleet's ansible identity does.

Added the real current flow config (kestra_local_user/kestra_local_key) and
a screenshot of the live KV Store showing exactly those two entries. Also
refreshed the automation-self-update.timer example, which had gone stale.
2026-09-05 08:31:54 +03:00
thesabear d4f538f5e0 capitalize headings 2026-09-01 18:00:18 +03:00
thesabear f20ed10632 capitalize headings 2026-09-01 17:59:02 +03:00
thesabear 4c1b23a69c disaster-recovery.md: Layer 1 explicitly covers LXCs too now
Small, precise clarification - the table row was always worded
generically ('a host', not 'a VM') so it was never technically wrong,
just aspirational for LXC hosts before Terraform could provision them
natively. Now genuinely true for both, so it says so.
2026-09-01 08:41:13 +03:00
thesabear ab60ddce67 security-monitoring.md: agent count and roster refreshed to 12
Live re-ran agent_control -l against the real Wazuh manager - the
netbird host (ID 013) is now enrolled and Active, matching the fleet's
real current host count.
2026-09-01 08:39:09 +03:00
thesabear fa0236016b firewall-and-network.md: fresh real evidence for the Docker-bypass gap
Live-verified against the new NetBird host: firewalld genuinely locked
to 3 explicit rich-rules (zero blanket ports), yet 3 container-published
ports (netbird-proxy, netbird-server, hawser) sit completely outside
those rules and are reachable LAN-wide via Docker's own NAT - the exact
gap the doc already documented, now with a second real example on a
host provisioned this same week instead of just the one from before.
2026-09-01 08:35:28 +03:00
thesabear f69dc87460 architecture-overview.md: host count to 12, law 8 gets the mesh admin path
Fleet host count was stale (11, now 12 with the NetBird control plane).
Traffic law 8 (Management) now reflects the real new off-LAN admin path
via the zero-trust mesh, alongside the existing LAN-scoped firewall
rules - accurate about what's affected if the mesh goes down (on-LAN
access unaffected, off-LAN access specifically loses its only path).
2026-09-01 08:32:45 +03:00
thesabear aad38e086c README.md: use a dedicated zero-trust diagram, stop reusing the doc's
Was reusing netbird-zero-trust-mesh-topology.svg (the doc's detailed
peer-topology diagram) in the README too - breaks this repo's own
established convention of the README getting its own dedicated asset
even when covering related material (see readme-trust-boundaries-
blast-radius.svg vs architecture-overview-trust-depth.svg). New diagram
is a simple perimeter-vs-zero-trust conceptual contrast, matching the
README section's generalized framing rather than NetBird's specific
implementation topology.
2026-09-01 00:57:20 +03:00
thesabear 1d5b8ed65e README.md, netbird-zero-trust.md: bigger zero-trust section, expanded doc, drop over-specific personal-device detail
README: real dedicated 'Zero Trust, Actually Implemented' section (general
concept -> NetBird as the concrete implementation -> link out), host/doc
count bumped to 12/16, NetBird tool bullet.

netbird-zero-trust.md: dropped the LXC-provisioning tangent (not relevant
to a doc about NetBird itself), added self-hosted-vs-SaaS rationale, a
real Addressing table, and expanded split-DNS mechanism detail. Also
genericized personal-device specifics (device types/exact split of
access) that were too specific for the public repo.
2026-09-01 00:51:07 +03:00
thesabear 685c82a6f9 netbird-zero-trust.md: remove the rollout-status section
Not appropriate for an employer-facing portfolio doc - editorial call.
2026-09-01 00:31:40 +03:00
thesabear 8ceadab38a netbird-zero-trust.md: new doc for the zero-trust mesh overlay
New file covering NetBird - a self-hosted WireGuard mesh giving every
fleet host and personal device a stable overlay identity, with a
genuinely-implemented zero-trust policy layer (deny-by-default, groups,
scoped setup keys, peer approval, posture checks).

- Why a mesh over a classic VPN concentrator, illustrated with a real
  topology diagram (control plane handles coordination only; actual
  data flows peer-to-peer, bypassing it entirely - the literal
  distinction from a concentrator, drawn not just asserted)
- Ties back to today's iac-pipeline.md update: this LXC is the first
  host ever built through the new Terraform LXC-native path, start to
  finish, no manual provisioning step
- Real bring-up incident: gRPC/h2c requirements broke through a naive
  proxy chain, and a proxying CDN 403s the agent outright - both root
  causes documented, not just the fixes
- Evidence: 3 real command blocks (docker ps, live Caddyfile splitter
  config, netbird status --detail from an enrolled peer), 2 real
  screenshots (dashboard Peers list, Access Control Policies - port
  counts in the screenshot match the real policy detail in the text)
- Second diagram (edge routing chain) for the specific gRPC/h2c/path
  split detail, kept separate from the topology diagram since they show
  genuinely different shapes of information
- Honest, non-rounded-up rollout status table - several phases still
  explicitly open
- Sanitize-checked: no internal IPs/domains/personal email

Also: fixes iac-pipeline.md's forward-reference to this doc to use the
repo's actual link convention ([docs/x.md](x.md)), not descriptive
prose link text.
2026-09-01 00:21:06 +03:00
thesabear 2d6be37271 iac-pipeline.md: update for new Terraform LXC support
Terraform gained a second provider (bpg/proxmox) alongside the existing
telmate/proxmox, via a new containers.tf / proxmox_virtual_environment_container
resource - real, live-verified against the actual repo files. Corrects
the doc's previous "Terraform only manages virtual machines... cannot
create or manage LXC containers" claim, which is no longer true.

- Terraform section: VM/LXC comparison table, real containers.tf
  excerpt, explains why LXCs need an extra pct-exec bootstrap step
  (stock template has no sshd, since it never went through Packer)
- WARNING section: new paragraph noting the LXC-provisioning gap is
  closed for new hosts going forward (the three existing exceptions
  stay as preserved history, not retroactively fixed) - forward-links
  to docs/netbird-zero-trust.md (next commit)
- Fixed now-stale section heading ("one resource type" -> "two
  resource types")
- Sanitize-checked: no internal IPs/domains
2026-08-31 23:59:36 +03:00
thesabear 6519a90db4 orchestration-flow-patterns.svg: pick up latest drawio edit, re-apply strip fix
New export reflecting the user's latest diagram edit. Same white-line
strip as aae1ff2 applied fresh to this export (variant this time: flat
#1C1D1E plus inverted light-dark(#1C1D1E, #d3d4d5)) - verified 0 broken
patterns remain, valid XML, all 8 correct span backgrounds preserved.
2026-08-30 07:52:54 +03:00
thesabear 5e409d5510 assets: fix edge-label white-line rendering artifact in remaining 7 diagrams
Same fix as orchestration-flow-patterns.svg (8772564), applied after a
comprehensive re-check that found the bug wasn't limited to the 6 files
originally caught by a narrower pattern match - architecture-overview.svg
and firewall-and-network-docker-bypass.svg were also affected.

Confirmed via a control test on orchestration-flow-patterns.svg that the
.drawio source's labelBackgroundColor property was never the actual
cause (reverted it, re-exported, still broken, still fixed cleanly by
the same strip) - this is a draw.io export-time quirk, not a content or
convention problem, so no CLAUDE.md changes needed.

Each file: stripped the same broken wrapper-div background-color
declarations (flat #1C1D1E / #ffffff, or the equivalent light-dark()/
var(--ge-adaptive-bg) variants - not consistent across exports of the
same file), verified 0 remain, valid XML, and the correct adaptive span
background count unchanged before/after in every file.

Files: architecture-overview.svg, firewall-and-network-docker-bypass.svg,
iac-pipeline-tools-flow.svg, observability-pipeline.svg,
readme-trust-boundaries-blast-radius.svg, secret-distribution-flows.svg,
secrets-and-pki-lifecycle.svg
2026-08-29 19:08:50 +03:00
thesabear 0d7c97ab37 orchestration-flow-patterns.svg: fix edge-label white-line rendering artifact
The exported SVG's 4 edge labels (no/yes/approve/decline) had two extra,
non-adaptive background-color declarations stamped onto their wrapper
divs by the draw.io exporter (flat #ffffff, and an undefined
var(--ge-adaptive-bg) CSS variable that falls back to #ffffff) -
independent of both the .drawio source content and the export dialog's
Appearance setting (tested Automatic and Light, both showed it).
Surgically stripped just those two declarations from the exported SVG,
verified count (4+4 removed, 0 remaining), confirmed the correct
adaptive span background (light-dark(white, #1C1D1E)) and every other
color in the diagram were untouched, confirmed still valid XML.
2026-08-29 09:27:13 +03:00
thesabear 6aa9117ad2 iac-pipeline.md: full 7-step audit
- Replaced both mermaid diagrams with real Nextcloud diagrams; the
  Ansible-stages rebuild caught a real omission - the old diagram showed
  only 2 stages (init/compliance) when there are genuinely 3
  (provisioning.yml exists too, currently just clamav/rocky-docker)
- Live-verified against the real iac repo: roles_metadata.yml (9
  cis_hardening + 6 other compliance roles, 1 provisioning role),
  kickstart partitioning/packages/SSH config, both Packer bootstrap
  scripts, terraform.tfvars, pct list on both hypervisors, a real
  rendered host_tags.yml
- KB fix: LXC Strategy note's PBS row was wrong, not just stale - PBS
  genuinely has a populated vm_tags list and live compliance roles
  (confirmed via real artifacts on the host itself), not 'never
  Ansible-managed' as it said; corrected and re-verified via re-fetch
- Added real content not previously in the doc: the deliberately
  permissive build-time SSH window closed by ssh_hardening, the
  admin/ansible identity split baked into the image at build time, and a
  third pipeline exception (PBS) that's genuinely different in kind from
  the other two, including a real Rocky-vs-Debian PAM ordering bug found
  onboarding it
- Considered two screenshot candidates (Proxmox template list, VM/LXC
  mix) - declined as low-value; command evidence covers this
  source-driven topic well on its own
- Sanitize-checked: no internal IPs/MACs/domains/personal info/forbidden
  app names
2026-08-29 08:21:38 +03:00
thesabear 57c494e354 notifications.md: full 7-step audit
- Replaced mermaid diagram with real Nextcloud diagram; rebuild caught a
  real bug in the old one (showed Kopia/Bazarr flowing through the App
  Router, which flows.json disproves - they bypass it entirely)
- Live-verified Mosquitto broker config/ACL, Node-RED flow routing (16
  switch rules = 15 apps + unknown fallback, 2 dedicated endpoints),
  mqtt-monitor.sh check count against the real script
- Named NetBox and Kestra directly (previously generic) after the real
  Node-RED screenshot made them visible anyway; Postiz/nocodb-content
  stay generic per standing instruction
- Added real evidence: routing-table command output, the real
  topic-agnostic Inventory Parse function source, real Mosquitto
  ACL/config, real check-count grep, a real Node-RED flow canvas
  screenshot, and a real Mosquitto connection log screenshot (the
  kestra-notify client is live proof of the MQTT-not-HTTP claim)
- KB fix: Ansible mqtt_client Role note was missing a 23rd real check
  (crash-looping systemd units, distinct from the failed-units check,
  added to the script after a real vault-agent crash-loop incident)
- Sanitize-checked: no internal IPs/domains/personal info/forbidden app
  names
2026-08-29 07:49:33 +03:00
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