frappe / frappe/pilot

Restore fail

Open
#437 4 comments 1 reaction 0 assignees View on GitHub
Dominant language
Python
Stars
101
Forks
61
Avg merge
2d 12h
Merged PRs (30d)
41

Description

Trying to restore a v15 erpnext into a new bench with v16 apps, set up with pilot:

The old bench lives in docker and has these apps:
ERPNext: v15.43.1
Frappe Framework: v15.48.0
Raven: v1.7.1

The new bench has these apps:
Frappe 16.32.0
ERPNext 16.30.0
Wiki 3.0.0
Blog 0.0.1
Builder 1.32.0
Ecommerce Integrations 1.17.0
ERPNext Shipping 16.0.0
Gameplan 0.0.1
Offsite Backups 0.0.1
Raven 2.8.12

The restore went through like this:
```
$ pilot frappe --site bv-dev restore 20260831_132441-bv-erpnext-database.sql.gz --with-public-files 20260831_132441-bv-erpnext-files.tar --with-private-files 20260831_132441-bv-erpnext-private-files.tar
File 20260831_132441-bv-erpnext-database.sql.gz not found. Trying to check in alternative directories.
File /home/peer/pilot/benches/bv-dev/20260831_132441-bv-erpnext-database.sql.gz found.
Enter mysql super user [root]:
MySQL root password:
App frappe already installed
bv-dev: SystemSettings.enable_scheduler is UNSET
*** Scheduler is disabled ***
Site bv-dev has been restored with files

```
which looks like a success.

