From 9782eeb60a435d35ded4123db24076c397b677e1 Mon Sep 17 00:00:00 2001 From: Davide Silvestri <75379892+silvestrid@users.noreply.github.com> Date: Thu, 12 Mar 2026 10:41:26 +0100 Subject: [PATCH 1/3] fix: Dockerfile home folder permissions bug after the upgrade from bookworm to trixie (#4958) --- backend/Dockerfile | 7 +++++-- ...using_an_error_trying_to_run_the_backend_and_fro.json | 9 +++++++++ web-frontend/Dockerfile | 7 +++++-- 3 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 changelog/entries/unreleased/bug/fix_a_bug_causing_an_error_trying_to_run_the_backend_and_fro.json diff --git a/backend/Dockerfile b/backend/Dockerfile index 4c21bbb4ac..5ef20f62f8 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -196,7 +196,8 @@ ENV DOCKER_USER=baserow_docker_user \ DJANGO_SETTINGS_MODULE='baserow.config.settings.test' RUN groupadd --system --gid $GID ${DOCKER_USER} && \ - useradd --shell /bin/bash -l -u $UID -g $GID -o -c "" -d /baserow -m ${DOCKER_USER} + useradd --shell /bin/bash -l -u $UID -g $GID -o -c "" -d /baserow -m ${DOCKER_USER} && \ + chmod 755 /baserow COPY --from=tool-builder /usr/local/bin/su-exec /usr/local/bin/su-exec COPY --from=tool-builder /usr/bin/tini /usr/bin/tini @@ -266,6 +267,7 @@ ENV DOCKER_USER=baserow_docker_user \ RUN getent group $GID || groupadd --system --gid $GID ${DOCKER_USER} && \ useradd --shell /bin/bash -l -u $UID -g $GID -o -c "" -d /baserow -m ${DOCKER_USER} && \ + chmod 755 /baserow && \ echo "${DOCKER_USER} ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/${DOCKER_USER} && \ chmod 0440 /etc/sudoers.d/${DOCKER_USER} @@ -350,7 +352,8 @@ RUN apt-get update && \ && apt-get clean && rm -rf /var/lib/apt/lists/* RUN groupadd --system --gid $GID ${DOCKER_USER} && \ - useradd --shell /bin/bash -l -u $UID -g $GID -o -c "" -d /baserow -m ${DOCKER_USER} + useradd --shell /bin/bash -l -u $UID -g $GID -o -c "" -d /baserow -m ${DOCKER_USER} && \ + chmod 755 /baserow # In slim docker images, mime.types is removed and we need it for mimetypes guessing COPY ./backend/docker/mime.types /etc/ diff --git a/changelog/entries/unreleased/bug/fix_a_bug_causing_an_error_trying_to_run_the_backend_and_fro.json b/changelog/entries/unreleased/bug/fix_a_bug_causing_an_error_trying_to_run_the_backend_and_fro.json new file mode 100644 index 0000000000..61fbab01c4 --- /dev/null +++ b/changelog/entries/unreleased/bug/fix_a_bug_causing_an_error_trying_to_run_the_backend_and_fro.json @@ -0,0 +1,9 @@ +{ + "type": "bug", + "message": "Fix a bug that caused an error when running the backend and frontend images as different users.", + "issue_origin": "github", + "issue_number": null, + "domain": "core", + "bullet_points": [], + "created_at": "2026-03-12" +} \ No newline at end of file diff --git a/web-frontend/Dockerfile b/web-frontend/Dockerfile index af9ad06b96..741a651c10 100644 --- a/web-frontend/Dockerfile +++ b/web-frontend/Dockerfile @@ -115,7 +115,8 @@ ENV DOCKER_USER=baserow_docker_user \ BASEROW_IMAGE_TYPE="web-frontend" RUN groupadd --system --gid $GID ${DOCKER_USER} && \ - useradd --shell /bin/bash -l -u $UID -g $GID -o -c "" -d /baserow -m ${DOCKER_USER} + useradd --shell /bin/bash -l -u $UID -g $GID -o -c "" -d /baserow -m ${DOCKER_USER} && \ + chmod 755 /baserow COPY --from=tool-builder /usr/local/bin/su-exec /usr/local/bin/su-exec COPY --from=tool-builder /usr/bin/tini /usr/bin/tini @@ -193,6 +194,7 @@ COPY --from=tool-builder /usr/bin/dos2unix /usr/local/bin/dos2unix RUN getent group $GID || groupadd --system --gid $GID ${DOCKER_USER} && \ useradd --shell /bin/bash -l -u $UID -g $GID -o -c "" -d /baserow -m ${DOCKER_USER} && \ + chmod 755 /baserow && \ echo "${DOCKER_USER} ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/${DOCKER_USER} && \ chmod 0440 /etc/sudoers.d/${DOCKER_USER} @@ -267,7 +269,8 @@ RUN apt-get update && apt-get upgrade -y --no-install-recommends \ RUN rm -rf /usr/local/lib/node_modules/npm /usr/local/bin/npm /usr/local/bin/npx RUN groupadd --system --gid $GID ${DOCKER_USER} && \ - useradd --shell /bin/bash -l -u $UID -g $GID -o -c "" -d /baserow -m ${DOCKER_USER} + useradd --shell /bin/bash -l -u $UID -g $GID -o -c "" -d /baserow -m ${DOCKER_USER} && \ + chmod 755 /baserow USER $UID:$GID RUN mkdir -p /baserow/web-frontend/docker From 7e4b9d3f2412444a88e46c5100d44ca91bccd05a Mon Sep 17 00:00:00 2001 From: dimmur-brw Date: Thu, 12 Mar 2026 13:49:37 +0100 Subject: [PATCH 2/3] chore(deps): Remove ollama package as dependancy (#4963) --- backend/pyproject.toml | 1 - .../generative_ai_model_types.py | 44 ++++++------------- backend/uv.lock | 17 ------- .../bug/4962_remove_ollama_dependency.json | 9 ++++ 4 files changed, 22 insertions(+), 49 deletions(-) create mode 100644 changelog/entries/unreleased/bug/4962_remove_ollama_dependency.json diff --git a/backend/pyproject.toml b/backend/pyproject.toml index 1faa4c1789..edae2d347b 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -86,7 +86,6 @@ dependencies = [ "tzdata==2025.3", "sentry-sdk==2.52.0", "typing_extensions>=4.14.1", - "ollama==0.6.1", "langchain==0.3.27", "langchain-openai==0.3.35", "openai==2.14.0", diff --git a/backend/src/baserow/core/generative_ai/generative_ai_model_types.py b/backend/src/baserow/core/generative_ai/generative_ai_model_types.py index c057445489..0d55f4e20a 100644 --- a/backend/src/baserow/core/generative_ai/generative_ai_model_types.py +++ b/backend/src/baserow/core/generative_ai/generative_ai_model_types.py @@ -330,7 +330,7 @@ def prompt( raise GenerativeAIPromptError(str(exc)) from exc -class OllamaGenerativeAIModelType(GenerativeAIModelType): +class OllamaGenerativeAIModelType(BaseOpenAIGenerativeAIModelType): type = "ollama" def get_host(self, workspace=None, settings_override=None): @@ -339,6 +339,16 @@ def get_host(self, workspace=None, settings_override=None): or settings.BASEROW_OLLAMA_HOST ) + def get_api_key(self, workspace=None, settings_override=None): + return "ollama" + + def get_organization(self, workspace=None, settings_override=None): + return None + + def get_base_url(self, workspace=None, settings_override=None): + host = self.get_host(workspace, settings_override) + return f"{host}/v1" + def get_enabled_models(self, workspace=None, settings_override=None): workspace_models = self.get_workspace_setting( workspace, "models", settings_override @@ -346,39 +356,11 @@ def get_enabled_models(self, workspace=None, settings_override=None): return workspace_models or settings.BASEROW_OLLAMA_MODELS def is_enabled(self, workspace=None, settings_override=None): - ollama_host = self.get_host(workspace, settings_override) - return bool(ollama_host) and bool( + host = self.get_host(workspace, settings_override) + return bool(host) and bool( self.get_enabled_models(workspace, settings_override) ) - def get_client(self, workspace=None, settings_override=None): - from ollama import Client as OllamaClient - - ollama_host = self.get_host(workspace, settings_override) - return OllamaClient(host=ollama_host) - - def prompt( - self, model, prompt, workspace=None, temperature=None, settings_override=None - ): - from ollama import RequestError as OllamaRequestError - from ollama import ResponseError as OllamaResponseError - - client = self.get_client(workspace, settings_override) - options = {} - if temperature: - # Because some LLMs can have a temperature of 2, this is the maximum by - # default. We're changing it to a maximum of 1 because Ollama only - # accepts 1. - options["temperature"] = min(temperature, 1) - try: - response = client.generate( - model=model, prompt=prompt, stream=False, options=options - ) - except (OllamaRequestError, OllamaResponseError) as exc: - raise GenerativeAIPromptError(str(exc)) from exc - - return response["response"] - def get_settings_serializer(self): from baserow.api.generative_ai.serializers import OllamaSettingsSerializer diff --git a/backend/uv.lock b/backend/uv.lock index 27a59ba34e..ea561625d4 100644 --- a/backend/uv.lock +++ b/backend/uv.lock @@ -227,7 +227,6 @@ dependencies = [ { name = "mcp", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "mistralai", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "netifaces", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "ollama", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "openai", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "openpyxl", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "opentelemetry-api", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -362,7 +361,6 @@ requires-dist = [ { name = "mcp", specifier = "==1.26.0" }, { name = "mistralai", specifier = "==1.1.0" }, { name = "netifaces", specifier = "==0.11.0" }, - { name = "ollama", specifier = "==0.6.1" }, { name = "openai", specifier = "==2.14.0" }, { name = "openpyxl", specifier = "==3.1.5" }, { name = "opentelemetry-api", specifier = "==1.39.1" }, @@ -1382,14 +1380,12 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d7/7c/f0a6d0ede2c7bf092d00bc83ad5bafb7e6ec9b4aab2fbdfa6f134dc73327/greenlet-3.3.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:60c2ef0f578afb3c8d92ea07ad327f9a062547137afe91f38408f08aacab667f", size = 275671, upload-time = "2025-12-04T14:23:05.267Z" }, { url = "https://files.pythonhosted.org/packages/44/06/dac639ae1a50f5969d82d2e3dd9767d30d6dbdbab0e1a54010c8fe90263c/greenlet-3.3.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a5d554d0712ba1de0a6c94c640f7aeba3f85b3a6e1f2899c11c2c0428da9365", size = 646360, upload-time = "2025-12-04T14:50:10.026Z" }, { url = "https://files.pythonhosted.org/packages/e0/94/0fb76fe6c5369fba9bf98529ada6f4c3a1adf19e406a47332245ef0eb357/greenlet-3.3.0-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3a898b1e9c5f7307ebbde4102908e6cbfcb9ea16284a3abe15cab996bee8b9b3", size = 658160, upload-time = "2025-12-04T14:57:45.41Z" }, - { url = "https://files.pythonhosted.org/packages/93/79/d2c70cae6e823fac36c3bbc9077962105052b7ef81db2f01ec3b9bf17e2b/greenlet-3.3.0-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:dcd2bdbd444ff340e8d6bdf54d2f206ccddbb3ccfdcd3c25bf4afaa7b8f0cf45", size = 671388, upload-time = "2025-12-04T15:07:15.789Z" }, { url = "https://files.pythonhosted.org/packages/b8/14/bab308fc2c1b5228c3224ec2bf928ce2e4d21d8046c161e44a2012b5203e/greenlet-3.3.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5773edda4dc00e173820722711d043799d3adb4f01731f40619e07ea2750b955", size = 660166, upload-time = "2025-12-04T14:26:05.099Z" }, { url = "https://files.pythonhosted.org/packages/4b/d2/91465d39164eaa0085177f61983d80ffe746c5a1860f009811d498e7259c/greenlet-3.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ac0549373982b36d5fd5d30beb8a7a33ee541ff98d2b502714a09f1169f31b55", size = 1615193, upload-time = "2025-12-04T15:04:27.041Z" }, { url = "https://files.pythonhosted.org/packages/42/1b/83d110a37044b92423084d52d5d5a3b3a73cafb51b547e6d7366ff62eff1/greenlet-3.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d198d2d977460358c3b3a4dc844f875d1adb33817f0613f663a656f463764ccc", size = 1683653, upload-time = "2025-12-04T14:27:32.366Z" }, { url = "https://files.pythonhosted.org/packages/a0/66/bd6317bc5932accf351fc19f177ffba53712a202f9df10587da8df257c7e/greenlet-3.3.0-cp314-cp314t-macosx_11_0_universal2.whl", hash = "sha256:d6ed6f85fae6cdfdb9ce04c9bf7a08d666cfcfb914e7d006f44f840b46741931", size = 282638, upload-time = "2025-12-04T14:25:20.941Z" }, { url = "https://files.pythonhosted.org/packages/30/cf/cc81cb030b40e738d6e69502ccbd0dd1bced0588e958f9e757945de24404/greenlet-3.3.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9125050fcf24554e69c4cacb086b87b3b55dc395a8b3ebe6487b045b2614388", size = 651145, upload-time = "2025-12-04T14:50:11.039Z" }, { url = "https://files.pythonhosted.org/packages/9c/ea/1020037b5ecfe95ca7df8d8549959baceb8186031da83d5ecceff8b08cd2/greenlet-3.3.0-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:87e63ccfa13c0a0f6234ed0add552af24cc67dd886731f2261e46e241608bee3", size = 654236, upload-time = "2025-12-04T14:57:47.007Z" }, - { url = "https://files.pythonhosted.org/packages/69/cc/1e4bae2e45ca2fa55299f4e85854606a78ecc37fead20d69322f96000504/greenlet-3.3.0-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2662433acbca297c9153a4023fe2161c8dcfdcc91f10433171cf7e7d94ba2221", size = 662506, upload-time = "2025-12-04T15:07:16.906Z" }, { url = "https://files.pythonhosted.org/packages/57/b9/f8025d71a6085c441a7eaff0fd928bbb275a6633773667023d19179fe815/greenlet-3.3.0-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3c6e9b9c1527a78520357de498b0e709fb9e2f49c3a513afd5a249007261911b", size = 653783, upload-time = "2025-12-04T14:26:06.225Z" }, { url = "https://files.pythonhosted.org/packages/f6/c7/876a8c7a7485d5d6b5c6821201d542ef28be645aa024cfe1145b35c120c1/greenlet-3.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:286d093f95ec98fdd92fcb955003b8a3d054b4e2cab3e2707a5039e7b50520fd", size = 1614857, upload-time = "2025-12-04T15:04:28.484Z" }, { url = "https://files.pythonhosted.org/packages/4f/dc/041be1dff9f23dac5f48a43323cd0789cb798342011c19a248d9c9335536/greenlet-3.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c10513330af5b8ae16f023e8ddbfb486ab355d04467c4679c5cfe4659975dd9", size = 1676034, upload-time = "2025-12-04T14:27:33.531Z" }, @@ -2166,19 +2162,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/be/9c/92789c596b8df838baa98fa71844d84283302f7604ed565dafe5a6b5041a/oauthlib-3.3.1-py3-none-any.whl", hash = "sha256:88119c938d2b8fb88561af5f6ee0eec8cc8d552b7bb1f712743136eb7523b7a1", size = 160065, upload-time = "2025-06-19T22:48:06.508Z" }, ] -[[package]] -name = "ollama" -version = "0.6.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "httpx", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "pydantic", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/9d/5a/652dac4b7affc2b37b95386f8ae78f22808af09d720689e3d7a86b6ed98e/ollama-0.6.1.tar.gz", hash = "sha256:478c67546836430034b415ed64fa890fd3d1ff91781a9d548b3325274e69d7c6", size = 51620, upload-time = "2025-11-13T23:02:17.416Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/47/4f/4a617ee93d8208d2bcf26b2d8b9402ceaed03e3853c754940e2290fed063/ollama-0.6.1-py3-none-any.whl", hash = "sha256:fc4c984b345735c5486faeee67d8a265214a31cbb828167782dc642ce0a2bf8c", size = 14354, upload-time = "2025-11-13T23:02:16.292Z" }, -] - [[package]] name = "openai" version = "2.14.0" diff --git a/changelog/entries/unreleased/bug/4962_remove_ollama_dependency.json b/changelog/entries/unreleased/bug/4962_remove_ollama_dependency.json new file mode 100644 index 0000000000..fdff431022 --- /dev/null +++ b/changelog/entries/unreleased/bug/4962_remove_ollama_dependency.json @@ -0,0 +1,9 @@ +{ + "type": "bug", + "message": "Remove ollama dependency", + "issue_origin": "github", + "issue_number": 4962, + "domain": "database", + "bullet_points": [], + "created_at": "2026-03-12" +} \ No newline at end of file From c639c99a0f50eda039fba38fb3aaa8b3aef203e7 Mon Sep 17 00:00:00 2001 From: dimmur-brw Date: Thu, 12 Mar 2026 14:10:59 +0100 Subject: [PATCH 3/3] chore (deps): update langchain to 0.3.28 (#4966) --- backend/pyproject.toml | 2 +- backend/uv.lock | 8 ++++---- .../refactor/4965_update_langchain_to_0328.json | 9 +++++++++ 3 files changed, 14 insertions(+), 5 deletions(-) create mode 100644 changelog/entries/unreleased/refactor/4965_update_langchain_to_0328.json diff --git a/backend/pyproject.toml b/backend/pyproject.toml index edae2d347b..2b4f0d62da 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -86,7 +86,7 @@ dependencies = [ "tzdata==2025.3", "sentry-sdk==2.52.0", "typing_extensions>=4.14.1", - "langchain==0.3.27", + "langchain==0.3.28", "langchain-openai==0.3.35", "openai==2.14.0", "anthropic==0.77.0", diff --git a/backend/uv.lock b/backend/uv.lock index ea561625d4..4a3a91d29f 100644 --- a/backend/uv.lock +++ b/backend/uv.lock @@ -355,7 +355,7 @@ requires-dist = [ { name = "icalendar", specifier = "==6.3.2" }, { name = "itsdangerous", specifier = "==2.2.0" }, { name = "jira2markdown", specifier = "==0.5" }, - { name = "langchain", specifier = "==0.3.27" }, + { name = "langchain", specifier = "==0.3.28" }, { name = "langchain-openai", specifier = "==0.3.35" }, { name = "loguru", specifier = "==0.7.3" }, { name = "mcp", specifier = "==1.26.0" }, @@ -1787,7 +1787,7 @@ redis = [ [[package]] name = "langchain" -version = "0.3.27" +version = "0.3.28" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -1798,9 +1798,9 @@ dependencies = [ { name = "requests", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "sqlalchemy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/83/f6/f4f7f3a56626fe07e2bb330feb61254dbdf06c506e6b59a536a337da51cf/langchain-0.3.27.tar.gz", hash = "sha256:aa6f1e6274ff055d0fd36254176770f356ed0a8994297d1df47df341953cec62", size = 10233809, upload-time = "2025-07-24T14:42:32.959Z" } +sdist = { url = "https://files.pythonhosted.org/packages/87/bb/a65e29c8e4aaf0348c2617962e427c8e760d82a67adbd197019e49c7769d/langchain-0.3.28.tar.gz", hash = "sha256:30a32f44cc6690bcc6a6fb7c14d61a15406d5eda1a0e7eab60b3660944888741", size = 10242473, upload-time = "2026-03-06T22:45:17.911Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f6/d5/4861816a95b2f6993f1360cfb605aacb015506ee2090433a71de9cca8477/langchain-0.3.27-py3-none-any.whl", hash = "sha256:7b20c4f338826acb148d885b20a73a16e410ede9ee4f19bb02011852d5f98798", size = 1018194, upload-time = "2025-07-24T14:42:30.23Z" }, + { url = "https://files.pythonhosted.org/packages/5b/f5/ecd71e5b78e67944b2600a155ef63000bc00148e6794e8e7809b2453887a/langchain-0.3.28-py3-none-any.whl", hash = "sha256:1ba1244477b67b812b775f346209fa596e78bf055a34e45ce22acb7a45842a32", size = 1024717, upload-time = "2026-03-06T22:45:15.545Z" }, ] [[package]] diff --git a/changelog/entries/unreleased/refactor/4965_update_langchain_to_0328.json b/changelog/entries/unreleased/refactor/4965_update_langchain_to_0328.json new file mode 100644 index 0000000000..9f659f12b9 --- /dev/null +++ b/changelog/entries/unreleased/refactor/4965_update_langchain_to_0328.json @@ -0,0 +1,9 @@ +{ + "type": "refactor", + "message": "Update langchain to 0.3.28", + "issue_origin": "github", + "issue_number": 4965, + "domain": "database", + "bullet_points": [], + "created_at": "2026-03-12" +} \ No newline at end of file