vm/testing/nextcloud_install_testing.sh
2016-06-13 22:50:45 +02:00

563 lines
15 KiB
Bash

#!/bin/bash
# Tech and Me, ©2016 - www.techandme.se
#
# This install from Nextcloud daily build with PHP 7, MySQL 5.7 and Apche 2.4.
# Ubuntu 16.04 is required.
set -e
# Ubuntu version
DISTRO=$(grep -ic "Ubuntu 16.04 LTS" /etc/lsb-release)
# Nextcloud apps
CONVER=v1.3.0.0
CONVER_FILE=contacts.tar.gz
CONVER_REPO=https://github.com/nextcloud/contacts/releases/download
CALVER=v1.3.0
CALVER_FILE=calendar.tar.gz
CALVER_REPO=https://github.com/nextcloud/calendar/releases/download
# Passwords
SHUF=$(shuf -i 13-15 -n 1)
MYSQL_PASS=$(cat /dev/urandom | tr -dc "a-zA-Z0-9@#*=" | fold -w $SHUF | head -n 1)
PW_FILE=/var/mysql_password.txt
# Directories
SCRIPTS=/var/scripts
HTML=/var/www/html
NCPATH=$HTML/nextcloud
NCDATA=/var/ncdata
# Apache vhosts
SSL_CONF="/etc/apache2/sites-available/nextcloud_ssl_domain_self_signed.conf"
HTTP_CONF="/etc/apache2/sites-available/nextcloud_http_domain_self_signed.conf"
# Network
IFACE=$(lshw -c network | grep "logical name" | awk '{print $3}')
ADDRESS=$(hostname -I | cut -d ' ' -f 1)
# Repositories
GITHUB_REPO="https://raw.githubusercontent.com/nextcloud/vm"
STATIC="https://raw.githubusercontent.com/nextcloud/vm/master/static"
NCDAILY="https://download.nextcloud.com/server/daily/"
DAILYVERSION="nextcloud-9-daily-2016-06-13"
# Commands
CLEARBOOT=$(dpkg -l linux-* | awk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e [0-9] | xargs sudo apt-get -y purge)
# Linux user, and Nextcloud user
UNIXUSER=ncadmin
UNIXPASS=nextcloud
# Check if root
if [ "$(whoami)" != "root" ]; then
echo
echo -e "\e[31mSorry, you are not root.\n\e[0mYou must type: \e[36msudo \e[0mbash $SCRIPTS/nextcloud_install_production.sh"
echo
exit 1
fi
# Check Ubuntu version
if [ $DISTRO -eq 1 ]
then
echo "Ubuntu 16.04 LTS OK!"
else
echo "Ubuntu 16.04 LTS is required to run this script."
echo "Please install that distro and try again."
exit 1
fi
# Check if repo is available
if wget -q --spider "$NCDAILY" > /dev/null; then
echo "Nextcloud repo OK"
else
echo "Nextcloud repo is not available, exiting..."
exit 1
fi
# Check if it's a clean server
echo "Checking if it's a clean server..."
if [ $(dpkg-query -W -f='${Status}' mysql-common 2>/dev/null | grep -c "ok installed") -eq 1 ];
then
echo "MySQL is installed, it must be a clean server."
exit 1
fi
if [ $(dpkg-query -W -f='${Status}' apache2 2>/dev/null | grep -c "ok installed") -eq 1 ];
then
echo "Apache2 is installed, it must be a clean server."
exit 1
fi
if [ $(dpkg-query -W -f='${Status}' php 2>/dev/null | grep -c "ok installed") -eq 1 ];
then
echo "PHP is installed, it must be a clean server."
exit 1
fi
if [ $(dpkg-query -W -f='${Status}' nextcloud 2>/dev/null | grep -c "ok installed") -eq 1 ];
then
echo "Nextcloud is installed, it must be a clean server."
exit 1
fi
if [ $(dpkg-query -W -f='${Status}' ubuntu-server 2>/dev/null | grep -c "ok installed") -eq 0 ];
then
echo "'ubuntu-server' is not installed, this doesn't seem to be a server."
echo "Please install the server version of Ubuntu and restart the script"
exit 1
fi
# Create $UNIXUSER if not existing
if id "$UNIXUSER" >/dev/null 2>&1
then
echo "$UNIXUSER already exists!"
else
adduser --disabled-password --gecos "" $UNIXUSER
echo -e "$UNIXUSER:$UNIXPASS" | chpasswd
usermod -aG sudo $UNIXUSER
fi
if [ -d /home/$UNIXUSER ];
then
echo "$UNIXUSER OK!"
else
echo "Something went wrong when creating the user... Script will exit."
exit 1
fi
# Create $SCRIPTS dir
if [ -d $SCRIPTS ]; then
sleep 1
else
mkdir -p $SCRIPTS
fi
# Change DNS
if ! [ -x "$(command -v resolvconf)" ]; then
apt-get install resolvconf -y -q
dpkg-reconfigure resolvconf
else
echo 'reolvconf is installed.' >&2
fi
echo "nameserver 8.8.8.8" > /etc/resolvconf/resolv.conf.d/base
echo "nameserver 8.8.4.4" >> /etc/resolvconf/resolv.conf.d/base
# Check network
if ! [ -x "$(command -v nslookup)" ]; then
apt-get install dnsutils -y -q
else
echo 'dnsutils is installed.' >&2
fi
if ! [ -x "$(command -v ifup)" ]; then
apt-get install ifupdown -y -q
else
echo 'ifupdown is installed.' >&2
fi
sudo ifdown $IFACE && sudo ifup $IFACE
nslookup google.com
if [[ $? > 0 ]]
then
echo "Network NOT OK. You must have a working Network connection to run this script."
exit 1
else
echo "Network OK."
fi
# Update system
apt-get update
# Set locales
apt-get install language-pack-en-base -y
sudo locale-gen "sv_SE.UTF-8" && sudo dpkg-reconfigure --frontend=noninteractive locales
# Install aptitude
apt-get install aptitude -y
# Write MySQL pass to file and keep it safe
echo "$MYSQL_PASS" > $PW_FILE
chmod 600 $PW_FILE
chown root:root $PW_FILE
# Install MYSQL 5.7
apt-get install software-properties-common -y
echo "mysql-server-5.7 mysql-server/root_password password $MYSQL_PASS" | debconf-set-selections
echo "mysql-server-5.7 mysql-server/root_password_again password $MYSQL_PASS" | debconf-set-selections
apt-get install mysql-server-5.7 -y
# mysql_secure_installation
apt-get -y install expect
SECURE_MYSQL=$(expect -c "
set timeout 10
spawn mysql_secure_installation
expect \"Enter current password for root:\"
send \"$MYSQL_PASS\r\"
expect \"Would you like to setup VALIDATE PASSWORD plugin?\"
send \"n\r\"
expect \"Change the password for root ?\"
send \"n\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
")
echo "$SECURE_MYSQL"
apt-get -y purge expect
# Install Apache
apt-get install apache2 -y
a2enmod rewrite \
headers \
env \
dir \
mime \
ssl \
setenvif
# Set hostname and ServerName
sudo sh -c "echo 'ServerName nextcloud' >> /etc/apache2/apache2.conf"
sudo hostnamectl set-hostname nextcloud
service apache2 restart
# Install PHP 7.0
apt-get update
apt-get install -y \
libapache2-mod-php7.0 \
php7.0-common \
php7.0-mysql \
php7.0-intl \
php7.0-mcrypt \
php7.0-ldap \
php7.0-imap \
php7.0-cli \
php7.0-gd \
php7.0-pgsql \
php7.0-json \
php7.0-sqlite3 \
php7.0-curl \
php7.0-xml \
php7.0-zip \
php7.0-mbstring
# Install Unzip
apt-get install unzip -y
# Download and install Nextcloud
wget $NCDAILY/$DAILYVERSION.zip -P $HTML
unzip $HTML/$DAILYVERSION.zip -d $HTML
rm $HTML/$DAILYVERSION.zip
# Secure permissions
wget -q $STATIC/setup_secure_permissions_nextcloud.sh -P $SCRIPTS
bash $SCRIPTS/setup_secure_permissions_nextcloud.sh
# Install Nextcloud
cd $NCPATH
sudo -u www-data php occ maintenance:install --data-dir "$NCDATA" --database "mysql" --database-name "nextcloud_db" --database-user "root" --database-pass "$MYSQL_PASS" --admin-user "$UNIXUSER" --admin-pass "$UNIXPASS"
echo
echo "Nextcloud version:"
sudo -u www-data php $NCPATH/occ status
echo
sleep 3
# Prepare cron.php to be run every 15 minutes
crontab -u www-data -l | { cat; echo "*/15 * * * * php -f $NCPATH/cron.php > /dev/null 2>&1"; } | crontab -u www-data -
# Change values in php.ini (increase max file size)
# max_execution_time
sed -i "s|max_execution_time = 30|max_execution_time = 3500|g" /etc/php/7.0/apache2/php.ini
# max_input_time
sed -i "s|max_input_time = 60|max_input_time = 3600|g" /etc/php/7.0/apache2/php.ini
# memory_limit
sed -i "s|memory_limit = 128M|memory_limit = 512M|g" /etc/php/7.0/apache2/php.ini
# post_max
sed -i "s|post_max_size = 8M|post_max_size = 1100M|g" /etc/php/7.0/apache2/php.ini
# upload_max
sed -i "s|upload_max_filesize = 2M|upload_max_filesize = 1000M|g" /etc/php/7.0/apache2/php.ini
# Install Figlet
apt-get install figlet -y
# Generate $HTTP_CONF
if [ -f $HTTP_CONF ];
then
echo "Virtual Host exists"
else
touch "$HTTP_CONF"
cat << HTTP_CREATE > "$HTTP_CONF"
<VirtualHost *:80>
### YOUR SERVER ADDRESS ###
# ServerAdmin admin@example.com
# ServerName example.com
# ServerAlias subdomain.example.com
### SETTINGS ###
DocumentRoot $NCPATH
<Directory $NCPATH>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
Satisfy Any
</Directory>
Alias /nextcloud "$NCPATH/"
<IfModule mod_dav.c>
Dav off
</IfModule>
<Directory "$NCDATA">
# just in case if .htaccess gets disabled
Require all denied
</Directory>
SetEnv HOME $NCPATH
SetEnv HTTP_HOME $NCPATH
</VirtualHost>
HTTP_CREATE
echo "$HTTP_CONF was successfully created"
sleep 3
fi
# Generate $SSL_CONF
if [ -f $SSL_CONF ];
then
echo "Virtual Host exists"
else
touch "$SSL_CONF"
cat << SSL_CREATE > "$SSL_CONF"
<VirtualHost *:443>
Header add Strict-Transport-Security: "max-age=15768000;includeSubdomains"
SSLEngine on
### YOUR SERVER ADDRESS ###
# ServerAdmin admin@example.com
# ServerName example.com
# ServerAlias subdomain.example.com
### SETTINGS ###
DocumentRoot $NCPATH
<Directory $NCPATH>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
Satisfy Any
</Directory>
Alias /nextcloud "$NCPATH/"
<IfModule mod_dav.c>
Dav off
</IfModule>
<Directory "$NCDATA">
# just in case if .htaccess gets disabled
Require all denied
</Directory>
SetEnv HOME $NCPATH
SetEnv HTTP_HOME $NCPATH
### LOCATION OF CERT FILES ###
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
</VirtualHost>
SSL_CREATE
echo "$SSL_CONF was successfully created"
sleep 3
fi
# Enable new config
a2ensite nextcloud_ssl_domain_self_signed.conf
a2ensite nextcloud_http_domain_self_signed.conf
a2dissite default-ssl
service apache2 restart
## Set config values
# Experimental apps
sudo -u www-data php $NCPATH/occ config:system:set appstore.experimental.enabled --value="true"
# Default mail server as an example (make this user configurable?)
sudo -u www-data php $NCPATH/occ config:system:set mail_smtpmode --value="smtp"
sudo -u www-data php $NCPATH/occ config:system:set mail_smtpauth --value="1"
sudo -u www-data php $NCPATH/occ config:system:set mail_smtpport --value="465"
sudo -u www-data php $NCPATH/occ config:system:set mail_smtphost --value="smtp.gmail.com"
sudo -u www-data php $NCPATH/occ config:system:set mail_smtpauthtype --value="LOGIN"
sudo -u www-data php $NCPATH/occ config:system:set mail_from_address --value="www.techandme.se"
sudo -u www-data php $NCPATH/occ config:system:set mail_domain --value="gmail.com"
sudo -u www-data php $NCPATH/occ config:system:set mail_smtpsecure --value="ssl"
sudo -u www-data php $NCPATH/occ config:system:set mail_smtpname --value="www.techandme.se@gmail.com"
sudo -u www-data php $NCPATH/occ config:system:set mail_smtppassword --value="techandme_se"
# Install Libreoffice Writer to be able to read MS documents.
sudo apt-get install --no-install-recommends libreoffice-writer -y
# Install packages for Webmin
apt-get install -y zip perl libnet-ssleay-perl openssl libauthen-pam-perl libpam-runtime libio-pty-perl apt-show-versions python
# Install Webmin
sed -i '$a deb http://download.webmin.com/download/repository sarge contrib' /etc/apt/sources.list
wget -q http://www.webmin.com/jcameron-key.asc -O- | sudo apt-key add -
apt-get update
apt-get install webmin -y
# Add extra security
wget -q $STATIC/security.sh -P $SCRIPTS
bash $SCRIPTS/security.sh
rm $SCRIPTS/security.sh
# Download and install Documents
#if [ -d $NCPATH/apps/documents ]; then
#sleep 1
#else
#wget -q https://github.com/nextcloud/documents/archive/master.zip -P $NCPATH/apps
#cd $NCPATH/apps
#unzip -q master.zip
#rm master.zip
#mv documents-master/ documents/
#fi
# Enable documents
#if [ -d $NCPATH/apps/documents ]; then
#sudo -u www-data php $NCPATH/occ app:enable documents
#sudo -u www-data php $NCPATH/occ config:system:set preview_libreoffice_path --value="/usr/bin/libreoffice"
#fi
# Download and install Contacts
#if [ -d $NCPATH/apps/contacts ]; then
#sleep 1
#else
#wget -q $CONVER_REPO/$CONVER/$CONVER_FILE -P $NCPATH/apps
#tar -zxf $NCPATH/apps/$CONVER_FILE -C $NCPATH/apps
#cd $NCPATH/apps
#rm $CONVER_FILE
#fi
# Enable Contacts
#if [ -d $NCPATH/apps/contacts ]; then
#sudo -u www-data php $NCPATH/occ app:enable contacts
#fi
# Download and install Calendar
#if [ -d $NCPATH/apps/calendar ]; then
#sleep 1
#else
#wget -q $CALVER_REPO/$CALVER/$CALVER_FILE -P $NCPATH/apps
#tar -zxf $NCPATH/apps/$CALVER_FILE -C $NCPATH/apps
#cd $NCPATH/apps
#rm $CALVER_FILE
#fi
# Enable Calendar
#if [ -d $NCPATH/apps/calendar ]; then
#sudo -u www-data php $NCPATH/occ app:enable calendar
#fi
# Set secure permissions final (./data/.htaccess has wrong permissions otherwise)
bash $SCRIPTS/setup_secure_permissions_nextcloud.sh
# Change roots .bash_profile
if [ -f $SCRIPTS/change-root-profile.sh ];
then
echo "change-root-profile.sh exists"
else
wget -q $STATIC/change-root-profile.sh -P $SCRIPTS
fi
# Change $UNIXUSER .bash_profile
if [ -f $SCRIPTS/change-ncadmin-profile.sh ];
then
echo "change-ncadmin-profile.sh exists"
else
wget -q $STATIC/change-ncadmin-profile.sh -P $SCRIPTS
fi
# Get startup-script for root
if [ -f $SCRIPTS/nextcloud-startup-script.sh ];
then
echo "nextcloud-startup-script.sh exists"
else
wget -q $GITHUB_REPO/nextcloud-startup-script.sh -P $SCRIPTS
fi
# Welcome message after login (change in /home/$UNIXUSER/.profile
if [ -f $SCRIPTS/instruction.sh ];
then
echo "instruction.sh exists"
else
wget -q $STATIC/instruction.sh -P $SCRIPTS
fi
# Clears command history on every login
if [ -f $SCRIPTS/history.sh ];
then
echo "history.sh exists"
else
wget -q $STATIC/history.sh -P $SCRIPTS
fi
# Change root profile
bash $SCRIPTS/change-root-profile.sh
if [[ $? > 0 ]]
then
echo "change-root-profile.sh were not executed correctly."
sleep 10
else
echo "change-root-profile.sh script executed OK."
rm $SCRIPTS/change-root-profile.sh
sleep 2
fi
# Change $UNIXUSER profile
bash $SCRIPTS/change-ncadmin-profile.sh
if [[ $? > 0 ]]
then
echo "change-ncadmin-profile.sh were not executed correctly."
sleep 10
else
echo "change-ncadmin-profile.sh executed OK."
rm $SCRIPTS/change-ncadmin-profile.sh
sleep 2
fi
# Get script for Redis
if [ -f $SCRIPTS/redis-server-ubuntu16.sh ];
then
echo "redis-server-ubuntu16.sh exists"
else
wget -q $STATIC/redis-server-ubuntu16.sh -P $SCRIPTS
fi
# Make $SCRIPTS excutable
chmod +x -R $SCRIPTS
chown root:root -R $SCRIPTS
# Allow $UNIXUSER to run these scripts
chown $UNIXUSER:$UNIXUSER $SCRIPTS/instruction.sh
chown $UNIXUSER:$UNIXUSER $SCRIPTS/history.sh
# Install Redis
bash $SCRIPTS/redis-server-ubuntu16.sh
rm $SCRIPTS/redis-server-ubuntu16.sh
# Upgrade
aptitude full-upgrade -y
# Cleanup
echo "$CLEARBOOT"
apt-get autoremove -y
apt-get autoclean
if [ -f /home/$UNIXUSER/*.sh ];
then
rm /home/$UNIXUSER/*.sh
fi
if [ -f /root/*.sh ];
then
rm /root/*.sh
fi
# Reboot
reboot
exit 0