VestaCP: Soporte para Mysql 8

Hace tiempo que no dedico tiempo en serio al proyecto de vesta, esta semana he estado algo aburrido y me he estado haciendo algunas cosas con mysql y me dio por mirar el tema de vestacp, ya que me acorde de algunas peticiones que tenia la gente sobre el soporte para mysql 8 ya que esta estable desde ni se cuando así que me decidi a meter mano y probar a instalar vestaCP directamente con soporte para mysql 8 en un debian 9

Tal como hice con el soporte para mysql 5.7 he probado a mejorar la compatibilidad con mysql 8 que hasta ahora era inexistente

El tema es que ya sabía que no funcionaba pero necesitaba mi conejillo de indias y este fue un debian 9, decidí no actualizar ya que probe en un ubuntu 18 y fue bastante mal por algún tema de apparmor así que lo deje y monte un servidor con debian 9, antes de instalar vesta añadí los repos de mysql 8 de la siguiente manera:

wget https://dev.mysql.com/get/mysql-apt-config_0.8.10-1_all.deb

dpkg -i mysql-apt-config_0.8.10-1_all.deb

Sí, así de sencillo, luego instalamos vestacp con normalidad, parece que todo va bien en primera instanacia, aunque las bases de datos que creamos no funcionan y para eso debemos parchearlo

Primero añadimos soporte para el sistema antiguo de contraseñas ya que no funcionará de momento con las contraseñas cifradas en SHA-256

Mysql 8 Support

Es necesario modificar el my.cnf añadiendo la siguiente linea después de [Mysqld]

default_authentication_plugin=mysql_native_password

Reiniciamos mysql y parcheamos vestacp con el siguiente código:

https://github.com/serghey-rodin/vesta/pull/1805/files
https://github.com/serghey-rodin/vesta/pull/1806/files

De momento no es oficial, ya que acabo de hacerlo y requiere revisión por parte de vestacp y testeos varios, los dos parches los he probado y en principio funcionan bien pero puede que tarden en ser aceptados o directamente pueden ser rechazados, eso no se sabe, aunque la vez pasada fueron aceptados y esta es una modificación al anterior código

En todo caso el parche importante para que la creación de bases de datos y usuarios funcione es el parche 1805, que añade compatibilidad a mysql 8 con el siguiente código:

Lo más sencillo es reemplazar toda la función add_mysql_database del func/db.sh por la siguiente función modificada, se cambiaron muchas lineas así que reemplazarla es más sencillo:

add_mysql_database() {
    mysql_connect $host

    query="CREATE DATABASE \`$database\` CHARACTER SET $charset"
    mysql_query "$query" > /dev/null

   if [ "$(echo $mysql_ver |cut -d '.' -f1)" -eq 8 ]; then
        query="CREATE USER IF NOT EXISTS '$dbuser'@'localhost' IDENTIFIED BY '$dbpass';"
        mysql_query "$query" > /dev/null
        query="CREATE USER IF NOT EXISTS '$dbuser'@'%' IDENTIFIED BY '$dbpass';"
        mysql_query "$query" > /dev/null
        query="GRANT ALL ON \`$database\`.* TO \`$dbuser\`@\`%\`"
        query="GRANT ALL ON \`$database\`.* TO \`$dbuser\`@localhost"
        mysql_query "$query" > /dev/null
    else
    query="GRANT ALL ON \`$database\`.* TO \`$dbuser\`@\`%\`
        IDENTIFIED BY '$dbpass'"
    mysql_query "$query" > /dev/null

    query="GRANT ALL ON \`$database\`.* TO \`$dbuser\`@localhost
        IDENTIFIED BY '$dbpass'"
    mysql_query "$query" > /dev/null
    fi  
     if [ "$(echo $mysql_ver |cut -d '.' -f2)" -ge 7 ] || [ "$(echo $mysql_ver |cut -d '.' -f1)" -eq 8 ]; then
        md5=$(mysql_query "SHOW CREATE USER \`$dbuser\`" 2>/dev/null)
        md5=$(echo "$md5" |grep password |cut -f8 -d \')
    else
        md5=$(mysql_query "SHOW GRANTS FOR \`$dbuser\`" 2>/dev/null)
        md5=$(echo "$md5" |grep PASSW|tr ' ' '\n' |tail -n1 |cut -f 2 -d \')
    fi
}

Eso es todo, lo mismo habría que hacer con el otro parche si no no se podrán restaurar backups 😛