1070 строки
37 KiB
Bash
1070 строки
37 KiB
Bash
#!/bin/bash
|
|
# shellcheck disable=2034,2059
|
|
true
|
|
# see https://github.com/koalaman/shellcheck/wiki/Directive
|
|
|
|
## variables
|
|
|
|
# Dirs
|
|
SCRIPTS=/var/scripts
|
|
NCPATH=/var/www/nextcloud
|
|
HTML=/var/www
|
|
NCDATA=/mnt/ncdata
|
|
SNAPDIR=/var/snap/spreedme
|
|
GPGDIR=/tmp/gpg
|
|
BACKUP=/mnt/NCBACKUP
|
|
RORDIR=/opt/es/
|
|
|
|
# Ubuntu OS
|
|
DISTRO=$(lsb_release -sd | cut -d ' ' -f 2)
|
|
# Network
|
|
[ ! -z "$FIRST_IFACE" ] && IFACE=$(lshw -c network | grep "logical name" | awk '{print $3; exit}')
|
|
IFACE2=$(ip -o link show | awk '{print $2,$9}' | grep 'UP' | cut -d ':' -f 1)
|
|
[ ! -z "$CHECK_CURRENT_REPO" ] && REPO=$(apt-get update | grep -m 1 Hit | awk '{ print $2}')
|
|
ADDRESS=$(hostname -I | cut -d ' ' -f 1)
|
|
WGET="/usr/bin/wget"
|
|
# WANIP4=$(dig +short myip.opendns.com @resolver1.opendns.com) # as an alternative
|
|
WANIP4=$(curl -s -k -m 5 https://ipv4bot.whatismyipaddress.com)
|
|
[ ! -z "$LOAD_IP6" ] && WANIP6=$(curl -s -k -m 5 https://ipv6bot.whatismyipaddress.com)
|
|
INTERFACES="/etc/netplan/01-netcfg.yaml"
|
|
GATEWAY=$(ip route | grep default | awk '{print $3}')
|
|
DNS1="9.9.9.9"
|
|
DNS2="149.112.112.112"
|
|
# Repo
|
|
GITHUB_REPO="https://raw.githubusercontent.com/nextcloud/vm/master"
|
|
STATIC="$GITHUB_REPO/static"
|
|
LETS_ENC="$GITHUB_REPO/lets-encrypt"
|
|
APP="$GITHUB_REPO/apps"
|
|
NCREPO="https://download.nextcloud.com/server/releases"
|
|
ISSUES="https://github.com/nextcloud/vm/issues"
|
|
# User information
|
|
NCPASS=nextcloud
|
|
NCUSER=ncadmin
|
|
UNIXUSER=$SUDO_USER
|
|
UNIXUSER_PROFILE="/home/$UNIXUSER/.bash_profile"
|
|
ROOT_PROFILE="/root/.bash_profile"
|
|
# Database
|
|
SHUF=$(shuf -i 25-29 -n 1)
|
|
MARIADB_PASS=$(tr -dc "a-zA-Z0-9@#*=" < /dev/urandom | fold -w "$SHUF" | head -n 1)
|
|
NEWMARIADBPASS=$(tr -dc "a-zA-Z0-9@#*=" < /dev/urandom | fold -w "$SHUF" | head -n 1)
|
|
[ ! -z "$NCDB" ] && NCCONFIGDB=$(grep "dbname" $NCPATH/config/config.php | awk '{print $3}' | sed "s/[',]//g")
|
|
ETCMYCNF=/etc/mysql/my.cnf
|
|
MYCNF=/root/.my.cnf
|
|
[ ! -z "$MYCNFPW" ] && MARIADBMYCNFPASS=$(grep "password" $MYCNF | sed -n "/password/s/^password='\(.*\)'$/\1/p")
|
|
PGDB_PASS=$(tr -dc "a-zA-Z0-9@#*=" < /dev/urandom | fold -w "$SHUF" | head -n 1)
|
|
NEWPGPASS=$(tr -dc "a-zA-Z0-9@#*=" < /dev/urandom | fold -w "$SHUF" | head -n 1)
|
|
[ ! -z "$NCDB" ] && NCCONFIGDB=$(grep "dbname" $NCPATH/config/config.php | awk '{print $3}' | sed "s/[',]//g")
|
|
[ ! -z "$NCDBPASS" ] && NCCONFIGDBPASS=$(grep "dbpassword" $NCPATH/config/config.php | awk '{print $3}' | sed "s/[',]//g")
|
|
# Path to specific files
|
|
SECURE="$SCRIPTS/setup_secure_permissions_nextcloud.sh"
|
|
SSL_CONF="/etc/apache2/sites-available/nextcloud_ssl_domain_self_signed.conf"
|
|
HTTP_CONF="/etc/apache2/sites-available/nextcloud_http_domain_self_signed.conf"
|
|
# Nextcloud version
|
|
[ ! -z "$NC_UPDATE" ] && CURRENTVERSION=$(sudo -u www-data php $NCPATH/occ status | grep "versionstring" | awk '{print $3}')
|
|
NCVERSION=$(curl -s -m 900 $NCREPO/ | sed --silent 's/.*href="nextcloud-\([^"]\+\).zip.asc".*/\1/p' | sort --version-sort | tail -1)
|
|
STABLEVERSION="nextcloud-$NCVERSION"
|
|
NCMAJOR="${NCVERSION%%.*}"
|
|
NCBAD=$((NCMAJOR-2))
|
|
# Keys
|
|
OpenPGP_fingerprint='28806A878AE423A28372792ED75899B9A724937A'
|
|
# OnlyOffice URL
|
|
[ ! -z "$OO_INSTALL" ] && SUBDOMAIN=$(whiptail --title "T&M Hansson IT OnlyOffice" --inputbox "OnlyOffice subdomain eg: office.yourdomain.com" "$WT_HEIGHT" "$WT_WIDTH" 3>&1 1>&2 2>&3)
|
|
# Nextcloud Main Domain
|
|
[ ! -z "$OO_INSTALL" ] && NCDOMAIN=$(whiptail --title "T&M Hansson IT OnlyOffice" --inputbox "Nextcloud url, make sure it looks like this: cloud\\.yourdomain\\.com" "$WT_HEIGHT" "$WT_WIDTH" cloud\\.yourdomain\\.com 3>&1 1>&2 2>&3)
|
|
# Collabora Docker URL
|
|
[ ! -z "$COLLABORA_INSTALL" ] && SUBDOMAIN=$(whiptail --title "T&M Hansson IT Collabora" --inputbox "Collabora subdomain eg: office.yourdomain.com" "$WT_HEIGHT" "$WT_WIDTH" 3>&1 1>&2 2>&3)
|
|
# Nextcloud Main Domain
|
|
[ ! -z "$COLLABORA_INSTALL" ] && NCDOMAIN=$(whiptail --title "T&M Hansson IT Collabora" --inputbox "Nextcloud url, make sure it looks like this: cloud\\.yourdomain\\.com" "$WT_HEIGHT" "$WT_WIDTH" cloud\\.yourdomain\\.com 3>&1 1>&2 2>&3)
|
|
# Letsencrypt
|
|
LETSENCRYPTPATH="/etc/letsencrypt"
|
|
CERTFILES="$LETSENCRYPTPATH/live"
|
|
DHPARAMS="$CERTFILES/$SUBDOMAIN/dhparam.pem"
|
|
# Collabora App
|
|
HTTPS_CONF="/etc/apache2/sites-available/$SUBDOMAIN.conf"
|
|
HTTP2_CONF="/etc/apache2/mods-available/http2.conf"
|
|
# Nextant
|
|
# this var get's the latest automatically:
|
|
SOLR_VERSION=$(curl -s https://github.com/apache/lucene-solr/tags | grep -o "release.*</span>$" | grep -o '[0-6].[0-9].[0-9]' | sort -t. -k1,1n -k2,2n -k3,3n | tail -n1)
|
|
[ ! -z "$NEXTANT_INSTALL" ] && NEXTANT_VERSION=$(curl -s https://api.github.com/repos/nextcloud/fulltextsearch/releases/10134699 | grep 'tag_name' | cut -d\" -f4 | sed -e "s|v||g")
|
|
NT_RELEASE=nextant-$NEXTANT_VERSION.tar.gz
|
|
NT_DL=https://github.com/nextcloud/fulltextsearch/releases/download/v$NEXTANT_VERSION/$NT_RELEASE
|
|
SOLR_RELEASE=solr-$SOLR_VERSION.tgz
|
|
SOLR_DL=http://www-eu.apache.org/dist/lucene/solr/$SOLR_VERSION/$SOLR_RELEASE
|
|
NC_APPS_PATH=$NCPATH/apps
|
|
SOLR_HOME=/home/$SUDO_USER/solr_install/
|
|
SOLR_JETTY=/opt/solr/server/etc/jetty-http.xml
|
|
SOLR_DSCONF=/opt/solr-$SOLR_VERSION/server/solr/configsets/data_driven_schema_configs/conf/solrconfig.xml
|
|
# PHP-FPM
|
|
PHP_INI=/etc/php/7.2/fpm/php.ini
|
|
PHP_POOL_DIR=/etc/php/7.2/fpm/pool.d
|
|
# Adminer
|
|
ADMINERDIR=/usr/share/adminer
|
|
ADMINER_CONF=/etc/apache2/conf-available/adminer.conf
|
|
# Redis
|
|
REDIS_CONF=/etc/redis/redis.conf
|
|
REDIS_SOCK=/var/run/redis/redis-server.sock
|
|
RSHUF=$(shuf -i 30-35 -n 1)
|
|
REDIS_PASS=$(tr -dc "a-zA-Z0-9@#*=" < /dev/urandom | fold -w "$RSHUF" | head -n 1)
|
|
# Extra security
|
|
SPAMHAUS=/etc/spamhaus.wl
|
|
ENVASIVE=/etc/apache2/mods-available/mod-evasive.load
|
|
APACHE2=/etc/apache2/apache2.conf
|
|
# Full text Search
|
|
[ ! -z "$ES_INSTALL" ] && INDEX_USER=$(tr -dc '[:lower:]' < /dev/urandom | fold -w "$SHUF" | head -n 1)
|
|
[ ! -z "$ES_INSTALL" ] && ROREST=$(tr -dc "A-Za-z0-9" < /dev/urandom | fold -w "$SHUF" | head -n 1)
|
|
[ ! -z "$ES_INSTALL" ] && DOCKER_INS=$(dpkg -l | grep ^ii | awk '{print $2}' | grep docker)
|
|
[ ! -z "$ES_INSTALL" ] && nc_fts="ark74/nc_fts"
|
|
[ ! -z "$ES_INSTALL" ] && fts_es_name="fts_esror"
|
|
# Talk
|
|
[ ! -z "$TURN_INSTALL" ] && TURN_CONF="/etc/turnserver.conf"
|
|
[ ! -z "$TURN_INSTALL" ] && TURN_PORT=5349
|
|
[ ! -z "$TURN_INSTALL" ] && SHUF=$(shuf -i 25-29 -n 1)
|
|
[ ! -z "$TURN_INSTALL" ] && TURN_SECRET=$(tr -dc "a-zA-Z0-9@#*=" < /dev/urandom | fold -w "$SHUF" | head -n 1)
|
|
[ ! -z "$TURN_INSTALL" ] && TURN_DOMAIN=$(sudo -u www-data /var/www/nextcloud/occ config:system:get overwrite.cli.url | sed 's#https://##;s#/##')
|
|
# Migrate Docker to overlay2
|
|
[ ! -z "$DOCKEROVERLAY2" ] && DOCKERBACKUP=$(grep "datadir" $NCPATH/config/config.php | awk '{print $3}' | sed "s/[',]//g")/DOCKERBACKUP
|
|
|
|
## functions
|
|
|
|
# If script is running as root?
|
|
#
|
|
# Example:
|
|
# if is_root
|
|
# then
|
|
# # do stuff
|
|
# else
|
|
# print_text_in_color "$Red" "You are not root..."
|
|
# exit 1
|
|
# fi
|
|
#
|
|
is_root() {
|
|
if [[ "$EUID" -ne 0 ]]
|
|
then
|
|
return 1
|
|
else
|
|
return 0
|
|
fi
|
|
}
|
|
|
|
# Check if root
|
|
root_check() {
|
|
if ! is_root
|
|
then
|
|
msg_box "Sorry, you are not root. You now have two options:
|
|
|
|
1. With SUDO directly:
|
|
a) :~$ sudo bash $SCRIPTS/name-of-script.sh
|
|
|
|
2. Become ROOT and then type your command:
|
|
a) :~$ sudo -i
|
|
b) :~# $SCRIPTS/name-of-script.sh
|
|
|
|
In both cases above you can leave out $SCRIPTS/ if the script
|
|
is directly in your PATH.
|
|
|
|
More information can be found here: https://unix.stackexchange.com/a/3064"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
debug_mode() {
|
|
if [ "$DEBUG" -eq 1 ]
|
|
then
|
|
set -ex
|
|
fi
|
|
}
|
|
|
|
ask_yes_or_no() {
|
|
read -r -p "$1 ([y]es or [N]o): "
|
|
case ${REPLY,,} in
|
|
y|yes)
|
|
echo "yes"
|
|
;;
|
|
*)
|
|
echo "no"
|
|
;;
|
|
esac
|
|
}
|
|
|
|
msg_box() {
|
|
local PROMPT="$1"
|
|
whiptail --msgbox "${PROMPT}" "$WT_HEIGHT" "$WT_WIDTH"
|
|
}
|
|
|
|
# Check if process is runnnig: is_process_running dpkg
|
|
is_process_running() {
|
|
PROCESS="$1"
|
|
|
|
while :
|
|
do
|
|
RESULT=$(pgrep "${PROCESS}")
|
|
|
|
if [ "${RESULT:-null}" = null ]; then
|
|
break
|
|
else
|
|
print_text_in_color "$ICyan" "${PROCESS} is running. Waiting for it to stop..."
|
|
sleep 10
|
|
fi
|
|
done
|
|
}
|
|
|
|
start_if_stopped() {
|
|
if ! pgrep "$1"
|
|
then
|
|
print_text_in_color "$ICyan" "Starting $1..."
|
|
check_command service "$1" start
|
|
fi
|
|
}
|
|
|
|
# Warn user that HTTP/2 will be disabled if installing app that use Apache2 PHP instead of PHP-FPM
|
|
# E.g: http2_warn Modsecurity
|
|
http2_warn() {
|
|
msg_box "This VM has HTTP/2 enabled by default.
|
|
|
|
If you continue with installing $1, HTTP/2 will be disabled since it's not compatible with the mpm module used by $1.
|
|
|
|
This is what Apache will say in the error.log if you enable $1 anyway:
|
|
'The mpm module (prefork.c) is not supported by mod_http2.
|
|
The mpm determines how things are processed in your server.
|
|
HTTP/2 has more demands in this regard and the currently selected mpm will just not do.
|
|
This is an advisory warning. Your server will continue to work, but the HTTP/2 protocol will be inactive.'"
|
|
|
|
if [[ "no" == $(ask_yes_or_no "Do you really want to enable $1 anyway?") ]]
|
|
then
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
caulculate_php_fpm() {
|
|
# Minimum amount of max children (lower than this won't work with 2 GB RAM)
|
|
min_max_children=8
|
|
# If start servers are lower than this then it's likely that there are room for max_spare_servers
|
|
min_start_servers=20
|
|
# Maximum amount of children is only set if the min_start_servers value are met
|
|
min_max_spare_servers=35
|
|
|
|
# Calculate the sum of the current values
|
|
CURRENT_START="$(grep pm.start_servers $PHP_POOL_DIR/nextcloud.conf | awk '{ print $3}')"
|
|
CURRENT_MAX="$(grep pm.max_spare_servers $PHP_POOL_DIR/nextcloud.conf | awk '{ print $3}')"
|
|
CURRENT_MIN="$(grep pm.min_spare_servers $PHP_POOL_DIR/nextcloud.conf | awk '{ print $3}')"
|
|
CURRENT_SUM="$((CURRENT_START + CURRENT_MAX + CURRENT_MIN))"
|
|
|
|
# Calculate max_children depending on RAM
|
|
# Tends to be between 30-50MB per children
|
|
average_php_memory_requirement=50
|
|
available_memory=$(awk '/MemAvailable/ {printf "%d", $2/1024}' /proc/meminfo)
|
|
PHP_FPM_MAX_CHILDREN=$((available_memory/average_php_memory_requirement))
|
|
|
|
# Lowest possible value is 8
|
|
print_text_in_color "$ICyan" "Automatically configures pm.max_children for php-fpm..."
|
|
if [ $PHP_FPM_MAX_CHILDREN -lt $min_max_children ]
|
|
then
|
|
msg_box "The current max_children value available to set is $PHP_FPM_MAX_CHILDREN, and with that value PHP-FPM won't function properly.
|
|
The minimum value is 8, and the value is calculated depening on how much RAM you have left to use in the system.
|
|
|
|
The absolute minimum amount of RAM required to run the VM is 2 GB, but we recomend 4 GB.
|
|
|
|
You now have two choices:
|
|
1. Import this VM again, raise the amount of RAM with at least 1 GB, and then run this script again,
|
|
installing it in the same way as you did before.
|
|
2. Import this VM again without raising the RAM, but don't install any of the following apps:
|
|
1) Collabora
|
|
2) OnlyOffice
|
|
3) Full Text Search
|
|
|
|
This script will now exit.
|
|
The installation was not successful, sorry for the inconvenience.
|
|
|
|
If you think this is a bug, please report it to $ISSUES"
|
|
exit 1
|
|
else
|
|
check_command sed -i "s|pm.max_children.*|pm.max_children = $PHP_FPM_MAX_CHILDREN|g" $PHP_POOL_DIR/nextcloud.conf
|
|
restart_webserver
|
|
print_text_in_color "$IGreen" "pm.max_children was set to $PHP_FPM_MAX_CHILDREN"
|
|
# Check if the sum of all the current values are more than $PHP_FPM_MAX_CHILDREN and only continue it is
|
|
if [ $PHP_FPM_MAX_CHILDREN -gt $CURRENT_SUM ]
|
|
then
|
|
# Set pm.max_spare_servers
|
|
if [ $PHP_FPM_MAX_CHILDREN -ge $min_max_spare_servers ]
|
|
then
|
|
if [ "$(grep pm.start_servers $PHP_POOL_DIR/nextcloud.conf | awk '{ print $3}')" -lt $min_start_servers ]
|
|
then
|
|
check_command sed -i "s|pm.max_spare_servers.*|pm.max_spare_servers = $((PHP_FPM_MAX_CHILDREN - 30))|g" $PHP_POOL_DIR/nextcloud.conf
|
|
restart_webserver
|
|
print_text_in_color "$IGreen" "pm.max_spare_servers was set to $((PHP_FPM_MAX_CHILDREN - 30))"
|
|
fi
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# If $PHP_FPM_MAX_CHILDREN is lower than the current sum of all values, revert to default settings
|
|
if [ $PHP_FPM_MAX_CHILDREN -lt $CURRENT_SUM ]
|
|
then
|
|
check_command sed -i "s|pm.max_children.*|pm.max_children = $PHP_FPM_MAX_CHILDREN|g" $PHP_POOL_DIR/nextcloud.conf
|
|
check_command sed -i "s|pm.start_servers.*|pm.start_servers = 3|g" $PHP_POOL_DIR/nextcloud.conf
|
|
check_command sed -i "s|pm.min_spare_servers.*|pm.min_spare_servers = 2|g" $PHP_POOL_DIR/nextcloud.conf
|
|
check_command sed -i "s|pm.max_spare_servers.*|pm.max_spare_servers = 3|g" $PHP_POOL_DIR/nextcloud.conf
|
|
print_text_in_color "$ICyan" "All PHP-INI values were set back to default values as the value for pm.max_children ($PHP_FPM_MAX_CHILDREN) was lower than the sum of all the current values ($CURRENT_SUM)"
|
|
print_text_in_color "$ICyan" "Please run this again to set optimal values"
|
|
restart_webserver
|
|
fi
|
|
}
|
|
|
|
calculate_php_fpm() {
|
|
# Minimum amount of max children (lower than this won't work with 2 GB RAM)
|
|
min_max_children=8
|
|
# If start servers are lower than this then it's likely that there are room for max_spare_servers
|
|
min_start_servers=20
|
|
# Maximum amount of children is only set if the min_start_servers value are met
|
|
min_max_spare_servers=35
|
|
|
|
# Calculate the sum of the current values
|
|
CURRENT_START="$(grep pm.start_servers $PHP_POOL_DIR/nextcloud.conf | awk '{ print $3}')"
|
|
CURRENT_MAX="$(grep pm.max_spare_servers $PHP_POOL_DIR/nextcloud.conf | awk '{ print $3}')"
|
|
CURRENT_MIN="$(grep pm.min_spare_servers $PHP_POOL_DIR/nextcloud.conf | awk '{ print $3}')"
|
|
CURRENT_SUM="$((CURRENT_START + CURRENT_MAX + CURRENT_MIN))"
|
|
|
|
# Calculate max_children depending on RAM
|
|
# Tends to be between 30-50MB per children
|
|
average_php_memory_requirement=50
|
|
available_memory=$(awk '/MemAvailable/ {printf "%d", $2/1024}' /proc/meminfo)
|
|
PHP_FPM_MAX_CHILDREN=$((available_memory/average_php_memory_requirement))
|
|
|
|
# Lowest possible value is 8
|
|
print_text_in_color "$ICyan" "Automatically configures pm.max_children for php-fpm..."
|
|
if [ $PHP_FPM_MAX_CHILDREN -lt $min_max_children ]
|
|
then
|
|
msg_box "The current max_children value available to set is $PHP_FPM_MAX_CHILDREN, and with that value PHP-FPM won't function properly.
|
|
The minimum value is 8, and the value is calculated depening on how much RAM you have left to use in the system.
|
|
|
|
The absolute minimum amount of RAM required to run the VM is 2 GB, but we recomend 4 GB.
|
|
|
|
You now have two choices:
|
|
1. Import this VM again, raise the amount of RAM with at least 1 GB, and then run this script again,
|
|
installing it in the same way as you did before.
|
|
2. Import this VM again without raising the RAM, but don't install any of the following apps:
|
|
1) Collabora
|
|
2) OnlyOffice
|
|
3) Full Text Search
|
|
|
|
This script will now exit.
|
|
The installation was not successful, sorry for the inconvenience.
|
|
|
|
If you think this is a bug, please report it to $ISSUES"
|
|
exit 1
|
|
else
|
|
check_command sed -i "s|pm.max_children.*|pm.max_children = $PHP_FPM_MAX_CHILDREN|g" $PHP_POOL_DIR/nextcloud.conf
|
|
restart_webserver
|
|
print_text_in_color "$IGreen" "pm.max_children was set to $PHP_FPM_MAX_CHILDREN"
|
|
# Check if the sum of all the current values are more than $PHP_FPM_MAX_CHILDREN and only continue it is
|
|
if [ $PHP_FPM_MAX_CHILDREN -gt $CURRENT_SUM ]
|
|
then
|
|
# Set pm.max_spare_servers
|
|
if [ $PHP_FPM_MAX_CHILDREN -ge $min_max_spare_servers ]
|
|
then
|
|
if [ "$(grep pm.start_servers $PHP_POOL_DIR/nextcloud.conf | awk '{ print $3}')" -lt $min_start_servers ]
|
|
then
|
|
check_command sed -i "s|pm.max_spare_servers.*|pm.max_spare_servers = $((PHP_FPM_MAX_CHILDREN - 30))|g" $PHP_POOL_DIR/nextcloud.conf
|
|
restart_webserver
|
|
print_text_in_color "$IGreen" "pm.max_spare_servers was set to $((PHP_FPM_MAX_CHILDREN - 30))"
|
|
fi
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# If $PHP_FPM_MAX_CHILDREN is lower than the current sum of all values, revert to default settings
|
|
if [ $PHP_FPM_MAX_CHILDREN -lt $CURRENT_SUM ]
|
|
then
|
|
check_command sed -i "s|pm.max_children.*|pm.max_children = $PHP_FPM_MAX_CHILDREN|g" $PHP_POOL_DIR/nextcloud.conf
|
|
check_command sed -i "s|pm.start_servers.*|pm.start_servers = 3|g" $PHP_POOL_DIR/nextcloud.conf
|
|
check_command sed -i "s|pm.min_spare_servers.*|pm.min_spare_servers = 2|g" $PHP_POOL_DIR/nextcloud.conf
|
|
check_command sed -i "s|pm.max_spare_servers.*|pm.max_spare_servers = 3|g" $PHP_POOL_DIR/nextcloud.conf
|
|
print_text_in_color "$ICyan" "All PHP-INI values were set back to default values as the value for pm.max_children ($PHP_FPM_MAX_CHILDREN) was lower than the sum of all the current values ($CURRENT_SUM)"
|
|
print_text_in_color "$ICyan" "Please run this again to set optimal values"
|
|
restart_webserver
|
|
fi
|
|
}
|
|
|
|
test_connection() {
|
|
# Install dnsutils if not existing
|
|
if ! dpkg-query -W -f='${Status}' "dnsutils" | grep -q "ok installed"
|
|
then
|
|
apt update -q4 & spinner_loading && apt install dnsutils -y
|
|
fi
|
|
# Install network-manager if not existing
|
|
if ! dpkg-query -W -f='${Status}' "network-manager" | grep -q "ok installed"
|
|
then
|
|
apt update -q4 & spinner_loading && apt install network-manager -y
|
|
fi
|
|
check_command service network-manager restart
|
|
ip link set "$IFACE" down
|
|
sleep 2
|
|
ip link set "$IFACE" up
|
|
sleep 2
|
|
print_text_in_color "$ICyan" "Checking connection..."
|
|
check_command service network-manager restart
|
|
sleep 2
|
|
if nslookup github.com
|
|
then
|
|
print_text_in_color "$IGreen" "Online!"
|
|
elif ! nslookup github.com
|
|
then
|
|
print_text_in_color "$ICyan" "Trying to restart networking service..."
|
|
check_command service networking restart && sleep 2
|
|
if nslookup github.com
|
|
then
|
|
print_text_in_color "$IGreen" "Online!"
|
|
fi
|
|
else
|
|
if ! nslookup github.com
|
|
then
|
|
msg_box "Network NOT OK. You must have a working network connection to run this script
|
|
If you think that this is a bug, please report it to https://github.com/nextcloud/vm/issues."
|
|
exit 1
|
|
fi
|
|
fi
|
|
}
|
|
|
|
restart_webserver() {
|
|
check_command systemctl restart apache2
|
|
if which php7.2-fpm > /dev/null
|
|
then
|
|
check_command systemctl restart php7.2-fpm.service
|
|
fi
|
|
|
|
}
|
|
|
|
# Install certbot (Let's Encrypt)
|
|
install_certbot() {
|
|
certbot --version 2> /dev/null
|
|
LE_IS_AVAILABLE=$?
|
|
if [ $LE_IS_AVAILABLE -eq 0 ]
|
|
then
|
|
certbot --version 2> /dev/null
|
|
else
|
|
print_text_in_color "$ICyan" "Installing certbot (Let's Encrypt)..."
|
|
apt update -q4 & spinner_loading
|
|
install_if_not software-properties-common
|
|
add-apt-repository ppa:certbot/certbot -y
|
|
apt update -q4 & spinner_loading
|
|
install_if_not certbot
|
|
apt update -q4 & spinner_loading
|
|
apt dist-upgrade -y
|
|
fi
|
|
}
|
|
|
|
# Let's Encrypt for subdomains
|
|
le_subdomain() {
|
|
a2dissite 000-default.conf
|
|
service apache2 reload
|
|
certbot certonly --standalone --pre-hook "service apache2 stop" --post-hook "service apache2 start" --agree-tos --rsa-key-size 4096 -d "$SUBDOMAIN"
|
|
}
|
|
|
|
# Check if port is open # check_open_port 443 domain.example.com
|
|
check_open_port() {
|
|
# Check to see if user already has nmap installed on their system
|
|
if [ "$(dpkg-query -s nmap 2> /dev/null | grep -c "ok installed")" == "1" ]
|
|
then
|
|
NMAPSTATUS=preinstalled
|
|
fi
|
|
|
|
apt update -q4 & spinner_loading
|
|
if [ "$NMAPSTATUS" = "preinstalled" ]
|
|
then
|
|
print_text_in_color "$ICyan" "nmap is already installed..."
|
|
else
|
|
apt install nmap -y
|
|
fi
|
|
|
|
# Check if $1 is open using nmap, if not notify the user
|
|
if [ "$(nmap -sS -p "$1" "$WANIP4" | grep -c "open")" == "1" ]
|
|
then
|
|
print_text_in_color "${IGreen}" "Port $1 is open on $WANIP4!"
|
|
if [ "$NMAPSTATUS" = "preinstalled" ]
|
|
then
|
|
print_text_in_color "$ICyan" "nmap was previously installed, not removing."
|
|
else
|
|
apt remove --purge nmap -y
|
|
fi
|
|
else
|
|
whiptail --msgbox "Port $1 is not open on $WANIP4. We will do a second try on $2 instead." "$WT_HEIGHT" "$WT_WIDTH"
|
|
if [[ "$(nmap -sS -PN -p "$1" "$2" | grep -m 1 "open" | awk '{print $2}')" = "open" ]]
|
|
then
|
|
print_text_in_color "${IGreen}" "Port $1 is open on $2!"
|
|
if [ "$NMAPSTATUS" = "preinstalled" ]
|
|
then
|
|
print_text_in_color "$ICyan" "nmap was previously installed, not removing."
|
|
else
|
|
apt remove --purge nmap -y
|
|
fi
|
|
else
|
|
whiptail --msgbox "Port $1 is not open on $2. Please follow this guide to open ports in your router: https://www.techandme.se/open-port-80-443/" "$WT_HEIGHT" "$WT_WIDTH"
|
|
any_key "Press any key to exit... "
|
|
if [ "$NMAPSTATUS" = "preinstalled" ]
|
|
then
|
|
print_text_in_color "$ICyan" "nmap was previously installed, not removing."
|
|
else
|
|
apt remove --purge nmap -y
|
|
fi
|
|
exit 1
|
|
fi
|
|
fi
|
|
}
|
|
|
|
check_distro_version() {
|
|
# Check Ubuntu version
|
|
print_text_in_color "$ICyan" "Checking server OS and version..."
|
|
if lsb_release -c | grep -ic "bionic" &> /dev/null
|
|
then
|
|
OS=1
|
|
elif lsb_release -i | grep -ic "Ubuntu" &> /dev/null
|
|
then
|
|
OS=1
|
|
elif uname -a | grep -ic "bionic" &> /dev/null
|
|
then
|
|
OS=1
|
|
elif uname -v | grep -ic "Ubuntu" &> /dev/null
|
|
then
|
|
OS=1
|
|
fi
|
|
|
|
if [ "$OS" != 1 ]
|
|
then
|
|
msg_box "Ubuntu Server is required to run this script.
|
|
Please install that distro and try again.
|
|
|
|
You can find the download link here: https://www.ubuntu.com/download/server"
|
|
exit 1
|
|
fi
|
|
|
|
if ! version 18.04 "$DISTRO" 18.04.4; then
|
|
msg_box "Ubuntu version $DISTRO must be between 18.04 - 18.04.4"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
configure_max_upload() {
|
|
# Increase max filesize (expects that changes are made in $PHP_INI)
|
|
# Here is a guide: https://www.techandme.se/increase-max-file-size/
|
|
print_text_in_color "$ICyan" "Setting max_upload size in PHP..."
|
|
# Copy settings from .htaccess to user.ini. beacuse we run php-fpm. Documented here: https://docs.nextcloud.com/server/13/admin_manual/installation/source_installation.html#php-fpm-configuration-notes
|
|
cp -fv "$NCPATH/.htaccess" "$NCPATH/.user.ini"
|
|
# Do the acutal change
|
|
sed -i 's/ php_value upload_max_filesize.*/# php_value upload_max_filesize 511M/g' "$NCPATH"/.user.ini
|
|
sed -i 's/ php_value post_max_size.*/# php_value post_max_size 511M/g' "$NCPATH"/.user.ini
|
|
sed -i 's/ php_value memory_limit.*/# php_value memory_limit 512M/g' "$NCPATH"/.user.ini
|
|
}
|
|
|
|
# Check if program is installed (is_this_installed apache2)
|
|
is_this_installed() {
|
|
if [ "$(dpkg-query -W -f='${Status}' "${1}" 2>/dev/null | grep -c "ok installed")" == "1" ]
|
|
then
|
|
print_text_in_color "$Red" "${1} is installed, it must be a clean server."
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Install_if_not program
|
|
install_if_not() {
|
|
if ! dpkg-query -W -f='${Status}' "${1}" | grep -q "ok installed"
|
|
then
|
|
apt update -q4 & spinner_loading && apt install "${1}" -y
|
|
fi
|
|
}
|
|
|
|
# Test RAM size
|
|
# Call it like this: ram_check [amount of min RAM in GB] [for which program]
|
|
# Example: ram_check 2 Nextcloud
|
|
ram_check() {
|
|
mem_available="$(awk '/MemTotal/{print $2}' /proc/meminfo)"
|
|
if [ "${mem_available}" -lt "$((${1}*1002400))" ]
|
|
then
|
|
print_text_in_color "${Red}" "Error: ${1} GB RAM required to install ${2}!" >&2
|
|
print_text_in_color "${Red}" "Current RAM is: ("$((mem_available/1002400))" GB)" >&2
|
|
sleep 3
|
|
msg_box "If you want to bypass this check you could do so by commenting out (# before the line) 'ram_check X' in the script that you are trying to run.
|
|
|
|
In nextcloud_install_production.sh you can find the check somewhere around line #34.
|
|
|
|
Please notice that things may be veery slow and not work as expeced. YOU HAVE BEEN WARNED!"
|
|
exit 1
|
|
else
|
|
print_text_in_color "${IGreen}" "RAM for ${2} OK! ($((mem_available/1002400)) GB)"
|
|
fi
|
|
}
|
|
|
|
# Test number of CPU
|
|
# Call it like this: cpu_check [amount of min CPU] [for which program]
|
|
# Example: cpu_check 2 Nextcloud
|
|
cpu_check() {
|
|
nr_cpu="$(nproc)"
|
|
if [ "${nr_cpu}" -lt "${1}" ]
|
|
then
|
|
print_text_in_color "${Red}" "Error: ${1} CPU required to install ${2}!" >&2
|
|
print_text_in_color "${Red}" "Current CPU: ($((nr_cpu)))" >&2
|
|
sleep 3
|
|
exit 1
|
|
else
|
|
print_text_in_color "${IGreen}" "CPU for ${2} OK! ($((nr_cpu)))"
|
|
fi
|
|
}
|
|
|
|
check_command() {
|
|
if ! "$@";
|
|
then
|
|
print_text_in_color "$ICyan" "Sorry but something went wrong. Please report this issue to $ISSUES and include the output of the error message. Thank you!"
|
|
print_text_in_color "$Red" "$* failed"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Example: occ_command 'maintenance:mode --on'
|
|
occ_command() {
|
|
check_command sudo -u www-data php "$NCPATH"/occ "$@";
|
|
}
|
|
|
|
network_ok() {
|
|
print_text_in_color "$ICyan" "Testing if network is OK..."
|
|
install_if_not network-manager
|
|
if ! service network-manager restart > /dev/null
|
|
then
|
|
service networking restart > /dev/null
|
|
fi
|
|
sleep 2
|
|
if wget -q -T 20 -t 2 http://github.com -O /dev/null & spinner_loading
|
|
then
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Whiptail auto-size
|
|
calc_wt_size() {
|
|
WT_HEIGHT=17
|
|
WT_WIDTH=$(tput cols)
|
|
|
|
if [ -z "$WT_WIDTH" ] || [ "$WT_WIDTH" -lt 60 ]; then
|
|
WT_WIDTH=80
|
|
fi
|
|
if [ "$WT_WIDTH" -gt 178 ]; then
|
|
WT_WIDTH=120
|
|
fi
|
|
WT_MENU_HEIGHT=$((WT_HEIGHT-7))
|
|
export WT_MENU_HEIGHT
|
|
}
|
|
|
|
install_and_enable_app() {
|
|
# Download and install $1
|
|
if [ ! -d "$NC_APPS_PATH/$1" ]
|
|
then
|
|
print_text_in_color "$ICyan" "Installing $1..."
|
|
# occ_command not possible here because it uses check_command and will exit if occ_command fails
|
|
result=$(sudo -u www-data php ${NCPATH}/occ app:install "$1")
|
|
if [ "$result" = "Error: Could not download app $1" ]
|
|
then
|
|
msg_box "The $1 app could not be installed.
|
|
Probably it's not compatible with $(occ_command -V).
|
|
|
|
You can try to install the app manually after the script has finished,
|
|
or when a new version of the app is released with the following command:
|
|
|
|
'sudo -u www-data php ${NCPATH}/occ app:install $1'"
|
|
fi
|
|
fi
|
|
|
|
# Enable $1
|
|
if [ -d "$NC_APPS_PATH/$1" ]
|
|
then
|
|
occ_command app:enable "$1"
|
|
chown -R www-data:www-data "$NC_APPS_PATH"
|
|
fi
|
|
}
|
|
|
|
download_verify_nextcloud_stable() {
|
|
rm -f "$HTML/$STABLEVERSION.tar.bz2"
|
|
wget -q -T 10 -t 2 "$NCREPO/$STABLEVERSION.tar.bz2" -P "$HTML"
|
|
mkdir -p "$GPGDIR"
|
|
wget -q "$NCREPO/$STABLEVERSION.tar.bz2.asc" -P "$GPGDIR"
|
|
chmod -R 600 "$GPGDIR"
|
|
gpg --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys "$OpenPGP_fingerprint"
|
|
gpg --verify "$GPGDIR/$STABLEVERSION.tar.bz2.asc" "$HTML/$STABLEVERSION.tar.bz2"
|
|
rm -r "$GPGDIR"
|
|
rm -f releases
|
|
}
|
|
|
|
# Initial download of script in ../static
|
|
# call like: download_static_script name_of_script
|
|
download_static_script() {
|
|
# Get ${1} script
|
|
rm -f "${SCRIPTS}/${1}.sh" "${SCRIPTS}/${1}.php" "${SCRIPTS}/${1}.py"
|
|
if ! { wget -q "${STATIC}/${1}.sh" -P "$SCRIPTS" || wget -q "${STATIC}/${1}.php" -P "$SCRIPTS" || wget -q "${STATIC}/${1}.py" -P "$SCRIPTS"; }
|
|
then
|
|
print_text_in_color "$Red" "{$1} failed to download. Please run: 'sudo wget ${STATIC}/${1}.sh|.php|.py' again."
|
|
print_text_in_color "$ICyan" "If you get this error when running the nextcloud-startup-script then just re-run it with:"
|
|
print_text_in_color "$ICyan" "'sudo bash $SCRIPTS/nextcloud-startup-script.sh' and all the scripts will be downloaded again"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Initial download of script in ../lets-encrypt
|
|
# call like: download_le_script name_of_script
|
|
download_le_script() {
|
|
# Get ${1} script
|
|
rm -f "${SCRIPTS}/${1}.sh" "${SCRIPTS}/${1}.php" "${SCRIPTS}/${1}.py"
|
|
if ! { wget -q "${LETS_ENC}/${1}.sh" -P "$SCRIPTS" || wget -q "${LETS_ENC}/${1}.php" -P "$SCRIPTS" || wget -q "${LETS_ENC}/${1}.py" -P "$SCRIPTS"; }
|
|
then
|
|
print_text_in_color "$Red" "{$1} failed to download. Please run: 'sudo wget ${STATIC}/${1}.sh|.php|.py' again."
|
|
print_text_in_color "$ICyan" "If you get this error when running the nextcloud-startup-script then just re-run it with:"
|
|
print_text_in_color "$ICyan" "'sudo bash $SCRIPTS/nextcloud-startup-script.sh' and all the scripts will be downloaded again"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Run any script in ../master
|
|
# call like: run_main_script name_of_script
|
|
run_main_script() {
|
|
rm -f "${SCRIPTS}/${1}.sh" "${SCRIPTS}/${1}.php" "${SCRIPTS}/${1}.py"
|
|
if wget -q "${GITHUB_REPO}/${1}.sh" -P "$SCRIPTS"
|
|
then
|
|
bash "${SCRIPTS}/${1}.sh"
|
|
rm -f "${SCRIPTS}/${1}.sh"
|
|
elif wget -q "${GITHUB_REPO}/${1}.php" -P "$SCRIPTS"
|
|
then
|
|
php "${SCRIPTS}/${1}.php"
|
|
rm -f "${SCRIPTS}/${1}.php"
|
|
elif wget -q "${GITHUB_REPO}/${1}.py" -P "$SCRIPTS"
|
|
then
|
|
python "${SCRIPTS}/${1}.py"
|
|
rm -f "${SCRIPTS}/${1}.py"
|
|
else
|
|
print_text_in_color "$Red" "Downloading ${1} failed"
|
|
print_text_in_color "$ICyan" "Script failed to download. Please run: 'sudo wget ${GITHUB_REPO}/${1}.sh|php|py' again."
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Run any script in ../static
|
|
# call like: run_static_script name_of_script
|
|
run_static_script() {
|
|
# Get ${1} script
|
|
rm -f "${SCRIPTS}/${1}.sh" "${SCRIPTS}/${1}.php" "${SCRIPTS}/${1}.py"
|
|
if wget -q "${STATIC}/${1}.sh" -P "$SCRIPTS"
|
|
then
|
|
bash "${SCRIPTS}/${1}.sh"
|
|
rm -f "${SCRIPTS}/${1}.sh"
|
|
elif wget -q "${STATIC}/${1}.php" -P "$SCRIPTS"
|
|
then
|
|
php "${SCRIPTS}/${1}.php"
|
|
rm -f "${SCRIPTS}/${1}.php"
|
|
elif wget -q "${STATIC}/${1}.py" -P "$SCRIPTS"
|
|
then
|
|
python "${SCRIPTS}/${1}.py"
|
|
rm -f "${SCRIPTS}/${1}.py"
|
|
else
|
|
print_text_in_color "$Red" "Downloading ${1} failed"
|
|
print_text_in_color "$ICyan" "Script failed to download. Please run: 'sudo wget ${STATIC}/${1}.sh|php|py' again."
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Run any script in ../apps
|
|
# call like: run_app_script collabora|nextant|passman|spreedme|contacts|calendar|webmin|previewgenerator
|
|
run_app_script() {
|
|
rm -f "${SCRIPTS}/${1}.sh" "${SCRIPTS}/${1}.php" "${SCRIPTS}/${1}.py"
|
|
if wget -q "${APP}/${1}.sh" -P "$SCRIPTS"
|
|
then
|
|
bash "${SCRIPTS}/${1}.sh"
|
|
rm -f "${SCRIPTS}/${1}.sh"
|
|
elif wget -q "${APP}/${1}.php" -P "$SCRIPTS"
|
|
then
|
|
php "${SCRIPTS}/${1}.php"
|
|
rm -f "${SCRIPTS}/${1}.php"
|
|
elif wget -q "${APP}/${1}.py" -P "$SCRIPTS"
|
|
then
|
|
python "${SCRIPTS}/${1}.py"
|
|
rm -f "${SCRIPTS}/${1}.py"
|
|
else
|
|
print_text_in_color "$Red" "Downloading ${1} failed"
|
|
print_text_in_color "$ICyan" "Script failed to download. Please run: 'sudo wget ${APP}/${1}.sh|php|py' again."
|
|
exit
|
|
fi
|
|
}
|
|
|
|
version(){
|
|
local h t v
|
|
|
|
[[ $2 = "$1" || $2 = "$3" ]] && return 0
|
|
|
|
v=$(printf '%s\n' "$@" | sort -V)
|
|
h=$(head -n1 <<<"$v")
|
|
t=$(tail -n1 <<<"$v")
|
|
|
|
[[ $2 != "$h" && $2 != "$t" ]]
|
|
}
|
|
|
|
version_gt() {
|
|
local v1 v2 IFS=.
|
|
read -ra v1 <<< "$1"
|
|
read -ra v2 <<< "$2"
|
|
printf -v v1 %03d "${v1[@]}"
|
|
printf -v v2 %03d "${v2[@]}"
|
|
[[ $v1 > $v2 ]]
|
|
}
|
|
|
|
spinner_loading() {
|
|
pid=$!
|
|
spin='-\|/'
|
|
i=0
|
|
while kill -0 $pid 2>/dev/null
|
|
do
|
|
i=$(( (i+1) %4 ))
|
|
printf "\r[${spin:$i:1}] " # Add text here, something like "Please be paitent..." maybe?
|
|
sleep .1
|
|
done
|
|
}
|
|
|
|
any_key() {
|
|
local PROMPT="$1"
|
|
read -r -sn 1 -p "$(printf "%b" "${IGreen}${PROMPT}${Color_Off}")";echo
|
|
}
|
|
|
|
lowest_compatible_nc() {
|
|
if [ "${CURRENTVERSION%%.*}" -lt "$1" ]
|
|
then
|
|
msg_box "This script is developed to work with Nextcloud $1 and later.
|
|
This means we can't use our own script for now. But don't worry,
|
|
we automated the update process and we will now use Nextclouds updater instead.
|
|
|
|
Press [OK] to continue the update, or press [CTRL+C] to abort.
|
|
|
|
If you are using Nextcloud $1 and later and still see this message,
|
|
or experience other issues then please report this to $ISSUES"
|
|
|
|
# Download the latest updater
|
|
# cd $NCPATH
|
|
# wget -q https://github.com/nextcloud/updater/archive/master.zip
|
|
# install_if_not unzip
|
|
# unzip -q master.zip
|
|
# rm master.zip*
|
|
# rm updater/ -R
|
|
# mv updater-master/ updater/
|
|
# download_static_script setup_secure_permissions_nextcloud -P $SCRIPTS
|
|
# bash $SECURE
|
|
# cd
|
|
|
|
# Do the upgrade
|
|
chown -R www-data:www-data "$NCPATH"
|
|
rm -rf "$NCPATH"/assets
|
|
yes | sudo -u www-data php /var/www/nextcloud/updater/updater.phar
|
|
download_static_script setup_secure_permissions_nextcloud -P $SCRIPTS
|
|
bash $SECURE
|
|
occ_command maintenance:mode --off
|
|
fi
|
|
|
|
# Check new version
|
|
# shellcheck source=lib.sh
|
|
NC_UPDATE=1 . <(curl -sL $GITHUB_REPO/lib.sh)
|
|
unset NC_UPDATE
|
|
if [ "${CURRENTVERSION%%.*}" -ge "$1" ]
|
|
then
|
|
sleep 1
|
|
else
|
|
msg_box "It appears that something went wrong with the update.
|
|
Please report this to $ISSUES"
|
|
occ_command -V
|
|
exit
|
|
fi
|
|
}
|
|
|
|
# Check universe reposiroty
|
|
check_universe() {
|
|
UNIV=$(apt-cache policy | grep http | awk '{print $3}' | grep universe | head -n 1 | cut -d "/" -f 2)
|
|
if [ "$UNIV" != "universe" ]
|
|
then
|
|
print_text_in_color "$ICyan" "Adding required repo (universe)."
|
|
add-apt-repository universe
|
|
fi
|
|
}
|
|
|
|
# Check universe reposiroty
|
|
check_multiverse() {
|
|
MULTIV=$(apt-cache policy | grep http | awk '{print $3}' | grep multiverse | head -n 1 | cut -d "/" -f 2)
|
|
if [ "$MULTIV" != "multiverse" ]
|
|
then
|
|
print_text_in_color "$ICyan" "Adding required repo (multiverse)."
|
|
add-apt-repository multiverse
|
|
fi
|
|
}
|
|
|
|
set_max_count() {
|
|
if grep -F 'vm.max_map_count=262144' /etc/sysctl.conf ; then
|
|
print_text_in_color "$ICyan" "Max map count already set, skipping..."
|
|
else
|
|
sysctl -w vm.max_map_count=262144
|
|
{
|
|
echo "###################################################################"
|
|
echo "# Docker ES max virtual memory"
|
|
echo "vm.max_map_count=262144"
|
|
} >> /etc/sysctl.conf
|
|
fi
|
|
}
|
|
|
|
install_docker() {
|
|
if ! docker -v &> /dev/null
|
|
then
|
|
print_text_in_color "$ICyan" "Installing Docker CE..."
|
|
install_if_not curl
|
|
curl -fsSL get.docker.com | sh
|
|
fi
|
|
# Set overlay2
|
|
cat << OVERLAY2 > /etc/docker/daemon.json
|
|
{
|
|
"storage-driver": "overlay2"
|
|
}
|
|
OVERLAY2
|
|
systemctl daemon-reload
|
|
systemctl restart docker
|
|
}
|
|
|
|
# Remove all dockers excluding one
|
|
# docker_prune_except_this fts_esror 'Full Text Search'
|
|
docker_prune_except_this() {
|
|
print_text_in_color "$ICyan" "Checking if there are any old images and removing them..."
|
|
DOCKERPS=$(docker ps -a | grep -v "$1" | awk 'NR>1 {print $1}')
|
|
if [ "$DOCKERPS" != "" ]
|
|
then
|
|
msg_box "Removing old Docker instance(s)... ($DOCKERPS)
|
|
|
|
Please note that we will not remove $1 ($2).
|
|
|
|
You will be given the option to abort when you hit OK."
|
|
any_key "Press any key to continue. Press CTRL+C to abort"
|
|
docker stop "$(docker ps -a | grep -v "$1" | awk 'NR>1 {print $1}')"
|
|
docker container prune -f
|
|
docker image prune -a -f
|
|
docker volume prune -f
|
|
fi
|
|
}
|
|
|
|
# Remove selected Docker image
|
|
# docker_prune_this 'collabora/code' 'onlyoffice/documentserver'
|
|
docker_prune_this() {
|
|
# Collabora
|
|
DOCKERIMG="$(docker images "$1" | awk '{print $1}' | tail -1)"
|
|
if [ "$DOCKERIMG" = "collabora/code" ]
|
|
then
|
|
msg_box "Removing old Docker image: $DOCKERIMG
|
|
|
|
You will be given the option to abort when you hit OK."
|
|
any_key "Press any key to continue. Press CTRL+C to abort"
|
|
docker stop "$(docker container ls | grep "$1" | awk '{print $1}' | tail -1)"
|
|
docker container prune -f
|
|
docker image prune -a -f
|
|
docker volume prune -f
|
|
fi
|
|
|
|
# OnlyOffice
|
|
DOCKERIMG="$(docker images "$2" | awk '{print $1}' | tail -1)"
|
|
if [ "$DOCKERIMG" = "onlyoffice/documentserver" ]
|
|
then
|
|
msg_box "Removing old Docker image: $DOCKERIMG
|
|
|
|
You will be given the option to abort when you hit OK."
|
|
any_key "Press any key to continue. Press CTRL+C to abort"
|
|
docker stop "$(docker container ls | grep "$2" | awk '{print $1}' | tail -1)"
|
|
docker container prune -f
|
|
docker image prune -a -f
|
|
docker volume prune -f
|
|
fi
|
|
}
|
|
|
|
# countdown 'message looks like this' 10
|
|
countdown() {
|
|
print_text_in_color "$ICyan" "$1"
|
|
secs="$(($2))"
|
|
while [ $secs -gt 0 ]; do
|
|
echo -ne "$secs\033[0K\r"
|
|
sleep 1
|
|
: $((secs--))
|
|
done
|
|
}
|
|
|
|
print_text_in_color() {
|
|
printf "%b%s%b\n" "$1" "$2" "$Color_Off"
|
|
}
|
|
|
|
## bash colors
|
|
# Reset
|
|
Color_Off='\e[0m' # Text Reset
|
|
|
|
# Regular Colors
|
|
Black='\e[0;30m' # Black
|
|
Red='\e[0;31m' # Red
|
|
Green='\e[0;32m' # Green
|
|
Yellow='\e[0;33m' # Yellow
|
|
Blue='\e[0;34m' # Blue
|
|
Purple='\e[0;35m' # Purple
|
|
Cyan='\e[0;36m' # Cyan
|
|
White='\e[0;37m' # White
|
|
|
|
# Bold
|
|
BBlack='\e[1;30m' # Black
|
|
BRed='\e[1;31m' # Red
|
|
BGreen='\e[1;32m' # Green
|
|
BYellow='\e[1;33m' # Yellow
|
|
BBlue='\e[1;34m' # Blue
|
|
BPurple='\e[1;35m' # Purple
|
|
BCyan='\e[1;36m' # Cyan
|
|
BWhite='\e[1;37m' # White
|
|
|
|
# Underline
|
|
UBlack='\e[4;30m' # Black
|
|
URed='\e[4;31m' # Red
|
|
UGreen='\e[4;32m' # Green
|
|
UYellow='\e[4;33m' # Yellow
|
|
UBlue='\e[4;34m' # Blue
|
|
UPurple='\e[4;35m' # Purple
|
|
UCyan='\e[4;36m' # Cyan
|
|
UWhite='\e[4;37m' # White
|
|
|
|
# Background
|
|
On_Black='\e[40m' # Black
|
|
On_Red='\e[41m' # Red
|
|
On_Green='\e[42m' # Green
|
|
On_Yellow='\e[43m' # Yellow
|
|
On_Blue='\e[44m' # Blue
|
|
On_Purple='\e[45m' # Purple
|
|
On_Cyan='\e[46m' # Cyan
|
|
On_White='\e[47m' # White
|
|
|
|
# High Intensity
|
|
IBlack='\e[0;90m' # Black
|
|
IRed='\e[0;91m' # Red
|
|
IGreen='\e[0;92m' # Green
|
|
IYellow='\e[0;93m' # Yellow
|
|
IBlue='\e[0;94m' # Blue
|
|
IPurple='\e[0;95m' # Purple
|
|
ICyan='\e[0;96m' # Cyan
|
|
IWhite='\e[0;97m' # White
|
|
|
|
# Bold High Intensity
|
|
BIBlack='\e[1;90m' # Black
|
|
BIRed='\e[1;91m' # Red
|
|
BIGreen='\e[1;92m' # Green
|
|
BIYellow='\e[1;93m' # Yellow
|
|
BIBlue='\e[1;94m' # Blue
|
|
BIPurple='\e[1;95m' # Purple
|
|
BICyan='\e[1;96m' # Cyan
|
|
BIWhite='\e[1;97m' # White
|
|
|
|
# High Intensity backgrounds
|
|
On_IBlack='\e[0;100m' # Black
|
|
On_IRed='\e[0;101m' # Red
|
|
On_IGreen='\e[0;102m' # Green
|
|
On_IYellow='\e[0;103m' # Yellow
|
|
On_IBlue='\e[0;104m' # Blue
|
|
On_IPurple='\e[0;105m' # Purple
|
|
On_ICyan='\e[0;106m' # Cyan
|
|
On_IWhite='\e[0;107m' # White
|