Start here: read the five conclusions below, then open the DNS plan. Allow 2 minutes.

Measured workloads. One decision guide.

Your homelab:
what to fix, keep, and try.

Fix the broken remote DNS path. Keep the useful NAS cache. Keep Proxmox simple. Test new tools in small, reversible steps.

Observed 20 Sep 2026Live checks + primary-source researchRecommendations not applied

The 60-second version

You do not need a big rebuild.

  1. Fix Tailscale DNS: it points to a resolver behind an offline router.
  2. Keep the 384 GB of RAM: your 341 GiB ARC is useful. The matched BigTank cache test reached 5.34 GB/s.
  3. Fix placement before consolidating: 84 of 89 Longhorn volumes have one replica. SFF hosts the only control plane.
  4. Keep standalone Proxmox: a central dashboard does not require Corosync.
  5. Pilot, then decide: the TrueNAS storage plugin and NetBird are candidates for experiments.

Reading choices: 1 minute for the summary · 5 minutes for priorities and NAS results · about 35 minutes for the full report. Technical details start collapsed.

Purpose: help decide your next operational steps and future hardware needs. Scope: live inspection, historical metrics, and bounded scratch-file benchmarks. No production storage layout, tailnet setting, or resource limit was changed. One initial Kubernetes test caused a Copyparty OOM restart; it recovered, cleanup was verified, and the revised tests used direct I/O. This report reads offline. Documentation navigation requires the built MkDocs site; external reference links need internet access.

Do one useful thing at a time

Your priorities, in order

“Now” means the next useful action, not an emergency. These are proposed actions, not completed work. Effort ranges are planning estimates for the person doing the work; access problems or unexpected failures can extend them.

First: repair and measure

1 · NOW
Restore reliable remote DNS.

Allow 15–30 minutes with admin access and an offsite test client. Success: the client resolves private and public names and opens a private app.

Read the DNS plan →
2 · SOON
Inspect NAS cooling and trend drive health.

Allow 15–30 minutes for the initial inspection, then compare a day of temperatures. Success: lower temperatures under comparable load and no increase in CRC counters.

Read the health findings →
3 · NEXT
Map data and device dependencies before retiring a host.

Allow 1–2 hours to review the measured placement. Dell is the first candidate to evaluate; keep it until sole copies and protected replicas have a verified destination.

Read the consolidation findings →
Later: three optional experiments, ranked
4 · PILOT
Try the TrueNAS plugin on one disposable VM.

Budget 2–4 hours for installation and lifecycle checks. Success: provisioning, snapshots, recovery, cleanup, and a move back to local storage all pass.

Read the isolated pilot →
5 · PILOT
Evaluate NetBird alongside working access.

Budget 2–4 hours for a narrow private-access pilot; self-hosted public ingress is a separate experiment. Preserve independent recovery access.

Read the NetBird decision →
6 · LATER
Compare the two dashboards already installed.

Budget 30–60 minutes to compare existing ProxCenter and PDM. No new VM or Corosync cluster is needed.

Compare the three options →

Keep for now: the existing RAM, standalone Proxmox hosts, local Talos disks, and Cloudflare DNS/certificate automation. None of the findings establishes a need for a hardware purchase today.

01Verified configuration faultOffsite validation pending

Fix the DNS destination, then test remotely.

Tailscale distributes 192.168.1.1 as global DNS. The only approved router for that subnet, tailscale-firewalla, was offline. Technitium at 192.168.10.15 correctly answers your domain.

Remote clientReceives DNS server 192.168.1.1
Offline Firewalla peerRoute to 192.168.1.0/24 unavailable
Configured resolverNo working path established

The online TrueNAS Tailscale app advertises an approved route for 192.168.10.0/24. That route reaches your actual LAN, but does not cover 192.168.1.1.

Recommended change: use 192.168.10.15 only for vanillax.me. Use reachable public resolvers, or the client's local DNS, for other domains. This is called split DNS: the hostname's suffix selects its resolver.

Evidence, exact change plan, and offsite checks
What was observed
CheckResult
Global tailnet resolver192.168.1.1
Router for 192.168.1.0/24tailscale-firewalla; offline since 10 August, about 41 days
Restricted resolver for vanillax.meMissing
Technitium: argocd.vanillax.me192.168.10.52, the intended private gateway
Technitium: news.vanillax.mePublic Cloudflare addresses
Technitium: google.comREFUSED; not currently serving general recursive DNS

Proposed procedure

Prerequisites: access to Tailscale DNS/network administration; a saved copy of existing DNS settings; a phone on cellular or another genuinely offsite client. Recheck the TrueNAS subnet route and intended client permissions first.

  1. Remove the stale global 192.168.1.1 nameserver. Choose either reachable public global resolvers or clients' local DNS; review the global override accordingly.
  2. Add 192.168.10.15 as a restricted nameserver for vanillax.me.
  3. Keep the NAS's approved 192.168.10.0/24 route. Ensure intended clients can reach the DNS server on TCP/UDP 53 and the app gateway on HTTPS.
  4. Enable “Use Tailscale DNS” on the test client. Linux clients also need accepted subnet routes. Review “Use with exit node” if the client uses one.
  5. On cellular, check private resolution, unrelated public DNS, and an actual HTTPS app.

Success looks like this

  • argocd.vanillax.me resolves to 192.168.10.52.
  • news.vanillax.me resolves publicly, and google.com also resolves.
  • The private app opens over HTTPS. Correct DNS alone does not prove application routing works.

