# esh-pve-nas

Second Proxmox VE host at the ESH home lab (`esh-nas-pve.esteban.net`), dedicated to NAS / storage duty.

## Network

- **LAN IP:** 10.0.50.55
- **FQDN:** `esh-nas-pve.esteban.net`
- **Web UI:** `https://10.0.50.55:8006`
- **SSH:** `root@esh-pve-nas` (key auth)

Media services on this box sit at `10.0.50.56` (Plex) and `10.0.50.57` (Jellyfin) — references to `esh-nas-pve` in the homepage config point at those addresses.

## Hardware

- **CPU:** Intel Xeon W-1250 @ 3.30 GHz
- **RAM:** 125.6 GB
- **Kernel:** `6.8.12-13-pve` (Proxmox 8.x)
- **Storage: root is `nvme/ROOT/pve-1` on the mirrored NVMe pool** since the
  2026-08-18 migration. The USB Disk-on-Module (7.3 GB, `ID_BUS=usb`, NORELSYS
  1081) still holds the ESP and `/boot`, but is **out of the runtime I/O path** —
  a USB bus reset no longer drops root from under a running hypervisor. Runbook:
  [`docs/runbooks/esh-pve-nas-boot-migration.md`](../../docs/runbooks/esh-pve-nas-boot-migration.md).

  DOM LVM layout:

  | LV | size | role |
  |---|---|---|
  | `pve-root` | 6.04 G | ext4 — **the rollback**, intact and unmounted, keeps its own kernel + initrd |
  | `pve-boot` | 512 M | ext4 — `/boot`, carved out of swap |
  | `pve-swap` | 256 M | swap, shrunk to make room |

  `/boot` stays ext4 on the DOM on purpose: GRUB cannot read the `nvme` pool,
  which has `encryption`, `large_dnode` and `zstd_compress` enabled.

  ⚠ **Device letters are not stable** — the DOM was `sdq` before the reboot and
  `sdl` after. `fstab` uses `/dev/pve/*` and UUIDs; never write a rule against a
  bare `sdX` on this host.

  ⚠ **There is no auto-fallback if a boot fails.** grubenv lives on an LVM LV,
  which GRUB can read but not write, so `grub-reboot`'s one-shot degrades to a
  sticky default (verified 2026-08-18: `next_entry` survived the boot that
  consumed it). Steady state is `saved_entry=pve-zfs-root` with no `next_entry`.
  A failed boot needs the console — and this box has **no IPMI, no BMC, no serial
  console**. Recovery is selecting `Proxmox VE - ROLLBACK: ext4 root on the USB
  DOM` at the GRUB menu.
- ⚠ **Never set the ZFS cachefile on one pool.** `zpool set cachefile=…` flips the
  host from import-by-scan to import-by-cache; a cache holding only `nvme` leaves
  `ssd` and `tank` unimported at boot, which empties every CT 103 export. Set it on
  all three or none.
- **Pools:** `nvme` (2× 931 GB NVMe mirror — 32 G used, 867 G free, holds every guest
  rootfs), `ssd` (4× 894 GB Intel SATA, 2 mirrors — 1.42 T free), `tank`
  (12× 14.6 TB raidz2 ×2 — 40 T of 175 T). Plus NFS `/mnt/pve/tank-vmbu` for VM backups.
- ⚠⚠ **THIS HOST IS HALF OF A 2-NODE PROXMOX CLUSTER** — `esh-pve-cluster`, nodes
  `pve` (esh-pve, 10.0.250.35, nodeid 1) and `esh-nas-pve` (this host, nodeid 2).
  `Expected votes: 2`, `Quorum: 2`, no qdevice. **Taking either node down drops the
  survivor below quorum and makes its `/etc/pve` read-only** — guests keep running,
  but no config change, no VM start/stop, no storage edit works until the partner
  returns. This was undocumented and nearly bit the 2026-08-18 migration, which
  rebooted this node without accounting for it. Before any planned reboot of either
  node, either accept the read-only window on the survivor or set
  `pvecm expected 1` on it for the duration. Discovered 2026-08-18.
- ⚠ **CT 103 `esh-nas` (10.0.50.50) runs on THIS host and serves `hard` NFS.**
  Never reboot this host casually — quiesce the clients first. Measured from the
  server on 2026-08-18 (`ss -tn '( sport = :2049 )'` inside CT 103), there are
  **five** clients, not the two long documented here:

  | client | mounts | opts |
  |---|---|---|
  | esh-docker-vm `10.0.50.45` | `/mnt/books`, `/mnt/backup` | **hard** — quiesce |
  | esh-pve `10.0.250.35` | `/mnt/pve/esh-nas`, `/mnt/pve/tank-vmbu` | **hard** — quiesce |
  | esh-vm-db `10.0.50.60` | `/mnt/backup` | **hard** — no ssh; reach it via `qm guest exec 101` on esh-pve |
  | vm-esh-nas `10.0.50.154` | — | is VM 104 *on this host*; stops with it |
  | nh3-dev `10.100.10.50` | `/mnt/books` | soft,ro — safe, errors rather than blocks |

  **Ask the server who its clients are; don't trust this table.** It rots. `ss` on
  CT 103 is ground truth, and that is how the three undocumented clients surfaced.
  Playbooks: `esh-cutover-1-quiesce-docker-vm.yaml`,
  `esh-cutover-2-quiesce-esh-pve.yaml`, `esh-cutover-5-restore-docker-vm.yaml`.

> **Root-fs pressure:** 77% of a 5.9 GB root (1.3 GB free) after the 2026-08-17
> mitigation. Still not enough for the pending upgrade — **225 packages, 161
> carrying `deb12uN`/security bumps, including a ~250 MB signed kernel that lands
> in `/boot`.** ⚠ **Migrate first, patch after:** unpacking that into 1.3 GB of
> headroom risks wedging dpkg on a hypervisor running five guests. The host is on
> `pve-manager/8.4.11` vs esh-pve's 8.4.14 for exactly this reason.

## What it runs

Media + storage-adjacent workloads for the ESH site. Not yet catalogued here; `qm list` / `pct list` on the host is authoritative.

The `ESH-FileBot` entry in homepage (`10.0.50.70`, labeled "Restic Backup Target and File Sync — esh-nas-pve") is a workload running here — mentioned in the backup project as a possible additional restic endpoint; confirm role before integrating into the fleet plan.

## Refresh state

```bash
scripts/refresh-server-info.sh esh-pve-nas
```

## Placement rule

Hypervisor for ESH storage/media VMs. Non-PFI scope.
