| @@ -0,0 +1,211 @@ | |||
| #!/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 # | |||
| # # | |||
| ############################################################################### | |||
| _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" | |||
| } | |||
| # 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 | |||
| } | |||
| # 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" | |||
| } | |||
| # 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 | |||