On a connected Mac, check the system resolver with this read-only command:

dscacheutil -q host -a name argocd.vanillax.me

Avoid a misleading local test. This Mac received DNS answers even when querying TEST-NET address 192.0.2.123, consistent with LAN DNS interception. Therefore, successful LAN queries to an arbitrary address do not prove that address is reachable through Tailscale. Technitium container-loopback tests bypassed that interception.

If validation fails: separate DNS resolution from subnet reachability. If names resolve but HTTPS fails, inspect client route acceptance and access policy. Restore the saved DNS settings to undo the change, understanding that the old global resolver still depends on the offline router.

Do not blindly toggle NAS settings: its accept-dns=false and accept-routes=false govern the NAS itself. They do not disable its advertised subnet routing for other clients.

Confidence boundary: the configuration fault is verified. All other tailnet peers were offline during inspection, so the user's offsite symptom and proposed remediation were not tested end to end. Tailscale DNS reference · Subnet-router documentation.

02Live measurementsMinimum RAM still unknown

Your RAM is doing useful work.

Keep the current 384 GB. The NAS has substantial CPU headroom, while its large ZFS cache demonstrably accelerates reads. These findings justify neither buying more RAM nor promising equal performance with less.

ZFS ARC occupied341.4 GiB~330.5 GiB cached data
CPU average · 72 hours1.51%2.43% at the 95th percentile
Demand-data cache hits · 72 hours99.917%Request count, not bytes
A snapshot of usable memory. ZFS ARC is a memory cache that retains recently or frequently used blocks. Other allocations include the OS, apps, kernel, and additional caches; they are not all mandatory app memory. Values are rounded.

Actual pool read and write tests

Industry comparison: verdicts below use the published specifications of your actual drive classes. No matched industry-average ZFS benchmark is available for this exact layout and test. “Fast” and “slow” refer to the workload shown, not a fleet-wide score.

No L2ARC is installed. The comparison is physical storage versus RAM ARC. All three pools used new 4 GiB files, compression off, 128 KiB records, one job and queue depth one.

Sequential results · 20 September 2026
PoolWrite + final flushDirect disk readPrefetch disk readWarm RAM readVerdict & industry reference
BigTank203.4 MB/s254.9 MB/s480.4 MB/s5.34 GB/sNormal HDD bulk speed

480 MB/s reads are useful; 203 MB/s writes are modest for two mirrors. Reference: each HGST He10 is rated ~249 MB/s sustained. Adding four drive ratings is not a guaranteed pool rate.

ai-pool396.3 MB/s274.1 MB/s1,066.0 MB/s5.50 GB/sFast readsModest writes

1,066 MB/s reads are good aggregate SATA throughput. 396 MB/s writes merit a longer test if important. Reference: HP/Samsung rate one SSD at ~550 MB/s read, ~520 MB/s write.

Backup10T170.5 MB/s190.5 MB/s203.5 MB/s5.50 GB/sNormal single-HDD speed

203 MB/s reads are ~80% of this Seagate’s 254 MB/s maximum outer-track transfer rating. A used filesystem need not reach the drive’s best-case rate.

Disk counters confirmed approximately 4 GiB of physical reads for each sequential disk-read test and zero physical reads for each warm ARC repeat. MB/s is decimal. These short runs do not establish indefinite SSD write speed or maximum application throughput.

Small random requests · 4 KiB access to 128 KiB records
PoolDisk read IOPSRead p99Write + fsync IOPSMean write + fsync cycleVerdict & industry reference
BigTank97.9108.53 ms61.216.34 msSlow for busy VMs / databases

Mean read ~10.2 ms is HDD-like; 108.5 ms p99 is a long tail. HGST reference: 8 ms seek + 4.16 ms average rotation. No comparable published filesystem p99 average.

ai-pool1,502.51.02 ms415.92.40 msMuch faster than HDDs

~15× BigTank’s read IOPS and much lower tails. Samsung reference: 10K raw 4 KiB QD1 read IOPS, but this ZFS test reads 128 KiB records—no valid same-condition average or percentage score.

Backup10T130.319.79 ms123.38.11 msHDD-limited for random I/O

Better tails than BigTank in this run. Seagate reference: 170 read / 370 write IOPS at QD16 with write cache disabled; not comparable to QD1 ZFS plus per-write fsync.

Fast or slow? BigTank is reasonable HDD-class storage for large files and backups. Its random-write and tail-latency results are a weak fit for busy databases and VMs. The SSD pool reads well at 1.07 GB/s, but its stripe has no redundancy. RAM reads are very fast locally; network clients remain limited by their links.

References: HGST He10 · Seagate 10 TB · HP S700 · Samsung 860 EVO. Warm RAM reads are fast cache results, not drive ratings. Vendor peaks are not industry averages.

What happens with four simultaneous file transfers?

A follow-up used four distinct 1 GiB files. Four disk readers achieved 522 MB/s total, about 131–135 MB/s each. Four writers achieved 202 MB/s total, about 51 MB/s each, including each job’s final flush. One reader over the same four files reached 434 MB/s. All disk reads were verified with physical counters.

That is an actual four-stream NAS-local test. It is not a four-user SMB test, a mixed read/write test, or a claim that throughput scales linearly as users are added. Four-stream measurement evidence.

Industry context and example user workloads

