Published on

TrueNAS Core to Scale App Migration

Table of Contents


If you’ve landed here, hello! It seems that you too want to make the switch from TrueNAS Core to Scale.

There are many reasons for and against it, and I won’t go into them here. At the end of the day, when all’s said and know what I mean?1

I also won’t go into the exact migration process for the OS itself - you can do it all through the UI. But make sure you have backups of everything!

I’ll primarily be going over the app migrations for my jails into Docker container versions, keeping as much data as possible.

These will be a combination of semi-rough and detailed notes, so I hope they’re helpful.

But first

I’d create a new dataset for your container data to live. Gradually, we’ll copy more and more data out of the old iocage dataset into this one. It’s good to keep a copy so we can start fresh.

I went with a dataset called apps, so I’ll be using commands referencing that, in my pool tank: /mnt/tank/apps.


The configuration can be found here:

/mnt/tank/iocage/jails/<jailname>/root/usr/local/plexdata/Plex\ Media\ Server/

Where <jailname> is your jail - mine was plex.

Copy this folder into your app dataset:

mkdir -p /mnt/tank/apps/plex/config/Library/Application\ Support/
cp -Rip /mnt/tank/iocage/jails/plex/root/usr/local/plexdata/Plex\ Media\ Server/ /mnt/tank/apps/plex/config/Library/Application\ Support/
chown -R 1000:1000 /mnt/tank/apps/plex/config/

When installing the Plex app, under Storage -> Config Volume, you need to set it to the above path /mnt/tank/apps/plex/config

I have my media setup like so:


With these directories previously being mounted on the container in similar (but not identical) paths:


When mounting these directories, make sure you allow read/write access for Plex. You may have to chown -R 1000:1000 the directories so Plex can scan them.

I went this route since I didn’t particularly want Plex to have complete access to the whole pool. We can achieve the same structure in the Docker version.

Under the Config Volume, there’s a button to add Plex Extra Host Path Volumes. Click it, and put the corresponding paths as above to rebuild the required structure.

NOTE: I had issues with the official TrueNAS Plex app (obviously) with SMB shares and stuff, so I had to disable the SMB share that was causing the issue.

Additional info


For me, configuration and existing torrents can be found here:


Where <jailname> is your jail - mine was transmission.

Copy this folder into your app dataset:

mkdir -p /mnt/tank/apps/transmission/
cp -Rip /mnt/tank/iocage/jails/transmission/root/usr/local/etc/transmission/home /mnt/tank/apps/transmission/config
chown -R 568:568 /mnt/tank/apps/transmission/config/

When installing the Transmission app, under Storage Configuration -> Transmission Config Storage, you need to set it to the above path /mnt/tank/apps/transmission/config

Leave Complete Downloads Storage and Incomplete Downloads Storage as they are - we’ll be mounting our own directories to avoid having to reconfigure the torrents.

Under Additional Storage, add a Host Path mount option for your download location. For me, it was /mnt/tank/torrents to be mounted as /mnt/torrents

The reason we’re not using the option for download location is that the internal torrent files (and resume files) reference absolute paths - we need to keep these the same so we don’t have to migrate them.

The web UI port is different in this app - change it if you want the old behaviour (8081).

I additionally had to mount additional storage to prevent the config being overwritten on each start up of the container. This means mounting the config file /mnt/tank/apps/transmission/config/settings.json as READONLY in the container.

You can start the container now and see if it works with your previous config - and that your torrents are all there. Verify local files on one of them to make sure everything is hunky-dory.

Grafana + InfluxDB


This is where things get a little trickier. I’ve documented how to set up both these services in the past to capture metrics from TrueNAS, both on this blog and originally on the TrueNAS forum2.

Therefore these steps assume you’re using the same setup - so if not, adjust to taste.

We’ll start with Grafana - as the app is available from the official TrueNAS Chart. At the time of writing this, it’s version 10 - a huge jump from my v7 Core setup.

I had the database here:


Where <jailname> is your jail - mine was transmission.

Copy this file into your app dataset:

mkdir -p /mnt/tank/apps/grafana/
cp -Rip /mnt/tank/iocage/jails/grafana/root/var/db/grafana/grafana.db /mnt/tank/apps/grafana/
chown -R 568:568 /mnt/tank/apps/grafana/

Under Additional Environment Variables, add the following:

  • GF_DATABASE_PATH - /mnt/grafana/grafana.db

Under Additional Storage, add a Host Path mount option for your app data location. I used /mnt/tank/apps/grafana to be mounted as /mnt/grafana

Now - I had problems with the SQLite database, with log messages saying "database is locked". If your googling leads you nowhere, try adding the environment variable GF_DATABASE_WAF=true.


