Jellyfin migration failed during upgrade to electric eel

Jellyfin failed to migrate after upgrading from 24.04.2.5 to 24.10.2.1. It looks like it didn’t like one of my mount points surrounded by escaped single quotes to account for a space in the path.

raise RenderError(f"Path [{path}] must start with /")\nbase_v2_1_16.error.RenderError: Path [\'/mnt/Music Videos\'] must start with /\n

What should I do now?

Full app_migrations.log below

[2025/04/28 17:26:10] (DEBUG) app_migrations.migrate():250 - Migration details for 'system-update--2025-04-29_00:23:39' backup on 'AppPool' pool
[2025/04/28 17:26:10] (DEBUG) app_migrations.migrate():256 - 'jellyfin' app failed to migrate successfully: 'Failed to create app: [EFAULT] Failed to render compose templates: Traceback (most recent call last):\n  File "/usr/bin/apps_render_app", line 33, in <module>\n    sys.exit(load_entry_point(\'apps-validation==0.1\', \'console_scripts\', \'apps_render_app\')())\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/usr/lib/python3/dist-packages/catalog_templating/scripts/render_compose.py", line 47, in main\n    render_templates_from_path(args.path, args.values)\n  File "/usr/lib/python3/dist-packages/catalog_templating/scripts/render_compose.py", line 19, in render_templates_from_path\n    rendered_data = render_templates(\n                    ^^^^^^^^^^^^^^^^^\n  File "/usr/lib/python3/dist-packages/catalog_templating/render.py", line 36, in render_templates\n    ).render({\'ix_lib\': template_libs, \'values\': test_values})\n      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/usr/lib/python3/dist-packages/jinja2/environment.py", line 1301, in render\n    self.environment.handle_exception()\n  File "/usr/lib/python3/dist-packages/jinja2/environment.py", line 936, in handle_exception\n    raise rewrite_traceback_stack(source=source)\n  File "/mnt/.ix-apps/app_configs/jellyfin/versions/1.1.24/templates/docker-compose.yaml", line 39, in top-level template code\n    {% do c1.add_storage(store.mount_path, store) %}\n  ^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/mnt/.ix-apps/app_configs/jellyfin/versions/1.1.24/templates/library/base_v2_1_16/container.py", line 279, in add_storage\n    self._storage.add(mount_path, config)\n  File "/mnt/.ix-apps/app_configs/jellyfin/versions/1.1.24/templates/library/base_v2_1_16/storage.py", line 91, in add\n    mount_path = valid_fs_path_or_raise(mount_path)\n                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/mnt/.ix-apps/app_configs/jellyfin/versions/1.1.24/templates/library/base_v2_1_16/validations.py", line 204, in valid_fs_path_or_raise\n    path = _valid_path_or_raise(path)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/mnt/.ix-apps/app_configs/jellyfin/versions/1.1.24/templates/library/base_v2_1_16/validations.py", line 234, in _valid_path_or_raise\n    raise RenderError(f"Path [{path}] must start with /")\nbase_v2_1_16.error.RenderError: Path [\'/mnt/Music Videos\'] must start with /\n'
[2025/04/28 17:26:10] (DEBUG) app_migrations.migrate():253 - 'plex' app migrated successfully

I updated the log above with pre-formatted text to see the issue.

I downgraded to Dragonfish-24.04.2.5 , removed the single quotes, and replaced the space with an underscore in the mount path under the Jellyfin storage configuration. Can I just boot back to Electric Eel-24.10.2.1 and re-run the migration?

I rebooted to Electric Eel-24.10.2.1 and attempted to re-run the migration

midclt call -job k8s_to_docker.migrate

However, the migration failed with the same error as above. It looks like the migration is trying to use the old configuration with the old path containing the space. The new storage configuration replaced the space with an underscore.

How do I re-run the migration with the new jellyfin configuration?

In addition, I found that re-running the k8s_to_docker.migrate migration script also reverted the configuration back to the old one after booting back to Dragonfish. I had to redo the config change that I previously did in Dragonfish to fix the mount path name. The config is preserved when booting back and forth between Dragonfish and Electric Eel without running the migration script. It seems clear that the k8s_to_docker.migrate migration script is not picking up new config changes and reverting any changes since it was originally run.

After making your config changes in DF, you should be able to create a new k8s backup with midclt call -job kubernetes.backup_chart_releases 'test' and then, after upgrading back to EE, run midclt call -job k8s_to_docker.migrate '{"backup_name": "test"}'.

While running DF, I created a new k8s backup called “ee_backup” .

$ midclt call -job kubernetes.backup_chart_releases "ee_backup"
Status: Backup 'ee_backup' complete
Total Progress: [########################################] 100.00%
ee_backup

I then rebooted into EE and attempted to perform the migration with the backup. However , I ran into the following error:

$ midclt call -job k8s_to_docker.migrate '{"backup_name": "ee_backup"}'
Status: (none)
Total Progress: [________________________________________] 0.00%
[EINVAL] kubernetes_pool: Not a string

Can I just reboot into EE or do I need to blow away the current EE boot environment and re-run the upgrade to EE?

Do I need to also pass in the poolname as a parameter?

I found a job that will list the available backups in the middleware git repo.

midclt call -job k8s_to_docker.list_backups AppPool

It shows that my backup exists. Here’s a snippet of the output

{"error": null, "backups": {"ee_backup": {"name": "ee_backup", "releases":

I figured out from the source code that the poolname needs to go first

midclt call -job k8s_to_docker.migrate AppPool '{"backup_name": "ee_backup"}'

Success! Jellyfin is fully migrated.

To completely close this issue, I recommend adding documentation to the release notes on how to backup kubernetes before re-running the migration job.

To make a backup:

midclt call -job kubernetes.backup_chart_releases "backup"

To show backups:

midclt call -job k8s_to_docker.list_backups poolname

To migrate from backup:

midclt call -job k8s_to_docker.migrate poolname '{"backup_name": "backup"}'
1 Like