From b23dd31994cd91f783347c4d7b6b4a09cb64809f Mon Sep 17 00:00:00 2001 From: Alexander Sieg Date: Mon, 27 Apr 2026 10:22:51 +0200 Subject: [PATCH 1/5] odoo17: fix longpoll server start --- pkgs/by-name/od/odoo17/package.nix | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pkgs/by-name/od/odoo17/package.nix b/pkgs/by-name/od/odoo17/package.nix index 74358118c520..8befd6786dbc 100644 --- a/pkgs/by-name/od/odoo17/package.nix +++ b/pkgs/by-name/od/odoo17/package.nix @@ -55,6 +55,13 @@ python.pkgs.buildPythonApplication rec { }" ]; + postPatch = '' + # hardcode the location of the unwrapped python scrip, otherwise the websocket + # server (called longpoll in codebase) will fail to start. + substituteInPlace odoo/service/server.py \ + --replace-fail 'sys.argv[0]' "'${placeholder "out"}/bin/.odoo-wrapped'" + ''; + build-system = with python.pkgs; [ setuptools ]; From e926a193afb32ab29ca70e0680e9047a77da3a60 Mon Sep 17 00:00:00 2001 From: Alexander Sieg Date: Mon, 27 Apr 2026 10:22:51 +0200 Subject: [PATCH 2/5] odoo18: fix longpoll server start --- pkgs/by-name/od/odoo18/package.nix | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pkgs/by-name/od/odoo18/package.nix b/pkgs/by-name/od/odoo18/package.nix index 239e06fd092c..40a0449d4d83 100644 --- a/pkgs/by-name/od/odoo18/package.nix +++ b/pkgs/by-name/od/odoo18/package.nix @@ -26,6 +26,13 @@ python.pkgs.buildPythonApplication rec { hash = "sha256-rNG0He+51DnRT5g1SovGZ9uiE1HWXtcmAybcadBMjY4="; # odoo }; + postPatch = '' + # hardcode the location of the unwrapped python scrip, otherwise the websocket + # server (called longpoll in codebase) will fail to start. + substituteInPlace odoo/service/server.py \ + --replace-fail 'sys.argv[0]' "'${placeholder "out"}/bin/.odoo-wrapped'" + ''; + makeWrapperArgs = [ "--prefix PATH : ${ lib.makeBinPath [ From d6f5f08713afd5c20bd120c2288e78f27913bd70 Mon Sep 17 00:00:00 2001 From: Alexander Sieg Date: Mon, 27 Apr 2026 10:22:51 +0200 Subject: [PATCH 3/5] odoo19: fix longpoll server start --- pkgs/by-name/od/odoo19/package.nix | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pkgs/by-name/od/odoo19/package.nix b/pkgs/by-name/od/odoo19/package.nix index c6a9f9c110e6..862a47b0bbc0 100644 --- a/pkgs/by-name/od/odoo19/package.nix +++ b/pkgs/by-name/od/odoo19/package.nix @@ -26,6 +26,13 @@ python.pkgs.buildPythonApplication rec { hash = "sha256-JsbJ39zPZm4eyRTXkvdCMHwYaA08yUxZXcLglRn3kWs="; # odoo }; + postPatch = '' + # hardcode the location of the unwrapped python scrip, otherwise the websocket + # server (called longpoll in codebase) will fail to start. + substituteInPlace odoo/service/server.py \ + --replace-fail 'sys.argv[0]' "'${placeholder "out"}/bin/.odoo-wrapped'" + ''; + makeWrapperArgs = [ "--prefix PATH : ${ lib.makeBinPath [ From 6d72b67f3e363471f2e670ec3d9599f412654792 Mon Sep 17 00:00:00 2001 From: Alexander Sieg Date: Mon, 27 Apr 2026 10:22:51 +0200 Subject: [PATCH 4/5] nixos/odoo: add workers option to settings --- nixos/modules/services/finance/odoo.nix | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/nixos/modules/services/finance/odoo.nix b/nixos/modules/services/finance/odoo.nix index 422ca7240a85..6165e521bda7 100644 --- a/nixos/modules/services/finance/odoo.nix +++ b/nixos/modules/services/finance/odoo.nix @@ -46,7 +46,24 @@ in }; settings = lib.mkOption { - type = format.type; + type = lib.types.submodule { + options = { + options = { + workers = lib.mkOption { + type = lib.types.ints.unsigned; + default = 0; + description = "Values above 0 will enable the multi-processing HTTP server, this should be set for production setups. This needs to be set to >0 for real-time connections in the discuss app. For configuration recommendations see "; + }; + proxy_mode = lib.mkOption { + type = lib.types.bool; + default = cfg.domain != null; + defaultText = "services.odoo.domain != null"; + description = "Enables the use of X-Forwarded-* headers through Werkzeug’s proxy support. Must be enabled if reverse proxy is used."; + }; + }; + }; + freeformType = format.type; + }; default = { }; description = '' Odoo configuration settings. For more details see @@ -96,7 +113,7 @@ in ''; locations = { - "/longpolling" = { + "/websocket" = { proxyPass = "http://odoochat"; }; @@ -127,7 +144,6 @@ in ); settings.options = { data_dir = "/var/lib/private/odoo/data"; - proxy_mode = cfg.domain != null; # Disable the database manager by default # https://www.odoo.com/documentation/master/administration/on_premise/deploy.html#database-manager-security list_db = lib.mkDefault false; From 98a3cc1471182af269d86d762167c085e294817c Mon Sep 17 00:00:00 2001 From: Alexander Sieg Date: Mon, 27 Apr 2026 10:22:51 +0200 Subject: [PATCH 5/5] nixosTests/odoo: add new multi-process test --- nixos/tests/all-tests.nix | 18 +++++++-- nixos/tests/odoo/multi-process.nix | 39 +++++++++++++++++++ .../{odoo.nix => odoo/single-process.nix} | 7 +++- pkgs/by-name/od/odoo17/package.nix | 2 +- pkgs/by-name/od/odoo18/package.nix | 2 +- pkgs/by-name/od/odoo19/package.nix | 2 +- 6 files changed, 62 insertions(+), 8 deletions(-) create mode 100644 nixos/tests/odoo/multi-process.nix rename nixos/tests/{odoo.nix => odoo/single-process.nix} (86%) diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix index d167ec0c90a5..7f48a36f8915 100644 --- a/nixos/tests/all-tests.nix +++ b/nixos/tests/all-tests.nix @@ -1168,15 +1168,27 @@ in octoprint = runTest ./octoprint.nix; oddjobd = handleTestOn [ "x86_64-linux" "aarch64-linux" ] ./oddjobd.nix { }; odoo17 = runTest { - imports = [ ./odoo.nix ]; + imports = [ ./odoo/single-process.nix ]; + _module.args.package = pkgs.odoo17; + }; + odoo17-multiprocess = runTest { + imports = [ ./odoo/multi-process.nix ]; _module.args.package = pkgs.odoo17; }; odoo18 = runTest { - imports = [ ./odoo.nix ]; + imports = [ ./odoo/single-process.nix ]; + _module.args.package = pkgs.odoo18; + }; + odoo18-multiprocess = runTest { + imports = [ ./odoo/multi-process.nix ]; _module.args.package = pkgs.odoo18; }; odoo19 = runTest { - imports = [ ./odoo.nix ]; + imports = [ ./odoo/single-process.nix ]; + _module.args.package = pkgs.odoo19; + }; + odoo19-multiprocess = runTest { + imports = [ ./odoo/multi-process.nix ]; _module.args.package = pkgs.odoo19; }; oh-my-zsh = runTest ./oh-my-zsh.nix; diff --git a/nixos/tests/odoo/multi-process.nix b/nixos/tests/odoo/multi-process.nix new file mode 100644 index 000000000000..f73a37a5c9a6 --- /dev/null +++ b/nixos/tests/odoo/multi-process.nix @@ -0,0 +1,39 @@ +{ + package, + lib, + ... +}: +{ + name = "odoo-multi-process"; + meta.maintainers = with lib.maintainers; [ + mkg20001 + xanderio + ]; + + nodes.server = { + services.nginx = { + enable = true; + recommendedProxySettings = true; + }; + + services.odoo = { + enable = true; + package = package; + autoInit = true; + autoInitExtraFlags = [ "--without-demo=all" ]; + domain = "localhost"; + settings.options.workers = 2; + }; + }; + + testScript = # python + '' + server.wait_for_unit("odoo.service") + server.wait_until_succeeds( + "test $(journalctl -u odoo | grep -o 'Worker WorkerHTTP ([[:digit:]]*) alive' | wc -l) = 2" + ) + server.wait_until_succeeds("curl -s http://localhost:8069/web/database/selector | grep 'Odoo'") + server.succeed("curl -s http://localhost/web/database/selector | grep 'Odoo'") + server.succeed("curl http://localhost/web/database/manager | grep 'database manager has been disabled'") + ''; +} diff --git a/nixos/tests/odoo.nix b/nixos/tests/odoo/single-process.nix similarity index 86% rename from nixos/tests/odoo.nix rename to nixos/tests/odoo/single-process.nix index 258b42ad1cd9..7658ae7a7b32 100644 --- a/nixos/tests/odoo.nix +++ b/nixos/tests/odoo/single-process.nix @@ -4,8 +4,11 @@ ... }: { - name = "odoo"; - meta.maintainers = with lib.maintainers; [ mkg20001 ]; + name = "odoo-single-process"; + meta.maintainers = with lib.maintainers; [ + mkg20001 + xanderio + ]; nodes.server = { services.nginx = { diff --git a/pkgs/by-name/od/odoo17/package.nix b/pkgs/by-name/od/odoo17/package.nix index 8befd6786dbc..35cfcf46d281 100644 --- a/pkgs/by-name/od/odoo17/package.nix +++ b/pkgs/by-name/od/odoo17/package.nix @@ -118,7 +118,7 @@ python.pkgs.buildPythonApplication rec { passthru = { updateScript = ./update.sh; tests = { - inherit (nixosTests) odoo17; + inherit (nixosTests) odoo17 odoo17-multiprocess; }; }; diff --git a/pkgs/by-name/od/odoo18/package.nix b/pkgs/by-name/od/odoo18/package.nix index 40a0449d4d83..bb2e3174eda6 100644 --- a/pkgs/by-name/od/odoo18/package.nix +++ b/pkgs/by-name/od/odoo18/package.nix @@ -104,7 +104,7 @@ python.pkgs.buildPythonApplication rec { passthru = { updateScript = ./update.sh; tests = { - inherit (nixosTests) odoo18; + inherit (nixosTests) odoo18 odoo18-multiprocess; }; }; diff --git a/pkgs/by-name/od/odoo19/package.nix b/pkgs/by-name/od/odoo19/package.nix index 862a47b0bbc0..424d722b41dd 100644 --- a/pkgs/by-name/od/odoo19/package.nix +++ b/pkgs/by-name/od/odoo19/package.nix @@ -99,7 +99,7 @@ python.pkgs.buildPythonApplication rec { passthru = { updateScript = ./update.sh; tests = { - inherit (nixosTests) odoo19; + inherit (nixosTests) odoo19 odoo19-multiprocess; }; };