Date: April 30, 2026 | Tags: homelab, NAS, NFS, QNAP, Ollama, OpenWebUI, Proxmox, Docker
Summary
Successfully completed the migration of both Ollama model data and OpenWebUI application data from local VM storage to a QNAP NAS (TS-453D) via NFS. This involved diagnosing and fixing a broken NAS mount configuration, correcting NFS export issues on the QNAP, and performing live data migrations with minimal downtime.
Background
The Ollama AI stack (Ollama + Open WebUI) runs on VM 205 (IP: 10.10.20.39) inside a Proxmox VE cluster (host IP: 10.10.20.252). The stack was originally configured to store both model weights and OpenWebUI application data on a NAS via NFS mounts, but at some point the NAS mounts broke, causing the stack to fail. A previous workaround switched the Docker volumes to local paths to restore service, but the goal was always to move the data back to the NAS for centralized storage and backup.
Phase 1: NAS Mount Investigation & Diagnosis
The Problem
The NFS mounts on VM 205 were broken. The original /etc/fstab had:
10.10.20.6:/volume1/ollama-models /mnt/nas/ollama-models nfs defaults,_netdev,nofail,x-systemd.automount 0 010.10.20.6:/volume1/openwebui-data /mnt/nas/openwebui-data nfs defaults,_netdev,nofail,x-systemd.automount 0 0
Root Cause Analysis
Two distinct issues were found:
- Wrong NAS IP in fstab: The fstab pointed to
10.10.20.6, but the actual NAS IP is10.10.20.4. Pinging 10.10.20.6 returned 100% packet loss. Pinging 10.10.20.4 succeeded with <1ms latency. - Wrong path format: The fstab used Synology-style paths (
/volume1/...) but the NAS is a QNAP TS-453D running QTS 5.2.3. QNAP uses different NFS export paths.
NAS Discovery
| Property | Value |
|---|---|
| Model | QNAP TS-453D |
| Firmware | QTS 5.2.3.3451 |
| CPU | Intel Celeron J4125 (4C/4T, 2.7GHz) |
| RAM | 4 GB |
| IP | 10.10.20.4 |
| Hostname | NAS5F20EF |
| MAC | 24:5A:8E:5F:20:F0 |
Open Ports on NAS
| Port | Service | Status |
|---|---|---|
| 22 | SSH | Open |
| 111 | rpcbind | Open |
| 443 | HTTPS | Open |
| 445 | SMB | Open |
| 2049 | NFS | Open |
| 8080 | HTTP | Open |
NFS Export Issue
Even though the NFS service was running (confirmed via rpcinfo showing NFS v2/3/4 on TCP/UDP port 2049), showmount -e 10.10.20.4 returned an empty export list. SSH into the QNAP revealed the /etc/exports file contained an invalid NFS option read-wr instead of rw, causing exportfs to silently fail with no active exports.
Phase 2: NFS Export Fix
- SSH into QNAP NAS:
ssh jczaldivar@10.10.20.4 - Backup original exports:
sudo cp /etc/exports /etc/exports.bak - Write corrected exports file with proper
rwoptions (replacing invalidread-wr) - Reload NFS exports:
sudo exportfs -ra - Verify exports active:
sudo exportfs -vconfirmed both shares exported with rw - Verify from Proxmox:
showmount -e 10.10.20.4now listed both/ollama-modelsand/openwebui-data
Corrected /etc/exports on QNAP:
/share/CACHEDEV1_DATA/ollama-models *(rw,async,no_subtree_check,no_root_squash,insecure) 10.10.20.0/24(rw,async,no_subtree_check,no_root_squash,insecure)/share/CACHEDEV1_DATA/openwebui-data *(rw,async,no_subtree_check,no_root_squash,insecure) 10.10.20.0/24(rw,async,no_subtree_check,no_root_squash,insecure)
Phase 3: Ollama Models Migration
The NAS already contained a full set of Ollama models from a previous configuration (9.8 GB):
| Model | Size | ID |
|---|---|---|
| nomic-embed-text:latest | 274 MB | 0a195f422b47 |
| qwen2.5-coder:7b | 4.7 GB | dae161a2 |
| llama3.1:8b | 4.9 GB | 46e0d1c039e |
| tinyllama:latest | 637 MB | 26449156de35 |
The NFS share was mounted on VM 205 at /mnt/nas/ollama-models, docker-compose.yml was updated to use the NAS path, and the container was recreated, immediately picking up all 4 models from the NAS.
Phase 4: OpenWebUI Data Migration
| Location | Size | Description |
|---|---|---|
| NAS (pre-existing) | 890 MB | Older copy from previous config |
| Local VM (active) | 934 MB | Current working copy |
- Mounted NFS share:
mount -t nfs 10.10.20.4:/openwebui-data /mnt/nas/openwebui-data - Stopped open-webui container for data consistency
- Rsync’d local data to NAS:
rsync -av --delete– transferred 934 MB at ~110 MB/sec - Updated docker-compose.yml volume to NAS path
- Updated
/etc/fstabwith correct NAS IP (10.10.20.4) and paths - Restarted all containers – both recreated with NAS mounts and running healthy
Verification Results
| Check | Result |
|---|---|
| ollama container | Up, running |
| open-webui container | Up, healthy |
| OpenWebUI HTTP (port 3000) | HTTP 200 |
| Ollama models accessible | All 4 models loaded |
| NFS mount ollama-models | rw, NFS v3 |
| NFS mount openwebui-data | rw, NFS v3 |
| NAS ollama-models size | 9.8 GB |
| NAS openwebui-data size | 890 MB |
Current Network Topology
Infrastructure Overview
All devices are on the 10.10.20.0/24 subnet.
| Device | IP Address | Role | Details |
|---|---|---|---|
| Proxmox VE Host | 10.10.20.252 | Hypervisor | Hosts all VMs and containers |
| VM 205 (ollama-gpu) | 10.10.20.39 | AI Stack | Docker: ollama (:11434), open-webui (:3000), NVIDIA GPU passthrough |
| QNAP NAS (TS-453D) | 10.10.20.4 | NFS Storage | Hostname: NAS5F20EF, QTS 5.2.3, Intel J4125, 4GB RAM |
| CT 206 | – | OpenClaw agent | Telegram bot |
| CT 120 | – | dns-server | DNS services |
| CT 130 | – | ad-server | Active Directory |
| CT 200 | – | opn-attackrr-agent1 | Security lab |
| CT 201 | – | metasploitable2 | Security lab target |
| CT 202 | – | dvwa-target | Security lab target |
| CT 203 | – | mycompany-dc | Domain controller |
| VM 204 | – | eve-ng | Network emulator |
Network Connectivity Map
| Source | Destination | Protocol | Port/Service |
|---|---|---|---|
| Proxmox (10.10.20.252) | VM 205 (10.10.20.39) | VM Host | Virtual NIC |
| VM 205 (10.10.20.39) | QNAP NAS (10.10.20.4) | NFS v3 | TCP 2049 |
| User Browser | VM 205 (10.10.20.39) | HTTP | Port 3000 (Open WebUI) |
| open-webui container | ollama container | HTTP | Port 11434 (Docker network) |
NAS Storage Layout
| Share Name | Internal Path | Size | Type |
|---|---|---|---|
| /ollama-models | /share/CACHEDEV1_DATA/ollama-models | 9.8 GB | NFS Export |
| /openwebui-data | /share/CACHEDEV1_DATA/openwebui-data | 890 MB | NFS Export |
| 4SSD-SHARE | – | 1.96 TB | SMB Share |
| Container | – | 7.43 GB | Container Station |
| easystore | – | 1.35 TB | USB External |
| Public | – | 24 KB | SMB Share |
Data Flow
Request path: User Browser -> HTTP:3000 -> Open WebUI (VM 205 container) -> HTTP:11434 (docker network) -> Ollama (VM 205 container) -> GPU Inference (NVIDIA passthrough)
Storage path: Ollama reads/writes model data from /root/.ollama inside the container, which maps to /mnt/nas/ollama-models on VM 205, which is an NFS mount to 10.10.20.4:/ollama-models on the QNAP NAS (internal path: /share/CACHEDEV1_DATA/ollama-models).
WebUI data path: Open WebUI reads/writes app data from /app/backend/data inside the container, which maps to /mnt/nas/openwebui-data on VM 205, which is an NFS mount to 10.10.20.4:/openwebui-data on the QNAP NAS (internal path: /share/CACHEDEV1_DATA/openwebui-data).
Key Configuration Files
VM 205 – /etc/fstab (corrected):
10.10.20.4:/ollama-models /mnt/nas/ollama-models nfs defaults,_netdev,nofail,x-systemd.automount 0 010.10.20.4:/openwebui-data /mnt/nas/openwebui-data nfs defaults,_netdev,nofail,x-systemd.automount 0 0
VM 205 – docker-compose.yml:
services: ollama: image: ollama/ollama:latest container_name: ollama ports: ["11434:11434"] volumes: ["/mnt/nas/ollama-models:/root/.ollama"] deploy: resources: reservations: devices: - driver: nvidia count: all capabilities: [gpu] open-webui: image: ghcr.io/open-webui/open-webui:main container_name: open-webui ports: ["3000:8080"] environment: ["OLLAMA_BASE_URI=http://ollama:11434"] volumes: ["/mnt/nas/openwebui-data:/app/backend/data"] depends_on: [ollama]
Lessons Learned
- Always verify the NAS IP: The fstab had a stale IP (10.10.20.6) that no longer existed. The actual NAS was at 10.10.20.4.
- QNAP != Synology paths: Synology uses
/volume1/share-name, QNAP uses/share/CACHEDEV1_DATA/share-nameinternally and exports as/share-name. - Check /etc/exports directly: The QNAP web UI showed NFS enabled, but the underlying exports file had an invalid option (
read-wrinstead ofrw), causing silent export failures. - showmount -e is your friend: Quick way to verify NFS exports are actually published.
- Keep local backups: The docker-compose.yml.bak file preserved the original NAS-based config for easy restoration.
Status: Complete
Both Ollama models (9.8 GB, 4 models) and OpenWebUI data (890 MB) are now running from the QNAP NAS via NFS. The stack is fully operational with all 4 models accessible and OpenWebUI responding healthy on port 3000. Migration completed April 30, 2026.



