File: //proc/thread-self/root/scripts/mysql.sh
#!/bin/bash
echo "**************************************************************"
echo "* Installing MySQL Server *"
echo "**************************************************************"
echo "Installing MySQL"
apt update
echo "Creating directories"
mkdir -p /home/appbox/mysql/run
mkdir -p /home/appbox/mysql/data
mkdir -p /home/appbox/logs/mysql
mkdir -p /home/appbox/config/mysql
usermod -d /home/appbox/mysql/data mysql
echo "Creating log files"
touch /home/appbox/logs/mysql/error.log
echo "Moving sources"
mv /sources/mysqld.cnf /home/appbox/config/mysql/mysqld.cnf
chmod 600 /home/appbox/config/mysql/mysqld.cnf
chown -R appbox:appbox /home/appbox
echo "Create & secure runtime directories"
mkdir -p /var/run/mysqld
touch /var/run/mysqld/mysqld.sock
chown -R appbox:appbox /var/run/mysqld /run/mysqld/
# Check if 5.7 needs to be installed first
if hexdump -n 2 -d -s 0x33 /home/appbox/mysql/data/mysql/db.frm | head -1 | awk '{print $2}' | grep -q '^50'; then
echo "Installing downgraded mysql"
# Downgrade Mysql
cat << EOF > /etc/apt/sources.list.d/mysql.list
### THIS FILE IS AUTOMATICALLY CONFIGURED ###
# You may comment out entries below, but any other modifications may be lost.
# Use command 'dpkg-reconfigure mysql-apt-config' as root for modifications.
deb http://repo.mysql.com/apt/ubuntu/ bionic mysql-apt-config
deb http://repo.mysql.com/apt/ubuntu/ bionic mysql-5.7
deb http://repo.mysql.com/apt/ubuntu/ bionic mysql-tools
#deb http://repo.mysql.com/apt/ubuntu/ bionic mysql-tools-preview
deb-src http://repo.mysql.com/apt/ubuntu/ bionic mysql-5.7
EOF
apt update
VERSION=$(apt-cache policy mysql-server | grep 5.7 | head -1 | awk '{print $1}')
if ! grep -q 'mysql' /etc/passwd; then
groupadd -g 109 -o -r mysql
useradd -M -N -g mysql -o -r -d /var/lib/mysql -s /bin/false -c "MySQL Server" -u 106 mysql
fi
apt install --allow-downgrades -y mysql-client=${VERSION} mysql-community-client=${VERSION} mysql-community-server=${VERSION} mysql-server=${VERSION}
chown -R appbox:appbox /run/mysqld/
truncate -s0 /home/appbox/logs/mysql/error.log
if ! grep -q 'innodb-fast-shutdown' /home/appbox/config/mysql/mysqld.cnf; then
echo "
innodb-fast-shutdown = 1" >> /home/appbox/config/mysql/mysqld.cnf
fi
mysqld_safe --defaults-file=/home/appbox/config/mysql/mysqld.cnf --skip-grant-tables --socket=/run/mysqld/mysqld.sock &
while ! (mysqladmin ping)
do
sleep 3
echo "waiting for mysql ..."
done
mysqladmin -uroot -h127.0.0.1 --protocol=tcp shutdown
until ! ps aux | grep -v 'grep' | grep -q 'mysqld'; do
sleep 3
echo "waiting for mysql to die..."
done
rm /etc/apt/sources.list.d/mysql.list
apt update
fi
apt install -y mysql-server php-mysql
echo "Starting MySQL for the first time"
chown -R appbox:appbox /var/run/mysqld /run/mysqld/
mysqld_safe --defaults-file=/home/appbox/config/mysql/mysqld.cnf --skip-grant-tables --initialize-insecure --upgrade=FORCE --socket=/run/mysqld/mysqld.sock
mysqld_safe --defaults-file=/home/appbox/config/mysql/mysqld.cnf --skip-grant-tables --upgrade=FORCE --socket=/run/mysqld/mysqld.sock &
while ! (mysqladmin --socket=/run/mysqld/mysqld.sock ping)
do
sleep 3
echo "waiting for mysql ..."
done
mysqladmin -uroot --socket=/run/mysqld/mysqld.sock shutdown
until ! ps aux | grep -v 'grep' | grep -q 'mysqld'; do
sleep 3
echo "waiting for mysql to die..."
done
echo "Defining Variables"
DB_NAME=${DB_NAME:-""}
DB_USER=${DB_USER:-""}
DB_PASS=${DB_PASS:-""}
echo "Cycle MySQL service"
service mysql start
service mysql stop
echo "Start MySQL in safe mode"
/usr/bin/mysqld_safe --defaults-file=/home/appbox/config/mysql/mysqld.cnf &
sleep 10
while ! (mysqladmin --socket=/run/mysqld/mysqld.sock ping)
do
sleep 3
echo "waiting for mysql ..."
done
echo "Setting up root password."
mysqladmin -u root password ${MYSQL_ROOT_PASSWORD}
echo "Enable remote root login."
mysql --user=root --password=${MYSQL_ROOT_PASSWORD} -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}';"
if [ -n "$DB_NAME" ]; then
echo "Adding new DB $DB_NAME"
mysql --user=root --password=${MYSQL_ROOT_PASSWORD} -e "CREATE DATABASE $DB_NAME"
#We have setup a DB, so we can setup a cron to back it up.
echo "+ Creating backup directory"
mkdir -p /home/appbox/mysql/backup
echo "0 0 * * * /usr/bin/mysqldump -uroot -p${MYSQL_ROOT_PASSWORD} ${DB_NAME} > /home/appbox/mysql/backup/${DB_NAME}_BACKUP.sql" > /sources/backupcron
cat /sources/backupcron | crontab -
fi
if [ -n "$DB_USER" ]; then
echo "Adding User $DB_USER"
mysql --user=root --password=${MYSQL_ROOT_PASSWORD} -e "GRANT ALL PRIVILEGES ON $DB_NAME.* TO '$DB_USER'@'localhost' IDENTIFIED BY '$DB_PASS'; FLUSH PRIVILEGES;"
mysql --user=root --password=${MYSQL_ROOT_PASSWORD} -e "GRANT ALL PRIVILEGES ON $DB_NAME.* TO '$DB_USER'@'%' IDENTIFIED BY '$DB_PASS'; FLUSH PRIVILEGES;"
fi
if [ -n "$DB_NAME" ]; then
mysql --user=root --password=${MYSQL_ROOT_PASSWORD} -e "select user, host FROM mysql.user;"
fi
echo "Killing MySQL"
pkill -9 mysql
#echo "Installing Database"
#mysql -u${DB_USER} -p${DB_PASS} ${DB_NAME} < /sources/dbsource.sql
# Setup NGINX Daemon
echo "Setting up MySQL Daemon"
mkdir -p /etc/service/mysql
cat << EOF >> /etc/service/mysql/run
#!/bin/sh
exec /usr/sbin/mysqld --defaults-file=/home/appbox/config/mysql/mysqld.cnf --verbose=0 --socket=/run/mysqld/mysqld.sock
EOF
chmod +x /etc/service/mysql/run
echo "Finished installing MySQL"