From ad157d9760872ec8e2b5d3299a70ba6d028613f7 Mon Sep 17 00:00:00 2001 From: DerLinkman Date: Tue, 21 Mar 2023 12:25:19 +0100 Subject: [PATCH] Updated DB Upgrade process (avoid internal upgrade issues (mysql_tables) --- data/Dockerfiles/dockerapi/dockerapi.py | 23 +++++++++++++++++++- data/Dockerfiles/phpfpm/docker-entrypoint.sh | 14 ++++++++---- docker-compose.yml | 4 ++-- 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/data/Dockerfiles/dockerapi/dockerapi.py b/data/Dockerfiles/dockerapi/dockerapi.py index 9e699c22..62607cf8 100644 --- a/data/Dockerfiles/dockerapi/dockerapi.py +++ b/data/Dockerfiles/dockerapi/dockerapi.py @@ -321,7 +321,7 @@ class DockerUtils: # api call: container_post - post_action: exec - cmd: system - task: mysql_upgrade def container_post__exec__system__mysql_upgrade(self, container_id, request_json): for container in self.docker_client.containers.list(filters={"id": container_id}): - sql_return = container.exec_run(["/bin/bash", "-c", "/usr/bin/mysql_upgrade -uroot -p'" + os.environ['DBROOT'].replace("'", "'\\''") + "'\n"], user='mysql') + sql_return = container.exec_run(["/bin/bash", "-c", "/usr/bin/mysql-upgrade -uroot -p'" + os.environ['DBROOT'].replace("'", "'\\''") + "'\n"], user='mysql') if sql_return.exit_code == 0: matched = False for line in sql_return.output.decode('utf-8').split("\n"): @@ -337,6 +337,27 @@ class DockerUtils: else: res = { 'type': 'error', 'msg': 'mysql_upgrade: error running command', 'text': sql_return.output.decode('utf-8')} return Response(content=json.dumps(res, indent=4), media_type="application/json") + + # api call: container_post - post_action: exec - cmd: system - task: mariadb_upgrade (new for 10.6+) + def container_post__exec__system__mariadb_upgrade(self, container_id, request_json): + for container in self.docker_client.containers.list(filters={"id": container_id}): + sql_return = container.exec_run(["/bin/bash", "-c", "/usr/bin/mariadb-upgrade -uroot -p'" + os.environ['DBROOT'].replace("'", "'\\''") + "'\n"], user='mysql') + if sql_return.exit_code == 0: + matched = False + for line in sql_return.output.decode('utf-8').split("\n"): + if 'is already upgraded to' in line: + matched = True + if matched: + res = { 'type': 'success', 'msg':'mariadb_upgrade: already upgraded', 'text': sql_return.output.decode('utf-8')} + return Response(content=json.dumps(res, indent=4), media_type="application/json") + else: + container.restart() + res = { 'type': 'warning', 'msg':'mariadb_upgrade: upgrade was applied', 'text': sql_return.output.decode('utf-8')} + return Response(content=json.dumps(res, indent=4), media_type="application/json") + else: + res = { 'type': 'error', 'msg': 'mariadb_upgrade: error running command', 'text': sql_return.output.decode('utf-8')} + return Response(content=json.dumps(res, indent=4), media_type="application/json") + # api call: container_post - post_action: exec - cmd: system - task: mysql_tzinfo_to_sql def container_post__exec__system__mysql_tzinfo_to_sql(self, container_id, request_json): for container in self.docker_client.containers.list(filters={"id": container_id}): diff --git a/data/Dockerfiles/phpfpm/docker-entrypoint.sh b/data/Dockerfiles/phpfpm/docker-entrypoint.sh index cefebcdf..3cf4ed76 100755 --- a/data/Dockerfiles/phpfpm/docker-entrypoint.sh +++ b/data/Dockerfiles/phpfpm/docker-entrypoint.sh @@ -29,18 +29,24 @@ done echo "MySQL @ ${CONTAINER_ID}" SQL_LOOP_C=0 SQL_CHANGED=0 +SQL_TYPE=$(mysqladmin version -u${DBUSER} -p${DBPASS} --socket=/var/run/mysqld/mysqld.sock | grep -o -m 1 -E 'MySQL|MariaDB' | tr '[:upper:]' '[:lower:]') +if [[ ${SQL_TYPE} == "mariadb" ]]; then + SQL_FULL_UPGRADE_RETURN=$(curl --silent --insecure -XPOST https://dockerapi/containers/${CONTAINER_ID}/exec -d '{"cmd":"system", "task":"mariadb_upgrade"}' --silent -H 'Content-type: application/json') +elif [[ ${SQL_TYPE} == "mysql" ]]; then + SQL_FULL_UPGRADE_RETURN=$(curl --silent --insecure -XPOST https://dockerapi/containers/${CONTAINER_ID}/exec -d '{"cmd":"system", "task":"mysql_upgrade"}' --silent -H 'Content-type: application/json') +fi + until [[ ${SQL_UPGRADE_STATUS} == 'success' ]]; do if [ ${SQL_LOOP_C} -gt 4 ]; then echo "Tried to upgrade MySQL and failed, giving up after ${SQL_LOOP_C} retries and starting container (oops, not good)" break fi - SQL_FULL_UPGRADE_RETURN=$(curl --silent --insecure -XPOST https://dockerapi/containers/${CONTAINER_ID}/exec -d '{"cmd":"system", "task":"mysql_upgrade"}' --silent -H 'Content-type: application/json') SQL_UPGRADE_STATUS=$(echo ${SQL_FULL_UPGRADE_RETURN} | jq -r .type) SQL_LOOP_C=$((SQL_LOOP_C+1)) echo "SQL upgrade iteration #${SQL_LOOP_C}" if [[ ${SQL_UPGRADE_STATUS} == 'warning' ]]; then SQL_CHANGED=1 - echo "MySQL applied an upgrade, debug output:" + echo "${SQL_TYPE} applied an upgrade, debug output:" echo ${SQL_FULL_UPGRADE_RETURN} sleep 3 while ! mysqladmin status --socket=/var/run/mysqld/mysqld.sock -u${DBUSER} -p${DBPASS} --silent; do @@ -49,10 +55,10 @@ until [[ ${SQL_UPGRADE_STATUS} == 'success' ]]; do done continue elif [[ ${SQL_UPGRADE_STATUS} == 'success' ]]; then - echo "MySQL is up-to-date - debug output:" + echo "${SQL_TYPE} is up-to-date - debug output:" echo ${SQL_FULL_UPGRADE_RETURN} else - echo "No valid reponse for mysql_upgrade was received, debug output:" + echo "No valid reponse for ${SQL_TYPE}_upgrade was received, debug output:" echo ${SQL_FULL_UPGRADE_RETURN} fi done diff --git a/docker-compose.yml b/docker-compose.yml index 7310f965..5f59ad2c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -106,7 +106,7 @@ services: - rspamd php-fpm-mailcow: - image: mailcow/phpfpm:1.82 + image: mailcow/phpfpm:1.83 command: "php-fpm -d date.timezone=${TZ} -d expose_php=0" depends_on: - redis-mailcow @@ -510,7 +510,7 @@ services: - watchdog dockerapi-mailcow: - image: mailcow/dockerapi:2.01 + image: mailcow/dockerapi:2.02 security_opt: - label=disable restart: always