Commit Graph
123 Commits
Author SHA1 Message Date
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
thesabear f1d1464af5 assets: update trust-boundaries-blast-radius diagram to latest export 2026-08-26 10:57:41 +03:00
thesabear 3ccf5cc2b1 assets: fix floating label background color in README diagrams
Edge-label captions were using an ambient light-dark() background that
didn't match Gitea's actual dark theme. Fixed to a plain rgb(13,17,23),
matching the corrected CLAUDE.md diagram convention.
2026-08-26 09:56:15 +03:00
thesabear 1c3a2c83a5 secret-distribution: verify against live-checked KB, fix diagram, add real evidence
Source Trilium note (Secret Distribution Model) was live-verified and
stamped this session - Certificate Flow, App Secret Flow, Configuration
Distribution Flow, and the technitium_api_token Vault-KV exception all
confirmed against the real hosts, not just trusted from the KB.

Replaced the Mermaid diagram, which incorrectly showed the Configuration
Distribution Flow feeding into Vault directly, with a corrected version:
that flow is a control-plane gate on what Vault Agent renders, not a
peer data flow. Added a real Vault Agent log excerpt proving the full
redeploy chain (restart -> render -> reload_command -> container
recreated) actually happens, and restored the technitium_api_token
exception that was in the source note but missing from this doc.
2026-08-26 01:23:22 +03:00
thesabear b4827a3d42 secrets-and-pki: remove open-vulnerability disclosure section
Publishing a ranked list of a live system's own weak points - including
explicitly naming the "single highest-value target" - is a real security
problem for a public repo, not a portfolio concern. Removed the section
and the matching stat-table row. Left the fixed cert-renewal incident in
place since there's nothing exploitable in a resolved issue.
2026-08-26 00:22:19 +03:00
thesabear fb85d9c8f5 secrets-and-pki: add real Vault evidence, expand access model
Access model now covers the narrowly-scoped read-only utility policies
(ansible sync roles, metrics-reader, pki-reader) alongside the
host-scoped svc-* pattern - the fuller picture confirmed live against
Vault's actual ACL policy list, not just the original narrower claim.

