frappe / frappe/pilot

bench setup fails, and Version mismatches on Ubuntu 24.4.4

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

Description

$ cat /etc/os-release
PRETTY_NAME="Ubuntu 24.04.4 LTS"
NAME="Ubuntu"
VERSION_ID="24.04"
VERSION="24.04.4 LTS (Noble Numbat)"
VERSION_CODENAME=noble
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=noble
LOGO=ubuntu-logo

$ python --version
Python 3.12.3

~/pilot/benches/bv-dev$ cat bench.toml
[bench]
name = "bv-dev"
python = "3.14"
http_port = 8000
socketio_port = 9000
socketio_backend = "node"
watch_apps_js = true
reload_python = true
watch_admin_js = false
db_type = "mariadb"
allow_developer_mode = false
--snip--

Why does it say python = "3.14" in this bench.toml? Where does this come from? Whatever the reason, it somehow looks like a version mismatch.

The README of this repo sais:

Requirements
Debian 12+, Ubuntu 22.04+, Fedora 40+, Arch Linux, or macOS with Homebrew for local development
Python 3.11+

Allowed for installation in the setup wizard on the admin interface available on port 7000 of the machine are only "version-16" and "develop".

The admin wizard is available via LAN as well as on the machine itself via SSH tunneling, e.g. using:
`C:\Users\Peer>ssh -L 7000:bv-dev:7000 peer@bv-dev`
on the local dev machine and then accessing the admin wizard on the url "localhost:7000" which is forwarded to the machine with the freshly installed pilot.

The installation of the new bench ("bv-dev") failed. It thankfully allowed me to go back and choose another option (e.g. "develop" instead of "version-16"), but the result was the same (roughly speaking), the wizard couldn't complete and there was no other version option to choose from to try.

Here is the protocol from the wizard's modal "details" window:

