Commit Graph
149 Commits
Author SHA1 Message Date
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
thesabear 62d1a508eb README: ground every Systems bullet in verified, sourced detail
Fixed one real inaccuracy (Gitea registry scope, Secret Distribution
path count) and replaced generic descriptions with true, specific
detail across all 14 Systems bullets - real incidents, real design
decisions, concrete numbers - each checked against Trilium and, where
relevant, the live Ansible roles rather than trusted at face value.

Also stages a verified-but-unintegrated PAM hardening finding in
docs/firewall-and-network.md for that file's own upcoming audit pass.
2026-08-24 11:18:04 +03:00
thesabear 5403307790 updates 2026-08-23 12:57:55 +03:00
thesabear eea176c322 README: bump bullet-list app names to font-size 1.4em
1.15em rendered fine (sanitizer allow-list is working, confirmed by
the stat-table numbers) but was too subtle a jump to actually look
bigger next to body text. 1.4em matches the visual weight of the
stat-strip numbers.
2026-08-23 12:20:47 +03:00
thesabear 2740710f95 README: real CSS now renders - center stat table, verify bigger names
Gitea's default sanitizer strips style="" from every element; added a
markup.sanitizer allowlist for style on common tags (app.ini, this
Gitea instance) and restarted the service. Now that it's actually
respected: table centered via style="margin:0 auto" (the deprecated
align attribute never reliably did this), and the app-name font-size
bump from the last commit should finally show up too.
2026-08-23 12:16:19 +03:00
thesabear 744772139d README: make tech names in the bullet list bigger, not just bold
Plain markdown bold has no size control. Switched each app name to
<strong style="font-size:1.15em;"> so it stands out from the
description text instead of just being the same size in bold.
2026-08-23 12:03:11 +03:00
thesabear e5eee4d592 README: drop broken centering wrapper on stat strip
align="center" and a div wrapper both failed to actually center the
table under Gitea's markdown CSS. Rather than keep guessing, dropped
the centering attempt - table stays left-aligned with its per-cell
alignment intact.
2026-08-23 12:00:44 +03:00
thesabear 6278e94205 README: fix stat strip centering with a div wrapper
align="center" on <table> itself gets ignored - Gitea's markdown CSS
forces tables to display:block for horizontal scroll, which breaks
that attribute. Wrapping in <div align="center"> actually centers it.
2026-08-23 11:58:29 +03:00
thesabear a4d8f698e9 README: center stat strip and use meaningful icons instead of decoration
Table wasn't centered on the page (only text inside cells was) - added
align=\"center\" to the table itself. Icons were arbitrary; replaced
with ones that actually trace back to the related system's own icon
elsewhere in this doc (Docker whale for compose stacks, the brick wall
from Firewall & Network Segmentation for trust boundaries, the same
cycle icon Orchestration uses for automated maintenance flows).
2026-08-23 11:53:43 +03:00
thesabear 19cae974a8 update readme 2026-08-23 11:47:34 +03:00
thesabear 52c2ae7858 update readme 2026-08-23 11:45:00 +03:00
thesabear 57a1db1b63 update readme 2026-08-23 11:44:10 +03:00
thesabear 76e2d61fb8 update teh readme 2026-08-23 11:43:50 +03:00
thesabear 3df76a51db README: merge bio intro and hero pitch into one bulleted section
Both paragraphs made the same 'this isn't a hobby, it's a platform'
point and duplicated tech mentions. Merged into one section: a
bulleted list naming the real technology behind every category
(Vault for secrets, Kestra for orchestration, Wazuh+Dashy for the
SOC, etc.) instead of one dense paragraph or abstract category names.
2026-08-23 11:21:10 +03:00
thesabear 6cb48b4a6d readme updates 2026-08-23 10:58:21 +03:00
thesabear 2a0dc1f866 README: fix diagram caption to match what the simplified diagram actually shows
Caption claimed all dashed arrows were telemetry reporting, but two
of them ('proxies', 'auth') are traffic-routing relationships, not
telemetry - the old caption was written for the full 20-edge version
and never updated when the diagram got simplified.
2026-08-23 10:49:33 +03:00
thesabear e1227844c1 README: replace Mermaid diagram with real drawio SVG export
No more Mermaid, per standing rule - the architecture diagram is now
a real image (assets/architecture-overview.svg), built and exported
from the Nextcloud Diagramming app, fetched via WebDAV and validated
as well-formed XML before committing. Ends the rendering-gap chase
entirely since there's no live renderer involved anymore, just a
static image.
2026-08-23 10:46:23 +03:00
thesabear a19c6c02bb updates 2026-08-23 10:35:35 +03:00
thesabear b0792b7142 README: rebuild full diagram with corrected edge direction
Restructured so the edge proxy feeds forward into the app host
(EdgeProxy -.proxies.-> Apps) instead of the app host and SSO
pointing backward into the proxy - matches the real traffic
direction (browser hits the proxy first, which routes to the app)
and removes the long rank-spanning edges that were likely behind the
rendering gap. Full node set restored, colors restored.
2026-08-23 09:59:08 +03:00
thesabear 92b9168897 TEMP: isolate whether DNS-->Vault (the one rejoin in this tree) is the trigger 2026-08-23 09:55:21 +03:00
thesabear 0d377b48aa TEMP: test with a clean tree, no crossing/rejoining edges
7 nodes, strictly tree-shaped, no diamond merges (removed DNS-->Vault
and the EdgeProxy/SSO/InternalProxy branch entirely). If gap is gone,
the rejoining-path topology is the trigger, not raw node count.
2026-08-23 09:54:03 +03:00
thesabear 5f09d9c595 TEMP: test with ~half the real diagram (no Monitoring/SecMon fan-in)
Diagnostic bisection - if gap reappears here, it's a size/complexity
threshold. If not, the trigger is specifically in the observability
fan-in portion I removed for this test.
2026-08-23 09:51:48 +03:00
thesabear 3aeeb21518 TEMP: swap diagram for a trivial 3-node placeholder to diagnose the gap
Diagnostic only - not a real content change. If the gap disappears
with this minimal diagram, it's genuinely about the real diagram's
content and I can bisect from here. If the gap is still there, it's
not about the diagram at all.
2026-08-23 09:50:33 +03:00
thesabear 742ffec430 README: revert the 3 failed diagram-gap test changes
None of edge reduction, classDef removal, or multi-line label removal
fixed the gap - restoring the full diagram content since there's no
reason to keep it degraded for a fix that didn't work.
2026-08-23 09:32:25 +03:00
thesabear 9054ac7027 README: remove most multi-line <br/> node labels from diagram, test #3
Compared node labels between this diagram and the non-gapped
architecture-overview.md one - this had 5 two-line labels, that one
only 2. Reduced to 1 remaining (App Host) to test whether multi-line
label height is what's breaking the container size calculation.
2026-08-23 09:29:56 +03:00