The HGST He10 specification gives about 249 MB/s sustained per drive and mechanical seek/rotation delays; the Seagate 10 TB reference is up to 254 MB/s. A mirrored ZFS pool is not guaranteed the sum of all its drive specifications. Samsung and HP SATA SSD ratings are around 550 MB/s per drive under vendor conditions. This is a specification comparison, not an industry percentile.

BigTank’s approximately 10.2 ms average uncached random read is in mechanical-latency territory. Its 108.5 ms read p99 matters more to an interactive VM than the bulk MB/s headline. The SSD pool’s 396 MB/s flushed write result warrants a longer representative test if writes become the priority; it does not diagnose a bad drive.

Illustrative bandwidth budgets — not tested user limits
Example demandTotal bandwidthImplication
10 direct-play video streams at 100 Mb/s125 MB/sAbout 24% of the measured four-reader total; multi-file seeking and transcoding remain untested
40 direct-play streams at 25 Mb/s125 MB/sSame bandwidth, more independent streams; no 40-user validation
Four NAS-local bulk readers522 MB/s measuredAbout 131–135 MB/s each in the test
Four NAS-local bulk writers202 MB/s measuredAbout 51 MB/s each, with final flushes
Kubernetes/database requestsNo defensible user-count conversionTest transaction latency and representative application load

A 10 GbE link has a 1.25 GB/s arithmetic ceiling before overhead; 2.5 GbE has 312.5 MB/s. The historical 1,119 MB/s TCP test equals 8.95 Gb/s. The SSD pool can approach the network budget; cached RAM reads exceed it.

Canonical NAS reference, drive datasheets and methodology · Raw measurement summary.

The purchasing distinction: “RAM is useful” is demonstrated. “This workload needs every installed gigabyte to meet your performance target” is still an unanswered question. A full cache alone cannot resolve it.

How to think about the next NAS

Planning options — not validated replacement specifications
RAM optionRecommendationTradeoff
Keep current 384 GBRecommended todayPreserves demonstrated caching; no evidence supports an upgrade
256 GBCandidate for a future replacementMore cache headroom than 128 GB, still less than the current occupied ARC
128 GB, expandableCandidate to test before purchaseMust reserve OS/app peaks; cannot devote all 128 GB to ARC
64 GBLarger unvalidated tradeoffLess caching for backups, restores, Steam iSCSI, and future VM storage

Choose a future platform for usable drive bays, cooling, ECC memory and expansion, storage-controller connectivity, and the 10 GbE path as well as CPU. Current CPU observations do not justify chasing more cores. Power draw and total replacement cost were not measured here.

Full hardware, workload, benchmark methods, and RAM validation plan
Observed hardware and workload
ItemObserved state
Chassis / processorHP DL360 Gen9; Xeon E5-2680 v4; 14 cores / 28 threads
Memory12 × 32 GB DDR4 ECC LRDIMM, 1600 MT/s; 377.6 GiB OS usable
Operating systemTrueNAS-26.0.0-MASTER+20260914-020141; a development build
Current appsRustFS ~3.2 GiB; Tailscale and monitoring ~0.14 GiB combined
App peak evidenceRustFS reached a 7.46 GiB ten-minute memory average in the 72-hour history
NAS virtual machinesOne configured 8 GB VM, stopped
ServicesNFS, SMB, iSCSI, and NVMe-oF running
Active block-storage consumerOne Steam Linux iSCSI session from 192.168.50.114
Memory pressureNo new memory PSI stalls or ARC throttling in the sample; no swap configured

Two observation windows

72-hour history: 432 ten-minute averages from existing Netdata metrics. CPU mean 1.51%, p95 2.43%, maximum ten-minute average 11.88%. These averages can hide brief spikes. Demand-data hit rate was calculated from access/hit rates because the supplied percentage chart returned invalid zeros.

Five-minute live sample: 20 September, 17:16:08–17:21:08 UTC. Demand-data reads: 405,024 hits and 15 misses, or 99.9963%. CPU averaged 3.68%; the highest 15-second sample was 10.98%. Traffic averaged 8.51 MiB/s inbound and 6.56 MiB/s outbound. The highest observed HDD utilization over a 15-second sample was 27.5%.

There was no observed CPU, disk, or memory saturation during that workload. That does not test the NAS at maximum load.

Why the smaller-cache history is only a clue

About 11 hours of historical buckets had ARC below 128 GiB and roughly 99.999967% demand-data hits. That suggests some workloads fit comfortably in less cache. Those periods had different activity and cache warm-up conditions, however, and do not simulate a machine with only 128 GB total RAM.

Benchmark controls and limitations

The complete NAS suite ran 17:45:56–17:54:58 UTC: 24 tests on three new 8 GiB-quota scratch datasets. Disk phases used primarycache=metadata, secondarycache=none; warm phases used primarycache=all after a warmup read. Metadata caching remained enabled. Prefetch can generate ARC demand hits while reading from disk, so physical disk-byte deltas establish the data path.

Sequential writes used buffered I/O plus end_fsync=1; random writes used fsync=1. The latter’s full write cycle includes both the write and separate fsync. All temporary datasets were removed, production properties were unchanged, and the pools stayed healthy. No global cache drops or ARC-limit changes were performed.

The first small read-only pass is preserved as historical evidence in the NAS reference. Its 96.7 MB/s old-file direct read is not the pool maximum. An old 4 GiB sparse file with only 512 bytes allocated was excluded. Historical NFS/SMB tests used different sync settings and do not establish protocol overhead.