```STEP init,1787842787.467 Initialize bench
[1/12] Validate bench.toml...
[2/12] Ensure admin password...
[3/12] Ensure database credentials...
[4/12] Install system packages...
[5/12] Create bench directory structure...
[6/12] Create Python virtualenv...
Using CPython 3.14.6
Creating virtual environment at: env
Activate with: source env/bin/activate
[7/12] Clone and install framework app...
Cloning frappe...
Cloning into '/home/peer/pilot/benches/bv-dev/apps/frappe'...
Installing frappe...
Using Python 3.14.6 environment at: env
Resolved 130 packages in 390ms
Building frappe @ file:///home/peer/pilot/benches/bv-dev/apps/frappe
Built frappe @ file:///home/peer/pilot/benches/bv-dev/apps/frappe
Prepared 1 package in 83ms
Installed 130 packages in 94ms
+ annotated-types==0.8.0
+ asttokens==3.0.2
+ babel==2.16.0
+ beautifulsoup4==4.13.5
+ bleach-allowlist==1.0.3
+ brotli==1.2.0
+ cachetools==7.1.7
+ certifi==2026.7.22
+ cffi==2.1.1
+ chardet==5.2.0
+ charset-normalizer==3.5.1
+ click==8.4.2
+ croniter==6.0.0
+ cryptography==50.0.1
+ cssselect==1.5.0
+ cssselect2==0.9.0
+ cssutils==2.11.1
+ decorator==5.3.1
+ distro==1.9.0
+ docopt==0.6.2
+ duckdb==1.4.5
+ email-reply-parser==0.5.12
+ et-xmlfile==2.0.0
+ executing==2.2.1
+ filelock==3.20.4
+ filetype==1.2.0
+ fonttools==4.63.0
+ frappe==16.32.0 (from file:///home/peer/pilot/benches/bv-dev/apps/frappe)
+ gitdb==4.0.12
+ gitpython==3.1.60
+ google-api-core==2.34.0
+ google-api-python-client==2.188.0
+ google-auth==2.48.0
+ google-auth-httplib2==0.4.2
+ google-auth-oauthlib==1.2.4
+ googleapis-common-protos==1.75.2
+ gunicorn==23.0.0 (from git+https://github.com/frappe/gunicorn@54b59ca884c79dcf04d4882658a32bbaf17e999f)
+ hiredis==3.3.1
+ html5lib==1.1
+ httplib2==0.32.0
+ idna==3.19
+ ipython==8.37.0
+ jedi==0.20.0
+ jinja2==3.1.6
+ ldap3==2.9.1
+ lxml==6.1.2
+ markdown2==2.5.5
+ markdownify==1.2.3
+ markupsafe==3.0.3
+ matplotlib-inline==0.2.2
+ more-itertools==11.1.0
+ mysqlclient==2.2.7
+ nh3==0.3.7
+ num2words==0.5.14
+ oauthlib==3.3.1
+ openpyxl==3.1.5
+ orjson==3.11.9
+ packaging==26.3
+ parso==0.8.7
+ passlib==1.7.4
+ pdfkit==1.0.0
+ pexpect==4.9.0
+ phonenumbers==9.0.37
+ pillow==12.3.0
+ premailer==3.10.0
+ prompt-toolkit==3.0.53
+ proto-plus==1.28.4
+ protobuf==7.36.0
+ psutil==7.0.0
+ psycopg2-binary==2.9.12
+ ptyprocess==0.7.0
+ pure-eval==0.2.3
+ pyarrow==25.0.1
+ pyasn1==0.6.4
+ pyasn1-modules==0.4.2
+ pycountry==24.6.1
+ pycparser==3.0
+ pydantic==2.12.5
+ pydantic-core==2.41.5
+ pydyf==0.12.1
+ pygments==2.21.0
+ pyjwt==2.13.0
+ pymysql==1.1.2
+ pyopenssl==26.4.0
+ pyotp==2.9.0
+ pyparsing==3.3.2
+ pypdf==6.15.0
+ pyphen==0.18.1
+ pypika==0.48.9 (from git+https://github.com/frappe/pypika@2c50e6142b2d61d2d243e466fdd5dc03b3d918f2)
+ pyqrcode==1.2.1
+ python-dateutil==2.9.0.post0
+ pytz==2025.2
+ pyyaml==6.0.3
+ rauth==0.7.3
+ redis==7.1.1
+ requests==2.33.1
+ requests-oauthlib==2.0.0
+ restrictedpython==8.5
+ rq==2.6.1
+ rsa==4.9.1
+ semantic-version==2.10.0
+ sentry-sdk==1.45.1
+ six==1.17.0
+ smmap==5.0.3
+ soupsieve==2.9.2
+ sql-metadata==3.0.1
+ sqlglot==30.17.0
+ sqlparse==0.6.0
+ stack-data==0.6.3
+ tenacity==9.1.4
+ terminaltables==3.1.10
+ tinycss2==1.5.1
+ tinyhtml5==2.1.0
+ traceback-with-variables==2.2.1
+ traitlets==5.16.1
+ typing-extensions==4.16.0
+ typing-inspection==0.4.4
+ uritemplate==4.2.0
+ urllib3==2.7.0
+ vobject==0.9.9
+ wcwidth==0.8.2
+ weasyprint==68.0
+ webencodings==0.6.1
+ websockets==15.0.1
+ werkzeug==3.1.6
+ whoosh==2.7.4
+ xlrd==2.0.2
+ xlsxwriter==3.2.9
+ zopfli==0.4.3
+ zxcvbn==4.5.0
[8/12] Install Node.js...
[9/12] Install Node.js dependencies...
yarn install v1.22.22
[1/5] Validating package.json...
error frappe-framework@: The engine "node" is incompatible with this module. Expected version ">=24". Got "18.20.3"
error Found incompatible module.
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.

Error: Command '/home/peer/.nvm/versions/node/v18.20.3/bin/yarn' failed with exit code 1.

Rolling back changes...
Removing bench directories...

Rollback complete. bench.toml is preserved - fix the issue and run init again.
STEP-FAILED init,1787842796.011
Error: Command '/home/peer/.nvm/versions/node/v18.20.3/bin/yarn' failed with exit code 1.
Traceback (most recent call last):
File "", line 198, in _run_module_as_main
File "", line 88, in _run_code
File "/home/peer/pilot/pilot/tasks/wizard_setup.py", line 31, in
WizardSetupTask.main()
File "/home/peer/pilot/pilot/tasks/base.py", line 203, in main
run_task_main(cls)
File "/home/peer/pilot/pilot/internal/tasks/authoring.py", line 83, in run_task_main
run_task(task_from_args(cls, bench, bench_root, args))
File "/home/peer/pilot/pilot/internal/tasks/authoring.py", line 88, in run_task
task.run()
File "/home/peer/pilot/pilot/tasks/wizard_setup.py", line 16, in run
self.init()
File "/home/peer/pilot/pilot/tasks/base.py", line 48, in wrapper
return func(self, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/peer/pilot/pilot/tasks/wizard_setup.py", line 22, in init
self.bench.initialize(on_progress=self.report)
File "/home/peer/pilot/pilot/core/bench/__init__.py", line 388, in initialize
BenchInitializer(self).run(on_progress)
File "/home/peer/pilot/pilot/core/bench/initializer.py", line 22, in run
self._run_steps(on_progress)
File "/home/peer/pilot/pilot/core/bench/initializer.py", line 59, in _run_steps
action()
File "/home/peer/pilot/pilot/managers/environment.py", line 206, in install_node_dependencies
run_command(
File "/home/peer/pilot/pilot/utils.py", line 397, in run_command
_raise_on_failure(argv, process, stdout, stderr, stream_output, redactions)
File "/home/peer/pilot/pilot/utils.py", line 486, in _raise_on_failure
raise CommandError(
pilot.exceptions.CommandError: Command '/home/peer/.nvm/versions/node/v18.20.3/bin/yarn' failed with exit code 1.
```

