Skip to content

Commit 38f3a23

Browse files
committed
nixos/dolibarr: split DB type; add PostgreSQL support
1 parent f9100c2 commit 38f3a23

File tree

1 file changed

+71
-7
lines changed

1 file changed

+71
-7
lines changed

nixos/modules/services/web-apps/dolibarr.nix

Lines changed: 71 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,16 +55,38 @@ let
5555
${concatStringsSep "\n" (mapAttrsToList (k: v: "\$${k} = ${toStr k v};") settings)}
5656
'';
5757

58+
dbUnit =
59+
{
60+
"mysql" = "mysql.service";
61+
"postgresql" = "postgresql.target";
62+
}
63+
.${cfg.database.type};
64+
65+
dbPort =
66+
if cfg.database.createLocally then
67+
{
68+
"mysql" = config.services.mysql.settings.mysqld.port;
69+
"postgresql" = config.services.postgresql.settings.port;
70+
}
71+
.${cfg.database.type}
72+
else
73+
cfg.database.port;
74+
5875
# see https://github.com/Dolibarr/dolibarr/blob/develop/htdocs/install/install.forced.sample.php for all possible values
5976
install = {
6077
force_install_noedit = 2;
6178
force_install_main_data_root = "${cfg.stateDir}/documents";
6279
force_install_nophpinfo = true;
6380
force_install_lockinstall = "444";
6481
force_install_distrib = "nixos";
65-
force_install_type = "mysqli";
82+
force_install_type =
83+
{
84+
"mysql" = "mysqli";
85+
"postgresql" = "pgsql";
86+
}
87+
.${cfg.database.type};
6688
force_install_dbserver = cfg.database.host;
67-
force_install_port = toString cfg.database.port;
89+
force_install_port = toString dbPort;
6890
force_install_database = cfg.database.name;
6991
force_install_databaselogin = cfg.database.user;
7092

@@ -128,6 +150,15 @@ in
128150
};
129151

130152
database = {
153+
type = mkOption {
154+
type = types.enum [
155+
"mysql"
156+
"postgresql"
157+
];
158+
example = "postgresql";
159+
default = "mysql";
160+
description = "Database engine to use.";
161+
};
131162
host = mkOption {
132163
type = types.str;
133164
default = "localhost";
@@ -245,14 +276,19 @@ in
245276
dolibarr_main_data_root = "${cfg.stateDir}/documents";
246277

247278
dolibarr_main_db_host = cfg.database.host;
248-
dolibarr_main_db_port = toString cfg.database.port;
279+
dolibarr_main_db_port = toString dbPort;
249280
dolibarr_main_db_name = cfg.database.name;
250281
dolibarr_main_db_prefix = "llx_";
251282
dolibarr_main_db_user = cfg.database.user;
252283
dolibarr_main_db_pass = mkIf (cfg.database.passwordFile != null) ''
253284
file_get_contents("${cfg.database.passwordFile}")
254285
'';
255-
dolibarr_main_db_type = "mysqli";
286+
dolibarr_main_db_type =
287+
{
288+
"mysql" = "mysqli";
289+
"postgresql" = "pgsql";
290+
}
291+
.${cfg.database.type};
256292
dolibarr_main_db_character_set = mkDefault "utf8";
257293
dolibarr_main_db_collation = mkDefault "utf8_unicode_ci";
258294

@@ -262,7 +298,16 @@ in
262298
# Security settings
263299
dolibarr_main_prod = true;
264300
dolibarr_main_force_https = vhostCfg.forceSSL or false;
265-
dolibarr_main_restrict_os_commands = "${pkgs.mariadb}/bin/mysqldump, ${pkgs.mariadb}/bin/mysql";
301+
dolibarr_main_restrict_os_commands =
302+
{
303+
"mysql" = "${pkgs.mariadb}/bin/mysqldump, ${pkgs.mariadb}/bin/mysql";
304+
"postgresql" =
305+
let
306+
pkg = config.services.postgresql.package;
307+
in
308+
"${pkg}/bin/pg_dump, ${pkg}/bin/psql";
309+
}
310+
.${cfg.database.type};
266311
dolibarr_nocsrfcheck = false;
267312
dolibarr_main_instance_unique_id = ''
268313
file_get_contents("${cfg.stateDir}/dolibarr_main_instance_unique_id")
@@ -277,7 +322,7 @@ in
277322
"L '${cfg.stateDir}/install.forced.php' - ${cfg.user} ${cfg.group} - ${mkConfigFile "install.forced.php" install}"
278323
];
279324

280-
services.mysql = mkIf cfg.database.createLocally {
325+
services.mysql = mkIf (cfg.database.createLocally && cfg.database.type == "mysql") {
281326
enable = mkDefault true;
282327
package = mkDefault pkgs.mariadb;
283328
ensureDatabases = [ cfg.database.name ];
@@ -291,6 +336,20 @@ in
291336
];
292337
};
293338

339+
services.postgresql = mkIf (cfg.database.createLocally && cfg.database.type == "postgresql") {
340+
enable = mkDefault true;
341+
ensureDatabases = [ cfg.database.name ];
342+
ensureUsers = [
343+
{
344+
name = cfg.database.user;
345+
ensureDBOwnership = true;
346+
}
347+
];
348+
authentication = ''
349+
host ${cfg.database.name} ${cfg.database.user} localhost trust
350+
'';
351+
};
352+
294353
services.nginx.enable = mkIf (cfg.nginx != null) true;
295354
services.nginx.virtualHosts."${cfg.domain}" = mkIf (cfg.nginx != null) (
296355
lib.mkMerge [
@@ -308,7 +367,11 @@ in
308367
]
309368
);
310369

311-
systemd.services."phpfpm-dolibarr".after = mkIf cfg.database.createLocally [ "mysql.service" ];
370+
systemd.services."phpfpm-dolibarr" = {
371+
after = lib.optional cfg.database.createLocally dbUnit;
372+
requires = lib.optional cfg.database.createLocally dbUnit;
373+
};
374+
312375
services.phpfpm.pools.dolibarr = {
313376
inherit (cfg) user group;
314377
phpPackage = pkgs.php83.buildEnv {
@@ -338,6 +401,7 @@ in
338401
systemd.services.dolibarr-config = {
339402
description = "dolibarr configuration file management via NixOS";
340403
wantedBy = [ "multi-user.target" ];
404+
after = lib.optional cfg.database.createLocally dbUnit;
341405

342406
script =
343407
let

0 commit comments

Comments
 (0)