vuls: init at 0.27.0
[NixPkgs.git] / nixos / modules / services / finance / odoo.nix
blob1414500389d6391bf2517d00c37a50e529e8a1ff
1 { config, pkgs, lib, ... }:
2 let
3   cfg = config.services.odoo;
4   format = pkgs.formats.ini {};
5 in
7   options = {
8     services.odoo = {
9       enable = lib.mkEnableOption "odoo, an open source ERP and CRM system";
11       package = lib.mkPackageOption pkgs "odoo" { };
13       addons = lib.mkOption {
14         type = with lib.types; listOf package;
15         default = [];
16         example = lib.literalExpression "[ pkgs.odoo_enterprise ]";
17         description = "Odoo addons.";
18       };
20       autoInit = lib.mkEnableOption "automatically initialize the DB";
22       autoInitExtraFlags = lib.mkOption {
23         type = with lib.types; listOf str;
24         default = [ ];
25         example = lib.literalExpression /*nix*/ ''
26           [ "--without-demo=all" ]
27         '';
28         description = "Extra flags passed to odoo when run for the first time by autoInit";
29       };
31       settings = lib.mkOption {
32         type = format.type;
33         default = {};
34         description = ''
35           Odoo configuration settings. For more details see <https://www.odoo.com/documentation/15.0/administration/install/deploy.html>
36         '';
37         example = lib.literalExpression ''
38           options = {
39             db_user = "odoo";
40             db_password="odoo";
41           };
42         '';
43       };
45       domain = lib.mkOption {
46         type = with lib.types; nullOr str;
47         description = "Domain to host Odoo with nginx";
48         default = null;
49       };
50     };
51   };
53   config = lib.mkIf (cfg.enable) (let
54     cfgFile = format.generate "odoo.cfg" cfg.settings;
55   in {
56     services.nginx = lib.mkIf (cfg.domain != null) {
57       upstreams = {
58         odoo.servers = {
59           "127.0.0.1:8069" = {};
60         };
62         odoochat.servers = {
63           "127.0.0.1:8072" = {};
64         };
65       };
67       virtualHosts."${cfg.domain}" = {
68         extraConfig = ''
69           proxy_read_timeout 720s;
70           proxy_connect_timeout 720s;
71           proxy_send_timeout 720s;
73           proxy_set_header X-Forwarded-Host $host;
74           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
75           proxy_set_header X-Forwarded-Proto $scheme;
76           proxy_set_header X-Real-IP $remote_addr;
77         '';
79         locations = {
80           "/longpolling" = {
81             proxyPass = "http://odoochat";
82           };
84           "/" = {
85             proxyPass = "http://odoo";
86             extraConfig = ''
87               proxy_redirect off;
88             '';
89           };
90         };
91       };
92     };
94     services.odoo.settings.options = {
95       data_dir = "/var/lib/private/odoo/data";
96       proxy_mode = cfg.domain != null;
97     } // (lib.optionalAttrs (cfg.addons != []) {
98       addons_path = lib.concatMapStringsSep "," lib.escapeShellArg cfg.addons;
99     });
101     users.users.odoo = {
102       isSystemUser = true;
103       group = "odoo";
104     };
105     users.groups.odoo = {};
107     systemd.services.odoo = {
108       wantedBy = [ "multi-user.target" ];
109       after = [ "network.target" "postgresql.service" ];
111       # pg_dump
112       path = [ config.services.postgresql.package ];
114       requires = [ "postgresql.service" ];
116       serviceConfig = {
117         ExecStart = "${cfg.package}/bin/odoo";
118         ExecStartPre = pkgs.writeShellScript "odoo-start-pre.sh" (
119           ''
120           set -euo pipefail
122           cd "$STATE_DIRECTORY"
124           # Auto-migrate old deployments
125           if [[ -d .local/share/Odoo ]]; then
126             echo "pre-start: migrating state directory from $STATE_DIRECTORY/.local/share/Odoo to $STATE_DIRECTORY/data"
127             mv .local/share/Odoo ./data
128             rmdir .local/share
129             rmdir .local
130           fi
131           ''
132           + (lib.optionalString cfg.autoInit
133           ''
134           echo "pre-start: auto-init"
135           INITIALIZED="${cfg.settings.options.data_dir}/.odoo.initialized"
136           if [ ! -e "$INITIALIZED" ]; then
137             ${cfg.package}/bin/odoo  --init=INIT --database=odoo --db_user=odoo --stop-after-init ${lib.concatStringsSep " " cfg.autoInitExtraFlags}
138             touch "$INITIALIZED"
139           fi
140           '')
141           + "echo pre-start: OK"
142         );
143         DynamicUser = true;
144         User = "odoo";
145         StateDirectory = "odoo";
146         Environment = [
147           "ODOO_RC=${cfgFile}"
148         ];
149       };
150     };
152     services.postgresql = {
153       enable = true;
155       ensureDatabases = [ "odoo" ];
156       ensureUsers = [{
157         name = "odoo";
158         ensureDBOwnership = true;
159       }];
160     };
161   });