The next experiment that would answer the RAM question

  1. Choose an acceptable workload target: backup completion window, restore duration, Steam behavior, and file-open latency.
  2. Record a full representative workload cycle with current RAM: app memory peaks, demand-data hit/miss rates, disk latency/queues, and task duration.
  3. In a planned experiment, compare smaller ARC budgets while reserving enough memory for the OS and application peaks. Changing ARC size alone is not a perfect simulation of smaller physical RAM.
  4. Repeat comparable workloads after a defined warm-up period. Keep a configuration record and restore the original ARC settings if latency, memory pressure, or task duration worsens beyond the chosen target.
  5. Use the observed difference and hardware price to choose between 128, 256, and the current capacity.

This is a proposed experiment, not a change performed during the audit. ARC interpretation: OpenZFS caching and ARC statistics.

The immediate hardware follow-up is cooling.

BigTank's four HDDs reported 58, 55, 54, and 44°C. Check intake obstructions, dust, fan operation, drive-bay airflow, and temperature trends under comparable load. No thermal throttling or temperature-caused failure was demonstrated.

Pool health and counters to watch
All four pools were ONLINE
PoolLayout / roleAllocation
BigTankFour 10 TB HDDs; two mirrored vdevs; primary data57% used; 27% fragmentation
Backup10TSingle HDD; staging/replication destination68% used
ai-poolThree striped SATA SSDs; intentionally no redundancy75% used
boot-poolMirrored SSDsHealthy

All ten disks passed SMART, and pools reported no errors. The day's Backup10T scrub completed without errors. SMART success does not guarantee future reliability.

The HP S700 reported 816 lifetime CRC errors; the Samsung 860 EVO reported four. No matching recent kernel I/O errors were found. Save the counters and compare later before treating historical counts as an active cable or controller fault.

Do not compare SMART internal temperatures directly with a manufacturer's ambient-temperature limit. This assessment recommends improved cooling based on the observed temperatures; it does not claim the drives exceeded a verified manufacturer threshold.

03Host + Kubernetes benchmarksConsolidation needs data migration

Proxmox, Kubernetes, and consolidation

Improve storage placement and failure recovery before buying more CPU. Current home apps have compute headroom. The weak areas are single-copy volumes, SFF scheduling/storage delays, hardware-bound services, and the shed’s remote storage path.

Longhorn volumes with one replica84 / 8944 sole copies on the GPU host
Elite host memory available4.0 GiBLeast physical-host headroom
SFF worker CPU steal · p959.66%Guest waiting for hypervisor CPU time

Where the workloads fit

Placement recommendations — no workloads moved
WorkloadBest current directionWhat limits growth
Media, bulk files, backup copiesBigTank; keep NAS RAM and improve airflowAbout 202 MB/s shared writes; seek-heavy access and the client network
Home services and ordinary web appsWired SFF/Elite/Dell workers after checking requests and storageReplica availability, app memory limits, and attached devices
Busy databases and latency-sensitive VMsSelect a redundant SSD path with good application-visible fsync latencyDo not assume every local or enterprise-labelled path is fast under load
AI inference and large modelsKeep dual-3090 work on Threadripper; use the appropriate model-cache tierGPU VRAM, tokens/s and concurrency were not benchmarked by storage tests
SDR and shed equipmentKeep device-specific work there; avoid general stateful expansionWi-Fi, solar/power availability, and storage currently served from SFF

Consolidation and buying priorities

  1. Protect the data before removing a host. Identify every sole volume copy, retain independent replicas or proven recovery, and account for the single control plane on SFF. Losing that host stops scheduling even when workers have spare capacity.
  2. Investigate SFF contention and storage latency. Its six host threads serve ten assigned vCPUs. Pretest CPU steal affected both worker and control plane; etcd WAL p99 exceeded 10 ms in about 9% of sampled windows. Buying more fleet-wide CPU does not isolate this problem.
  3. Prioritize expandable RAM on a future wired consolidation host. Elite has about 4 GiB host-available memory and 18.26 of 22.98 GiB Kubernetes allocatable memory reserved by requests. Rebalance eligible apps before assuming an immediate purchase is necessary.
  4. Choose dependable SSD storage for durable state. Investigate the slow measured paths and monitor Elite’s VM SSD at 75% endurance used. This is wear tracking, not a prediction of imminent failure. Preserve the NAS’s useful RAM.
  5. Evaluate Dell retirement first, only after migration checks. An optimistic request/placement model fits its 32 displaced application pods elsewhere. Dell still carries two sole data copies and one copy of each of five protected volumes. The model is not proof that draining it will succeed.

Planning assumption: preserve today’s applications with room to grow. A future host should be sized for eligible workloads’ requests and observed peaks, plus OS/storage overhead and the spare capacity needed during a failure. No single new-machine RAM number is justified until the destination roles and failure target are chosen.

Proxmox disks: which are fast or slow?

These root-filesystem tests include 1 GiB writes with periodic flushes and 128 separate 8 KiB write-plus-fsync operations. Verdicts compare the tested paths and appropriate drive classes, not a matched industry average. Raw vendor peaks use different conditions.

Proxmox root filesystem only · 1 GiB file, flush every 64 MiB
Host / root driveWrite MB/sPhysical read MB/s8 KiB write + fsync p99Verdict & comparison
.14 PNY CS900359.7406.52.31 msNormal SATA-class result

Useful 360 MB/s writes and 407 MB/s reads. PNY CS900 1 TB reference: 535 MB/s read / 515 MB/s write, under different conditions; no matched industry average.

