Oikos Week 1: kernel policy, ontology, service contract, topology gen

Adds the Oikos agent-OS kernel: oikos/policy.yaml (risk classes +
approval rules for every homelab/MCP command), oikos/ontology.yaml
(8-domain systems model, typed relationships, node lifecycle), and
OIKOS.md (OODA loop operating brief, linked from AGENTS.md).

Extends inventory.yaml with a stable service contract (doc_page,
config_repo, risk_notes) on all 17 services, and a structured
archaeology: section for the 13 destroyed LXCs (was scattered
comments + a narrative table). Fixes stale drift found in the
process: authentik's backend pointed at a retired LXC (124); core
has run on the VPS since 2026-05-31.

Adds oikos/gen-topology.py, generating infrastructure/topology.md
(Mermaid compute/ingress + storage views) from inventory.yaml.
build_host_files.py now carries state/storage/depends_on into
generated hosts/*.yaml.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-05 22:50:34 +02:00
parent 7e8860ab47
commit b230ab5937
34 changed files with 832 additions and 8 deletions

View File

@@ -5,6 +5,7 @@ name: apps
kind: lxc
os: linux
role: docker-apps
state: active
host: hubris
pve_id: 105
lan_ip: 192.168.8.205
@@ -33,21 +34,29 @@ services_hosted:
- name: artifacto
backend: apps
url: https://artifacto.hubris.network
doc_page: containers/105-apps.md
config_repo: dtoro/Artifacto
- name: homelab_mcp
backend: apps
port: 9810
systemd_unit: homelab-mcp
public_host: mcp.hubris.network
endpoint: https://mcp.hubris.network/mcp
doc_page: infrastructure/homelab-context.md
config_repo: dtoro/Homelab-Docs
note: MCP server. Read-only context + management. Reachable on the LAN via Caddy and from off-LAN via
Netbird (192.168.8.0/24 is a network resource routed through hubris).
risk_notes: "agents' primary read surface \u2014 outage degrades every agent to grepping the clone"
- name: secrets_issuance
backend: apps
port: 9820
systemd_unit: secrets-issuance
public_host: secrets.hubris.network
endpoint: https://secrets.hubris.network/issue
doc_page: operations/agent-enrollment.md
config_repo: dtoro/Homelab-Docs
note: Issues per-client age private keys. Gated at source-IP layer (mesh + LAN subnets in MESH_SUBNETS).
risk_notes: "identity issuance \u2014 any change is security-sensitive; key operations are destructive-class"
age_pubkey: age1duyl8mkpgu80uv934dy8q7enqjms6yvdz264hme8uryuxmvvqesq6rusq0
see_also:
- containers/105-apps.md

View File

@@ -5,6 +5,7 @@ name: arriman
kind: lxc
os: linux
role: arr-stack
state: active
host: strong
pve_id: 122
lan_ip: 192.168.8.245
@@ -28,6 +29,7 @@ services_hosted:
- name: arr_stack
backend: arriman
note: jellyseerr / qbit / sab on docker compose
doc_page: containers/122-arriman.md
notes:
- Migrated from hubris to strong 2026-07-05 (Phase 2). Library on ludo-lvm.
- Contains homarr, radarr, sonarr, lidarr, sabnzbd, qbittorrent, bazarr, flaresolverr, prowlarr, jellyseerr

View File

@@ -5,6 +5,7 @@ name: auth-outpost
kind: lxc
os: linux
role: authentik-gateway
state: active
host: hubris
pve_id: 106
lan_ip: 192.168.8.6

View File

@@ -5,6 +5,7 @@ name: caddy
kind: lxc
os: linux
role: reverse-proxy
state: active
host: hubris
pve_id: 121
lan_ip: 192.168.8.175
@@ -23,6 +24,10 @@ services_hosted:
backend: caddy
role: reverse-proxy
note: terminates all *.hubris.network
doc_page: containers/121-caddy.md
config_repo: dtoro/caddy-conf
risk_notes: "wide blast radius \u2014 every *.hubris.network route rides on it (see oikos/policy.yaml\
\ service_overrides)"
notes:
- Terminates all *.hubris.network
- /etc/caddy is a git checkout of dtoro/caddy-conf

View File

@@ -5,6 +5,7 @@ name: dns
kind: lxc
os: linux
role: dns-server
state: active
host: hubris
pve_id: 107
lan_ip: 192.168.8.2
@@ -14,13 +15,13 @@ mesh_globals:
- netbird
- tailscale
runs:
- authentik
- dns
services_hosted:
- name: authentik
url: https://auth.hubris.network
- name: dns
backend: dns
dns: null
note: Technitium DNS, split-horizon zone
doc_page: containers/107-dns.md
risk_notes: "LAN-wide resolver \u2014 misconfig breaks name resolution for every client"
notes:
- Technitium DNS, split-horizon zone for *.hubris.network
- Primary DNS for 192.168.8.0/24 LAN (inventory.services.dns references this)

View File

@@ -5,6 +5,7 @@ name: elementsynapse
kind: lxc
os: linux
role: matrix-server
state: active
host: strong
pve_id: 118
lan_ip: 192.168.8.242
@@ -22,6 +23,8 @@ services_hosted:
- name: matrix
url: https://matrix.hubris.network
backend: elementsynapse
doc_page: containers/118-elementsynapse.md
risk_notes: "alert/approval channel for Oikos \u2014 outage silences agent escalation"
notes:
- Migrated from hubris to strong 2026-07-05 (Phase 1 of strong migration plan).
see_also:

View File

@@ -5,6 +5,7 @@ name: gitea
kind: lxc
os: linux
role: git-server
state: active
host: hubris
pve_id: 104
lan_ip: 192.168.8.121
@@ -26,6 +27,9 @@ services_hosted:
url: https://git.hubris.network
backend: gitea
backend_url: http://192.168.8.121:3000
doc_page: containers/104-gitea.md
config_repo: dtoro/gitea-customizations
risk_notes: hosts all config repos + deploy webhooks; outage blocks auto-deploy and sync
notes:
- Bare repos live at /mnt/library/repos/dtoro/*.git
see_also:

View File

@@ -5,6 +5,7 @@ name: grimmory
kind: lxc
os: linux
role: book-library
state: active
host: strong
pve_id: 130
lan_ip: 192.168.8.247

View File

@@ -5,6 +5,7 @@ name: haos
kind: vm
os: linux
role: home-automation
state: active
host: hubris
pve_id: 108
lan_ip: 192.168.8.101
@@ -21,6 +22,7 @@ runs:
services_hosted:
- name: haos
backend: haos
doc_page: vms/108-haos.md
see_also:
- vms/108-haos.md
mcp_endpoint: https://mcp.hubris.network/mcp

View File

@@ -5,6 +5,7 @@ name: house
kind: lxc
os: linux
role: family-planner
state: active
host: strong
pve_id: 129
lan_ip: 192.168.8.244

View File

@@ -5,6 +5,7 @@ name: hubris
kind: proxmox-host
os: linux
role: hypervisor
state: active
lan_ip: 192.168.8.77
mesh:
netbird:
@@ -28,6 +29,8 @@ services_hosted:
url: https://proxmox.hubris.network
backend: hubris
port: 8006
doc_page: hosts/hubris.md
risk_notes: "hypervisor UI \u2014 changes here affect every guest on the node"
age_pubkey: age1xkklkvnk5z0fsnh6cfgv70hy9ksfy8rdprwerzw4yk3p4p7cxcqs2yvpz6
see_also:
- hosts/hubris.md

View File

@@ -5,6 +5,7 @@ name: jellyfin
kind: lxc
os: linux
role: media-server
state: active
host: strong
pve_id: 101
lan_ip: 192.168.8.246
@@ -25,6 +26,9 @@ services_hosted:
- name: jellyfin
url: https://media.hubris.network
backend: jellyfin
doc_page: containers/101-jellyfin.md
risk_notes: native Authentik OIDC via SSO-Auth plugin, no Caddy forward-auth gate; VAAPI transcode depends
on GPU passthrough on strong
notes:
- Jellyfin 10.11.11 with VAAPI hardware acceleration (Radeon 680M iGPU on strong)
- 4 cores / 8 GiB RAM / 1 GiB swap

View File

@@ -5,6 +5,7 @@ name: mac-mini
kind: workstation
os: macos
role: dev
state: active
lan_ip: 192.168.178.182
mesh:
netbird:

View File

@@ -5,6 +5,7 @@ name: mule-images
kind: lxc
os: linux
role: photo-management
state: active
host: hubris
pve_id: 120
lan_ip: 192.168.8.136
@@ -25,6 +26,8 @@ services_hosted:
- name: photos
url: https://photos.hubris.network
backend: mule-images
doc_page: containers/120-mule-images.md
config_repo: dtoro/mule-image
see_also:
- containers/120-mule-images.md
mcp_endpoint: https://mcp.hubris.network/mcp

View File

@@ -5,6 +5,7 @@ name: netbird-vps
kind: external
os: linux
role: netbird-mgmt
state: active
mesh:
netbird:
ip: 100.122.165.149
@@ -16,6 +17,16 @@ mesh_globals:
- tailscale
ssh:
user: root
runs:
- authentik
services_hosted:
- name: authentik
url: https://auth.hubris.network
backend: netbird-vps
doc_page: containers/106-auth-outpost.md
note: core runs on the VPS since 2026-05-31; LAN forward-auth outpost is auth-outpost (LXC 106) at 192.168.8.6:9000.
Previous backend value "authentik" referenced the retired embedded-outpost host (LXC 124).
risk_notes: "SSO provider \u2014 outage locks login to OIDC/forward-auth services"
notes:
- "Public IONOS VPS \u2014 hosts the vanilla netbird mgmt+signal+relay+dashboard stack + host coturn (see\
\ infrastructure/vps-hardening.md + infrastructure/mesh.md changelog 2026-05-21)."

View File

@@ -5,6 +5,7 @@ name: nextcloud
kind: lxc
os: linux
role: file-sync
state: active
host: hubris
pve_id: 114
lan_ip: 192.168.8.224
@@ -25,6 +26,7 @@ services_hosted:
- name: nextcloud
url: https://cloud.hubris.network
backend: nextcloud
doc_page: containers/114-nextcloud.md
see_also:
- containers/114-nextcloud.md
mcp_endpoint: https://mcp.hubris.network/mcp

View File

@@ -5,6 +5,7 @@ name: nfs-export
kind: lxc
os: linux
role: storage-export
state: active
host: hubris
pve_id: 102
lan_ip: 192.168.8.200

View File

@@ -5,6 +5,7 @@ name: paperless
kind: lxc
os: linux
role: document-archive
state: active
host: hubris
pve_id: 103
lan_ip: 192.168.8.130
@@ -25,6 +26,8 @@ services_hosted:
- name: paperless
url: https://paperless.hubris.network
backend: paperless
doc_page: containers/103-paperless.md
risk_notes: "document archive \u2014 treat data as irreplaceable; DB operations are destructive-class"
see_also:
- containers/103-paperless.md
mcp_endpoint: https://mcp.hubris.network/mcp

View File

@@ -5,6 +5,7 @@ name: rclone
kind: lxc
os: linux
role: backup
state: active
mesh:
netbird:
fqdn: rclone.netbird.selfhosted

View File

@@ -5,6 +5,7 @@ name: republic-laptop
kind: workstation
os: linux
role: primary-dev
state: active
mesh:
netbird:
fqdn: republic-laptop.netbird.selfhosted

View File

@@ -5,6 +5,7 @@ name: romm
kind: lxc
os: linux
role: rom-manager
state: active
host: strong
pve_id: 134
lan_ip: 192.168.8.249

View File

@@ -5,6 +5,7 @@ name: seanime
kind: lxc
os: linux
role: anime-media-server
state: active
host: strong
pve_id: 133
lan_ip: 192.168.8.248

View File

@@ -5,6 +5,7 @@ name: sophia
kind: lxc
os: linux
role: workshop
state: active
host: hubris
pve_id: 119
lan_ip: 192.168.8.109

View File

@@ -5,6 +5,7 @@ name: strong
kind: proxmox-host
os: linux
role: hypervisor
state: active
lan_ip: 192.168.178.181
mesh_globals:
primary: netbird

View File

@@ -5,6 +5,7 @@ name: trmnl
kind: lxc
os: linux
role: trmnl-middleware
state: active
host: hubris
pve_id: 128
lan_ip: 192.168.8.211
@@ -21,6 +22,8 @@ services_hosted:
backend: trmnl
url: https://trmnl.hubris.network
note: self-hosted middleware for TRMNL e-ink plugins (polled by TRMNL cloud)
doc_page: containers/128-trmnl.md
config_repo: dtoro/terminalito
see_also:
- containers/128-trmnl.md
mcp_endpoint: https://mcp.hubris.network/mcp

View File

@@ -5,6 +5,7 @@ name: zimaos
kind: vm
os: linux
role: nas-frontend-eval
state: active
host: hubris
pve_id: 100
lan_ip: 192.168.8.195
@@ -20,6 +21,7 @@ services_hosted:
- name: zimaos
url: https://zimaos.hubris.network
backend: zimaos
doc_page: vms/100-zimaos.md
see_also:
- vms/100-zimaos.md
mcp_endpoint: https://mcp.hubris.network/mcp