I had an old version of InfluxDB installed from when I created the guide. Therefore, I’m just going to run with the same one - 1.8.0.

Unfortunately, it’s not available in the official chart (or Truecharts)3, so we’ll have to go with Docker Compose.

  1. Prepare your InfluxDB data:
mkdir -p /mnt/tank/apps/influxdb/
cp -Rip /mnt/tank/iocage/jails/grafana/root/usr/local/etc/influxd.conf /mnt/tank/apps/influxdb/
cp -Rip /mnt/tank/iocage/jails/grafana/root/var/db/influxdb /mnt/tank/apps/influxdb/db
mv /mnt/tank/apps/influxdb/influxd.conf /mnt/tank/apps/influxdb/influxdb.conf
chown -R 568:568 /mnt/tank/apps/influxdb/influxdb.conf /mnt/tank/apps/influxdb/db

NOTE: It seemed that for me, influxd.conf worked previously, but it now expects it to be called influxdb.conf.

  1. In the Apps section, click Launch Docker Image:
  • Application Name: influxdb
  • Image Repository: influxdb
  • Image Tag: 1.8
  • Networking -> Add External Interface
    • Select your interface (I only have one)
    • IPAM Type: Static IP
      • (or your preference)
    • Add static route
      • Destination:
      • Gateway: (or your gateway)
  • Storage -> Add Host Path Volumes
    • Host Path: /mnt/tank/apps/influxdb/db
    • Mount Path: /var/db/influxdb
    • Host Path: /mnt/tank/apps/influxdb/influxdb.conf
    • Mount Path: /etc/influxdb/influxdb.conf
  1. Restart Grafana

  2. You’ll need to modify the data sources to the IP above. Alternatively, I found a post that used the internal name for the container http://influxdb-ix-chart.ix-influxdb.svc.cluster.local.:8086 which worked for me.

Also, note that the Scale team decided to remove the graphite metric collection - see Jira tickets NAS-123668 and NAS-123098. So, yay. That’s never coming back!


Ah, the *arr4 suite of applications. Perfect for the Linux ISO power collector. I didn’t want to spend too much time here - and luckily, I found that it automatically backs up its config!

You can find your backups using a command like so:

find /mnt/tank/iocage/jails/transmission/root/ -iname '*sonarr*'

I had many files in the output - most importantly, these:


Setup a folder for Sonarr to use:

mkdir -p /mnt/tank/apps/sonarr/
chown -R 568:568 /mnt/tank/apps/sonarr/

And add the Sonarr app to your system. Under Sonarr Config Storage, change it to Host Path and put /mnt/tank/apps/sonarr.

Add your relevant additional mounts here too, for access to your TV Shows. Don’t forget to add your download client’s remote location!

Once deployed and active, open the web portal and go to Settings -> Backup -> Restore Backup (in the navbar). Use the latest backup you found.

Give it a moment to finish, and then make sure you have no further alerts in Sonarr. I had to amend the port used for Transmission, but otherwise, it appeared fine.

This was arguably the easiest. Kudos to Sonarr developers!


I had a dedicated jail for this previously, but I couldn’t tell you why. I’ll keep it short and sweet from now on, you should know what we are doing by now.

Config here:


Make it a home: (and delete some logs, we don’t need them)

mkdir /mnt/tank/apps/jackett/
cp -Rip /mnt/tank/iocage/jails/jackett/root/usr/local/jackett /mnt/tank/apps/jackett/Jackett
rm /mnt/tank/apps/jackett/Jackett/log*.txt
chown -R 568:568 /mnt/tank/apps/jackett

You’ll need to add the Truecharts Catalog to your installation - this is easy to do.

Select the Jackett application. Under App Config Storage, change to Host Path, and set it to /mnt/tank/apps/jackett

Save and start!

Thank you to Daulton for documenting Jackett on FreeBSD which helped me find the config directory.

Note: I actually had to deprecate (read: abandon) Jackett due to a recurring System.InsufficientExecutionStackException error. This was not unique to my system nor to the version of Jackett I was running. It’s a shame, to be honest!


That’s all the programs I had running pre-migration. I hope this helped!


  1. That’s a Gavin & Stacey reference. Sorry.

  2. I’m amazed at the amount of engagement that post got. I didn’t have my notifications set up correctly, so I unfortunately let it fall off my radar!

  3. Probably because there are many other "better" time series databases out there. However, I like and have bought into Influx - it works on my machine™

  4. The pirate pun has only just hit me.

If you‘ve liked what I‘ve written, or it has helped you out, please consider sharing!