feat(pxe-boot): switch NFS mount to HA cluster LAN VIP
Check NixOS configurations / eval-hosts (push) Successful in 10m31s

Updates mount-pxe-images.nix to mount pxe-boot/images from
ha-vip-lan.sweet.home (Pacemaker vip-lan, 192.168.2.229) instead of
server.sweet.home. Storage root changes from /tank to haStorageRoot
(/srv/ha-data). NFSv3+nolock options for LXC are unchanged.

Removes nfsServerHost and storageRoot from variables.nix — all NFS
clients now reference the HA cluster directly (docker via haStorageNfsFqdn
on VLAN 20, pxe-boot via ha-vip-lan on VLAN 2). Updates the nfsShares
comment to reflect the new single-source-of-truth role without the
dead server.nix references.

DNS records for server.sweet.home and server.storage.home were already
cleaned up automatically by IPA dynamic DNS when the VM was deleted.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J8djTWdXVzXZc99iujU6T2
This commit is contained in:
2026-07-29 20:53:46 +10:00
co-authored by Claude Sonnet 4.6
parent 24e5c9fe0c
commit 620a344d78
2 changed files with 10 additions and 19 deletions
+5 -5
View File
@@ -1,14 +1,14 @@
{ config, lib, vars, ... }: { config, lib, vars, ... }:
let let
# Use the same FQDN approach as docker/mount-data.nix — a bare hostname is # FQDN of the LAN NFS VIP (Pacemaker vip-lan, 192.168.2.229). Using the
# unreliable: systemd-resolved only tries LLMNR for single-label names, and # FQDN rather than a raw IP or bare hostname avoids systemd-resolved LLMNR
# a global search domain causes it to skip the interface-scoped LAN DNS. # quirks and survives a future VIP renumber via a DNS-only update.
nfsServer = "${vars.nfsServerHost}.${vars.homeDomain}"; nfsServer = "ha-vip-lan.${vars.homeDomain}";
in in
{ {
fileSystems.${vars.nfsShares.pxebootImages.mountpoint} = { fileSystems.${vars.nfsShares.pxebootImages.mountpoint} = {
device = "${nfsServer}:${vars.storageRoot}/${vars.nfsShares.pxebootImages.subpath}"; device = "${nfsServer}:${vars.haStorageRoot}/${vars.nfsShares.pxebootImages.subpath}";
fsType = "nfs"; fsType = "nfs";
options = [ options = [
"_netdev" "_netdev"
+5 -14
View File
@@ -22,7 +22,6 @@
# Cross-host references (LAN hostnames/users other hosts reach over the network) # Cross-host references (LAN hostnames/users other hosts reach over the network)
nixCacheHost = "nix-cache"; # substituter/remote-builder hostname nixCacheHost = "nix-cache"; # substituter/remote-builder hostname
nfsServerHost = "server"; # NFS export source hostname
dockerHost = "docker"; # docker-compose stack host dockerHost = "docker"; # docker-compose stack host
# Raspberry Pi's own Tailscale hostname (not fronted by `server` — it # Raspberry Pi's own Tailscale hostname (not fronted by `server` — it
@@ -135,19 +134,11 @@
haServerDrbdDisk = "/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1"; haServerDrbdDisk = "/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi1";
# Storage # Storage
storageRoot = "/tank"; # ZFS pool root on `server` # NFS share definitions — used by ha-server.nix (exports), docker/mount-data.nix,
# and pxe-boot/mount-pxe-images.nix (mounts). `subpath` is relative to
# NFS datasets exported from `storageRoot` on `nfsServerHost` and mounted # haStorageRoot; `mountpoint` is the absolute local path on each client.
# by client hosts. `subpath` is relative to `storageRoot` — combined with # Renaming a share only needs changing it here — exports and all client
# it to build both the export line in modules/build-types/server.nix and # mounts follow automatically.
# the "<nfsServerHost>:<storageRoot>/<subpath>" device string each client
# mount uses in modules/docker/mount-data.nix. `mountpoint` is the
# absolute local path clients mount it at, referenced by that same file's
# fileSystems attribute name plus every other place that needs to know
# where the share lives locally (modules/build-types/docker.nix's
# tmpfiles rules, modules/traefik/rotate-logs.nix's log path). Renaming a
# dataset or moving where it's mounted only needs changing it here — the
# export and every client reference follow automatically.
nfsShares = { nfsShares = {
options = "(rw,sync,no_subtree_check,no_root_squash)"; options = "(rw,sync,no_subtree_check,no_root_squash)";
dockerConfig = { dockerConfig = {