__nextcloud: migrate if the database type change
This adds a migration progess if the database type changes automaticly.
This commit is contained in:
parent
facb204749
commit
809ad7aa9d
2 changed files with 89 additions and 8 deletions
|
@ -113,13 +113,22 @@ database-type
|
|||
**This parameter defaults to the SQLite database backend, as it is the
|
||||
simplest one to setup and do not require extra parameters.**
|
||||
|
||||
If this parameter change, the type will migrate to the new database type.
|
||||
It will not work for SQLite because the upstream migration script does not
|
||||
support it. **Be aware that migrations take there time, plan at minimum
|
||||
40 seconds of migration for a stock installation.**
|
||||
|
||||
database-host
|
||||
The database host to connect to. Possible are hostnames, ip addresses or
|
||||
UNIX sockets. UNIX sockets must set in the format of
|
||||
``localhost:/path/to/socket``. If an non-standard port is used, set it
|
||||
after the hostname or ip address seperated by an colon (``:``).
|
||||
after the hostname or ip address seperated by an colon (``:``). If this
|
||||
value is not set, nextcloud defaults to the value ``localhost``.
|
||||
|
||||
If this value is not set, nextcloud defaults to the value ``localhost``.
|
||||
This type will not migrate data if the type does not change. You must do
|
||||
this manually by setting the maintainer mode (to avoid data changes) and
|
||||
then cloning the database to the new destination. After that, run cdist to
|
||||
apply the config changes. It should automaticly remove the maintainer mode.
|
||||
|
||||
database-name
|
||||
The name of the database to connect to. Required if MariaDB or PostgreSQL
|
||||
|
@ -173,6 +182,9 @@ nextcloud configuration is broken and must be resolved manually: Move the data
|
|||
directory to the correct location or change the configuration to point to the
|
||||
old destination and retry.
|
||||
|
||||
It aborts if it should migrate to a SQLite database. This will be done before
|
||||
the upstream migration script is executed, as it would throw the same error.
|
||||
|
||||
|
||||
EXAMPLES
|
||||
--------
|
||||
|
|
|
@ -7,6 +7,21 @@
|
|||
# explorer.
|
||||
|
||||
|
||||
# Print the value of the given configuration.
|
||||
#
|
||||
# Arguments:
|
||||
# 1: the nextcloud configuration name
|
||||
#
|
||||
# Returns with a unsuccessful return code if no parameter found.
|
||||
getparam() {
|
||||
awk -v FS=" = " -v name="$1" '
|
||||
function ntostring(n) { ret=""; for(i=n; i<=NF; i++) ret=ret $i (i<NF ? OFS : ""); return ret }
|
||||
$1 == name { print ntostring(2); success = 1 }
|
||||
END { if(!success) exit 4 }
|
||||
' "$__object/explorer/config"
|
||||
return $?
|
||||
}
|
||||
|
||||
# Test if the value exists as given.
|
||||
#
|
||||
# Arguments:
|
||||
|
@ -194,6 +209,44 @@ conf_array() {
|
|||
fi
|
||||
}
|
||||
|
||||
# Migrate the database to a new database type
|
||||
#
|
||||
# Arguments:
|
||||
# 1: the database type to convert to
|
||||
migrate_db() {
|
||||
# from argument
|
||||
database_type="$1"
|
||||
|
||||
# hostname, database, username and password
|
||||
database_host="$(cat "$__object/parameter/database-host" 2>/dev/null || printf "localhost")"
|
||||
database_name="$(cat "$__object/parameter/database-name")"
|
||||
database_user="$(cat "$__object/parameter/database-user")"
|
||||
database_pass="$(cat "$__object/parameter/database-password")"
|
||||
|
||||
# Extract the port from the host
|
||||
# this is required for pgsql, but mysql can do it itself, too
|
||||
if printf "%s" "$database_host" | grep -q ":[[:digit:]]\+$"; then
|
||||
# extract the last part, which is the port number
|
||||
database_port="${database_host##*:}"
|
||||
else
|
||||
# set default port because the tool can not do this for pgsql
|
||||
case "$database_type" in
|
||||
mysql)
|
||||
database_port=3306
|
||||
;;
|
||||
pgsql)
|
||||
database_port=5432
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# print out the correct command
|
||||
printf "php occ db:convert-type --no-interaction --no-ansi --clear-schema --all-apps \
|
||||
'%s' '%s' --password '%s' '%s' --port '%u' '%s'\n" \
|
||||
"$database_type" "$database_user" "$database_pass" "$database_host" "$database_port" "$database_name"
|
||||
}
|
||||
|
||||
|
||||
# Set the install variable if nextcloud was not installed before this type.
|
||||
if ! testparam installed 1; then
|
||||
install="yes"
|
||||
|
@ -210,19 +263,35 @@ conf_array host trusted_domains
|
|||
# Already set via the installer
|
||||
# set default values from the nextcloud installer to do not override them
|
||||
if [ -z "$install" ]; then
|
||||
# database
|
||||
# Database to check if the type changed
|
||||
# use the current type if no old type found to match instead of migrate
|
||||
database_type="$(cat "$__object/parameter/database-type")"
|
||||
old_db_type="$(getparam dbtype || printf "%s" "$database_type")"
|
||||
|
||||
case "$database_type" in
|
||||
sqlite3)
|
||||
if [ "$old_db_type" != "sqlite3" ]; then
|
||||
echo "Migrating to a SQLite database is not supported by upstream!" >&2
|
||||
echo "Do it manually or reinstall nextcloud .." >&2
|
||||
exit 1
|
||||
fi
|
||||
conf_string database-type dbtype
|
||||
;;
|
||||
|
||||
mysql|pgsql)
|
||||
conf_string database-type dbtype
|
||||
if [ "$old_db_type" != "$database_type" ]; then
|
||||
# the migration will change all database parameters itself
|
||||
migrate_db "$database_type"
|
||||
else
|
||||
# no change of dbtype cause it will cause a migration
|
||||
conf_string database-host dbhost installdef "localhost"
|
||||
conf_string database-name dbname required
|
||||
conf_string database-user dbuser required
|
||||
conf_string database-password dbpassword required
|
||||
fi
|
||||
|
||||
# It may not be a good idea to change this parameter, but do what
|
||||
# the user want to do.
|
||||
conf_string database-prefix dbtableprefix
|
||||
;;
|
||||
|
||||
|
|
Loading…
Reference in a new issue