But then accessing the bench fails with this error:
```Traceback (most recent call last):
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/utils/caching.py", line 65, in wrapper
return _cache[func][args_key]
~~~~~~~~~~~~^^^^^^^^^^
KeyError: ()

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/website/serve.py", line 20, in get_response
return renderer_instance.render()
~~~~~~~~~~~~~~~~~~~~~~~~^^
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/website/page_renderers/template_page.py", line 84, in render
html = self.get_html()
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/website/utils.py", line 545, in cache_html_decorator
html = func(*args, **kwargs)
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/website/page_renderers/template_page.py", line 92, in get_html
self.init_context()
~~~~~~~~~~~~~~~~~^^
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/website/page_renderers/base_template_page.py", line 15, in init_context
self.context.update(get_website_settings())
~~~~~~~~~~~~~~~~~~~~^^
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/website/doctype/website_settings/website_settings.py", line 263, in get_website_settings
context.boot = get_boot_data()
~~~~~~~~~~~~~^^
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/website/utils.py", line 178, in get_boot_data
apps = get_apps()
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/utils/typing_validations.py", line 36, in wrapper
return func(*args, **kwargs)
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/utils/caching.py", line 71, in wrapper
return_val = func(*args, **kwargs)
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/apps.py", line 26, in get_apps
app not in get_setup_wizard_completed_apps()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/core/doctype/installed_applications/installed_applications.py", line 159, in get_setup_wizard_completed_apps
return [a.app_name for a in apps.installed_applications if a.has_setup_wizard and a.is_setup_complete]
^^^^^^^^^^^^^^^^^^
AttributeError: 'InstalledApplication' object has no attribute 'has_setup_wizard'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/utils/caching.py", line 65, in wrapper
return _cache[func][args_key]
~~~~~~~~~~~~^^^^^^^^^^
KeyError: ()

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/app.py", line 139, in application
response = get_response()
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/website/serve.py", line 23, in get_response
return handle_exception(e, endpoint, path, http_status_code)
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/permissions.py", line 938, in wrapper
return fn(e, *args, **kwargs)
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/website/serve.py", line 37, in handle_exception
return ErrorPage(exception=e).render()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/website/page_renderers/template_page.py", line 84, in render
html = self.get_html()
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/website/utils.py", line 545, in cache_html_decorator
html = func(*args, **kwargs)
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/website/page_renderers/template_page.py", line 92, in get_html
self.init_context()
~~~~~~~~~~~~~~~~~^^
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/website/page_renderers/error_page.py", line 17, in init_context
super().init_context()
~~~~~~~~~~~~~~~~~~~~^^
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/website/page_renderers/base_template_page.py", line 15, in init_context
self.context.update(get_website_settings())
~~~~~~~~~~~~~~~~~~~~^^
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/website/doctype/website_settings/website_settings.py", line 263, in get_website_settings
context.boot = get_boot_data()
~~~~~~~~~~~~~^^
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/website/utils.py", line 178, in get_boot_data
apps = get_apps()
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/utils/typing_validations.py", line 36, in wrapper
return func(*args, **kwargs)
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/utils/caching.py", line 71, in wrapper
return_val = func(*args, **kwargs)
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/apps.py", line 26, in get_apps
app not in get_setup_wizard_completed_apps()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/core/doctype/installed_applications/installed_applications.py", line 159, in get_setup_wizard_completed_apps
return [a.app_name for a in apps.installed_applications if a.has_setup_wizard and a.is_setup_complete]
^^^^^^^^^^^^^^^^^^
AttributeError: 'InstalledApplication' object has no attribute 'has_setup_wizard'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/utils/caching.py", line 65, in wrapper
return _cache[func][args_key]
~~~~~~~~~~~~^^^^^^^^^^
KeyError: ()

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/middlewares.py", line 31, in __call__
return super().__call__(environ, patch_start_response)
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/peer/pilot/benches/bv-dev/env/lib/python3.14/site-packages/werkzeug/middleware/shared_data.py", line 250, in __call__
return self.app(environ, start_response)
~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/peer/pilot/benches/bv-dev/env/lib/python3.14/site-packages/werkzeug/middleware/shared_data.py", line 250, in __call__
return self.app(environ, start_response)
~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/app.py", line 84, in application
app(environ, start_response),
~~~^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/peer/pilot/benches/bv-dev/env/lib/python3.14/site-packages/werkzeug/wrappers/request.py", line 193, in application
resp = f(*args[:-2] + (request,))
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/app.py", line 145, in application
response = e.get_response(request.environ) if isinstance(e, HTTPException) else handle_exception(e)
~~~~~~~~~~~~~~~~^^^
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/permissions.py", line 938, in wrapper
return fn(e, *args, **kwargs)
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/app.py", line 405, in handle_exception
).render()
~~~~~~^^
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/website/page_renderers/template_page.py", line 84, in render
html = self.get_html()
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/website/utils.py", line 545, in cache_html_decorator
html = func(*args, **kwargs)
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/website/page_renderers/template_page.py", line 92, in get_html
self.init_context()
~~~~~~~~~~~~~~~~~^^
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/website/page_renderers/error_page.py", line 17, in init_context
super().init_context()
~~~~~~~~~~~~~~~~~~~~^^
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/website/page_renderers/base_template_page.py", line 15, in init_context
self.context.update(get_website_settings())
~~~~~~~~~~~~~~~~~~~~^^
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/website/doctype/website_settings/website_settings.py", line 263, in get_website_settings
context.boot = get_boot_data()
~~~~~~~~~~~~~^^
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/website/utils.py", line 178, in get_boot_data
apps = get_apps()
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/utils/typing_validations.py", line 36, in wrapper
return func(*args, **kwargs)
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/utils/caching.py", line 71, in wrapper
return_val = func(*args, **kwargs)
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/apps.py", line 26, in get_apps
app not in get_setup_wizard_completed_apps()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
File "/home/peer/pilot/benches/bv-dev/apps/frappe/frappe/core/doctype/installed_applications/installed_applications.py", line 159, in get_setup_wizard_completed_apps
return [a.app_name for a in apps.installed_applications if a.has_setup_wizard and a.is_setup_complete]
^^^^^^^^^^^^^^^^^^
AttributeError: 'InstalledApplication' object has no attribute 'has_setup_wizard'
```

Which might be related to:
https://discuss.frappe.io/t/missing-column-in-installed-application-table-after-backup-restore/149180/2
mentioning the "has_setup_wizard column is not present in the tabInstalled Application" issue and refering to:
https://github.com/frappe/frappe/pull/33161
as a possible pointer to solve it.

Is a restore from a v15 backup not possible? Or only from a specific version range? Can this be solved manualle (e.g. by simply altering the table manually to add said column)?

Contributor guide

No contributing guide indexed for this repository

Research direction

Start with the restore command output and the failure in apps/frappe/frappe/core/doctype/installed_applications/installed_applications.py, especially get_setup_wizard_completed_apps. Compare the missing has_setup_wizard field with the linked Frappe PR #33161 and the referenced discussion. Done means establishing whether v15 backups are supported on v16 and identifying a verified restore or migration path.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
backend, database
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Needs clarification
Newbie friendliness
42/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.