Dreaded "No Applications Installed" after hardware rebuild

Hi all,

I’ve been moving my hardware to a new case and just completed that today. I made sure to keep veery good track of which drives were connected to which port and set them all back up exactly as they were. The pools are fine, including my SSDpool which runs all the apps. All the data is still there, including all the file paths I built for each app and all of the app’s data within those directories. None of my apps were run using the ix self-built paths.

However the Apps dashboard shows no apps and reads “No Applications Installed”. I’ve tried unsetting and re-setting the SSDpool, restarting the server and so on but nothing’s worked. It’s like a directory of apps and pointers is missing or something?

I’m not really sure how to start diagnosing and fixing and hoping someone can point me in the right direction as I had about 20 apps set up! Don’t want to go through setting them all up again manually if I can help it.

Many thanks in advance.

It may sound stupid, but try installing any random app, this may kick things back in order, at least i’ve seen some posts that said their apps appeared after installing any new app

Hi, thanks for the suggestion! I did try that but it didn’t work in this case :frowning:

Okay so I rolled back /mnt/ix-apps to a snapshot from just before I shut it down to do the upgrades… I now have 3 apps showing. Still not the 20 or so I should have but hey, progress?

When I click “Edit” on one of the apps to check its file path and ensure its correct I get this error:

Validation Error

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/middlewared/api/base/server/ws_handler/rpc.py", line 323, in process_method_call
    result = await method.call(app, params)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/middlewared/api/base/server/method.py", line 52, in call
    result = await self.middleware.call_with_audit(self.name, self.serviceobj, methodobj, params, app)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/middlewared/main.py", line 911, in call_with_audit
    result = await self._call(method, serviceobj, methodobj, params, app=app,
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/middlewared/main.py", line 731, in _call
    return await self.run_in_executor(prepared_call.executor, methodobj, *prepared_call.args)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/middlewared/main.py", line 624, in run_in_executor
    return await loop.run_in_executor(pool, functools.partial(method, *args, **kwargs))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/middlewared/api/base/decorator.py", line 101, in wrapped
    result = func(*args)
             ^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/middlewared/plugins/apps/crud.py", line 81, in query
    version_details = self.middleware.call_sync(
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/middlewared/main.py", line 1041, in call_sync
    return methodobj(*prepared_call.args)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/middlewared/plugins/catalog/apps_details.py", line 175, in app_version_details
    return get_app_version_details(version_path, questions_context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/middlewared/plugins/catalog/apps_util.py", line 89, in get_app_version_details
    return minimum_scale_version_check_update(get_catalog_app_version_details(version_path, questions_context, {
                                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/catalog_reader/app.py", line 187, in get_app_version_details
    version_data['values'] = options['default_values_callable'](version_data)
                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/middlewared/plugins/catalog/apps_util.py", line 22, in get_app_default_values
    return construct_schema(version_details, {}, False)['new_values']
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/middlewared/plugins/apps/schema_utils.py", line 40, in construct_schema
    get_schema(q, False, old_values) for q in item_version_details['schema']['questions']
                                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
TypeError: 'NoneType' object is not subscriptable

Apps gone again. Totally at a loss.

Which version of TrueNAS? On my Goldeye, there is no schema_utils.py in the apps portion of the middleware. This sounds like an incomplete migration from Kubernetes to Docker, and you’re probably stuck with starting over.

Fangtooth 25.04.2.6, been running stable for a year or so. I joined on Fangtooth so AFAIK always been Docker, no Kubernetes.

What does /var/log/app_lifecycle.log show?

So, sequence of events since my last comment…

  • Updated to 25.10.5 - Goldeye in hopes that it may kick something into action. No luck.
  • Reinstalled a fresh copy of 25.10.5 - Goldeye from USB in hopes it might kick something into acton. Restored from config backup I made before install. No luck.
  • Created a new random app and restarted in hopes that may help at all. Again no luck.

/var/log/app_lifecycle.log unfortunately not present, assumedly due to fresh install, sorry. :confused:

Can you provide the output of midclt call app.query | jq?

Here, pasted below. I’ve semi-resigned myself to having to reinstall the apps and re-point them to the SSDpool so started with Booklore/Grimmory. Not going well if I’m honest lol.

Truenas_admin@Apollo[~]$ midclt call app.query | jq
[
  {
    "name": "grimmory",
    "id": "grimmory",
    "state": "RUNNING",
    "upgrade_available": false,
    "latest_version": "1.0.13",
    "image_updates_available": false,
    "custom_app": false,
    "migrated": false,
    "human_version": "v3.2.4_1.0.13",
    "version": "1.0.13",
    "metadata": {
      "app_version": "v3.2.4",
      "capabilities": [
        {
          "description": "Grimmory is able to change file ownership arbitrarily",
          "name": "CHOWN"
        },
        {
          "description": "Grimmory is able to bypass file permission checks",
          "name": "DAC_OVERRIDE"
        },
        {
          "description": "Grimmory is able to bypass permission checks for file operations",
          "name": "FOWNER"
        },
        {
          "description": "Grimmory is able to change group ID of processes",
          "name": "SETGID"
        },
        {
          "description": "Grimmory is able to change user ID of processes",
          "name": "SETUID"
        }
      ],
      "categories": [
        "media"
      ],
      "changelog_url": "https://github.com/grimmory-tools/grimmory/releases",
      "date_added": "2026-03-24",
      "description": "Grimmory is a self-hosted application for managing your entire book collection in one place. Organize, read, annotate, sync across devices, and share without relying on third-party services.",
      "home": "https://github.com/grimmory-tools/grimmory",
      "host_mounts": [],
      "icon": "https://media.sys.truenas.net/apps/grimmory/icons/icon.svg",
      "keywords": [
        "media",
        "ebooks"
      ],
      "last_update": "2026-07-01 13:13:50",
      "lib_version": "2.3.4",
      "lib_version_hash": "2e3a8847308fb2eb0da046018f287c73822c094b5950a10377c3235794ff1242",
      "maintainers": [
        {
          "email": "dev@truenas.com",
          "name": "truenas",
          "url": "https://www.truenas.com/"
        }
      ],
      "name": "grimmory",
      "run_as_context": [
        {
          "description": "Container [grimmory] runs as root user and group.",
          "gid": 0,
          "group_name": "Host group is [root]",
          "uid": 0,
          "user_name": "Host user is [root]"
        },
        {
          "description": "Container [mariadb] runs as non-root user and group.",
          "gid": 999,
          "group_name": "Host group is [docker]",
          "uid": 999,
          "user_name": "Host user is [netdata]"
        }
      ],
      "screenshots": [],
      "sources": [
        "https://apps.truenas.com/catalog/grimmory_community/",
        "https://github.com/grimmory-tools/grimmory"
      ],
      "title": "Grimmory",
      "train": "community",
      "version": "1.0.13"
    },
    "active_workloads": {
      "containers": 2,
      "used_ports": [],
      "used_host_ips": [],
      "container_details": [
        {
          "id": "2415eb4cb616b4343e3112adceee698c10de4696e051e30cc5990a3fee2c733e",
          "service_name": "grimmory",
          "image": "ghcr.io/grimmory-tools/grimmory:v3.2.4",
          "port_config": [],
          "state": "exited",
          "volume_mounts": [
            {
              "source": "/mnt/media/data/media/literature",
              "destination": "/books",
              "mode": "",
              "type": "bind"
            },
            {
              "source": "/mnt/SSDpool/appdata/booklore/data",
              "destination": "/app/data",
              "mode": "",
              "type": "bind"
            },
            {
              "source": "/mnt/SSDpool/appdata/booklore/bookdrop",
              "destination": "/bookdrop",
              "mode": "",
              "type": "bind"
            }
          ]
        },
        {
          "id": "e0b1037c92f2d20553189c27fc5e544e63ed601162c1050ec5c7b6f6b1364694",
          "service_name": "mariadb",
          "image": "mariadb:12.3.2",
          "port_config": [],
          "state": "running",
          "volume_mounts": [
            {
              "source": "/mnt/SSDpool/appdata/booklore/database",
              "destination": "/var/lib/mysql",
              "mode": "",
              "type": "bind"
            }
          ]
        }
      ],
      "volumes": [
        {
          "source": "/mnt/SSDpool/appdata/booklore/bookdrop",
          "destination": "/bookdrop",
          "mode": "",
          "type": "bind"
        },
        {
          "source": "/mnt/SSDpool/appdata/booklore/data",
          "destination": "/app/data",
          "mode": "",
          "type": "bind"
        },
        {
          "source": "/mnt/media/data/media/literature",
          "destination": "/books",
          "mode": "",
          "type": "bind"
        },
        {
          "source": "/mnt/SSDpool/appdata/booklore/database",
          "destination": "/var/lib/mysql",
          "mode": "",
          "type": "bind"
        }
      ],
      "images": [
        "ghcr.io/grimmory-tools/grimmory:v3.2.4",
        "mariadb:12.3.2"
      ],
      "networks": [
        {
          "Name": "ix-internal-grimmory-grimmory-net",
          "Id": "023800d9e2a26bfad69b45faebbfd0e52b0f4f8e58d790aaa8b9ae1101b3c013",
          "Labels": {
            "com.docker.compose.config-hash": "03bfac97ac9c4a7c3074f852bfa75e5f3e91777bd0751f06a68e08537b2180f3",
            "com.docker.compose.network": "ix-internal-grimmory-grimmory-net",
            "com.docker.compose.project": "ix-grimmory",
            "com.docker.compose.version": "2.38.1",
            "tn.network.internal": "true"
          },
          "Created": "2026-08-08T23:12:55.096646444+01:00",
          "Scope": "local",
          "Driver": "bridge",
          "EnableIPv4": true,
          "EnableIPv6": false,
          "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
              {
                "Subnet": "172.16.3.0/24",
                "Gateway": "172.16.3.1"
              }
            ]
          },
          "Internal": false,
          "Attachable": false,
          "Ingress": false,
          "ConfigFrom": {
            "Network": ""
          },
          "ConfigOnly": false,
          "Containers": {},
          "Options": {}
        }
      ]
    },
    "notes": "# Grimmory\n\n## Security\n\n**Read the following security precautions to ensure that you wish to continue using this application.**\n\n---\n\n### Container: [grimmory]\n\n#### Joined networks\n\n- ix-internal-grimmory-grimmory-net\n\n#### Running user/group(s)\n\n- User: unknown\n- Group: unknown\n- Supplementary Groups: apps\n\n---\n\n### Container: [mariadb]\n\n#### Joined networks\n\n- ix-internal-grimmory-grimmory-net\n\n#### Running user/group(s)\n\n- User: 999\n- Group: 999\n- Supplementary Groups: apps\n\n---\n\n## Bug Reports and Feature Requests\n\nIf you find a bug in this app or have an idea for a new feature, please file an issue at\nhttps://github.com/truenas/apps\n",
    "portals": {
      "Web UI": "http://0.0.0.0:30396/"
    }
  }
]
truenas_admin@Apollo[~]$

Ended up just reinstalling and linking everything from scratch.