summary refs log blame commit diff
path: root/modules/services/databases/mysql.nix
blob: e5b8661ef99c0e7429f86c129f517871b875dbd8 (plain) (tree)
1
2
3
4
5

                    
   
                                             
 








                                                        

  
 











































                                                                                      
 
                       
 


                                              

                                          
        
 
                                         
 

                      


                                  
 
                        
 





                                                              
 


                                              
 
                                                    
 





                                                  

      
    
 
 
{pkgs, config, ...}:

let
  inherit (pkgs.lib) mkOption mkIf singleton;

  cfg = config.services.mysql;

  mysql = pkgs.mysql;

  pidFile = "${cfg.pidDir}/mysqld.pid";

  mysqldOptions =
    "--user=${cfg.user} --datadir=${cfg.dataDir} " +
    "--log-error=${cfg.logError} --pid-file=${pidFile}";

in

{

  ###### interface

  options = {
  
    services.mysql = {
    
      enable = mkOption {
        default = false;
        description = "
          Whether to enable the MySQL server.
        ";
      };

      port = mkOption {
        default = "3306";
        description = "Port of MySQL"; 
      };

      user = mkOption {
        default = "mysql";
        description = "User account under which MySQL runs";
      };

      dataDir = mkOption {
        default = "/var/mysql";
        description = "Location where MySQL stores its table files";
      };

      logError = mkOption {
        default = "/var/log/mysql_err.log";
        description = "Location of the MySQL error logfile";
      };

      pidDir = mkOption {
        default = "/var/run/mysql";
        description = "Location of the file which stores the PID of the MySQL server";
      };

    };
    
  };


  ###### implementation

  config = mkIf config.services.mysql.enable {

    users.extraUsers = singleton
      { name = "mysql";
        description = "MySQL server user";
      };

    environment.systemPackages = [mysql];

    jobs = singleton {
      name = "mysql";
      
      job = ''
        description "MySQL server"

        stop on shutdown

        start script
            if ! test -e ${cfg.dataDir}; then
                mkdir -m 0700 -p ${cfg.dataDir}
                chown -R ${cfg.user} ${cfg.dataDir}
                ${mysql}/bin/mysql_install_db ${mysqldOptions}
            fi

            mkdir -m 0700 -p ${cfg.pidDir}
            chown -R ${cfg.user} ${cfg.pidDir}
        end script

        respawn ${mysql}/bin/mysqld ${mysqldOptions}

        stop script
            pid=$(cat ${pidFile})
            kill "$pid"
            ${mysql}/bin/mysql_waitpid "$pid" 1000
        end script
      '';
    };

  };

}