In the open terminal window with the running pilot server there were other errors (related or not?), here is a snipped of it:

```INFO:werkzeug:::ffff:127.0.0.1 - - [27/Aug/2026 15:09:08] "GET /api/v1/health HTTP/1.1" 200 -
ERROR:root:Task worker cycle failed
Traceback (most recent call last):
File "/home/peer/pilot/pilot/internal/tasks/worker.py", line 71, in _work
self._work_once(pid)
File "/home/peer/pilot/pilot/internal/tasks/worker.py", line 88, in _work_once
if self._run_next(pid):
^^^^^^^^^^^^^^^^^^^
File "/home/peer/pilot/pilot/internal/tasks/worker.py", line 106, in _run_next
if not self._tasks.read_status(task_id).is_terminal:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/peer/pilot/pilot/internal/tasks/store.py", line 79, in read_status
task_dir = self._files.existing_task_dir(task_id)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/peer/pilot/pilot/internal/tasks/files.py", line 32, in existing_task_dir
raise TaskNotFoundError(f"Task not found: {task_id}")
pilot.exceptions.TaskNotFoundError: Task not found: 20260827-150901-dfd5be
Error on request:
Traceback (most recent call last):
File "/home/peer/pilot/.admin-venv/lib/python3.12/site-packages/werkzeug/serving.py", line 371, in run_wsgi
execute(self.server.app)
File "/home/peer/pilot/.admin-venv/lib/python3.12/site-packages/werkzeug/serving.py", line 334, in execute
for data in application_iter:
File "/home/peer/pilot/.admin-venv/lib/python3.12/site-packages/werkzeug/wsgi.py", line 270, in __next__
return self._next()
^^^^^^^^^^^^
File "/home/peer/pilot/.admin-venv/lib/python3.12/site-packages/werkzeug/wrappers/response.py", line 32, in _iter_encoded
for item in iterable:
File "/home/peer/pilot/.admin-venv/lib/python3.12/site-packages/flask/helpers.py", line 132, in generator
yield from gen
File "/home/peer/pilot/admin/backend/api/v1/tasks.py", line 166, in generate
for event in reader.stream_output(task_id):
File "/home/peer/pilot/pilot/managers/task/reader.py", line 159, in stream_output
task = self.read_task(task_id)
^^^^^^^^^^^^^^^^^^^^^^^
File "/home/peer/pilot/pilot/managers/task/reader.py", line 113, in read_task
task_dir = self._files.existing_task_dir(task_id)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/peer/pilot/pilot/internal/tasks/files.py", line 32, in existing_task_dir
raise TaskNotFoundError(f"Task not found: {task_id}")
pilot.exceptions.TaskNotFoundError: Task not found: 20260827-150901-dfd5be
ERROR:werkzeug:Error on request:
Traceback (most recent call last):
File "/home/peer/pilot/.admin-venv/lib/python3.12/site-packages/werkzeug/serving.py", line 371, in run_wsgi
execute(self.server.app)
File "/home/peer/pilot/.admin-venv/lib/python3.12/site-packages/werkzeug/serving.py", line 334, in execute
for data in application_iter:
File "/home/peer/pilot/.admin-venv/lib/python3.12/site-packages/werkzeug/wsgi.py", line 270, in __next__
return self._next()
^^^^^^^^^^^^
File "/home/peer/pilot/.admin-venv/lib/python3.12/site-packages/werkzeug/wrappers/response.py", line 32, in _iter_encoded
for item in iterable:
File "/home/peer/pilot/.admin-venv/lib/python3.12/site-packages/flask/helpers.py", line 132, in generator
yield from gen
File "/home/peer/pilot/admin/backend/api/v1/tasks.py", line 166, in generate
for event in reader.stream_output(task_id):
File "/home/peer/pilot/pilot/managers/task/reader.py", line 159, in stream_output
task = self.read_task(task_id)
^^^^^^^^^^^^^^^^^^^^^^^
File "/home/peer/pilot/pilot/managers/task/reader.py", line 113, in read_task
task_dir = self._files.existing_task_dir(task_id)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/peer/pilot/pilot/internal/tasks/files.py", line 32, in existing_task_dir
raise TaskNotFoundError(f"Task not found: {task_id}")
pilot.exceptions.TaskNotFoundError: Task not found: 20260827-150901-dfd5be
::ffff:192.168.20.206 - - [27/Aug/2026 15:09:10] "GET /api/v1/health HTTP/1.1" 200 -
INFO:werkzeug:::ffff:192.168.20.206 - - [27/Aug/2026 15:09:10] "GET /api/v1/health HTTP/1.1" 200 -
::ffff:127.0.0.1 - - [27/Aug/2026 15:09:11] "GET /api/v1/health HTTP/1.1" 200 -
INFO:werkzeug:::ffff:127.0.0.1 - - [27/Aug/2026 15:09:11] "GET /api/v1/health HTTP/1.1" 200 -
::ffff:127.0.0.1 - - [27/Aug/2026 15:09:12] "GET /api/v1/tasks/20260827-150901-dfd5be/events HTTP/1.1" 404 -
INFO:werkzeug:::ffff:127.0.0.1 - - [27/Aug/2026 15:09:12] "GET /api/v1/tasks/20260827-150901-dfd5be/events HTTP/1.1" 404 -
:
```

Contributor guide

No contributing guide indexed for this repository

Research direction

Reproduce the admin wizard setup using the shown bench.toml and start with pilot/core/bench/initializer.py and pilot/managers/environment.py, especially install_node_dependencies. Trace how Python 3.14 and Node.js 18 are selected, then compare them with the frappe package engine requirement. Also determine whether the TaskNotFoundError traces in pilot/internal/tasks are a consequence of rollback; done means the failure is explained and setup behavior is covered by tests.

Written by the indexing model from the issue text.

Assessment

Tech stack
mariadb, node.js, python, ubuntu
Domain
devops, infrastructure, tooling
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.