.16 Apple SM0256G635.71,926.310.83 msFast reads; slow small saves

1.93 GB/s is a fast burst read; 10.83 ms save p99 is the slowest root path here. Apple model-specific matched benchmark unavailable.

.20 SK hynix BC501638.61,159.81.18 msFast burst / low save latency

1.16 GB/s read and 1.18 ms save p99 are strong in this short root-disk test. Does not test the separate VM data disk.

.21 PNY CS90083.1401.38.46 msSlow sequential writes

83 MB/s is low versus the other tested PNY SATA root at 360 MB/s. Reads are similar. Vendor reference: 535 MB/s read / 515 MB/s write. Background work and drive state differ; cause unproven.

.22 WDC SN530638.2888.70.91 msFast saves / useful NVMe reads

0.91 ms save p99 is best among these host roots. SN530 256 GB reference: 2,400 MB/s read / 950 MB/s write. This root SSD is separate from the Intel VM disk.

Manufacturer references: PNY CS900 · WD PC SN530 · Intel 660p 512 GB. These are advertised peaks, not industry averages.

Host OS disks are not interchangeable with VM data disks. The SFF control-plane SSD, Elite Intel VM SSD and GPU enterprise mirror are separate tiers.

Physical RAM, guest allocations, and seven-day memory evidence
Physical hosts · 15-second pre-host-test sample
HostUsable RAMActive guest allocationHost availableCPU busy
Threadripper .14125.7 GiB100 GiB18.3 GiB33.8%
Dell .1639.0 GiB30 GiB7.4 GiB41.4%
Shed .2031.1 GiB12 GiB25.0 GiB4.7%
SFF .2162.6 GiB52 GiB8.1 GiB39.3%
Elite .2230.6 GiB26 GiB, including PDM4.0 GiB22.5%

Available host memory is reclaimable memory at observation time, not unused guest allocation. The recently booted shed VM had not touched its full allocation. All active Talos VMs have ballooning disabled. Host samples are not peak-load guarantees.

These are host OS disks, not interchangeable VM disk benchmarks. SFF’s worker shares the tested physical disk, but its control-plane disk is separate. Elite’s VM uses a different Intel SSD. The Threadripper test is not its enterprise mirror. Physical counters confirmed roughly 1 GiB read on each tested root disk.

Kubernetes guest memory · seven days ending before tests
WorkerUsed p95 / maxRequested / allocatable
GPU51.37 / 53.19 GiB70.75 / 97.67 GiB
Elite11.17 / 14.14 GiB18.26 / 22.98 GiB
Dell12.00 / 12.50 GiB14.24 / 28.89 GiB
SFF13.39 / 14.17 GiB12.93 / 38.68 GiB
Shed2.32 / 2.33 GiB2.57 / 11.19 GiB

Control plane: memory p95 5.91 GiB, sampled maximum 6.16 GiB. History ends at 17:40 UTC, before our benchmarks; five-minute rates were sampled every ten minutes and can miss spikes. Shed coverage is incomplete. Kubernetes schedules against requests, so instantaneous free memory is not the entire placement budget.

Kubernetes VM storage: what the app receives

512 MiB direct-I/O read/write samples, one process, plus 128 separate 8 KiB write-plus-fsync operations. These include each volume’s guest and storage path. No matched industry-average baseline exists across these different replica counts, links and workloads.

App-visible path samples · not maximum disk ratings
PathWrite MB/sRead MB/s8 KiB write + fsync p99Verdict & comparison
Elite → local Intel SSD / Longhorn157.5240.01.29 msFastest tested guest path

Best tested write rate and 1.29 ms save p99; promising for light stateful work. Intel 660p 512 GB reference: 1,500 MB/s read / 1,000 MB/s write. Those bare-drive peaks exclude Longhorn and guest overhead.

SFF → local PNY / Longhorn58.3138.03.47 msModest bulk / good short saves

58 MB/s writes and 138 MB/s reads are modest; 3.47 ms save p99 is substantially better than the slow paths below. PNY reference: 535 MB/s read / 515 MB/s write before VM/storage layers.

GPU → default NVMe / Longhorn56.1123.07.09 msModest guest-storage speed

56 MB/s writes, 123 MB/s reads; 7.09 ms save p99. Well below raw NVMe peak throughput, but this does not isolate the limiting layer.

Dell app → Dell + SFF replicas37.1102.49.42 msSlower bulk; two copies included

37 MB/s writes and 9.42 ms save p99 include a two-host replica path. Do not rank against a single-copy benchmark as equal protection.

Shed app → SFF storage over Wi-Fi18.822.039.70 msSlow for latency-sensitive apps

19 MB/s writes and 39.70 ms save p99 are the remote Wi-Fi path, not the local SSD. A poor fit for general busy database workloads.

GPU → enterprise mirror / Longhorn33.995.446.78 msSlow in this busy-path sample

34 MB/s writes and 46.78 ms save p99 warrant a quieter repeat. About 8.1 GB background-inclusive device reads confound a drive-class judgment.

GPU → NAS SMB (sync disabled)135.5174.93.50 msUseful bulk; durability not tested

175 MB/s reads can include NAS RAM. sync=disabled means the 3.50 ms save reply is not comparable with durable-write latency.

Read the guarantee: NAS SMB uses sync=disabled. Its save latency is not a durable-write score. The enterprise path was busy with other work; its result does not rank the underlying drives.

