nixos/preload: init
[NixPkgs.git] / nixos / modules / services / finance / odoo.nix
blobb8574ed09af9ca37c569128c0e7d5262bec8dbd5
1 { config, pkgs, lib, ... }:
3 with lib;
5 let
6   cfg = config.services.odoo;
7   format = pkgs.formats.ini {};
8 in
10   options = {
11     services.odoo = {
12       enable = mkEnableOption (lib.mdDoc "odoo");
14       package = mkOption {
15         type = types.package;
16         default = pkgs.odoo;
17         defaultText = literalExpression "pkgs.odoo";
18         description = lib.mdDoc "Odoo package to use.";
19       };
21       addons = mkOption {
22         type = with types; listOf package;
23         default = [];
24         example = literalExpression "[ pkgs.odoo_enterprise ]";
25         description = lib.mdDoc "Odoo addons.";
26       };
28       settings = mkOption {
29         type = format.type;
30         default = {};
31         description = lib.mdDoc ''
32           Odoo configuration settings. For more details see <https://www.odoo.com/documentation/15.0/administration/install/deploy.html>
33         '';
34         example = literalExpression ''
35           options = {
36             db_user = "odoo";
37             db_password="odoo";
38           };
39         '';
40       };
42       domain = mkOption {
43         type = with types; nullOr str;
44         description = lib.mdDoc "Domain to host Odoo with nginx";
45         default = null;
46       };
47     };
48   };
50   config = mkIf (cfg.enable) (let
51     cfgFile = format.generate "odoo.cfg" cfg.settings;
52   in {
53     services.nginx = mkIf (cfg.domain != null) {
54       upstreams = {
55         odoo.servers = {
56           "127.0.0.1:8069" = {};
57         };
59         odoochat.servers = {
60           "127.0.0.1:8072" = {};
61         };
62       };
64       virtualHosts."${cfg.domain}" = {
65         extraConfig = ''
66           proxy_read_timeout 720s;
67           proxy_connect_timeout 720s;
68           proxy_send_timeout 720s;
70           proxy_set_header X-Forwarded-Host $host;
71           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
72           proxy_set_header X-Forwarded-Proto $scheme;
73           proxy_set_header X-Real-IP $remote_addr;
74         '';
76         locations = {
77           "/longpolling" = {
78             proxyPass = "http://odoochat";
79           };
81           "/" = {
82             proxyPass = "http://odoo";
83             extraConfig = ''
84               proxy_redirect off;
85             '';
86           };
87         };
88       };
89     };
91     services.odoo.settings.options = {
92       proxy_mode = cfg.domain != null;
93     };
95     users.users.odoo = {
96       isSystemUser = true;
97       group = "odoo";
98     };
99     users.groups.odoo = {};
101     systemd.services.odoo = {
102       wantedBy = [ "multi-user.target" ];
103       after = [ "network.target" "postgresql.service" ];
105       # pg_dump
106       path = [ config.services.postgresql.package ];
108       requires = [ "postgresql.service" ];
109       script = "HOME=$STATE_DIRECTORY ${cfg.package}/bin/odoo ${optionalString (cfg.addons != []) "--addons-path=${concatMapStringsSep "," escapeShellArg cfg.addons}"} -c ${cfgFile}";
111       serviceConfig = {
112         DynamicUser = true;
113         User = "odoo";
114         StateDirectory = "odoo";
115       };
116     };
118     services.postgresql = {
119       enable = true;
121       ensureDatabases = [ "odoo" ];
122       ensureUsers = [{
123         name = "odoo";
124         ensureDBOwnership = true;
125       }];
126     };
127   });