Added two real screenshots: the live policy list, and an actual audit
log entry showing a KV read with every secret value as hmac-sha256:...
instead of plaintext - proof for the audit-trail claim instead of just
an assertion of it.
2026-08-26 00:15:14 +03:00
thesabear 806f5302cd secrets-lifecycle: update diagram with latest export from Nextcloud 2026-08-25 23:42:34 +03:00
thesabear 818892c8a5 secrets-and-pki: verify against Trilium, replace diagrams with real content
Removed the before/after plaintext-secrets Mermaid diagram (the bullets
right below it already said the same thing more clearly) and the
Architecture flowchart (its per-host labels were silently missing
registry-token and Hawser-secret details that didn't fit in the boxes).

Replaced the flowchart with an accurate, complete "who gets what" table
sourced directly from Trilium, one sentence for the proxy-routing fact
it was trying to show, and a new sequence diagram for the actual secret
lifecycle (auth -> render -> read -> async rotation) - a genuinely
different kind of diagram since that's process/time-ordered information
a table can't represent well.

Also restored real specificity Trilium had that the doc had flattened
into vague language: the cert-renewal row now names Technitium
specifically and states the actual incident (an expired cert silently
served for 19 days before the auto-rebuild hook existed), and the audit
trail row now states the real rotation policy (weekly, 8 generations).
2026-08-25 23:30:58 +03:00
thesabear 5fddb5b8f7 architecture-overview: tighten two image captions that undersold their own screenshots
Both captions described only one rule visible in a multi-rule screenshot,
technically accurate but misleading about what the image actually shows.
2026-08-25 22:04:44 +03:00
thesabear cb5a2de638 architecture-overview: verify against Trilium, fix inaccurate dependency graph, add real evidence
Removed the dependency-graph Mermaid diagram (had backwards Vault
dependency arrows, contradicted the documented ingress model) and the
four-boundary Mermaid diagram (fully redundant with the table below it).
Verified every remaining claim against Trilium's Traffic Flow Model and
fixed two that didn't hold up: the DNS-bypass failure behavior overstated
an unconditional SSO bypass, and the notifications failure behavior had
an unsourced claim about backlog retry.

Added the real story behind the trust-boundary hardening (three stages
of the same "trusted by default" flaw getting found and closed, not a
changelog of dated facts), a new trust-depth diagram showing that being
"inside the network" still enforces its own internal boundaries, and
real pfSense screenshots proving the LAN lockdown rules actually exist
in production, not just in the doc.
2026-08-25 21:58:42 +03:00
thesabear c11395825c removed proxmox folder 2026-08-25 11:37:02 +03:00
thesabear 63689c3fc0 add projects/ - standalone scripts alongside the Docker stacks
Two real, working scripts: an Ansible playbook run-menu (the same
pattern used identically across both the fleet-config and infra-
provisioning repos), and cuesplit, a frame-accurate FLAC/.cue
splitting utility. Sanitized paths only, logic untouched.

README gets a new "Scripts & Tooling" section pointing at it, placed
right after "What's Running" alongside the other repo-structure
pointer.
2026-08-25 11:29:04 +03:00
thesabear b1807247e7 stacks: add nextcloud Dockerfiles, fix a broken kodi compose edit
Adds the two Dockerfiles nextcloud's compose build: contexts were
already referencing but never had (custom smbclient support for the
main container, a documentserver base for euro-office) - both had
their real internal-CA-trust mechanism replaced with a comment
explaining what's there and why, per the standing rule against
publishing that detail.

Also fixes a compose bug: kodi-ma-bridge's `environment:` key had
been dropped, leaving KEY=value pairs nested under `env_file:` (which
expects file paths, not inline vars) - would have made docker-compose
try to open a file literally named `TZ=${TZ}`.

Rest of this commit is manual cleanup (comment tidying, dropped
personal media-library volume mounts, a couple of .env comment
trims).
2026-08-25 11:12:20 +03:00
thesabear e6ad73e2f3 stacks: use each app's real default port instead of arbitrary fleet ports
Replaced 29 host-port values across 27 stacks with the app's own
well-known default (read directly from each compose file's own
container-side port mapping) instead of the arbitrary port numbers
this fleet actually assigns to avoid collisions across ~44 services
on one host. More recognizable to a reader, and removes the last
fleet-specific detail these files carried.

Also removes a stale adminer service from n8n's stack entirely
(compose service + .env var) - it's no longer actually deployed.
2026-08-25 10:30:13 +03:00
thesabear 1b1ca78d1f stacks: add .env for dev-tools stacks
Adds cloudcommander and it-tools .env files. it-tools' private .env
had two real domains (it-tools.local.thesabear.net,
it-tools.thesabear.net) that the public compose file doesn't
reference at all, so dropped along with the unused DOCKER var.

This completes .env/.env.secrets.ctmpl coverage across every
category in stacks/ (identity-and-security, platform, media,
productivity, dev-tools) - every var cross-checked against its
actual public compose file throughout.
2026-08-25 09:09:48 +03:00
thesabear b2f308a135 stacks: add .env + .env.secrets.ctmpl for productivity stacks
Adds real Vault Agent secret templates and non-secret env vars for
all 9 productivity stacks. Sanitized several real leaks: a real
residential public IP (ghost's UMAMI_IGNORE_IP), real personal
domains/email used across joplin/n8n/ghost/paperless-ngx, and a
real embedded OAuth client ID in paperless-ngx's private OIDC config
(dropped entirely - the public compose file doesn't wire up OIDC at
all, so none of that config was needed).

Also dropped n8n secrets referencing the out-of-scope Content
Pipeline system (nocodb-content, Postiz), and did not carry over a
real Redis password found sitting in plaintext in nextcloud's
private .env (unused by the public compose anyway).

Every var cross-checked against what its actual public compose file
references before writing.
2026-08-25 09:08:42 +03:00
thesabear e9bc00fde4 stacks: add .env + .env.secrets.ctmpl for media stacks
Adds real Vault Agent secret templates and non-secret env vars for
all 15 media stacks. Sanitized real leaks found in the source data:
kodi's real username and real hostnames+IPs in KODI_INSTANCES,
tdarr's real IP and hostname reference, immich's real username -
replaced with generic values (IPs use the RFC 5737 documentation
range, 192.0.2.0/24, rather than another real-looking address).

Every var cross-checked against what its actual public compose file
references before writing, learned from the platform batch.
2026-08-25 09:01:52 +03:00
thesabear 4fe385f3b5 stacks: add .env + .env.secrets.ctmpl for platform stacks, fix var-name mismatches
Adds real Vault Agent secret templates and non-secret env vars for
14 platform stacks (caddy, caddy-internal, dashy, docker-socket-
proxy, dockhand, gitea, grafana-stack, hawser, kestra, kopia,
mosquitto, nocodb, node-red, speedtest-tracker), sanitized per the
kv/host/... convention established for identity-and-security.

Also fixes 6 variable-name mismatches discovered while cross-checking
every new .env/.ctmpl against what its actual public compose file
references (the public compose files were already adapted from the
private originals during an earlier reorg pass, so names don't always
match 1:1): authentik (PG_USER/PG_DB/PG_PASS), gitea (added
GITEA_DOMAIN/GITEA_ROOT_URL, dropped an unused duplicate-instance pair
of vars), grafana-stack (GRAFANA_ADMIN_PASSWORD), kestra (added
USERNAME/PASSWORD), kopia (SECRET_PASSWORD), nocodb (JWT_SECRET).
Also dropped an unused DOCKER var across most stacks where the
compose file hardcodes its path instead of referencing it.
2026-08-25 08:58:45 +03:00
thesabear 5d9f5be89e stacks: add .env + .env.secrets.ctmpl for identity-and-security stacks
Adds the real Vault Agent secret-rendering templates and non-secret
env vars for authentik, vaultwarden, and wazuh - sanitized (real
domain/email/SMTP provider genericized, kv/<host>/... paths use a
generic 'host' placeholder instead of the real hostname). This is
the standing pattern for the rest of stacks/ going forward.
2026-08-25 08:40:25 +03:00
thesabear 342fde4654 stacks: remove 9 folders, update stack count in README
Removed: ollama (AI-related concerns), emby/qbittorrent/prowlarr
(media-download concerns), bookstack (being deprecated in the
homelab), and mariadb-latest/mysql-8/postgres-18-alpine/valkey-9.0-
alpine (build-only base-image factories - nothing connects to them,
they add no portfolio value on their own; real per-app DB usage,
e.g. Kodi's own mariadb service, already lives in that app's stack
folder and is unaffected).

Stack count updated 53 -> 44 in both README references.
2026-08-25 08:27:33 +03:00
thesabear c86d53b60c update gitignore 2026-08-24 21:27:11 +03:00
thesabear cb1c25257f README: fix heading case, reorder sections, split dense intro paragraph
- Heading capitalization consistent Title Case throughout
- Moved the three personal sections (What I Have Explored, What I'm
  Focused On, Fun Fact) from between the two strongest technical
  sections to after Systems/What's Running, as a closing note -
  keeps momentum through the trust-boundary story into the diagram
  and full Systems breakdown, and gives the page a real closing beat
  instead of ending on a bare stack-count line
- Split the dense opening bio paragraph into two at its natural seam
2026-08-24 20:25:50 +03:00
thesabear 7cedba5ace assets: pull latest trust-boundaries diagram export 2026-08-24 20:11:35 +03:00
thesabear 070b662089 assets: fix diagram readability - bigger fonts, drop redundant in-image caption 2026-08-24 20:07:32 +03:00
thesabear 1627563564 update the readme 2026-08-24 19:57:11 +03:00
thesabear 89d61a9a24 assets: refresh trust-boundaries diagram export 2026-08-24 19:56:27 +03:00
thesabear a63a5dc589 README: add trust-boundary diagram, alphabetize Systems section
Adds a real drawio-exported diagram to "Why Four Trust Boundaries,
Not One" showing the physical blast-radius split behind the routing-
authority claim in the text (previously prose-only). Sanitized -
verified no real hostnames/IPs made it into the export.

Also reorders all 14 Systems bullets alphabetically for easier
scanning.
2026-08-24 19:53:34 +03:00
thesabear 454437fa4e README: fix vague section heading
"The Decision That Shows The Most" never stated what it was claiming.
Renamed to state the actual decision directly.
2026-08-24 14:29:30 +03:00
thesabear c48e8c6cbb update the readme 2026-08-24 14:00:41 +03:00
thesabear a7f1a98ed2 update the readme 2026-08-24 13:36:07 +03:00