214 lines
7.5 KiB
Bash
Executable File
214 lines
7.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
###############################################################################
|
|
# #
|
|
# Nextcloud automatic installation script #
|
|
# #
|
|
# Designed for stressed VUAs with little to no wish to copypaste a gadzillion #
|
|
# UNIX commands. #
|
|
# #
|
|
# Copyright (c) 2020 - Bryan Pedini #
|
|
# Licensed under the Gnu General Public License 3.0 (or later), see the #
|
|
# LICENSE file for more details #
|
|
# #
|
|
###############################################################################
|
|
|
|
_parse_params() {
|
|
VERBOSE=true
|
|
VERSION="18.0.4"
|
|
INSTALL_DIR="/var/www/nextcloud"
|
|
NO_CONFIGURE_MARIADB=false
|
|
DATABASE_NAME="nextcloud"
|
|
DATABASE_USER="nextcloud_admin"
|
|
for par in "$@"; do
|
|
case "$par" in
|
|
"-h" | "--help" | "--usage")
|
|
_print_usage
|
|
;;
|
|
"-q" | "--quiet")
|
|
VERBOSE=false
|
|
shift
|
|
;;
|
|
"--version")
|
|
[[ -z "$2" ]] && _print_usage "Version not specified" 1
|
|
[[ "$2:0:1" = "-" ]] && _print_usage
|
|
VERSION="$2"
|
|
shift
|
|
shift
|
|
;;
|
|
"--install-dir")
|
|
[[ -z "$2" ]] && _print_usage "Installation directory not \
|
|
specified" 1
|
|
[[ "$2:0:1" = "-" ]] && _print_usage
|
|
INSTALL_DIR="$2"
|
|
shift
|
|
shift
|
|
;;
|
|
"--no-configure-mariadb")
|
|
NO_CONFIGURE_MARIADB=true
|
|
shift
|
|
;;
|
|
"--database-name")
|
|
[[ -z "$2" ]] && _print_usage "Database name not speficied" 1
|
|
[[ "$2:0:1" = "-" ]] && _print_usage
|
|
DATABASE_NAME="$2"
|
|
shift
|
|
shift
|
|
;;
|
|
"--database-user")
|
|
[[ -z "$2" ]] && _print_usage "Database admin user not \
|
|
specified" 1
|
|
[[ "$2:0:1" = "-" ]] && _print_usage
|
|
DATABASE_USER="$2"
|
|
shift
|
|
shift
|
|
;;
|
|
*)
|
|
_print_usage "Argument not recognized: $1" 1
|
|
esac
|
|
done
|
|
}
|
|
|
|
# Usage explaination printed to console
|
|
_print_usage() {
|
|
echo "Usage: $0 [OPTIONS]"
|
|
echo
|
|
echo "OPTIONS:"
|
|
echo " -h, --help, --usage Prints this help message and exits"
|
|
echo " -q, --quiet Turns off verbose logging (default: False)"
|
|
echo " --version Install a custom version of Nextcloud
|
|
(default: $VERSION)"
|
|
echo " --install-dir Specifies a custom path for installation
|
|
(default: \"/var/www/nextcloud\")"
|
|
echo " --no-configure-mariadb Does not launch the default MariaDB server
|
|
configuration scriptlet (default: False)"
|
|
echo " --database-name Specifies a custom database name
|
|
(default: \"nextcloud\")"
|
|
echo " --database-user Specifies a custom database admin user
|
|
(default \"nextcloud_admin\")"
|
|
|
|
if [ "$1" ]; then
|
|
echo
|
|
echo "Error: $1"
|
|
if [ "$2" ]; then
|
|
exit $2
|
|
fi
|
|
fi
|
|
exit 0
|
|
}
|
|
|
|
# Update current system
|
|
_update_system() {
|
|
[[ "$VERBOSE" = true ]] && echo "Updating current system"
|
|
ERR=$( { apt update 1>/dev/null; } 2>&1 | grep -v "stable CLI interface" )
|
|
[[ "$ERR" ]] && echo "Error during package cache update: $ERR"
|
|
ERR=$( { apt -y upgrade 1>/dev/null; } 2>&1 | grep -v \
|
|
"stable CLI interface" )
|
|
[[ "$ERR" ]] && echo "Error during system package updates: $ERR"
|
|
}
|
|
|
|
# Create required folders and set correct permissions
|
|
_configure_permissions() {
|
|
[[ "$VERBOSE" = true ]] && echo "Creating required folders and setting \
|
|
correct permissions"
|
|
mkdir -p "$INSTALL_DIR"/{public,data}
|
|
chown -R www-data:www-data "$INSTALL_DIR"
|
|
}
|
|
|
|
# Ask the user for mysql `root` password and configure mysql in unattended mode
|
|
_configure_mariadb_server() {
|
|
read -sp 'Please type a `root` password for mysql database: ' \
|
|
MYSQL_ROOT_PASSWORD && echo ""
|
|
|
|
[[ "$VERBOSE" = true ]] && echo "Configuring mysql in unattended mode"
|
|
ERR=$( { apt -y install expect >/dev/null; } 2>&1 | grep -v \
|
|
"stable CLI interface" )
|
|
[[ "$ERR" ]] && echo "Error during package installations: $ERR"
|
|
SECURE_MYSQL=$(expect -c "
|
|
set timeout 10
|
|
spawn mysql_secure_installation
|
|
expect \"Enter current password for root (enter for none):\"
|
|
send \"\r\"
|
|
expect \"Set root password?\"
|
|
send \"y\r\"
|
|
expect \"New password:\"
|
|
send \"$MYSQL_ROOT_PASSWORD\r\"
|
|
expect \"Re-enter new password:\"
|
|
send \"$MYSQL_ROOT_PASSWORD\r\"
|
|
expect \"Remove anonymous users?\"
|
|
send \"y\r\"
|
|
expect \"Disallow root login remotely?\"
|
|
send \"y\r\"
|
|
expect \"Remove test database and access to it?\"
|
|
send \"y\r\"
|
|
expect \"Reload privilege tables now?\"
|
|
send \"y\r\"
|
|
expect eof
|
|
")
|
|
ERR=$( { echo "$SECURE_MYSQL" 1>/dev/null; } 2>&1 )
|
|
[[ "$ERR" ]] && echo "Error during mysql_initialization: $ERR"
|
|
ERR=$( { apt -y remove --purge expect >/dev/null; } 2>&1 | \
|
|
grep -v "stable CLI interface" )
|
|
[[ "$ERR" ]] && echo "Error during package removals: $ERR"
|
|
|
|
unset SECURE_MYSQL
|
|
}
|
|
|
|
# Create Nextcloud database with associated login
|
|
_configure_database() {
|
|
[[ "$VERBOSE" = true ]] && echo "Creating Nextcloud database with \
|
|
associated login"
|
|
MYSQL_ROOT_USER="root"
|
|
QUERY="command=password&format=plain&scheme=rrnnnrrnrnnnrrnrnnrr"
|
|
MYSQL_USER_PASSWORD=$(curl -s \
|
|
"https://www.passwordrandom.com/query?$QUERY")
|
|
SQL="CREATE DATABASE nextcloud;"
|
|
mysql -u$MYSQL_ROOT_USER -p$MYSQL_ROOT_PASSWORD -e "$SQL"
|
|
SQL="GRANT ALL PRIVILEGES ON nextcloud.* TO nextcloud_admin@localhost
|
|
IDENTIFIED BY '$MYSQL_USER_PASSWORD';"
|
|
mysql -u$MYSQL_ROOT_USER -p$MYSQL_ROOT_PASSWORD -e "$SQL"
|
|
SQL="FLUSH PRIVILEGES;"
|
|
mysql -u$MYSQL_ROOT_USER -p$MYSQL_ROOT_PASSWORD -e "$SQL"
|
|
|
|
unset SQL; unset MYSQL_ROOT_USER; unset MYSQL_ROOT_PASSWORD; unset QUERY
|
|
}
|
|
|
|
# Configure Apache2 to run the website
|
|
_configure_apache2() {
|
|
# Ask the user for Apache2 FQDN hostname
|
|
read -p 'Please type the FQDN Nextcloud should run on: ' \
|
|
HOSTNAME && echo ""
|
|
|
|
[[ "$VERBOSE" = true ]] && echo "Configuring Apache2 to run the website"
|
|
cat << "EOF" > /etc/apache2/sites-available/cloud.conf
|
|
<VirtualHost *:80>
|
|
ServerName $HOSTNAME
|
|
DocumentRoot "$INSTALL_DIR/public"
|
|
|
|
<Directory "$INSTALL_DIR/public">
|
|
Allow from all
|
|
Require all granted
|
|
</Directory>
|
|
|
|
ErrorLog $INSTALL_DIR/error.log
|
|
CustomLog $INSTALL_DIR/access.log combined
|
|
</VirtualHost>
|
|
EOF
|
|
unset HOSTNAME; unset INSTALL_DIR
|
|
}
|
|
|
|
# Main program function, calls all other functions in the correct order
|
|
_main() {
|
|
_update_system
|
|
_configure_permissions
|
|
[[ "$NO_CONFIGURE_MARIADB" = false ]] && _configure_mariadb_server
|
|
_configure_database
|
|
_download_website
|
|
_configure_apache2
|
|
_enable_site
|
|
}
|
|
|
|
# Program execution
|
|
_parse_params $@
|
|
_main
|