Seven real Kubernetes volume paths, limitations, and the benchmark restart

Revised guest tests used one Python process, a new 512 MiB file, 1 MiB direct-I/O sequential writes/reads, and 128 separate 8 KiB writes with fsync. Every direct-write phase included a final fsync. Guest/client page cache was bypassed for sequential I/O; upstream caches and production traffic remained.

The NAS SMB dataset has sync=disabled, verified live. Its fast fsync replies do not establish durable storage and should not be compared as equal guarantees with the Longhorn paths. The read can come from NAS ARC.

The GPU enterprise path saw about 8.1 GB of guest-device reads while the benchmark itself read about 0.54 GB. Its 46.8 ms write-cycle p99 reflects a busy application path; it does not establish that enterprise drives are intrinsically slower. These tests cross different layers, so subtracting a host result from a guest result would not measure “Longhorn overhead.”

Test incident, recovered: the first 1 GiB buffered-write attempt exceeded Copyparty’s 1 GiB container memory limit, causing an OOM restart at 17:54:04 UTC. The sequence was stopped, the exact leftover scratch file was removed, and Copyparty returned to 1/1 Ready. This was test-induced, not evidence that Elite needs more physical RAM. Subsequent tests used 512 MiB direct I/O, checked available cgroup headroom where exposed, and completed cleanup.

The seven revised tests completed without reported benchmark errors. No raw VM disk, production file, resource limit, or scheduling configuration was changed. Small samples and current workload competition limit generalization; no synthetic storage test establishes a supported web-user or database-user count.

Full fleet inventory, exact methods and raw evidence.

Hot, slow, or underused: how to interpret the warning signs

Hot: NAS HDDs at 54–58°C justify checking cooling. Threadripper’s 103.6°C sensor was Tctl, not the die temperature; Tdie peaked at 76.6°C in the historical query. Interpret sensor labels before diagnosing overheating. Linux AMD temperature-sensor definitions.

Slow: the shed’s remote path, SFF contention, and some storage tail latency deserve attention. Etcd’s WAL p99 exceeded the upstream 10 ms guideline in about 9.14% of sampled windows; backend commit p99 exceeded 25 ms in about 0.99%. Etcd performance guidance.

Underused: NAS CPU and some guest memory have headroom in observed activity. That does not mean unused hosts can be switched off: 44 volumes have their only copy on GPU, the shed is tainted against ordinary scheduling, Elite has attached devices, and SFF owns the sole control plane. Four pretest OOM counter events on each of GPU and Elite remain unattributed; do not equate them automatically with host RAM exhaustion.

Next measurable gate: choose one ordinary Dell app, establish a recoverable data copy and an eligible destination, then plan its movement through GitOps. Keep rollback storage and the old host until the app and its backup/restore behavior are verified. No migration was attempted by this assessment.

04Five standalone hostsKeep current topology

Keep centralized management separate from clustering.

You already have both: ProxCenter 1.4.10 on the Pi at 192.168.10.15, and PDM 1.1.7 in LXC 101 on the Elite. PDM responds at 192.168.10.151:8443 and has all five hosts configured as remotes. Compare the existing tools before installing another dashboard.

Three options with different purposes
OptionWhat you gainCost / constraintRecommendation
Existing ProxCenterOne interface across hosts; current installation already works on ARMSome automation/security features depend on editionKeep as default
Proxmox Datacenter ManagerOfficial inventory, monitoring, guest operations, and cross-remote migrationAlready running in a 2 GiB / 2-core LXC on EliteValidate configured remotes and compare existing workflows
Full PVE clusterShared cluster configuration and a foundation for PVE HACorosync/quorum dependency, join migration, compatible storage/hardwareDefer until there is a concrete HA need

Feature sources: ProxCenter documentation · PDM introduction · PVE cluster requirements.

Why this fits your lab: all five hosts are standalone today. A dashboard can manage them without introducing a shared quorum dependency. PDM does not make hardware-bound guests freely movable or provide automatic VM failover on its own.

Live host inventory, migration constraints, and when clustering would help
PVE 9.2.18 on all five hosts; no corosync.conf found
HostAddressRelevant workload / constraint
Threadripper192.168.10.14VM 100 GPU worker; PCI GPU passthrough; stopped Kali VM 102 on NAS SMB
Dell Optiplex192.168.10.16VM 100 worker; local disks and iGPU passthrough
Shed HP micro192.168.10.20VM 100 worker; USB radios; Wi-Fi bridge and solar power
HP ProDesk192.168.10.21VM 100 worker plus VM 101 control plane; local disks
HP Elite192.168.10.22VM 100 worker; local disks, iGPU and USB passthrough; LXC 101 runs PDM

Four hosts use hostname pve. Every host has its own VM 100. Running Talos guests use cpu: host, and the fleet mixes AMD and Intel processors. Per-host storage names and local virtual disks also differ.

Before joining a cluster, you would need unique node identities, a plan for guest evacuation/backup and restore, noncolliding VM IDs, and reconciliation of storage and Omni provider configuration. PVE cluster join overwrites local cluster configuration and is not an ordinary dashboard setting. The previous Corosync incidents were not forensically diagnosed in this investigation.

What the Pi is doing

The Pi runs Ubuntu on ARM64 with about 7.7 GiB RAM. ProxCenter's frontend and PostgreSQL used approximately 140 MiB and 27 MiB respectively in one snapshot. Around 6.1 GiB was available overall. Omni, its five providers, and Technitium also run there. There is no measured resource reason to move the dashboard.

