truenas · ntp · homelab · networking · self-hosted

TrueNAS as an NTP Server for Your Homelab

How to configure TrueNAS as a local NTP server, pick the right pool addresses, and verify sync with ntpq -p — so everything in your homelab agrees on what time it is.

Time sync sounds boring until your Kubernetes logs disagree with your monitoring dashboard by 47 seconds and you spend an afternoon wondering why alerts are firing out of order.

Setting up TrueNAS as a local NTP server for your homelab takes about 15 minutes. It means one source of truth for time across every VM, container, and device on your network — and it's one less external dependency when your internet goes down at 2am.

Here's how to do it properly.

Why bother with a local NTP server

Most devices default to something like pool.ntp.org or a vendor-specific server. Fine for a home PC, not great for a homelab where you need consistent timestamps across distributed systems.

Certificate validation fails when clocks drift. Kubernetes control plane nodes get confused. Log correlation becomes unreliable. A local NTP server — one that all your devices sync to — eliminates clock skew between machines without each one needing its own upstream NTP dependency.

TrueNAS makes sense as the host because it's already running 24/7 and you've already done the work to keep it reliable.

Configure NTP on TrueNAS CORE (FreeBSD / ntpd)

TrueNAS CORE runs ntpd under the hood. You configure it at System → NTP Servers.

By default TrueNAS ships with three Debian pool servers. Replace them with regional UK pool addresses for better latency:

0.uk.pool.ntp.org
1.uk.pool.ntp.org
2.uk.pool.ntp.org
3.uk.pool.ntp.org

Each entry: check Burst, leave IBurst checked, min poll 6, max poll 10. The burst options improve initial sync accuracy when the service starts or a server becomes reachable again.

After saving, NTP restarts automatically.

Configure NTP on TrueNAS SCALE (Linux / chrony)

SCALE uses chrony instead of ntpd. The UI path is the same — System Settings → General → NTP Servers — but the underlying daemon is different.

Add the same pool addresses. SCALE also allows you to tick Prefer on one server if you want chrony to weight it more heavily. Leave it unchecked unless you're running a GPS-disciplined clock.

Allow your homelab devices to sync from TrueNAS

This is the part people miss. By default, ntpd and chrony accept queries from localhost only.

On CORE, add this to /etc/ntp.conf via System → Tunables (or directly if you have shell access):

restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap

Replace 192.168.1.0 with your actual LAN subnet. nomodify notrap means clients can query time but can't change the server's config.

On SCALE, chrony's config is at /etc/chrony.conf. Add:

allow 192.168.1.0/24

Reload with systemctl reload chronyd.

Verify sync with ntpq -p (CORE) or chronyc tracking (SCALE)

On TrueNAS CORE, SSH in and run:

ntpq -p

You'll see something like:

     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*0.uk.pool.ntp.o .GPS.            1 u   42   64  377    8.201   -0.413   0.891
+1.uk.pool.ntp.o .PPS.            1 u   11   64  377   11.047    0.218   0.743
+2.uk.pool.ntp.o 195.66.241.2     2 u   38   64  377   14.312    0.527   1.102

The * prefix means that's your current sync source. st 1 means stratum 1 — syncing directly from a GPS or atomic reference. offset under 1ms is fine for homelab purposes. reach 377 means all 8 of the last 8 polls succeeded.

On SCALE, run chronyc tracking:

chronyc tracking

Look for System time offset under 1ms and Leap status: Normal.

Point your homelab devices at TrueNAS

Once TrueNAS is syncing and accepting queries, update everything else to use its IP as the NTP server.

On Linux VMs:

# /etc/systemd/timesyncd.conf
[Time]
NTP=192.168.1.10

Then systemctl restart systemd-timesyncd.

For Proxmox nodes: Datacenter → Node → System → Time — set the NTP server to your TrueNAS IP. For pfSense/OPNsense: Services → NTP — add it as an upstream server.

Kubernetes nodes pick up NTP from the host OS, so fixing the node-level config is enough. Check drift with timedatectl show-timesync --all on each node. If you're running k3s at home, this applies to every node in your cluster.


One source of time, synced from regional pool servers, distributed to everything in your rack. It's not a glamorous setup but it's the kind of thing that quietly prevents a whole category of confusing errors.

If you're running TrueNAS for storage, you're already most of the way there — the service just needs enabling and your other devices pointing at it.

work together

Need this for your team?

This is the kind of infrastructure work I do for clients — cloud platforms, CI/CD automation, and GitOps workflows that teams can actually operate.