debian-nextcloud/install.sh

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