Evaluate the PDM installation you already have

PDM 1.1.7 is installed and both API services are active in Elite LXC 101. Its HTTPS endpoint returned HTTP 200; five remote definitions point to your five PVE hosts. This confirms a working service and configuration, not successful authentication or every remote operation.

Allow 30–60 minutes to compare inventory freshness, console access, backup visibility and a harmless operation on a disposable guest in PDM and ProxCenter. Keep the tool that supports your actual workflow. PDM downtime does not stop managed guests, but placing it on Elite makes its availability depend on that host.

No new PDM installation or removal is needed for this comparison. Save/export relevant configuration before changing remote definitions; revoke unused credentials only after choosing and validating the retained tool. PDM capabilities.

When a real cluster becomes worth it

Revisit a three-node, reliably wired design when you have a specific guest-failover requirement, a compatible storage plan, and enough spare capacity for failures. Keep the shed out of that quorum proposal. Proxmox calls for stable sub-5 ms networking and recommends separating Corosync from heavy storage traffic. HA also requires addressing passthrough, CPU compatibility, and guest storage; joining hosts alone does not solve them.

05Pilot alongside existing accessPublic proxy / Gateway integration beta

NetBird can replace parts of the access stack.

It is a credible private-access alternative to Tailscale. It also now offers a public reverse proxy, so replacing Cloudflare Tunnel is possible. That is a separate decision from replacing Cloudflare DNS or its other edge services.

Decide which job you want to replace
Current jobNetBird fitInitial choice
Private laptop/phone → LAN accessDirect overlap: clients, routing peers, policies, private DNSGood pilot candidate
Public websites via Cloudflare TunnelPublic reverse proxy exists, currently betaTest one noncritical endpoint
Cloudflare authoritative DNS / ExternalDNSA different responsibilityKeep initially
Cloudflare DNS-01 for certificatesA different responsibilityKeep initially
CDN / WAF / other edge servicesNo blanket equivalence establishedAssess only the capabilities you use

NetBird architecture · Public reverse proxy.

Recommended pilot: keep Cloudflare DNS/certificates and working Tailscale access. Test NetBird with an independent routing peer. If it becomes your emergency access, prefer a management/relay location outside the cluster you may need to repair.

In-cluster feasibility, public ingress architecture, and pilot checks

Can the control plane run in Kubernetes?

Yes, technically. Modern self-hosted deployments combine management, signal, relay, and STUN in netbird-server, with a dashboard and embedded identity support. The upstream quickstart starts at one CPU and 2 GB RAM; that is a provisioning baseline, not a measurement of this lab.

HTTP, WebSockets, OAuth, and gRPC/h2c must route correctly. Public UDP 3478 for STUN needs direct reachability; a Cloudflare HTTP Tunnel cannot supply it. Home hosting therefore needs appropriate inbound reachability, or an external endpoint such as a VPS. Quickstart · Proxy and transport requirements.

Inside this repository, an implementation would need pinned manifests, named Services, explicit network permissions, 1Password-managed secrets, backed-up state, and an update strategy appropriate for a single-writer database/PVC. Kubernetes, Cilium, secrets, and storage then become dependencies of remote access.

Two integration details to verify

  • The official server Helm chart source inspected in the investigation still described the older split-service architecture (chart 1.9.0 / app 0.46.0). Verify it against the intended current release before using it. The Kubernetes operator attaches services to an existing management account; it is not the control-plane server.
  • NetBird Gateway API integration exists, but upstream labels it beta. Its self-hosted public-proxy documentation identifies Traefik as the supported external TLS-passthrough edge. This is not a verified drop-in substitution for this lab's Cilium gateway.

Server chart source · Kubernetes operator · Gateway API status.

One possible public path

Public VPS edgeNetBird proxy / public reachability
Encrypted meshHome routing peer outside Kubernetes
Existing Cilium gatewayHost/SNI preserved for the app

This adds VPS cost, patching, backup, and bandwidth responsibilities. No VPS was selected or purchased. Direct peer paths may be fast; relayed paths depend on relay bandwidth and latency. Remote NAS traffic also depends on your WAN uplink.

Acceptance and rollback

  1. Pick private VPN access or public ingress as the first goal.
  2. Test one client and one noncritical resource while the existing path remains available.
  3. Verify DNS, intended access policy, reconnect behavior, direct versus relayed paths, and usable throughput.
  4. Test recovery access during an isolated pilot-component outage; do not take down the production cluster to prove it.
  5. Only replace an existing endpoint after behavior meets your needs. Roll back by returning clients/DNS to the original path and removing pilot routes and credentials.

Switching VPN products would not automatically repair Technitium routing or the current DNS policy. Those dependencies must be configured in either product. This investigation did not verify that Cloudflare Access authentication is active; do not assume a tunnel alone supplies it.

06Small isolated pilotExact version combination untested

The TrueNAS plugin fits. Start with one test VM.

Install it on a Proxmox host to let Proxmox request TrueNAS-backed VM disks and ZFS snapshots. It automates block storage; it is not a ProxCenter replacement, a TrueNAS App, or a requirement to form a Proxmox cluster.

Its immediate value is automatic zvol provisioning and snapshots over iSCSI or NVMe/TCP. It does not establish that HDD-backed NAS disks outperform your local storage. NFS/SMB still serve file content such as ISOs and backups. TrueNAS's September announcement calls for early-adopter testing on non-production workloads.

