diff --git a/proxy-manager/config.json b/proxy-manager/config.json index 2b6fdc89..44ea5f8a 100755 --- a/proxy-manager/config.json +++ b/proxy-manager/config.json @@ -7,6 +7,7 @@ "webui": "http://[HOST]:[PORT:81]", "startup": "application", "arch": ["aarch64", "amd64", "armhf", "armv7", "i386"], + "services": ["mysql:need"], "ports": { "80": 80, "81": 81, @@ -20,7 +21,7 @@ "boot": "auto", "hassio_api": true, "hassio_role": "default", - "map": ["ssl:rw"], + "map": ["ssl:rw", "backup:rw"], "options": {}, "schema": { "log_level": "list(trace|debug|info|notice|warning|error|fatal)?" diff --git a/proxy-manager/rootfs/etc/cont-init.d/mysql.sh b/proxy-manager/rootfs/etc/cont-init.d/mysql.sh index bed65dcd..c3aaca30 100644 --- a/proxy-manager/rootfs/etc/cont-init.d/mysql.sh +++ b/proxy-manager/rootfs/etc/cont-init.d/mysql.sh @@ -3,25 +3,45 @@ # Home Assistant Community Add-on: Nginx Proxy Manager # This file init the MySQL database # ============================================================================== +declare host +declare password +declare port +declare username +declare backup -# Initialize the database data directory. -if ! bashio::fs.directory_exists "/data/mysql"; then - mkdir /data/mysql - chown mysql:mysql /data/mysql +# Require MySQL service to be available +if ! bashio::services.available "mysql"; then + bashio::log.error \ + "This add-on now requires the MariaDB core add-on 2.0 or newer!" + bashio::exit.nok \ + "Make sure the MariaDB add-on is installed and running" fi -if ! bashio::fs.directory_exists "/data/mysql/mysql"; then +host=$(bashio::services "mysql" "host") +password=$(bashio::services "mysql" "password") +port=$(bashio::services "mysql" "port") +username=$(bashio::services "mysql" "username") - bashio::log.info "Initializing database..." +# Create database if not exists +echo "CREATE DATABASE IF NOT EXISTS nginxproxymanager;" \ + | mysql -h "${host}" -P "${port}" -u "${username}" -p"${password}" - s6-setuidgid mysql mysql_install_db --datadir=/data/mysql +# Check if older MySQL folder exists +if bashio::fs.directory_exists "/data/mysql"; then + bashio::log.info "Found previous MySQL database, starting migration..." + + backup="/backup/nginx-proxy-manager-$(date +%F).sql" + bashio::log.info "A backup of your database will be stored in: ${backup}" + + # Start internal MySQL server temperorary + bashio::log.info "Initializing previous database..." # Start MySQL. s6-setuidgid mysql /usr/bin/mysqld --datadir /data/mysql --tmpdir /tmp/ & rc="$?" pid="$!" if [ "$rc" -ne 0 ]; then - bashio::exit.nok "Failed to start the database." + bashio::exit.nok "Failed to start the previous database." fi # Wait until it is ready. @@ -32,20 +52,6 @@ if ! bashio::fs.directory_exists "/data/mysql/mysql"; then sleep 1 done - # Secure the installation. - mysql <<-EOSQL - SET @@SESSION.SQL_LOG_BIN=0; - - DELETE FROM - mysql.user - WHERE - user NOT IN ('mysql.sys', 'mysqlxsys', 'root', 'mysql') - OR host NOT IN ('localhost'); - - DROP DATABASE IF EXISTS test; - FLUSH PRIVILEGES; -EOSQL - # Check data integrity and fix corruptions. mysqlcheck \ --no-defaults \ @@ -74,15 +80,19 @@ EOSQL > /dev/null \ || true - # Create the database. - echo "CREATE DATABASE IF NOT EXISTS \`nginxproxymanager\` ;" | mysql + # Dump current database into backups folder + bashio::log.info "Backing up previous database..." - # Create the user. - echo "CREATE USER 'nginxproxymanager'@'%' IDENTIFIED BY 'nginxproxymanager' ;" | mysql - echo "GRANT ALL ON \`nginxproxymanager\`.* TO 'nginxproxymanager'@'%' ;" | mysql + mysqldump --single-transaction --quick --no-create-db --lock-tables nginxproxymanager \ + > "${backup}" # Stop the MySQL server - if ! kill -s TERM "$pid" || ! wait "$pid"; then - bashio::exit.nok "Initialization of database failed." - fi + kill -s TERM "$pid" || true + + # Load up database to the core mariadb + mysql -h "${host}" -P "${port}" -u "${username}" -p"${password}" \ + nginxproxymanager < "${backup}" + + # Delete local MySQL data folder + rm -f -r /data/mysql fi diff --git a/proxy-manager/rootfs/etc/cont-init.d/npm.sh b/proxy-manager/rootfs/etc/cont-init.d/npm.sh index 9f46373e..58ef10c0 100644 --- a/proxy-manager/rootfs/etc/cont-init.d/npm.sh +++ b/proxy-manager/rootfs/etc/cont-init.d/npm.sh @@ -3,6 +3,12 @@ # Home Assistant Community Add-on: Nginx Proxy Manager # This file applies patches so the add-on becomes compatible # ============================================================================== +declare mysql_host +declare mysql_password +declare mysql_port +declare mysql_username +declare query + # Redirect log output to the Hass.io add-on log sed -i 's#/data/logs/error.log#/proc/1/fd/1#g' /etc/nginx/nginx.conf sed -i 's#/data/logs/default.log#/proc/1/fd/1#g' /etc/nginx/nginx.conf @@ -111,3 +117,20 @@ then -out /data/nginx/dummycert.pem \ || bashio::exit.nok "Could not generate dummy certificate" fi + +# Set up database connection +mysql_host=$(bashio::services "mysql" "host") +mysql_password=$(bashio::services "mysql" "password") +mysql_port=$(bashio::services "mysql" "port") +mysql_username=$(bashio::services "mysql" "username") + +query=".database.engine = \"mysql\" + | .database.host = \"${mysql_host}\" + | .database.name = \"nginxproxymanager\" + | .database.user = \"${mysql_username}\" + | .database.password = \"${mysql_password}\" + | .database.port = ${mysql_port}" + +# shellcheck disable=SC2094 +cat <<< "$(jq "${query}" /data/manager/production.json)" \ + > /data/manager/production.json diff --git a/proxy-manager/rootfs/etc/services.d/manager/run b/proxy-manager/rootfs/etc/services.d/manager/run index 36b222b8..28250a6e 100755 --- a/proxy-manager/rootfs/etc/services.d/manager/run +++ b/proxy-manager/rootfs/etc/services.d/manager/run @@ -5,9 +5,6 @@ # ============================================================================== declare -a options -# Wait for MySQL to become available -bashio::net.wait_for 3306 - bashio::log.info "Starting the Manager..." options+=(--abort_on_uncaught_exception) diff --git a/proxy-manager/rootfs/etc/services.d/mysql/finish b/proxy-manager/rootfs/etc/services.d/mysql/finish deleted file mode 100644 index 2619653e..00000000 --- a/proxy-manager/rootfs/etc/services.d/mysql/finish +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/execlineb -S0 -# ============================================================================== -# Home Assistant Community Add-on: Nginx Proxy Manager -# Take down the S6 supervision tree when the MySQL server fails -# ============================================================================== -if -n { s6-test $# -ne 0 } -if -n { s6-test ${1} -eq 256 } - -s6-svscanctl -t /var/run/s6/services diff --git a/proxy-manager/rootfs/etc/services.d/mysql/run b/proxy-manager/rootfs/etc/services.d/mysql/run deleted file mode 100755 index fdcd0a44..00000000 --- a/proxy-manager/rootfs/etc/services.d/mysql/run +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/with-contenv bashio -# ============================================================================== -# Home Assistant Community Add-on: Nginx Proxy Manager -# Runs the MySQL database server -# ============================================================================== -declare -a options - -bashio::log.info "Starting MySQL database server..." - -options+=(--datadir /data/mysql) -options+=(--tmpdir /tmp/) - -exec s6-setuidgid mysql /usr/bin/mysqld "${options[@]}"