Commit 38f3a23b authored by toastal's avatar toastal
Browse files

nixos/dolibarr: split DB type; add PostgreSQL support

parent f9100c29
Loading
Loading
Loading
Loading
+71 −7
Original line number Diff line number Diff line
@@ -55,6 +55,23 @@ let
      ${concatStringsSep "\n" (mapAttrsToList (k: v: "\$${k} = ${toStr k v};") settings)}
    '';

  dbUnit =
    {
      "mysql" = "mysql.service";
      "postgresql" = "postgresql.target";
    }
    .${cfg.database.type};

  dbPort =
    if cfg.database.createLocally then
      {
        "mysql" = config.services.mysql.settings.mysqld.port;
        "postgresql" = config.services.postgresql.settings.port;
      }
      .${cfg.database.type}
    else
      cfg.database.port;

  # see https://github.com/Dolibarr/dolibarr/blob/develop/htdocs/install/install.forced.sample.php for all possible values
  install = {
    force_install_noedit = 2;
@@ -62,9 +79,14 @@ let
    force_install_nophpinfo = true;
    force_install_lockinstall = "444";
    force_install_distrib = "nixos";
    force_install_type = "mysqli";
    force_install_type =
      {
        "mysql" = "mysqli";
        "postgresql" = "pgsql";
      }
      .${cfg.database.type};
    force_install_dbserver = cfg.database.host;
    force_install_port = toString cfg.database.port;
    force_install_port = toString dbPort;
    force_install_database = cfg.database.name;
    force_install_databaselogin = cfg.database.user;

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

    database = {
      type = mkOption {
        type = types.enum [
          "mysql"
          "postgresql"
        ];
        example = "postgresql";
        default = "mysql";
        description = "Database engine to use.";
      };
      host = mkOption {
        type = types.str;
        default = "localhost";
@@ -245,14 +276,19 @@ in
        dolibarr_main_data_root = "${cfg.stateDir}/documents";

        dolibarr_main_db_host = cfg.database.host;
        dolibarr_main_db_port = toString cfg.database.port;
        dolibarr_main_db_port = toString dbPort;
        dolibarr_main_db_name = cfg.database.name;
        dolibarr_main_db_prefix = "llx_";
        dolibarr_main_db_user = cfg.database.user;
        dolibarr_main_db_pass = mkIf (cfg.database.passwordFile != null) ''
          file_get_contents("${cfg.database.passwordFile}")
        '';
        dolibarr_main_db_type = "mysqli";
        dolibarr_main_db_type =
          {
            "mysql" = "mysqli";
            "postgresql" = "pgsql";
          }
          .${cfg.database.type};
        dolibarr_main_db_character_set = mkDefault "utf8";
        dolibarr_main_db_collation = mkDefault "utf8_unicode_ci";

@@ -262,7 +298,16 @@ in
        # Security settings
        dolibarr_main_prod = true;
        dolibarr_main_force_https = vhostCfg.forceSSL or false;
        dolibarr_main_restrict_os_commands = "${pkgs.mariadb}/bin/mysqldump, ${pkgs.mariadb}/bin/mysql";
        dolibarr_main_restrict_os_commands =
          {
            "mysql" = "${pkgs.mariadb}/bin/mysqldump, ${pkgs.mariadb}/bin/mysql";
            "postgresql" =
              let
                pkg = config.services.postgresql.package;
              in
              "${pkg}/bin/pg_dump, ${pkg}/bin/psql";
          }
          .${cfg.database.type};
        dolibarr_nocsrfcheck = false;
        dolibarr_main_instance_unique_id = ''
          file_get_contents("${cfg.stateDir}/dolibarr_main_instance_unique_id")
@@ -277,7 +322,7 @@ in
        "L '${cfg.stateDir}/install.forced.php' - ${cfg.user} ${cfg.group} - ${mkConfigFile "install.forced.php" install}"
      ];

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

      services.postgresql = mkIf (cfg.database.createLocally && cfg.database.type == "postgresql") {
        enable = mkDefault true;
        ensureDatabases = [ cfg.database.name ];
        ensureUsers = [
          {
            name = cfg.database.user;
            ensureDBOwnership = true;
          }
        ];
        authentication = ''
          host ${cfg.database.name} ${cfg.database.user} localhost trust
        '';
      };

      services.nginx.enable = mkIf (cfg.nginx != null) true;
      services.nginx.virtualHosts."${cfg.domain}" = mkIf (cfg.nginx != null) (
        lib.mkMerge [
@@ -308,7 +367,11 @@ in
        ]
      );

      systemd.services."phpfpm-dolibarr".after = mkIf cfg.database.createLocally [ "mysql.service" ];
      systemd.services."phpfpm-dolibarr" = {
        after = lib.optional cfg.database.createLocally dbUnit;
        requires = lib.optional cfg.database.createLocally dbUnit;
      };

      services.phpfpm.pools.dolibarr = {
        inherit (cfg) user group;
        phpPackage = pkgs.php83.buildEnv {
@@ -338,6 +401,7 @@ in
      systemd.services.dolibarr-config = {
        description = "dolibarr configuration file management via NixOS";
        wantedBy = [ "multi-user.target" ];
        after = lib.optional cfg.database.createLocally dbUnit;

        script =
          let