Your specific collision risk: all five independent hosts have VM 100. Each standalone host needs its own parent dataset and its own iSCSI target or NVMe subsystem. A common dataset can collide at the zvol level. Distinct datasets with one shared target still expose unrelated block devices. Upstream isolation guide.

The smallest useful pilot

  1. Choose one wired host, such as 192.168.10.14, and a disposable VM.
  2. Use a dedicated dataset such as BigTank/proxmox-pilot-pve14 with its own target, separate from Steam iSCSI and Kubernetes storage.
  3. Use an inspected, pinned package and start with iSCSI. Keep the source VM disks/local recovery path until the trial passes.
  4. Verify creation, guest I/O, resize, snapshots/rollback, clone, backup/restore, deletion cleanup, and movement back to local storage.

Proposed names and actions only. No plugin-pilot dataset, target, VM, API key, or plugin installation was created.

Compatibility, release gotchas, permissions, and storage failure domains

Broad prerequisites match; exact compatibility remains untested

All hosts run PVE 9.2.18. The NAS runs TrueNAS-26.0.0-MASTER+20260914-020141. Upstream's minimum is TrueNAS 25.10+ and PVE 8+ for iSCSI, or PVE 9+ for NVMe/TCP. The development NAS version meets that broad floor but requires testing against the chosen plugin release.

On .14, open-iscsi and nvme-cli were present and the plugin was absent. NAS iSCSI and NVMe-oF services were running. PVE's live storage API version was 15 with compatibility age 6; an older plugin API declaration alone is not proof of incompatibility.

Choose matching release artifacts

On 20 September, v2.1.23-beta4 was the newest published release (19 September; marked prerelease). GitHub's “latest” endpoint selected beta3, whose prerelease flag was false despite its beta name. The main-branch version banner was older still. Pin a coherent package/tag and its matching configuration documentation; do not combine moving-branch installer files and unrelated release instructions.

The Reddit discussion mentions a dataset-creation bug and a beta-tag installer error. Tagged source shows several historical defects already fixed, including the PR82 dataset issue, later cloud-init changes, and beta4 capacity-cache/FQDN fixes. Open issue titles alone do not establish that the chosen release still fails. No plugin runtime defects were reproduced here.

Beta4 release · Tagged changelog · Cleanup/VMID-reuse report to validate.

Credentials and isolation

Use a dedicated API identity, verify the documented roles against the installed TrueNAS version, and keep credentials in 1Password and private host storage. Keep TLS verification enabled with a trusted matching certificate. Dataset write/delete roles may grant appliance-wide capabilities: selecting a pilot dataset prevents naming collisions but does not necessarily restrict the API key to that dataset. Restrict storage initiators as appropriate. API permissions guide.

Keep the current Talos storage design during the trial

Most active Talos disks are on per-host local LVM-backed storage. Moving their Longhorn storage disks onto this one NAS would place those volumes—and any replicas hosted there—behind the same physical NAS dependency. The plugin does not remove GPU/USB passthrough or mixed-CPU migration constraints.

For important future VM data, use a redundant pool. The current ai-pool is intentionally striped without redundancy. Snapshot support does not replace independent backups. Adding VM workloads would also change the NAS working set, so revisit RAM sizing after that change rather than applying today's measurements unchanged.

Stop conditions and rollback

Stop the pilot on unexplained data-integrity errors, failed cleanup, or a failed move back to local storage. Preserve logs and the exact version; do not test deletion on production volumes. Restore the disposable guest from its known-good backup or local copy. After ensuring no guest uses the pilot backend, remove only the pilot storage configuration, targets, data, and credentials. Do not stop shared NAS services to remove the trial.

Any future repository-owned implementation follows the branch/PR workflow. Host installation and storage changes need a concrete deployment plan; this report is the assessment, not that deployment.

Know what each claim rests on

Methods, confidence, and sources

This report combines the original investigation with the requested September 20 NAS, Proxmox and Kubernetes reruns. Evidence includes SSH/API inspection, Netdata and Prometheus history, bounded scratch-file read/write tests, repository configuration, and official documentation. Production services continued during testing.

Keep observations separate from decisions
Evidence typeExamplesWhat it supports
Verified snapshotDNS settings, offline peer, pool health, ProxCenter containers, host versionsState at observation time, not a permanent guarantee
Measured sample/history72-hour NAS history; pretest seven-day cluster history; local NAS, host and guest-path benchmarksBehavior in those windows and test conditions
Source-verified capabilityPDM remotes; NetBird public proxy; plugin isolation requirementsDocumented features, not a local interoperability test
Engineering recommendationKeep RAM; defer Corosync; isolate a plugin pilotA proposed choice based on evidence and this lab's dependencies

Still unanswered

  • Does the proposed DNS configuration solve the exact offsite client's symptom?
  • What performance is lost with smaller ARC budgets, prolonged SSD writes, and your actual concurrent application load?
  • What caused the older Corosync incidents?
  • Does the selected plugin release pass its lifecycle tests on this TrueNAS development build?
  • Does NetBird meet your access/recovery needs over your actual WAN?

Primary references and repository context

Capability and release claims are dated to this assessment. Recheck the chosen version before a deployment. Internal addresses identify this lab; examples are not portable configuration for another network.

One next action, under 2 minutes: open Tailscale's DNS settings and record the current nameserver entries. Use that saved state before making the proposed DNS change.