#!/bin/bash #################################### # # Nextcloud Install script. # #################################### # Check if user is root or sudo if ! [ $( id -u ) = 0 ]; then echo -e "${RED}Please run the nextcloud script as sudo or root user. ${NC}" exit 1 fi # Output colors YELLOW='\033[1;33m' BLUE='\033[0;34m' RED='\033[0;31m' GREEN='\033[0;32m' NC='\033[0m' # Log Location LOG="/tmp/nextcloud-install.log" # Initialize variable values NCdomainName="" NCIP="" mysqlRootPwd=$(openssl rand -base64 24) NCDbName=nextcloud NCAdmin=ncadmin NCPass=$(openssl rand -base64 18) DbUser=nextcloud_dbadmin DbPwd=$(openssl rand -base64 24) OS=$(lsb_release -i | cut -f 2-) PHP=/etc/php/*/apache2/php.ini #clean terminal clear echo -e "${YELLOW}Welcome to my Nextcloud install script.\nThe script will automatically setup:\n \n${BLUE} - SSL with a self sign certificate. \n - Enable memcache APCu local Caching.\n - Enable Redis for database transactional locking.\n - Setup Nextcloud PHP Recommendations.\n - Enable Pretty URl's.\n - Setup Cron for background tasks.\n - Enabling Bruteforce protection.\n ${NC}" echo"" #Collect read -p "Enter Nextcloud Server's hostname - e.g cloud.example.com: " NCdomainName read -p "Enter your Server's IP Address: " NCIP #change hostname sudo hostnamectl set-hostname "${NCdomainName}" #seed Mysql install values debconf-set-selections <<< "mysql-server mysql-server/root_password password ${mysqlRootPwd}" debconf-set-selections <<< "mysql-server mysql-server/root_password_again password ${mysqlRootPwd}" #update OS echo -e "${YELLOW}Updating your ${OS} OS.. ${NC}" export DEBIAN_FRONTEND=noninteractive apt update -y && apt upgrade -y && apt dist-upgrade -y &>> ${LOG} apt install -y wget &>> ${LOG} #clear command line clear #download nextcloud echo -e "${YELLOW}Downloading Nextcloud.. ${NC}" wget https://download.nextcloud.com/server/releases/latest.zip if [ $? -ne 0 ]; then echo -e "${RED}Failed to download nextcloud" 1>&2 exit 1 fi echo -e "${GREEN}Downloaded Nextcloud${NC}" #install Mariadb echo -e "${YELLOW}Installing Database ...${NC}" sudo apt install mariadb-server -y &>> ${LOG} if [ $? -ne 0 ]; then echo -e "${RED}Failed to install mariadb-server" 1>&2 exit 1 fi echo -e "${GREEN}Downloaded MariaDB Server${NC}" #secure mariadb echo -e "${YELLOW}Securing your Database.. ${NC}" echo > mysql_secure_installation.sql << EOF UPDATE mysql.user SET Password=PASSWORD('${mysqlRootPwd}') WHERE User='root'; DELETE FROM mysql.user WHERE User=''; DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1'); DROP DATABASE IF EXISTS test; DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%'; FLUSH PRIVILEGES; EOF if [ $? -ne 0 ]; then echo -e "${RED}Failed to secure database " 1>&2 exit 1 fi echo -e "${GREEN}Secured database successfully${NC}" # Create database & user and set permissions CODE=" DROP DATABASE IF EXISTS ${NCDbName}; CREATE DATABASE IF NOT EXISTS ${NCDbName}; CREATE USER IF NOT EXISTS '${DbUser}'@'localhost' IDENTIFIED BY \"${DbPwd}\"; GRANT ALL PRIVILEGES ON ${NCDbName}.* TO '${DbUser}'@'localhost'; FLUSH PRIVILEGES;" # Execute SQL code echo -e "${YELLOW}Creating and setting up your Nextcloud Database${NC}" echo ${CODE} | mysql -u root -p${mysqlRootPwd} if [ $? -ne 0 ]; then echo -e "${RED}Failed to create and setup Nextcloud database " 1>&2 exit 1 fi echo -e "${GREEN}Setting up Nextcloud database completed successfully${NC}" #install required packages echo -e "${YELLOW}Installing required Nextcloud packages in the background, this may take a while ..${NC}" sudo apt install apache2 php php-apcu php-bcmath php-cli php-common php-curl php-gd php-gmp php-imagick php-intl php-mbstring php-mysql php-zip php-xml unzip php-imagick redis php-redis imagemagick cron -y > /dev/null 2>&1 &>> ${LOG} if [ $? -ne 0 ]; then echo -e "${RED}Failed to install required package" 1>&2 exit 1 fi echo -e "${GREEN}Installing packages completed successfully${NC}" #configure php extensions sudo phpenmod bcmath gmp imagick intl -y &>> ${LOG} if [ $? -ne 0 ]; then echo -e "${RED}Failed to setup php extenions" 1>&2 exit 1 fi echo -e "${GREEN}PHP extensions setup successfully completed${NC}" #Setup Nextcloud echo -e "${YELLOW}Setting up Apache and Nextcloud files ..\n This may take some time..${NC}" unzip latest.zip > /dev/null 2>&1 #Rename Nexcloud directory mv nextcloud ${NCdomainName} #set folder permissions sudo chown -R www-data:www-data ${NCdomainName} #Move Nextcloud folder to apache dir sudo mv ${NCdomainName} /var/www #Disable default apache site sudo a2dissite 000-default.conf > /dev/null 2>&1 &>> ${LOG} #create host config file cat > /etc/apache2/sites-available/${NCdomainName}.conf << EOF DocumentRoot /var/www/${NCdomainName}/ ServerName ${NCdomainName} Require all granted AllowOverride All Options FollowSymLinks MultiViews Dav off DocumentRoot "/var/www/${NCdomainName}" Header add Strict-Transport-Security: "max-age=15552000;includeSubdomains" ServerAdmin admin@${NCdomainName} ServerName ${NCdomainName} Options Indexes FollowSymLinks AllowOverride None Require all granted Satisfy Any Include /var/www/${NCdomainName}/.htaccess Require all denied Require all denied Dav off Require all denied SetEnv HOME /var/www/${NCdomainName} SetEnv HTTP_HOME /var/www/${NCdomainName} TraceEnable off RewriteEngine On RewriteCond %{REQUEST_METHOD} ^TRACK RewriteRule .* - [R=405,L] # Avoid "Sabre\DAV\Exception\BadRequest: expected filesize XXXX got XXXX" RequestReadTimeout body=0 # Avoid zero byte files (only works in Ubuntu 22.04 -->>) SetEnv proxy-sendcl 1 TransferLog /var/log/apache2/${NCdomainName}.log ErrorLog /var/log/apache2/${NCdomainName}.error.log # Intermediate configuration SSLEngine on SSLCompression off SSLProtocol -all +TLSv1.2 +TLSv1.3 SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20> SSLHonorCipherOrder off SSLSessionTickets off ServerSignature off SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key EOF NCdataPath="/var/www/${NCdomainName}/data" #enable site sudo a2ensite ${NCdomainName}.conf > /dev/null 2>&1 &>> ${LOG} #enable required php modules sudo a2enmod dir env headers mime rewrite ssl > /dev/null 2>&1 &>> ${LOG} # Install Nextcloud echo -e "${YELLOW}Installing Nextcloud, it might take a while..." cd /var/www/${NCdomainName} sudo -u www-data php /var/www/"${NCdomainName}"/occ maintenance:install \ --data-dir="$NCdataPath" \ --database=mysql \ --database-name=$NCDbName \ --database-user="$DbUser" \ --database-pass="$DbPwd" \ --admin-user="$NCAdmin" \ --admin-pass="$NCPass" if [ $? -ne 0 ]; then echo -e "${RED}Failed to run maintenance install" 1>&2 exit 1 fi echo -e "${GREEN}Maintenance install successfully completed${NC}" #create and setup nextcloud logging. echo -e "${YELLOW}Setting Up Nextcloud Admin Logging .." touch /var/log/nextcloud.log chown www-data:www-data /var/log/nextcloud.log sleep 2 sudo -u www-data php /var/www/${NCdomainName}/occ config:system:set log_type --value="file" sudo -u www-data php /var/www/${NCdomainName}/occ config:system:set logfile --value="/var/log/nextcloud.log" sudo -u www-data php /var/www/${NCdomainName}/occ config:system:set loglevel --value="2" sudo -u www-data php /var/www/${NCdomainName}/occ app:enable admin_audit sudo -u www-data php /var/www/${NCdomainName}/occ config:app:set admin_audit logfile --value="/var/log/nextcloud.log" sudo -u www-data php /var/www/${NCdomainName}/occ config:system:set logfile_audit --value="/var/log/nextcloud.log" #enable external share support and install php-smbclient sudo -u www-data php /var/www/${NCdomainName}/occ app:enable files_external if [[ "$OS" == "Ubuntu" ]]; then echo -e "${YELLOW}Installing PHP SMB Support for ${OS}" 1>&2 sudo DEBIAN_FRONTEND=noninteractive apt install -y php-smbclient elif [[ "$OS" == "Debian" ]]; then echo -e "${YELLOW}Installing PHP SMB Support for ${OS}" 1>&2 sudo DEBIAN_FRONTEND=noninteractive apt install -y smbclient else echo -e "${RED}Could not determine OS skipping PHP SMB Install" 1>&2 fi #Set nextcloud to use cron instead of Ajax #sudo crontab -u www-data -l | { cat; echo "*/5 * * * * php -f /var/www/${NCdomainName}/cron.php"; } | sudo crontab -u www-data - > /dev/null 2>&1 sudo crontab -u www-data -l | { cat; echo "*/5 * * * * php -f /var/www/${NCdomainName}/cron.php > /dev/null 2>&1"; } | sudo crontab -u www-data - #update cron sudo -u www-data php /var/www/${NCdomainName}/occ config:system:set maintenance_window_start --value=“15” #enable pretty url's echo -e "${YELLOW}Enabling pretty url's. ${NC}" sudo -u www-data php /var/www/${NCdomainName}/occ config:system:set htaccess.RewriteBase --value="/" sudo -u www-data php /var/www/${NCdomainName}/occ maintenance:update:htaccess #securing web ui from bruteforce echo -e "${YELLOW}Enabling bruteforce protection.${NC}" sudo -u www-data php /var/www/${NCdomainName}/occ config:system:set auth.bruteforce.protection.enabled --value="true" #set truested domains echo -e "${YELLOW}Enabling trusted domains.${NC}" #sudo -u www-data php /var/www/${NCdomainName}/occ config:system:set trusted_domains 0 --value="127.0.0.1" sudo -u www-data php /var/www/${NCdomainName}/occ config:system:set trusted_domains 1 --value="${NCdomainName}" sudo -u www-data php /var/www/${NCdomainName}/occ config:system:set trusted_domains 2 --value="${NCIP}" #fix directory issue nextcloud 29.0.1 sudo -u www-data php /var/www/${NCdomainName}/occ config:system:set overwritehost --value="${NCIP}" sudo -u www-data php /var/www/${NCdomainName}/occ config:system:set overwriteprotocol --value="https" sudo -u www-data php /var/www/${NCdomainName}/occ config:system:set overwrite.cli.url --value="https://${NCdomainName}" #set php recommended Configurations echo -e "${YELLOW}Enabling PHP Recommendations for Nextcloud.${NC}" sudo sed -i "s:memory_limit = .*:memory_limit = 512M:" $PHP sudo sed -i "s:upload_max_filesize = .*:upload_max_filesize = 200M:" $PHP sudo sed -i "s:max_execution_time = .*:max_execution_time = 360:" $PHP sudo sed -i "s:post_max_size = .*:post_max_size = 200M:" $PHP sudo sed -i "s:;opcache.interned_strings_buffer=.*:opcache.interned_strings_buffer=16:" $PHP sudo sed -i "s:;opcache.max_accelerated_files=.*:opcache.max_accelerated_files=10000:" $PHP sudo sed -i "s:;opcache.memory_consumption=.*:opcache.memory_consumption=128:" $PHP sudo sed -i "s:;opcache.save_comments=.*:opcache.save_comments=1:" $PHP sudo sed -i "s:;opcache.revalidate_freq=.*:opcache.revalidate_freq=1:" $PHP #add and fix for memcache local sudo sed -i -e $'$a\\[nextcloud]' /etc/php/*/mods-available/apcu.ini sudo sed -i -e $'$a\\apc.enable_cli = 1' /etc/php/*/mods-available/apcu.ini sudo sed -i -e $'$a\\memory_limit = 512M' /etc/php/*/mods-available/apcu.ini #setup Caching echo -e "${YELLOW}Setting Up Caching..${NC}" sudo usermod -a -G redis www-data sleep 5 sudo -u www-data php /var/www/${NCdomainName}/occ config:system:set filelocking.enabled --value="true" sleep 5 sudo -u www-data php /var/www/${NCdomainName}/occ config:system:set memcache.local --value="\OC\Memcache\APCu" sleep 5 sudo -u www-data php /var/www/${NCdomainName}/occ config:system:set memcache.locking --value="\OC\Memcache\Redis" sudo -u www-data php /var/www/${NCdomainName}/occ config:system:set memcache.distributed --value="\OC\Memcache\Redis" sudo -u www-data php /var/www/${NCdomainName}/occ config:system:set redis host --value="localhost" sudo -u www-data php /var/www/${NCdomainName}/occ config:system:set redis port --value="6379" sudo -u www-data php /var/www/${NCdomainName}/occ config:system:set redis timeout --value="0.0" #configure theming sudo -u www-data php /var/www/${NCdomainName}/occ theming:config name ${NCdomainName} sudo -u www-data php /var/www/${NCdomainName}/occ theming:config url https://${NCdomainName} #restart apache2 echo -e "${YELLOW}Restarting Apache service.${NC}" sudo systemctl restart apache2 > /dev/null 2>&1 &>> ${LOG} if [ $? -ne 0 ]; then echo -e "${RED}Failed to restart Apache service" 1>&2 exit 1 fi echo -e "${GREEN}Restarting Apache Service successfully completed${NC}" #installtion clean up echo -e "${YELLOW}Cleaning up installation temp files ....${NC}" sudo rm -rf latest.zip sudo rm -rf mysql_secure_installation.sql echo"" echo -e "${BLUE}Nextcloud installation and setup complete\n- Visit: https://${NCIP} or https://${NCdomainName}\n Admin username: ${NCAdmin}\n Admin password: ${NCPass}\n\n Database root user password: ${mysqlRootPwd} \n Database User: ${DbUser} \n Database user password: ${DbPwd}\n\n ${GREEN}Thank you for using my script and being part of the geek2gether community.${NC}"