TrueNas - Upgrade to Electric Eel (24.10)- Migrating TrueCharts to Docker

With the release of TrueNAS SCALE 24.10 “Electric Eel”, iXsystems introduced a major architectural change: Kubernetes support for apps has been dropped in favor of a native Docker-based system.
If you're like me and have been running plenty of TrueCharts apps—which are built entirely on Kubernetes—this shift means one thing:
You can no longer rely on the same app infrastructure after upgrading.
To make this transition manageable, I decided to:
- Take a full system backup
- Export all my existing apps and configurations
- Build a tool that helps migrate apps from Kubernetes to Docker Compose
I also still rely on a few legacy jails, and although unsupported, they continue to function. With such a mixed setup, I wanted to carefully test how the upgrade performs—and how to preserve my app environment without starting from scratch.
Here’s how it went and how I prepared to minimize risk.
Spoiler: It went well—but only because I prepared.
📸 My Setup: Not Exactly Vanilla
Here’s a quick look at just some of the TrueCharts apps I have running:

As you can see, it’s not just a handful—I’ve got a decent app ecosystem running. Not all of them use HostPath volumes. That’s exactly why I wanted to approach the upgrade with care.
🔒 Step One: Make a Backup
Before doing anything, I made a complete image of my TrueNAS system and apps pool disks. No exceptions.
Even though TrueNAS upgrades are generally stable, there are just too many moving parts when you’re using apps, persistent volumes, and custom networking. If something goes sideways, having a bootable image can save hours of frustration.
✅ Recommended Tools:
- Rescuezilla: A super friendly GUI for Clonezilla. Great for point-and-click backups.
- Clonezilla: The CLI classic. Rock solid and fast.
- Ventoy: An amazing multi-ISO boot tool (more on that below).
There are excellent guides online for creating a Rescuezilla or Clonezilla image, so I won’t go into too much detail here. Just make sure to back up your boot disk at the very least—ideally to another drive or NAS.
🧰 Ventoy – The Swiss Army Knife USB Stick
Let’s talk about Ventoy, a tool that made my backup and recovery process way more convenient.
With Ventoy, you install it once on a USB stick, and then you just drag & drop ISOs onto the stick. That’s it.
Next time you boot from the USB, Ventoy shows a menu of all ISOs on the drive—pick one, and it boots.
Why it's awesome:
- No more flashing ISOs one by one
- Add/remove ISOs just like files
- Works with tons of distros and tools (Rescuezilla, Clonezilla, MemTest, TrueNAS ISO, etc.)
It’s now my go-to tool for recovery and upgrades. I highly recommend setting up a Ventoy stick before you do anything major with your NAS.
📦 Automating TrueCharts App Migration with My Script
To make app migrations smoother—especially across major TrueNAS upgrades—I wrote a small but powerful script:
👉 GitHub: truenas-exp-truecharts-apps
This tool helps you extract and back up your entire app setup—not just Helm values, but also secrets, configmaps, PostgreSQL databases, and even generates Docker Compose templates so you can redeploy apps outside of TrueNAS if needed.
🧩 What the Script Does
- 🔍 Detects all deployed TrueCharts apps (apps with
ix-
namespaces) - 📦 Exports Kubernetes resources:
- Helm release values (
values.yaml
) - ConfigMaps and Secrets
- Services and Ingresses
- Helm release values (
- 🧠 Parses credentials to find linked PostgreSQL databases
- Extracts DB name, user, and password from secrets
- Exports PSQL DBs
- 🐳 Generates Docker Compose YAML files per app
- Includes PostgreSQL definitions (if used)
- Mounts paths, environment variables, ports, and image references
- Supports basic one-command redeploy outside TrueNAS
📸 Example: Export Structure
Here's what the export output looks like:
javaCopyEditexports
/
├── ix-gitea/
│ ├── values.yaml
│ ├── configmaps/
│ ├── secrets/
│ ├── svc.yaml
│ ├── ingress.yaml
│ └── docker-compose.yaml
├── ix-jellyfin/
│ └── ...
Each app’s folder contains everything needed to:
- Re-deploy it back into TrueNAS SCALE via Helm
- Or migrate it to a standalone Docker host with Compose
📸 PostgreSQL Detection
Apps using CloudNativePG (like Gitea, Wiki.js, etc.) often store DB credentials in Kubernetes secrets. The script finds those and embeds them in the Compose setup automatically.
services:
postgres:
image: postgres:15
environment:
POSTGRES_DB: wikijs
POSTGRES_USER: wikijs_user
POSTGRES_PASSWORD: ********
volumes:
- pgdata:/var/lib/postgresql/data
This means you can move apps from TrueNAS SCALE to plain Docker if needed, with very little adjustment.
📸 Script Running
Launching the script is easy:
chmod +x truenas-export-truechart-apps.sh
./truenas-export-truechart-apps.sh
And the output clearly shows what’s happening—apps detected, exports saved, Compose files created.
root@r0k5t4r[~/scripts/truenas-exp-truecharts-apps]# ./truenas-export-truechart-apps.sh
📦 Exporting all TrueCharts apps for Electric Eel migration...
🔍 Checking namespace: ix-teamspeak3
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /etc/rancher/k3s/k3s.yaml
📤 Exporting Helm values for: teamspeak3 (namespace: ix-teamspeak3)
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /etc/rancher/k3s/k3s.yaml
✅ Cleaned values saved to: /root/scripts/truenas-exp-truecharts-apps/exports/ix-teamspeak3/teamspeak3/cleaned.yaml
⚠️ Found hostPath volumes in teamspeak3:
/mnt/zpool0/k8s/teamspeak
⚠️ Backup of hostPath volumes skipped by user setting.
📦 PVCs in ix-teamspeak3/teamspeak3:
No resources found in ix-teamspeak3 namespace.
------------------------------
🔍 Checking namespace: ix-metallb-config
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /etc/rancher/k3s/k3s.yaml
📤 Exporting Helm values for: metallb-config (namespace: ix-metallb-config)
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /etc/rancher/k3s/k3s.yaml
✅ Cleaned values saved to: /root/scripts/truenas-exp-truecharts-apps/exports/ix-metallb-config/metallb-config/cleaned.yaml
✅ No hostPath volumes found in metallb-config
📦 PVCs in ix-metallb-config/metallb-config:
No resources found in ix-metallb-config namespace.
------------------------------
🔍 Checking namespace: ix-jellyfin
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /etc/rancher/k3s/k3s.yaml
📤 Exporting Helm values for: jellyfin (namespace: ix-jellyfin)
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /etc/rancher/k3s/k3s.yaml
✅ Cleaned values saved to: /root/scripts/truenas-exp-truecharts-apps/exports/ix-jellyfin/jellyfin/cleaned.yaml
⚠️ Found hostPath volumes in jellyfin:
/mnt/zpool_rust/Pics
/mnt/zpool_rust/Multimedia
⚠️ Backup of hostPath volumes skipped by user setting.
📦 PVCs in ix-jellyfin/jellyfin:
jellyfin-config Bound pvc-5b916561-1964-439a-8a16-84da9635a0d3 256Gi [ReadWriteOnce] ix-storage-class-jellyfin
jellyfin-transcode Bound pvc-5bd181ab-33bb-4fa8-876a-d144cdac4ec2 256Gi [ReadWriteOnce] ix-storage-class-jellyfin
------------------------------
🔍 Checking namespace: ix-minio
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /etc/rancher/k3s/k3s.yaml
📤 Exporting Helm values for: minio (namespace: ix-minio)
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /etc/rancher/k3s/k3s.yaml
✅ Cleaned values saved to: /root/scripts/truenas-exp-truecharts-apps/exports/ix-minio/minio/cleaned.yaml
⚠️ Found hostPath volumes in minio:
/mnt/zpool0/minionew
⚠️ Backup of hostPath volumes skipped by user setting.
📦 PVCs in ix-minio/minio:
No resources found in ix-minio namespace.
------------------------------
📋 Migration Summary:
-----------------------------------
Apps WITH hostPath volumes:
- ix-teamspeak3/teamspeak3
- ix-jellyfin/jellyfin
- ix-makemkv/makemkv
- ix-dashy/dashy
- ix-minio/minio
Apps WITHOUT hostPath volumes:
- ix-metallb-config/metallb-config
- ix-metallb/metallb
- ix-prometheus-operator/prometheus-operator
- ix-cloudnative-pg/cloudnative-pg
- ix-wikijs/wikijs
- ix-pgadmin/pgadmin
-----------------------------------
📥 Exporting all Services and Ingresses to /root/scripts/truenas-exp-truecharts-apps/exports
🗄️ PostgreSQL usage detected in charts:
- ix-metallb-config/metallb-config
- ix-jellyfin/jellyfin
- ix-makemkv/makemkv
- ix-dashy/dashy
- ix-wikijs/wikijs
🗄️ Dumping PostgreSQL databases to host path: /root/scripts/truenas-exp-truecharts-apps/exports/pg_dumps ...
🔍 Processing PostgreSQL dump for ix-metallb-config/metallb-config...
⚠️ Could not find PostgreSQL credentials for ix-metallb-config/metallb-config, skipping dump.
🔍 Processing PostgreSQL dump for ix-jellyfin/jellyfin...
⚠️ Could not find PostgreSQL credentials for ix-jellyfin/jellyfin, skipping dump.
🔍 Processing PostgreSQL dump for ix-makemkv/makemkv...
⚠️ Could not find PostgreSQL credentials for ix-makemkv/makemkv, skipping dump.
🔍 Processing PostgreSQL dump for ix-dashy/dashy...
⚠️ Could not find PostgreSQL credentials for ix-dashy/dashy, skipping dump.
🔍 Processing PostgreSQL dump for ix-wikijs/wikijs...
✅ Found credentials for user postgres.
🛠️ Creating dump pod psql-dump-wikijs in default...
pod/psql-dump-wikijs created
pod/psql-dump-wikijs condition met
INFO[0000] Acquiring lock file /root/scripts/truenas-exp-truecharts-apps/-h/data/.lock
INFO[0000] Preparing data dir /root/scripts/truenas-exp-truecharts-apps/-h/data/d7638de68785edbb9f6001239dc51c033f1e35ffcb8e8bbc9a770b482991fabf
Databases found: postgres
wikijs
Dumping database: postgres
Dumping database: wikijs
pod "psql-dump-wikijs" deleted
🗄️ PostgreSQL dumps stored on host at: /root/scripts/truenas-exp-truecharts-apps/exports/pg_dumps
🎉 All TrueCharts apps exported and cleaned.
Read the summary very carefully. Especially take care for all apps that have no hostPath Volume yet. You need to either reconfigure those or use some approach from here:
Migration from TrueCharts to TrueNAS Custom App Quick Guide
by u/magusdm in truenas
In my case only the WikiJS app was really of interest to me. It is using a PSQL DB and so I extended the script to gather the username and password and dump the DB. 😸
Example: Migrate Dashy
With our docker-compose.yml file, we can now easily re-deploy dashy in docker using our HostPath volumes.
✅ Compose file written to: ./exports/ix-dashy/dashy/docker-compose.yaml
root@r0k5t4r[~/scripts/truenas-exp-truecharts-apps]# cat exports/ix-dashy/dashy/docker-compose.yaml
version: '3.8'
services:
dashy:
image: lissy93/dashy:3.1.0@sha256:b9929261cbf9353f8aee2c63b35e53aafc4951aa9923c1244242de7c1251f49f
container_name: dashy
ports:
- "10310:8080"
volumes:
- "/mnt/zpool0/dashy/item-icons:/app/public/item-icons"
- "/mnt/zpool0/dashy/user-data:/app/user-data"
restart: unless-stopped
root@r0k5t4r[~/scripts/truenas-exp-truecharts-apps]# cd exports/ix-dashy/dashy
root@r0k5t4r[...ruecharts-apps/exports/ix-dashy/dashy]# docker compose up -d
WARN[0000] /root/scripts/truenas-exp-truecharts-apps/exports/ix-dashy/dashy/docker-compose.yaml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion
[+] Running 2/2
✔ Network dashy_default Created 0.2s
✔ Container dashy Started 0.4s
root@r0k5t4r[...ruecharts-apps/exports/ix-dashy/dashy]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4ff8badb9791 lissy93/dashy:3.1.0 "docker-entrypoint.s…" 2 minutes ago Up 2 minutes (healthy) 0.0.0.0:10310->8080/tcp, :::10310->8080/tcp dashy
root@r0k5t4r[...ruecharts-apps/exports/ix-dashy/dashy]# docker logs dashy
yarn run v1.22.19
$ NODE_OPTIONS=--openssl-legacy-provider npm-run-all --parallel build start
$ node server
$ NODE_OPTIONS=--openssl-legacy-provider vue-cli-service build
Checking config file against schema...
✔️ Config file is valid, no issues found
SSL Not Enabled: Public key not present
██████╗ █████╗ ███████╗██╗ ██╗██╗ ██╗
██╔══██╗██╔══██╗██╔════╝██║ ██║╚██╗ ██╔╝
██║ ██║███████║███████╗███████║ ╚████╔╝
██║ ██║██╔══██║╚════██║██╔══██║ ╚██╔╝
██████╔╝██║ ██║███████║██║ ██║ ██║
╚═════╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝ ╚═╝
*******************************************************************************************
Welcome to Dashy! 🚀
Your new dashboard is now up and running with Docker
*******************************************************************************************
Using Dashy V-3.1.0. Update Check Complete
━━━━━━━━━━━━━━━━━━━━━━━━━━━
⚠️ Update Available: 3.1.1
━━━━━━━━━━━━━━━━━━━━━━━━━━━
Browserslist: caniuse-lite is outdated. Please run:
npx update-browserslist-db@latest
Why you should do it regularly: https://github.com/browserslist/update-db#readme
- Building for production...
WARN A new version of sass-loader is available. Please upgrade for best experience.
Browserslist: caniuse-lite is outdated. Please run:
npx update-browserslist-db@latest
Why you should do it regularly: https://github.com/browserslist/update-db#readme
Browserslist: caniuse-lite is outdated. Please run:
npx update-browserslist-db@latest
Why you should do it regularly: https://github.com/browserslist/update-db#readme
Browserslist: caniuse-lite is outdated. Please run:
npx update-browserslist-db@latest
Why you should do it regularly: https://github.com/browserslist/update-db#readme
📌 Note on Ingress and Networking
If you were previously using Ingress with your TrueCharts apps (e.g. routing via a reverse proxy or ingress controller in Kubernetes), keep in mind that things are different now:
- In the new Docker-based setup, containers run directly with individual ports on the host.
- You’ll need to plan for possible port conflicts (e.g. multiple apps wanting to use port 80 or 443).
- Alternatively, you can assign each app a different IP address using Docker networks and macvlan/bridge settings—depending on your setup.
⚠️ These networking and port adjustments are not handled by the script and must be configured manually in the generated docker-compose.yaml
files.
🛠 Post-Migration Adjustments & Tips
While the export and Compose generation saves you a lot of time, some apps still require a bit of manual tweaking after redeployment. Here are a few things I encountered:
- Jellyfin: The container started fine, but I had to reconfigure the library paths inside the app by pointing them to my correct media folders on the host.
- TeamSpeak 3: The container wouldn’t start until I accepted the license agreement by adding this to the
docker-compose.yml
:
environment:
TS3SERVER_LICENSE: "accept"
- Debugging tip: If a container fails to start, always check the logs:bashKopierenBearbeitendocker logs teamspeak3
This helped me quickly spot misconfigurations or missing environment variables.
docker logs teamspeak3
⚠️ Disclaimer
This script is provided as-is, with no guarantees or warranties.
Use at your own risk. I take no responsibility if it causes data loss, misconfiguration, or broken apps.
Always back up your system before using tools that interact with application resources.
⚙️ Performing the Upgrade
With my backups done and app configs exported with my script, I finally pulled the trigger on the upgrade.
Steps:
- Open the TrueNAS web UI
- Go to System Settings → Update
- Select the 24.10 Electric Eel train
- Hit Download Updates and Apply
- Reboot and wait

✅ Post-Upgrade Results
After the reboot, I was pleasantly surprised:
- TrueCharts Apps Export Script: Using my script I was able to easily redeploy my apps in docker.
- Jails: Still there, still working. Unsupported, but functional. No migration needed. 😄
- Storage Pools and Shares: Untouched and accessible.
- UI & Performance: A little snappier in places. No noticeable regressions so far.
It just worked.
🧠 Final Thoughts
I’m very happy with how the 24.10 upgrade went—but I also didn’t go in blind.
If you're running a setup like mine with a lot of TrueCharts apps and even a few legacy jails, preparation is key:
- 🔒 Image your system drive (Rescuezilla/Clonezilla)
- 🧰 Make a Ventoy USB stick with all your tools
- 📦 Export your apps manually or comfortable using my migration script
If you take those steps, you'll be in a great position to upgrade smoothly—or recover quickly if something goes wrong.
🔗 Useful Links
- 💽 Rescuezilla – rescuezilla.com
- 💾 Clonezilla – clonezilla.org
- 🚀 Ventoy – ventoy.net
- 🧩 TrueCharts App Export Script – GitHub
- 🐟 TrueNAS SCALE Release Notes
- 📝 More posts on roksblog.de
Let me know in the comments if your upgrade experience was similar—or if you hit any roadblocks! And if you find my script useful, feel free to star the repo 👍