diff --git a/configs/beszel-agent/hosts/nh3-albok.env b/configs/beszel-agent/hosts/nh3-albok.env new file mode 100644 index 0000000..32d92eb --- /dev/null +++ b/configs/beszel-agent/hosts/nh3-albok.env @@ -0,0 +1,2 @@ +PORT=45876 +KEY="ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHdG5fWcEZHK45sRlx8kyvrd9agexKQv4QK9Dc07wTLt" diff --git a/configs/beszel-agent/hosts/nh3-svos.env b/configs/beszel-agent/hosts/nh3-svos.env new file mode 100644 index 0000000..32d92eb --- /dev/null +++ b/configs/beszel-agent/hosts/nh3-svos.env @@ -0,0 +1,2 @@ +PORT=45876 +KEY="ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHdG5fWcEZHK45sRlx8kyvrd9agexKQv4QK9Dc07wTLt" diff --git a/servers/nh3-albok/README.md b/servers/nh3-albok/README.md index 707af5a..512cbfe 100644 --- a/servers/nh3-albok/README.md +++ b/servers/nh3-albok/README.md @@ -18,6 +18,7 @@ bus with it. Unit 6 (encrypted wings keyed from the vault) also wants a host who | OS | Debian 13 genericcloud + cloud-init; Docker CE 29.8 from Docker's repo | | Identities | `vh` 1000 (operator keys), `infra-ops` 850 (NOPASSWD sudo, `log_output`, BULK_DATA exempt), `docker` gid 851; albok ids 1500/1510/1511/1512 (see the stack README) | | Service | `albok-service` on host **8392** → container 8390, `mem_limit 8g`. `/srv/albok/{store,private,etc}` on the root ext4 | +| Monitoring | Beszel native agent 0.18.7, hub system `6ikkuo8x9v7ke35` (no Docker socket shared), 4 standard alerts; up 2026-10-05 | | Backups | nh3-pve-2 vzdump job, nightly **2130**, snapshot mode → **pbs-ana**, namespace **`nh3-pve-2`**; pbs-nh3's 0630 sync mirrors it | ## ⚠ Keep it single-tenant diff --git a/servers/nh3-svos/README.md b/servers/nh3-svos/README.md index c09bcf2..78eec9d 100644 --- a/servers/nh3-svos/README.md +++ b/servers/nh3-svos/README.md @@ -15,13 +15,13 @@ configuration, enrollment and acceptance. | Guest | VM **111** on **nh3-pve-2**, `onboot 1`, tag `svos` | | Shape | 4 vCPU `x86-64-v3`, 8 GiB, 100 GB on `vmstore` (local NVMe LVM-thin, discard on). nh3-pve-2 had 47 GB RAM and 946 GB vmstore free at build | | OS | Debian 13 genericcloud, Python 3.13 + venv, SQLite 3.46, systemd-timesyncd (synced), qemu-guest-agent | -| Identities | `vh` 1000 (operator keys + lkraven@nh3-dev, so svos-dev's session can ssh in; NOPASSWD sudo from cloud-init), `infra-ops` 850, **`svc-svos` 801** (nologin; the only writer of the data root) | +| Identities | `vh` 1000 (operator keys + lkraven@nh3-dev, so svos-dev's session can ssh in; NOPASSWD sudo from cloud-init, plus `/etc/sudoers.d/91-vh-verifypw` so `sudo -v` agrees), `infra-ops` 850, **`svc-svos` 801** (nologin; the only writer of the data root) | | Data root | `/var/lib/svos`, svc-svos 0700, on the local root ext4. Never NFS, never shared | | Releases | `/opt/svos` root:svc-svos 2775, with `releases/` for svos-dev's layout. The git checkout is not a runtime dependency | | Docker | none, by design | | Backups | nh3-pve-2 vzdump job, nightly **21:30**, `all 1` → pbs-ana namespace `nh3-pve-2` (mirrored to pbs-nh3 at 06:30), snapshot mode with guest-agent fs-freeze | | App-consistent hook | `/etc/qemu/fsfreeze-hook.d/` exists. The guest agent runs those scripts on vzdump's freeze/thaw, which is where svos-dev's SQLite checkpoint hook belongs. Until it lands, backups are crash-consistent (fine for WAL + synchronous FULL, but not the stated requirement) | -| Monitoring | not yet. Beszel needs the native agent here (no Docker); that is pending together with nh3-albok's | +| Monitoring | Beszel native agent 0.18.7 (`playbooks/beszel-native.yaml`, `configs/beszel-agent/hosts/nh3-svos.env`), hub system `t6y646ifa3x7xxv`, alerts CPU>95%/15m, Disk>85%/5m, Memory>90%/10m, offline/2m. Up 2026-10-05 | ## Build (reproducible) @@ -35,6 +35,15 @@ scripts/elway infra-ops@10.100.50.43 --playbook playbooks/nh3-svos-host.yaml ## Ingress / auth: NOT built yet, proposal pending (Prime + svos-dev) +App side, per svos-dev 2026-10-05: kernel on `127.0.0.1:8400 --trust-loopback` (its Unix-socket mode needs a 0700 +kernel-owned dir and creates a 0666 socket, so no shared-group socket in this build), interface connector on +`127.0.0.1:8403`. Static UI at `/opt/svos/current/static`. `/api/*` → kernel with the prefix stripped (`/api/health` is +the kernel's); `/health`, `/verbs/ping|pins|pin|unpin`, `/openapi.json` → connector unchanged. ⚠ With +`--trust-loopback`, every local process is inside the identity trust boundary, so run no untrusted workloads here. +Agreed design (option A): Caddy on the tailnet address only, `forward_auth` to a loopback WhoIs responder fed the real +socket peer (`{http.request.remote.host}:{port}`), fail closed, allow-list of logins, client identity/forwarding headers +stripped, Origin passed through untouched. + App listeners stay private (loopback or a Unix socket). The front door has to give the browser **HTTPS**: the UI and the voice adapter need a secure context for the microphone. It also has to give the kernel's adapter a **verified identity** in `Tailscale-User-Login`, with any browser-supplied copy stripped. See the svos-dev thread of 2026-10-05.