Docker ARM Build - Why Not?

Hey,

How hard could it possibly be to add one line of code to ship builds for ARM support in 2025? I read all of these posts about how you only have AMD builds, and that “it should be no problem to install taiga from source on ARM, that’s what we do for our SaaS”. You know your software inside-out, I don’t – it’s as simple as that. There are many, many reasons people prefer to use easily replicable solutions like docker for deployment nowadays that I’m not going to get into.

I followed the production taiga deployment guide to the letter, and get this error in the python step for backend, and like, what am I supposed to do with it?

ERROR: Exception:
Traceback (most recent call last):
File “/home/taiga/taiga-back/.venv/lib/python3.12/site-packages/pip/_internal/cli/base_command.py”, line 107, in _run_wrapper
status = _inner_run()
^^^^^^^^^^^^
File “/home/taiga/taiga-back/.venv/lib/python3.12/site-packages/pip/_internal/cli/base_command.py”, line 98, in _inner_run
return self.run(options, args)
^^^^^^^^^^^^^^^^^^^^^^^
File “/home/taiga/taiga-back/.venv/lib/python3.12/site-packages/pip/_internal/cli/req_command.py”, line 71, in wrapper
return func(self, options, args)
^^^^^^^^^^^^^^^^^^^^^^^^^
File “/home/taiga/taiga-back/.venv/lib/python3.12/site-packages/pip/_internal/commands/install.py”, line 393, in run
requirement_set = resolver.resolve(
^^^^^^^^^^^^^^^^^
File “/home/taiga/taiga-back/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py”, line 98, in resolve
result = self._result = resolver.resolve(
^^^^^^^^^^^^^^^^^
File “/home/taiga/taiga-back/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers/resolution.py”, line 596, in resolve
state = resolution.resolve(requirements, max_rounds=max_rounds)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/home/taiga/taiga-back/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers/resolution.py”, line 429, in resolve
self._add_to_criteria(self.state.criteria, r, parent=None)
File “/home/taiga/taiga-back/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers/resolution.py”, line 150, in _add_to_criteria
if not criterion.candidates:
^^^^^^^^^^^^^^^^^^^^
File “/home/taiga/taiga-back/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/structs.py”, line 194, in bool
return bool(self._sequence)
^^^^^^^^^^^^^^^^^^^^
File “/home/taiga/taiga-back/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py”, line 165, in bool
self._bool = any(self)
^^^^^^^^^
File “/home/taiga/taiga-back/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py”, line 149, in
return (c for c in iterator if id(c) not in self._incompatible_ids)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/home/taiga/taiga-back/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py”, line 39, in _iter_built
candidate = func()
^^^^^^
File “/home/taiga/taiga-back/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py”, line 180, in _make_candidate_from_link
base: BaseCandidate | None = self._make_base_candidate_from_link(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/home/taiga/taiga-back/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py”, line 226, in _make_base_candidate_from_link
self._link_candidate_cache[link] = LinkCandidate(
^^^^^^^^^^^^^^
File “/home/taiga/taiga-back/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py”, line 309, in init
super().init(
File “/home/taiga/taiga-back/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py”, line 162, in init
self.dist = self._prepare()
^^^^^^^^^^^^^^^
File “/home/taiga/taiga-back/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py”, line 239, in _prepare
dist = self._prepare_distribution()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/home/taiga/taiga-back/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py”, line 320, in _prepare_distribution
return preparer.prepare_linked_requirement(self._ireq, parallel_builds=True)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/home/taiga/taiga-back/.venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py”, line 537, in prepare_linked_requirement
return self._prepare_linked_requirement(req, parallel_builds)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/home/taiga/taiga-back/.venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py”, line 652, in _prepare_linked_requirement
dist = _get_prepared_distribution(
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/home/taiga/taiga-back/.venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py”, line 77, in _get_prepared_distribution
abstract_dist.prepare_distribution_metadata(
File “/home/taiga/taiga-back/.venv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py”, line 59, in prepare_distribution_metadata
self._install_build_reqs(build_env_installer)
File “/home/taiga/taiga-back/.venv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py”, line 133, in _install_build_reqs
build_reqs = self._get_build_requires_wheel()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/home/taiga/taiga-back/.venv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py”, line 108, in _get_build_requires_wheel
return backend.get_requires_for_build_wheel()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/home/taiga/taiga-back/.venv/lib/python3.12/site-packages/pip/_internal/utils/misc.py”, line 694, in get_requires_for_build_wheel
return super().get_requires_for_build_wheel(config_settings=cs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/home/taiga/taiga-back/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py”, line 196, in get_requires_for_build_wheel
return self._call_hook(
^^^^^^^^^^^^^^^^
File “/home/taiga/taiga-back/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py”, line 402, in _call_hook
raise BackendUnavailable(
pip._vendor.pyproject_hooks._impl.BackendUnavailable: Cannot import ‘setuptools.build_meta’