|
55 | 55 | ${concatStringsSep "\n" (mapAttrsToList (k: v: "\$${k} = ${toStr k v};") settings)} |
56 | 56 | ''; |
57 | 57 |
|
| 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 | + |
58 | 75 | # see https://github.com/Dolibarr/dolibarr/blob/develop/htdocs/install/install.forced.sample.php for all possible values |
59 | 76 | install = { |
60 | 77 | force_install_noedit = 2; |
61 | 78 | force_install_main_data_root = "${cfg.stateDir}/documents"; |
62 | 79 | force_install_nophpinfo = true; |
63 | 80 | force_install_lockinstall = "444"; |
64 | 81 | 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}; |
66 | 88 | force_install_dbserver = cfg.database.host; |
67 | | - force_install_port = toString cfg.database.port; |
| 89 | + force_install_port = toString dbPort; |
68 | 90 | force_install_database = cfg.database.name; |
69 | 91 | force_install_databaselogin = cfg.database.user; |
70 | 92 |
|
|
128 | 150 | }; |
129 | 151 |
|
130 | 152 | 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 | + }; |
131 | 162 | host = mkOption { |
132 | 163 | type = types.str; |
133 | 164 | default = "localhost"; |
|
245 | 276 | dolibarr_main_data_root = "${cfg.stateDir}/documents"; |
246 | 277 |
|
247 | 278 | dolibarr_main_db_host = cfg.database.host; |
248 | | - dolibarr_main_db_port = toString cfg.database.port; |
| 279 | + dolibarr_main_db_port = toString dbPort; |
249 | 280 | dolibarr_main_db_name = cfg.database.name; |
250 | 281 | dolibarr_main_db_prefix = "llx_"; |
251 | 282 | dolibarr_main_db_user = cfg.database.user; |
252 | 283 | dolibarr_main_db_pass = mkIf (cfg.database.passwordFile != null) '' |
253 | 284 | file_get_contents("${cfg.database.passwordFile}") |
254 | 285 | ''; |
255 | | - dolibarr_main_db_type = "mysqli"; |
| 286 | + dolibarr_main_db_type = |
| 287 | + { |
| 288 | + "mysql" = "mysqli"; |
| 289 | + "postgresql" = "pgsql"; |
| 290 | + } |
| 291 | + .${cfg.database.type}; |
256 | 292 | dolibarr_main_db_character_set = mkDefault "utf8"; |
257 | 293 | dolibarr_main_db_collation = mkDefault "utf8_unicode_ci"; |
258 | 294 |
|
|
262 | 298 | # Security settings |
263 | 299 | dolibarr_main_prod = true; |
264 | 300 | 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}; |
266 | 311 | dolibarr_nocsrfcheck = false; |
267 | 312 | dolibarr_main_instance_unique_id = '' |
268 | 313 | file_get_contents("${cfg.stateDir}/dolibarr_main_instance_unique_id") |
|
277 | 322 | "L '${cfg.stateDir}/install.forced.php' - ${cfg.user} ${cfg.group} - ${mkConfigFile "install.forced.php" install}" |
278 | 323 | ]; |
279 | 324 |
|
280 | | - services.mysql = mkIf cfg.database.createLocally { |
| 325 | + services.mysql = mkIf (cfg.database.createLocally && cfg.database.type == "mysql") { |
281 | 326 | enable = mkDefault true; |
282 | 327 | package = mkDefault pkgs.mariadb; |
283 | 328 | ensureDatabases = [ cfg.database.name ]; |
|
291 | 336 | ]; |
292 | 337 | }; |
293 | 338 |
|
| 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 | + |
294 | 353 | services.nginx.enable = mkIf (cfg.nginx != null) true; |
295 | 354 | services.nginx.virtualHosts."${cfg.domain}" = mkIf (cfg.nginx != null) ( |
296 | 355 | lib.mkMerge [ |
|
308 | 367 | ] |
309 | 368 | ); |
310 | 369 |
|
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 | + |
312 | 375 | services.phpfpm.pools.dolibarr = { |
313 | 376 | inherit (cfg) user group; |
314 | 377 | phpPackage = pkgs.php83.buildEnv { |
|
338 | 401 | systemd.services.dolibarr-config = { |
339 | 402 | description = "dolibarr configuration file management via NixOS"; |
340 | 403 | wantedBy = [ "multi-user.target" ]; |
| 404 | + after = lib.optional cfg.database.createLocally dbUnit; |
341 | 405 |
|
342 | 406 | script = |
343 | 407 | let |
|
0 commit comments