dtoro 205d8a1a43 Oikos Week 4: Console v0, approval hardening, docs pass, backlog
Oikos Console v0 (oikos/console/) — read-mostly, server-rendered FastAPI
+ Jinja2 web UI, no SPA build chain. Signals landing page, service grid
+ detail, node/blast-radius view, live Mermaid relationship graph, drift
findings, approvals queue (approve/deny, destructive confirmation-phrase
enforced), daily/weekly reports. Tested end-to-end via the preview tools
against live production data, including a real click-through of the
approve/deny flow.

Found and fixed two bugs during that testing:
- Severity-dot CSS classes didn't match the actual severity strings
  (dot-warn/dot-crit vs "warning"/"critical") — warning-severity signals
  rendered with no visible indicator at all.
- The console's sys.path setup pointed at its own webhook checkout
  (/opt/oikos-console) rather than /opt/homelab-context, which would have
  made its oikos.* imports resolve to a SEPARATE copy of oikos/signal.py
  etc. than the scheduler and CLI use — silently forking signal/approval
  data into two locations in production. Fixed to match mcp/server.py's
  CONTEXT_DIR pattern. Also added _commit_push() so the console's writes
  (approval replies, signal ack/resolve) don't sit uncommitted against
  the 5-min-synced clone.

Split oikos/gen_topology_lib.py out of oikos/gen-topology.py (hyphenated
filenames aren't importable) so the console's /graph route can render
live without shelling out.

oikos/console/deploy/ — third webhook on dtoro/Homelab-Docs (port 9831),
matching the homelab-mcp/secrets-issuance precedent. README documents the
Caddy route and Gitea webhook registration this repo can't do for itself,
and that Authentik step-up on /approvals needs a live instance to
configure.

Approval hardening: grants are now single-use (oikos/approve.py
check_grant marks the request "executed" atomically, so a second call
for the same id fails even within the TTL) — verified with a test. Per-
agent age-key-signed requests, as originally planned, turned out not to
be buildable as stated: age is encryption-only, no signing primitive.
Documented the real alternative (SSH-key signing) and moved it to the
60/90-day backlog pending an inventory schema gap (no SSH pubkeys
recorded today).

Docs pass: added the Oikos command surface to operations/commands.md,
new MCP tools to AGENTS.md. Found two more stale references while at
it — commands.md and AGENTS.md both still pointed DNS at the destroyed
LXC 124/dnsmasq instead of Technitium on dns (107), and a claudio-monitor
reference deprecated since 2026-06-04 — fixed both.

60/90-day backlog written into OIKOS.md, derived from gaps actually
observed this month, not guesswork.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 00:03:51 +02:00

Homelab Wiki — hubris

Living documentation for the hubris Proxmox homelab. Every node, every cross-cutting system, and every meaningful incident is its own page; pages are linked so you can start anywhere and walk the graph.

Last refreshed against live state: 2026-04-28.

Map

Hosts

  • hubris — Proxmox VE node, GMKtec NucBox M6 Ultra, 192.168.8.77 — runs everything today
  • strong — Proxmox VE node (cluster hostname strong), 192.168.178.181 — 2nd member of the Homelab cluster as of 2026-07-01, hosts no guests yet

VMs

LXC containers

See the full table in containers/index.md. Quick links:

ID Name IP Role
101 jellyfin 192.168.8.206 Media server
102 nfs-export 192.168.8.200 NFSv4 re-export of /mnt/library for ZimaOS
103 paperless 192.168.8.130 Document mgmt
104 gitea 192.168.8.121 Git server
105 apps 192.168.8.205 Docker host (Artifacto / PlantUML / Portainer / WriteFreely)
114 nextcloud 192.168.8.224 Personal cloud
118 elementsynapse 192.168.8.239 Matrix Synapse
119 sophia 192.168.8.157 Sophia
120 mule-images 192.168.8.136 Mule-image / mulita photos
121 caddy 192.168.8.175 Reverse proxy
122 arriman 192.168.8.132 Docker host (*arr stack)
124 authentik 192.168.8.180 SSO + split-horizon DNS
130 grimmory 192.168.8.213 Digital library (Grimmory — fork of Booklore)
132 rclone 192.168.8.214 Off-host backup → Proton Drive (rclone + Web GUI)

Cross-cutting infrastructure

Investigations

Time-stamped incident notes / experiments in investigations/.

Operations

Conventions

  • Each node page ends with a ## Changelog section. Reverse-chronological. Entry format:
    ### YYYY-MM-DD — short title
    one or two lines on what changed and why.
    
  • Cross-linking is mandatory. If a page references another node or system, link to it. Treat orphans as a bug.
  • Live state wins. When something here disagrees with pct config / docker inspect / running config, fix the wiki and note the change in the relevant changelog.
  • Tracked configs. A node whose config lives in a Gitea repo (Caddy, Gitea customizations, Artifacto, mule-image) is auto-deployed via webhook — see auto-deploy. Edits there must be pushed, not left local.
  • No secrets. This is a private repo on git.hubris.network, but still: paths to secret files are fine, secret values are not.

Maintaining this wiki

When you change a node:

  1. Update the relevant page (config snapshot, ports, mounts).
  2. Add a changelog entry at the bottom of that page.
  3. If the change touches a cross-cutting system (DNS, Caddy, Authentik, mesh), update that page too and link it from the changelog entry.
  4. If it's an incident, add an entry to investigations/.

See also

Description
Agentic OS for running a Homelab
Readme 37 MiB
Languages
Go 53.1%
Svelte 25.7%
TypeScript 14%
Shell 3.8%
Python 1.7%
Other 1.5%