3.4 KiB
3.4 KiB
created, updated, status
| created | updated | status |
|---|---|---|
| 2026-03-15 | 2026-03-15 | planned |
Migration: TrueNAS to Ubuntu + Coolify
Motivation
- TrueNAS is storage-first OS; not ideal for general-purpose app hosting and experimentation
- Server idles 99% of the time — underutilized capacity
- Coolify provides one-click app installs and git-push deploys (useful as a Laravel developer)
- Current setup makes experimenting with new apps slow (e.g., OpenClaw took 3-4 hours)
Current Setup
- OS: TrueNAS Scale (Debian-based) on NVMe SSD (
nvme0n1) - Storage: ZFS stripe pool
tankon two separate disks (~29T total, ~14.8T used) - Services: Traefik, Gitea, Servarr stack (Gluetun/ProtonVPN, qBittorrent, Sonarr, Radarr, Lidarr, Prowlarr, Bazarr, Recyclarr), CrowdSec, Dozzle, Watchtower
- Paths: Stacks at
/mnt/tank/stacks/, configs at/mnt/tank/configs/, media at/mnt/tank/media/
Target Setup
- OS: Ubuntu Server on NVMe SSD
- Storage: Same ZFS stripe pool
tank, imported as-is - Management: Coolify for app deployment and management
- Services: Same as before, plus easy deployment of new apps and Laravel projects
Migration Plan
Before Wiping TrueNAS
- Document network config — static IP, DNS settings, hostname, router port forwards
- Back up compose files and configs — copy
/mnt/tank/stacks/and/mnt/tank/configs/to USB stick or laptop (they're on the ZFS pool and will survive, but be safe) - Export the ZFS pool cleanly:
zpool export tank - Note disk identifiers for the pool (already known from
zpool status)
Install Ubuntu
- Install Ubuntu Server on the NVMe SSD (wipes TrueNAS)
- Set up networking — replicate static IP, hostname, DNS
Restore Storage
- Install ZFS support:
sudo apt install zfsutils-linux - Import the pool at the same mount point:
Pool should appear at
sudo zpool import -d /dev/disk/by-id tank/tank— if paths need to match old config, set the mountpoint:sudo zfs set mountpoint=/mnt/tank tank - Verify data integrity:
zpool status tank zpool scrub tank
Install Coolify
- Install Coolify (one-liner from their docs)
- Decide on reverse proxy strategy:
- Option A: Use Coolify's built-in Traefik — simplest, let Coolify manage SSL and routing
- Option B: Keep existing Traefik + CrowdSec config — more control, but manage it outside Coolify
- Do NOT run both on port 443 simultaneously
- Re-deploy services via Coolify using existing Docker Compose files from
/mnt/tank/stacks/
Post-Migration
- Verify Servarr stack — confirm VPN routing through Gluetun works
- Verify Gitea — confirm repos are accessible
- Set up disk monitoring:
sudo apt install smartmontools - Set up ZFS scrub cron (Ubuntu may set this up automatically, verify)
- Test deploying a Laravel project via git push to confirm Coolify workflow
Gotchas
- Mount point must match — Docker Compose files reference
/mnt/tank/...paths - Coolify has its own Traefik — conflicts with existing Traefik if both claim port 443
- ZFS pool must be exported cleanly before wiping TrueNAS, otherwise force-import is needed
- Servarr stack VPN routing through Gluetun may need network config adjustments in Coolify's Docker environment