|
|
@@ -24,9 +24,9 @@ memory=$(grep 'MemTotal' /proc/meminfo | tr ' ' '\n' | grep [0-9])
|
|
|
hst_backups="/root/hst_install_backups/$(date +%d%m%Y%H%M)"
|
|
|
spinner="/-\|"
|
|
|
os='debian'
|
|
|
-architecture="$(arch)"
|
|
|
-release=$(cat /etc/debian_version | tr "." "\n" | head -n1)
|
|
|
+release="$(cat /etc/debian_version | tr "." "\n" | head -n1)"
|
|
|
codename="$(cat /etc/os-release | grep VERSION= | cut -f 2 -d \( | cut -f 1 -d \))"
|
|
|
+architecture="$(arch)"
|
|
|
HESTIA_INSTALL_DIR="$HESTIA/install/deb"
|
|
|
HESTIA_COMMON_DIR="$HESTIA/install/common"
|
|
|
VERBOSE='no'
|
|
|
@@ -38,24 +38,18 @@ multiphp_v=("5.6" "7.0" "7.1" "7.2" "7.3" "7.4" "8.0" "8.1" "8.2")
|
|
|
fpm_v="8.1"
|
|
|
mariadb_v="10.11"
|
|
|
|
|
|
-software="nginx apache2 apache2-utils apache2-suexec-custom
|
|
|
- apache2-suexec-pristine libapache2-mod-fcgid libapache2-mod-php$fpm_v
|
|
|
- php$fpm_v php$fpm_v-common php$fpm_v-cgi php$fpm_v-mysql php$fpm_v-curl
|
|
|
- php$fpm_v-pgsql php$fpm_v-imagick php$fpm_v-imap php$fpm_v-ldap
|
|
|
- php$fpm_v-apcu php$fpm_v-zip php$fpm_v-bz2 php$fpm_v-cli
|
|
|
- php$fpm_v-gd php$fpm_v-intl php$fpm_v-mbstring
|
|
|
- php$fpm_v-opcache php$fpm_v-pspell php$fpm_v-readline php$fpm_v-xml
|
|
|
- awstats vsftpd proftpd-basic bind9 exim4 exim4-daemon-heavy
|
|
|
- clamav-daemon spamassassin dovecot-imapd dovecot-pop3d dovecot-sieve dovecot-managesieved
|
|
|
- net-tools mariadb-client mariadb-common mariadb-server mysql-client mysql-common mysql-server postgresql
|
|
|
- postgresql-contrib mc flex whois git idn2 unzip zip sudo bc ftp lsof
|
|
|
- rrdtool quota e2fslibs bsdutils e2fsprogs curl imagemagick fail2ban
|
|
|
- dnsutils bsdmainutils cron hestia=${HESTIA_INSTALL_VER} hestia-nginx
|
|
|
- hestia-php expect libmail-dkim-perl unrar-free vim-common acl sysstat
|
|
|
- rsyslog openssh-server util-linux ipset libapache2-mpm-itk zstd
|
|
|
- lsb-release jq"
|
|
|
-
|
|
|
-installer_dependencies="apt-transport-https curl dirmngr gnupg wget ca-certificates"
|
|
|
+# Defining software pack for all distros
|
|
|
+software="acl apache2 apache2-suexec-custom apache2-suexec-pristine apache2-utils awstats bc bind9 bsdmainutils bsdutils
|
|
|
+ clamav-daemon cron curl dnsutils dovecot-imapd dovecot-managesieved dovecot-pop3d dovecot-sieve e2fslibs e2fsprogs
|
|
|
+ exim4 exim4-daemon-heavy expect fail2ban flex ftp git hestia=${HESTIA_INSTALL_VER} hestia-nginx hestia-php idn2
|
|
|
+ imagemagick ipset jq libapache2-mod-fcgid libapache2-mod-php$fpm_v libapache2-mpm-itk libmail-dkim-perl lsb-release
|
|
|
+ lsof mariadb-client mariadb-common mariadb-server mc mysql-client mysql-common mysql-server net-tools nginx openssh-server
|
|
|
+ php$fpm_v php$fpm_v-apcu php$fpm_v-bz2 php$fpm_v-cgi php$fpm_v-cli php$fpm_v-common php$fpm_v-curl php$fpm_v-gd
|
|
|
+ php$fpm_v-imagick php$fpm_v-imap php$fpm_v-intl php$fpm_v-ldap php$fpm_v-mbstring php$fpm_v-mysql php$fpm_v-opcache
|
|
|
+ php$fpm_v-pgsql php$fpm_v-pspell php$fpm_v-readline php$fpm_v-xml php$fpm_v-zip postgresql postgresql-contrib
|
|
|
+ proftpd-basic quota rrdtool rsyslog spamassassin sudo sysstat unrar-free unzip util-linux vim-common vsftpd whois zip zstd"
|
|
|
+
|
|
|
+installer_dependencies="apt-transport-https ca-certificates curl dirmngr gnupg wget"
|
|
|
|
|
|
# Defining help function
|
|
|
help() {
|
|
|
@@ -67,7 +61,7 @@ help() {
|
|
|
-j, --proftpd Install ProFTPD [yes|no] default: no
|
|
|
-k, --named Install Bind [yes|no] default: yes
|
|
|
-m, --mysql Install MariaDB [yes|no] default: yes
|
|
|
- -M, --mysql-classic Install MySQL [yes|no] default: no
|
|
|
+ -M, --mysql8 Install MySQL [yes|no] default: no
|
|
|
-g, --postgresql Install PostgreSQL [yes|no] default: no
|
|
|
-x, --exim Install Exim [yes|no] default: yes
|
|
|
-z, --dovecot Install Dovecot [yes|no] default: yes
|
|
|
@@ -211,7 +205,9 @@ for arg; do
|
|
|
--proftpd) args="${args}-j " ;;
|
|
|
--named) args="${args}-k " ;;
|
|
|
--mysql) args="${args}-m " ;;
|
|
|
+ --mariadb) args="${args}-m " ;;
|
|
|
--mysql-classic) args="${args}-M " ;;
|
|
|
+ --mysql8) args="${args}-M " ;;
|
|
|
--postgresql) args="${args}-g " ;;
|
|
|
--exim) args="${args}-x " ;;
|
|
|
--dovecot) args="${args}-z " ;;
|
|
|
@@ -245,36 +241,36 @@ eval set -- "$args"
|
|
|
# Parsing arguments
|
|
|
while getopts "a:w:v:j:k:m:M:g:d:x:z:Z:c:t:i:b:r:o:q:l:y:6:s:e:p:D:fOh" Option; do
|
|
|
case $Option in
|
|
|
- a) apache=$OPTARG ;; # Apache
|
|
|
- w) phpfpm=$OPTARG ;; # PHP-FPM
|
|
|
- o) multiphp=$OPTARG ;; # Multi-PHP
|
|
|
- v) vsftpd=$OPTARG ;; # Vsftpd
|
|
|
- j) proftpd=$OPTARG ;; # Proftpd
|
|
|
- k) named=$OPTARG ;; # Named
|
|
|
- m) mysql=$OPTARG ;; # MariaDB
|
|
|
- M) mysqlclassic=$OPTARG ;; # MySQL
|
|
|
- g) postgresql=$OPTARG ;; # PostgreSQL
|
|
|
- x) exim=$OPTARG ;; # Exim
|
|
|
- z) dovecot=$OPTARG ;; # Dovecot
|
|
|
- Z) sieve=$OPTARG ;; # Sieve
|
|
|
- c) clamd=$OPTARG ;; # ClamAV
|
|
|
- t) spamd=$OPTARG ;; # SpamAssassin
|
|
|
- i) iptables=$OPTARG ;; # Iptables
|
|
|
- b) fail2ban=$OPTARG ;; # Fail2ban
|
|
|
- q) quota=$OPTARG ;; # FS Quota
|
|
|
- r) port=$OPTARG ;; # Backend Port
|
|
|
- l) lang=$OPTARG ;; # Language
|
|
|
- d) api=$OPTARG ;; # Activate API
|
|
|
- y) interactive=$OPTARG ;; # Interactive install
|
|
|
- 6) ipv6=$OPTARG ;; # IPv6
|
|
|
- s) servername=$OPTARG ;; # Hostname
|
|
|
- e) email=$OPTARG ;; # Admin email
|
|
|
- p) vpass=$OPTARG ;; # Admin password
|
|
|
- D) withdebs=$OPTARG ;; # Hestia debs path
|
|
|
- f) force='yes' ;; # Force install
|
|
|
- O) override='yes' ;; # Override checks
|
|
|
- h) help ;; # Help
|
|
|
- *) help ;; # Print help (default)
|
|
|
+ a) apache=$OPTARG ;; # Apache
|
|
|
+ w) phpfpm=$OPTARG ;; # PHP-FPM
|
|
|
+ o) multiphp=$OPTARG ;; # Multi-PHP
|
|
|
+ v) vsftpd=$OPTARG ;; # Vsftpd
|
|
|
+ j) proftpd=$OPTARG ;; # Proftpd
|
|
|
+ k) named=$OPTARG ;; # Named
|
|
|
+ m) mysql=$OPTARG ;; # MariaDB
|
|
|
+ M) mysql8=$OPTARG ;; # MySQL
|
|
|
+ g) postgresql=$OPTARG ;; # PostgreSQL
|
|
|
+ x) exim=$OPTARG ;; # Exim
|
|
|
+ z) dovecot=$OPTARG ;; # Dovecot
|
|
|
+ Z) sieve=$OPTARG ;; # Sieve
|
|
|
+ c) clamd=$OPTARG ;; # ClamAV
|
|
|
+ t) spamd=$OPTARG ;; # SpamAssassin
|
|
|
+ i) iptables=$OPTARG ;; # Iptables
|
|
|
+ b) fail2ban=$OPTARG ;; # Fail2ban
|
|
|
+ q) quota=$OPTARG ;; # FS Quota
|
|
|
+ r) port=$OPTARG ;; # Backend Port
|
|
|
+ l) lang=$OPTARG ;; # Language
|
|
|
+ d) api=$OPTARG ;; # Activate API
|
|
|
+ y) interactive=$OPTARG ;; # Interactive install
|
|
|
+ 6) ipv6=$OPTARG ;; # IPv6
|
|
|
+ s) servername=$OPTARG ;; # Hostname
|
|
|
+ e) email=$OPTARG ;; # Admin email
|
|
|
+ p) vpass=$OPTARG ;; # Admin password
|
|
|
+ D) withdebs=$OPTARG ;; # Hestia debs path
|
|
|
+ f) force='yes' ;; # Force install
|
|
|
+ O) override='yes' ;; # Override checks
|
|
|
+ h) help ;; # Help
|
|
|
+ *) help ;; # Print help (default)
|
|
|
esac
|
|
|
done
|
|
|
|
|
|
@@ -320,19 +316,23 @@ if [ "$exim" = 'no' ]; then
|
|
|
spamd='no'
|
|
|
dovecot='no'
|
|
|
fi
|
|
|
-if [ "$dovecot" = "no" ]; then
|
|
|
+if [ "$dovecot" = 'no' ]; then
|
|
|
sieve='no'
|
|
|
fi
|
|
|
if [ "$iptables" = 'no' ]; then
|
|
|
fail2ban='no'
|
|
|
fi
|
|
|
-if [ "$apache" = "no" ]; then
|
|
|
+if [ "$apache" = 'no' ]; then
|
|
|
phpfpm='yes'
|
|
|
fi
|
|
|
-if [ "$mysql" = 'yes' ] && [ "$mysqlclassic" = 'yes' ]; then
|
|
|
+if [ "$mysql" = 'yes' ] && [ "$mysql8" = 'yes' ]; then
|
|
|
mysql='no'
|
|
|
fi
|
|
|
|
|
|
+if [ "$mysqlclassic" = 'yes' ] && [ "$architecture" = 'aarch64' ]; then
|
|
|
+ check_result 1 "Mysql 8 does not support ARM64 yet for Debian please use Ubuntu. Unable to continue"
|
|
|
+fi
|
|
|
+
|
|
|
# Checking root permissions
|
|
|
if [ "x$(id -u)" != 'x0' ]; then
|
|
|
check_result 1 "Script can be run executed only by root"
|
|
|
@@ -382,7 +382,7 @@ else
|
|
|
apparmor='yes'
|
|
|
fi
|
|
|
|
|
|
-# Checking repository availability
|
|
|
+# Check repository availability
|
|
|
wget --quiet "https://$GPG/deb_signing.key" -O /dev/null
|
|
|
check_result $? "Unable to connect to the Hestia APT repository"
|
|
|
|
|
|
@@ -448,6 +448,7 @@ if [ -d /etc/netplan ] && [ -z "$force" ]; then
|
|
|
check_result 1 "Unable to detect netplan configuration."
|
|
|
fi
|
|
|
fi
|
|
|
+
|
|
|
# Validate whether installation script matches release version before continuing with install
|
|
|
if [ -z "$withdebs" ] || [ ! -d "$withdebs" ]; then
|
|
|
release_branch_ver=$(curl -s https://raw.githubusercontent.com/hestiacp/hestiacp/release/src/deb/hestia/control | grep "Version:" | awk '{print $2}')
|
|
|
@@ -525,7 +526,6 @@ clear
|
|
|
install_welcome_message
|
|
|
|
|
|
# Web stack
|
|
|
-
|
|
|
echo ' - NGINX Web / Proxy Server'
|
|
|
if [ "$apache" = 'yes' ]; then
|
|
|
echo ' - Apache Web Server (as backend)'
|
|
|
@@ -560,7 +560,7 @@ if [ "$exim" = 'yes' ]; then
|
|
|
fi
|
|
|
echo
|
|
|
if [ "$dovecot" = 'yes' ]; then
|
|
|
- echo -n ' - Dovecot POP3/IMAP Server '
|
|
|
+ echo -n ' - Dovecot POP3/IMAP Server'
|
|
|
if [ "$sieve" = 'yes' ]; then
|
|
|
echo -n '+ Sieve'
|
|
|
fi
|
|
|
@@ -568,11 +568,12 @@ if [ "$exim" = 'yes' ]; then
|
|
|
fi
|
|
|
|
|
|
echo
|
|
|
+
|
|
|
# Database stack
|
|
|
if [ "$mysql" = 'yes' ]; then
|
|
|
echo ' - MariaDB Database Server'
|
|
|
fi
|
|
|
-if [ "$mysqlclassic" = 'yes' ]; then
|
|
|
+if [ "$mysql8" = 'yes' ]; then
|
|
|
echo ' - MySQL8 Database Server'
|
|
|
fi
|
|
|
if [ "$postgresql" = 'yes' ]; then
|
|
|
@@ -707,7 +708,7 @@ fi
|
|
|
# Define apt conf location
|
|
|
apt=/etc/apt/sources.list.d
|
|
|
|
|
|
-#create new folder if not all-ready exists
|
|
|
+# Create new folder if not all-ready exists
|
|
|
mkdir -p /root/.gnupg/ && chmod 700 /root/.gnupg/
|
|
|
|
|
|
# Updating system
|
|
|
@@ -740,7 +741,7 @@ if [ "$mysql" = 'yes' ]; then
|
|
|
fi
|
|
|
|
|
|
# Installing Mysql8 repo
|
|
|
-if [ "$mysqlclassic" = 'yes' ]; then
|
|
|
+if [ "$mysql8" = 'yes' ]; then
|
|
|
echo "[ * ] Mysql 8"
|
|
|
echo "deb [arch=$ARCH signed-by=/usr/share/keyrings/mysql-keyring.gpg] http://repo.mysql.com/apt/debian/ $codename mysql-apt-config" >> /etc/apt/sources.list.d/mysql.list
|
|
|
echo "deb [arch=$ARCH signed-by=/usr/share/keyrings/mysql-keyring.gpg] http://repo.mysql.com/apt/debian/ $codename mysql-8.0" >> /etc/apt/sources.list.d/mysql.list
|
|
|
@@ -924,19 +925,18 @@ if [ "$mysql" = 'no' ]; then
|
|
|
software=$(echo "$software" | sed -e "s/mariadb-client//")
|
|
|
software=$(echo "$software" | sed -e "s/mariadb-common//")
|
|
|
fi
|
|
|
-if [ "$mysqlclassic" = 'no' ]; then
|
|
|
+if [ "$mysql8" = 'no' ]; then
|
|
|
software=$(echo "$software" | sed -e "s/mysql-server//")
|
|
|
software=$(echo "$software" | sed -e "s/mysql-client//")
|
|
|
software=$(echo "$software" | sed -e "s/mysql-common//")
|
|
|
fi
|
|
|
-if [ "$mysql" = 'no' ] && [ "$mysqlclassic" = 'no' ]; then
|
|
|
+if [ "$mysql" = 'no' ] && [ "$mysql8" = 'no' ]; then
|
|
|
software=$(echo "$software" | sed -e "s/php$fpm_v-mysql//")
|
|
|
fi
|
|
|
if [ "$postgresql" = 'no' ]; then
|
|
|
software=$(echo "$software" | sed -e "s/postgresql-contrib//")
|
|
|
software=$(echo "$software" | sed -e "s/postgresql//")
|
|
|
software=$(echo "$software" | sed -e "s/php$fpm_v-pgsql//")
|
|
|
- software=$(echo "$software" | sed -e "s/phppgadmin//")
|
|
|
fi
|
|
|
if [ "$fail2ban" = 'no' ]; then
|
|
|
software=$(echo "$software" | sed -e "s/fail2ban//")
|
|
|
@@ -950,7 +950,6 @@ if [ "$phpfpm" = 'yes' ]; then
|
|
|
software=$(echo "$software" | sed -e "s/libapache2-mpm-itk//")
|
|
|
software=$(echo "$software" | sed -e "s/libapache2-mod-ruid2//")
|
|
|
software=$(echo "$software" | sed -e "s/libapache2-mod-php$fpm_v//")
|
|
|
-
|
|
|
fi
|
|
|
if [ -d "$withdebs" ]; then
|
|
|
software=$(echo "$software" | sed -e "s/hestia-nginx//")
|
|
|
@@ -1149,22 +1148,18 @@ if [ "$apache" = 'no' ]; then
|
|
|
write_config_value "WEB_SSL_PORT" "443"
|
|
|
write_config_value "WEB_SSL" "openssl"
|
|
|
write_config_value "STATS_SYSTEM" "awstats"
|
|
|
-
|
|
|
fi
|
|
|
-
|
|
|
if [ "$phpfpm" = 'yes' ]; then
|
|
|
write_config_value "WEB_BACKEND" "php-fpm"
|
|
|
fi
|
|
|
|
|
|
# Database stack
|
|
|
-if [ "$mysql" = 'yes' ] || [ "$mysqlclassic" = 'yes' ]; then
|
|
|
+if [ "$mysql" = 'yes' ] || [ "$mysql8" = 'yes' ]; then
|
|
|
installed_db_types='mysql'
|
|
|
fi
|
|
|
-
|
|
|
if [ "$postgresql" = 'yes' ]; then
|
|
|
installed_db_types="$installed_db_types,pgsql"
|
|
|
fi
|
|
|
-
|
|
|
if [ -n "$installed_db_types" ]; then
|
|
|
db=$(echo "$installed_db_types" \
|
|
|
| sed "s/,/\n/g" \
|
|
|
@@ -1271,6 +1266,7 @@ cp -rf $HESTIA_COMMON_DIR/templates/web/skel/document_errors/* /var/www/document
|
|
|
|
|
|
# Installing firewall rules
|
|
|
cp -rf $HESTIA_COMMON_DIR/firewall $HESTIA/data/
|
|
|
+rm -f $HESTIA/data/firewall/ipset/blacklist.sh $HESTIA/data/firewall/ipset/blacklist.ipv6.sh
|
|
|
|
|
|
# Installing apis
|
|
|
cp -rf $HESTIA_COMMON_DIR/api $HESTIA/data/
|
|
|
@@ -1318,6 +1314,7 @@ $HESTIA/bin/v-add-sys-sftp-jail > /dev/null 2>&1
|
|
|
check_result $? "can't enable sftp jail"
|
|
|
|
|
|
# Adding Hestia admin account
|
|
|
+echo "[ * ] Create admin account..."
|
|
|
$HESTIA/bin/v-add-user admin $vpass $email "system" "System Administrator"
|
|
|
check_result $? "can't create admin user"
|
|
|
$HESTIA/bin/v-change-user-shell admin nologin
|
|
|
@@ -1326,6 +1323,7 @@ $HESTIA/bin/v-change-user-language admin $lang
|
|
|
$HESTIA/bin/v-change-sys-config-value 'POLICY_SYSTEM_PROTECTED_ADMIN' 'yes'
|
|
|
|
|
|
locale-gen "en_US.utf8" > /dev/null 2>&1
|
|
|
+
|
|
|
#----------------------------------------------------------#
|
|
|
# Configure Nginx #
|
|
|
#----------------------------------------------------------#
|
|
|
@@ -1369,22 +1367,26 @@ if [ -n "$resolver" ]; then
|
|
|
fi
|
|
|
|
|
|
# https://github.com/ergin/nginx-cloudflare-real-ip/
|
|
|
-CLOUDFLARE_FILE_PATH='/etc/nginx/conf.d/cloudflare.inc'
|
|
|
-echo "#Cloudflare" > $CLOUDFLARE_FILE_PATH
|
|
|
-echo "" >> $CLOUDFLARE_FILE_PATH
|
|
|
+cf_ips="$(curl -fsLm2 --retry 1 https://api.cloudflare.com/client/v4/ips)"
|
|
|
|
|
|
-echo "# - IPv4" >> $CLOUDFLARE_FILE_PATH
|
|
|
-for i in $(curl -s -L https://www.cloudflare.com/ips-v4); do
|
|
|
- echo "set_real_ip_from $i;" >> $CLOUDFLARE_FILE_PATH
|
|
|
-done
|
|
|
-echo "" >> $CLOUDFLARE_FILE_PATH
|
|
|
-echo "# - IPv6" >> $CLOUDFLARE_FILE_PATH
|
|
|
-for i in $(curl -s -L https://www.cloudflare.com/ips-v6); do
|
|
|
- echo "set_real_ip_from $i;" >> $CLOUDFLARE_FILE_PATH
|
|
|
-done
|
|
|
+if [ -n "$cf_ips" ] && [ "$(echo "$cf_ips" | jq -r '.success//""')" = "true" ]; then
|
|
|
+ cf_inc="/etc/nginx/conf.d/cloudflare.inc"
|
|
|
|
|
|
-echo "" >> $CLOUDFLARE_FILE_PATH
|
|
|
-echo "real_ip_header CF-Connecting-IP;" >> $CLOUDFLARE_FILE_PATH
|
|
|
+ echo "[ * ] Updating Cloudflare IP Ranges for Nginx..."
|
|
|
+ echo "# Cloudflare IP Ranges" > $cf_inc
|
|
|
+ echo "" >> $cf_inc
|
|
|
+ echo "# IPv4" >> $cf_inc
|
|
|
+ for ipv4 in $(echo "$cf_ips" | jq -r '.result.ipv4_cidrs[]//""' | sort); do
|
|
|
+ echo "set_real_ip_from $ipv4;" >> $cf_inc
|
|
|
+ done
|
|
|
+ echo "" >> $cf_inc
|
|
|
+ echo "# IPv6" >> $cf_inc
|
|
|
+ for ipv6 in $(echo "$cf_ips" | jq -r '.result.ipv6_cidrs[]//""' | sort); do
|
|
|
+ echo "set_real_ip_from $ipv6;" >> $cf_inc
|
|
|
+ done
|
|
|
+ echo "" >> $cf_inc
|
|
|
+ echo "real_ip_header CF-Connecting-IP;" >> $cf_inc
|
|
|
+fi
|
|
|
|
|
|
update-rc.d nginx defaults > /dev/null 2>&1
|
|
|
systemctl start nginx >> $LOG
|
|
|
@@ -1416,6 +1418,7 @@ if [ "$apache" = 'yes' ]; then
|
|
|
a2dismod --quiet status > /dev/null 2>&1
|
|
|
a2enmod --quiet hestia-status > /dev/null 2>&1
|
|
|
|
|
|
+ # Enable mod_ruid/mpm_itk or mpm_event
|
|
|
if [ "$phpfpm" = 'yes' ]; then
|
|
|
# Disable prefork and php, enable event
|
|
|
a2dismod php$fpm_v > /dev/null 2>&1
|
|
|
@@ -1482,7 +1485,7 @@ if [ -z "$ZONE" ]; then
|
|
|
ZONE='UTC'
|
|
|
fi
|
|
|
for pconf in $(find /etc/php* -name php.ini); do
|
|
|
- sed -i "s/;date.timezone =/date.timezone = $ZONE/g" $pconf
|
|
|
+ sed -i "s%;date.timezone =%date.timezone = $ZONE%g" $pconf
|
|
|
sed -i 's%_open_tag = Off%_open_tag = On%g' $pconf
|
|
|
done
|
|
|
|
|
|
@@ -1509,9 +1512,8 @@ if [ "$vsftpd" = 'yes' ]; then
|
|
|
chown root:adm /var/log/xferlog
|
|
|
chmod 640 /var/log/xferlog
|
|
|
update-rc.d vsftpd defaults
|
|
|
- systemctl start vsftpd
|
|
|
+ systemctl start vsftpd >> $LOG
|
|
|
check_result $? "vsftpd start failed"
|
|
|
-
|
|
|
fi
|
|
|
|
|
|
#----------------------------------------------------------#
|
|
|
@@ -1544,7 +1546,7 @@ fi
|
|
|
# Configure MariaDB / MySQL #
|
|
|
#----------------------------------------------------------#
|
|
|
|
|
|
-if [ "$mysql" = 'yes' ] || [ "$mysqlclassic" = 'yes' ]; then
|
|
|
+if [ "$mysql" = 'yes' ] || [ "$mysql8" = 'yes' ]; then
|
|
|
[ "$mysql" = 'yes' ] && mysql_type="MariaDB" || mysql_type="MySQL"
|
|
|
echo "[ * ] Configuring $mysql_type database server..."
|
|
|
mycnf="my-small.cnf"
|
|
|
@@ -1571,32 +1573,47 @@ if [ "$mysql" = 'yes' ] || [ "$mysqlclassic" = 'yes' ]; then
|
|
|
sed -i 's|mariadb.conf.d|mysql.conf.d|g' /etc/mysql/my.cnf
|
|
|
fi
|
|
|
|
|
|
- update-rc.d mysql defaults > /dev/null 2>&1
|
|
|
- systemctl start mysql >> $LOG
|
|
|
- check_result $? "${mysql_type,,} start failed"
|
|
|
+ if [ "$mysql_type" = 'MariaDB' ]; then
|
|
|
+ update-rc.d mariadb defaults > /dev/null 2>&1
|
|
|
+ systemctl -q enable mariadb 2> /dev/null
|
|
|
+ systemctl start mariadb >> $LOG
|
|
|
+ check_result $? "${mysql_type,,} start failed"
|
|
|
+ fi
|
|
|
+
|
|
|
+ if [ "$mysql_type" = 'MySQL' ]; then
|
|
|
+ update-rc.d mysql defaults > /dev/null 2>&1
|
|
|
+ systemctl -q enable mysql 2> /dev/null
|
|
|
+ systemctl start mysql >> $LOG
|
|
|
+ check_result $? "${mysql_type,,} start failed"
|
|
|
+ fi
|
|
|
|
|
|
# Securing MariaDB/MySQL installation
|
|
|
mpass=$(gen_pass)
|
|
|
echo -e "[client]\npassword='$mpass'\n" > /root/.my.cnf
|
|
|
chmod 600 /root/.my.cnf
|
|
|
|
|
|
+ if [ -f '/usr/bin/mariadb' ]; then
|
|
|
+ mysql_server="mariadb"
|
|
|
+ else
|
|
|
+ mysql_server="mysql"
|
|
|
+ fi
|
|
|
# Alter root password
|
|
|
- mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '$mpass'; FLUSH PRIVILEGES;"
|
|
|
+ $mysql_server -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '$mpass'; FLUSH PRIVILEGES;"
|
|
|
if [ "$mysql_type" = 'MariaDB' ]; then
|
|
|
# Allow mysql access via socket for startup
|
|
|
- mysql -e "UPDATE mysql.global_priv SET priv=json_set(priv, '$.password_last_changed', UNIX_TIMESTAMP(), '$.plugin', 'mysql_native_password', '$.authentication_string', 'invalid', '$.auth_or', json_array(json_object(), json_object('plugin', 'unix_socket'))) WHERE User='root';"
|
|
|
+ $mysql_server -e "UPDATE mysql.global_priv SET priv=json_set(priv, '$.password_last_changed', UNIX_TIMESTAMP(), '$.plugin', 'mysql_native_password', '$.authentication_string', 'invalid', '$.auth_or', json_array(json_object(), json_object('plugin', 'unix_socket'))) WHERE User='root';"
|
|
|
# Disable anonymous users
|
|
|
- mysql -e "DELETE FROM mysql.global_priv WHERE User='';"
|
|
|
+ $mysql_server -e "DELETE FROM mysql.global_priv WHERE User='';"
|
|
|
else
|
|
|
- mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '$mpass';"
|
|
|
- mysql -e "DELETE FROM mysql.user WHERE User='';"
|
|
|
- mysql -e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');"
|
|
|
+ $mysql_server -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '$mpass';"
|
|
|
+ $mysql_server -e "DELETE FROM mysql.user WHERE User='';"
|
|
|
+ $mysql_server -e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');"
|
|
|
fi
|
|
|
# Drop test database
|
|
|
- mysql -e "DROP DATABASE IF EXISTS test"
|
|
|
- mysql -e "DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%'"
|
|
|
+ $mysql_server -e "DROP DATABASE IF EXISTS test"
|
|
|
+ $mysql_server -e "DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%'"
|
|
|
# Flush privileges
|
|
|
- mysql -e "FLUSH PRIVILEGES;"
|
|
|
+ $mysql_server -e "FLUSH PRIVILEGES;"
|
|
|
fi
|
|
|
|
|
|
#----------------------------------------------------------#
|
|
|
@@ -1607,7 +1624,7 @@ fi
|
|
|
# shellcheck source=/usr/local/hestia/install/upgrade/upgrade.conf
|
|
|
source $HESTIA/install/upgrade/upgrade.conf
|
|
|
|
|
|
-if [ "$mysql" = 'yes' ] || [ "$mysqlclassic" = 'yes' ]; then
|
|
|
+if [ "$mysql" = 'yes' ] || [ "$mysql8" = 'yes' ]; then
|
|
|
# Display upgrade information
|
|
|
echo "[ * ] Installing phpMyAdmin version v$pma_v..."
|
|
|
|
|
|
@@ -1675,16 +1692,16 @@ if [ "$postgresql" = 'yes' ]; then
|
|
|
ppass=$(gen_pass)
|
|
|
cp -f $HESTIA_INSTALL_DIR/postgresql/pg_hba.conf /etc/postgresql/*/main/
|
|
|
systemctl restart postgresql
|
|
|
- sudo -iu postgres psql -c "ALTER USER postgres WITH PASSWORD '$ppass'"
|
|
|
+ sudo -iu postgres psql -c "ALTER USER postgres WITH PASSWORD '$ppass'" > /dev/null 2>&1
|
|
|
|
|
|
mkdir -p /etc/phppgadmin/
|
|
|
mkdir -p /usr/share/phppgadmin/
|
|
|
|
|
|
- cp -f $HESTIA_INSTALL_DIR/pga/config.inc.php /etc/phppgadmin/
|
|
|
-
|
|
|
wget --retry-connrefused --quiet https://github.com/hestiacp/phppgadmin/releases/download/v$pga_v/phppgadmin-v$pga_v.tar.gz
|
|
|
tar xzf phppgadmin-v$pga_v.tar.gz -C /usr/share/phppgadmin/
|
|
|
|
|
|
+ cp -f $HESTIA_INSTALL_DIR/pga/config.inc.php /etc/phppgadmin/
|
|
|
+
|
|
|
ln -s /etc/phppgadmin/config.inc.php /usr/share/phppgadmin/conf/
|
|
|
|
|
|
# Configuring phpPgAdmin
|
|
|
@@ -1715,7 +1732,7 @@ if [ "$named" = 'yes' ]; then
|
|
|
echo "/home/** rwm," >> /etc/apparmor.d/local/usr.sbin.named 2> /dev/null
|
|
|
systemctl status apparmor > /dev/null 2>&1
|
|
|
if [ $? -ne 0 ]; then
|
|
|
- systemctl restart apparmor
|
|
|
+ systemctl restart apparmor >> $LOG
|
|
|
fi
|
|
|
fi
|
|
|
update-rc.d bind9 defaults > /dev/null 2>&1
|
|
|
@@ -1765,7 +1782,7 @@ if [ "$exim" = 'yes' ]; then
|
|
|
update-rc.d -f postfix remove > /dev/null 2>&1
|
|
|
systemctl stop postfix > /dev/null 2>&1
|
|
|
update-rc.d exim4 defaults
|
|
|
- systemctl start exim4
|
|
|
+ systemctl start exim4 >> $LOG
|
|
|
check_result $? "exim4 start failed"
|
|
|
fi
|
|
|
|
|
|
@@ -1778,8 +1795,8 @@ if [ "$dovecot" = 'yes' ]; then
|
|
|
gpasswd -a dovecot mail > /dev/null 2>&1
|
|
|
cp -rf $HESTIA_COMMON_DIR/dovecot /etc/
|
|
|
cp -f $HESTIA_INSTALL_DIR/logrotate/dovecot /etc/logrotate.d/
|
|
|
- chown -R root:root /etc/dovecot*
|
|
|
rm -f /etc/dovecot/conf.d/15-mailboxes.conf
|
|
|
+ chown -R root:root /etc/dovecot*
|
|
|
|
|
|
#Alter config for 2.2
|
|
|
version=$(dovecot --version | cut -f -2 -d .)
|
|
|
@@ -1791,7 +1808,7 @@ if [ "$dovecot" = 'yes' ]; then
|
|
|
fi
|
|
|
|
|
|
update-rc.d dovecot defaults
|
|
|
- systemctl start dovecot
|
|
|
+ systemctl start dovecot >> $LOG
|
|
|
check_result $? "dovecot start failed"
|
|
|
fi
|
|
|
|
|
|
@@ -1824,7 +1841,7 @@ if [ "$clamd" = 'yes' ]; then
|
|
|
sleep 0.5
|
|
|
done
|
|
|
echo
|
|
|
- systemctl start clamav-daemon
|
|
|
+ systemctl start clamav-daemon >> $LOG
|
|
|
check_result $? "clamav-daemon start failed"
|
|
|
fi
|
|
|
|
|
|
@@ -1863,7 +1880,7 @@ if [ "$fail2ban" = 'yes' ]; then
|
|
|
sed -i "${fline}s/true/false/" /etc/fail2ban/jail.local
|
|
|
fi
|
|
|
if [ "$vsftpd" = 'yes' ]; then
|
|
|
- #Create vsftpd Log File
|
|
|
+ # Create vsftpd Log File
|
|
|
if [ ! -f "/var/log/vsftpd.log" ]; then
|
|
|
touch /var/log/vsftpd.log
|
|
|
fi
|
|
|
@@ -1880,13 +1897,14 @@ if [ "$fail2ban" = 'yes' ]; then
|
|
|
if [ -f /etc/fail2ban/jail.d/defaults-debian.conf ]; then
|
|
|
rm -f /etc/fail2ban/jail.d/defaults-debian.conf
|
|
|
fi
|
|
|
+
|
|
|
update-rc.d fail2ban defaults
|
|
|
- systemctl start fail2ban
|
|
|
+ systemctl start fail2ban >> $LOG
|
|
|
check_result $? "fail2ban start failed"
|
|
|
fi
|
|
|
|
|
|
# Configuring MariaDB/MySQL host
|
|
|
-if [ "$mysql" = 'yes' ] || [ "$mysqlclassic" = 'yes' ]; then
|
|
|
+if [ "$mysql" = 'yes' ] || [ "$mysql8" = 'yes' ]; then
|
|
|
$HESTIA/bin/v-add-database-host mysql localhost root $mpass
|
|
|
fi
|
|
|
|
|
|
@@ -1898,8 +1916,9 @@ fi
|
|
|
#----------------------------------------------------------#
|
|
|
# Install Roundcube #
|
|
|
#----------------------------------------------------------#
|
|
|
+
|
|
|
# Min requirements Dovecot + Exim + Mysql
|
|
|
-if ([ "$mysql" == 'yes' ] || [ "$mysqlclassic" == 'yes' ]) && [ "$dovecot" == "yes" ]; then
|
|
|
+if ([ "$mysql" == 'yes' ] || [ "$mysql8" == 'yes' ]) && [ "$dovecot" == "yes" ]; then
|
|
|
echo "[ * ] Install Roundcube..."
|
|
|
$HESTIA/bin/v-add-sys-roundcube
|
|
|
write_config_value "WEBMAIL_ALIAS" "webmail"
|
|
|
@@ -1911,6 +1930,7 @@ fi
|
|
|
#----------------------------------------------------------#
|
|
|
# Install Sieve #
|
|
|
#----------------------------------------------------------#
|
|
|
+
|
|
|
# Min requirements Dovecot + Exim + Mysql + Roundcube
|
|
|
if [ "$sieve" = 'yes' ]; then
|
|
|
# Folder paths
|
|
|
@@ -1922,7 +1942,7 @@ if [ "$sieve" = 'yes' ]; then
|
|
|
# dovecot.conf install
|
|
|
sed -i "s/namespace/service stats \{\n unix_listener stats-writer \{\n group = mail\n mode = 0660\n user = dovecot\n \}\n\}\n\nnamespace/g" /etc/dovecot/dovecot.conf
|
|
|
|
|
|
- # dovecot conf files
|
|
|
+ # Dovecot conf files
|
|
|
# 10-master.conf
|
|
|
sed -i -E -z "s/ }\n user = dovecot\n}/ \}\n unix_listener auth-master \{\n group = mail\n mode = 0660\n user = dovecot\n \}\n user = dovecot\n\}/g" /etc/dovecot/conf.d/10-master.conf
|
|
|
# 15-lda.conf
|
|
|
@@ -1930,14 +1950,15 @@ if [ "$sieve" = 'yes' ]; then
|
|
|
# 20-imap.conf
|
|
|
sed -i "s/mail_plugins = quota imap_quota/mail_plugins = quota imap_quota imap_sieve/g" /etc/dovecot/conf.d/20-imap.conf
|
|
|
|
|
|
- # replace dovecot-sieve config files
|
|
|
+ # Replace dovecot-sieve config files
|
|
|
cp -f $HESTIA_COMMON_DIR/dovecot/sieve/* /etc/dovecot/conf.d
|
|
|
|
|
|
+ # Dovecot default file install
|
|
|
echo -e "require [\"fileinto\"];\n# rule:[SPAM]\nif header :contains \"X-Spam-Flag\" \"YES\" {\n fileinto \"INBOX.Spam\";\n}\n" > /etc/dovecot/sieve/default
|
|
|
|
|
|
# exim4 install
|
|
|
sed -i "s/\stransport = local_delivery/ transport = dovecot_virtual_delivery/" /etc/exim4/exim4.conf.template
|
|
|
- sed -i "s/address_pipe:/dovecot_virtual_delivery:\n driver = pipe\n command = \/usr\/lib\/dovecot\/dovecot-lda -e -d \$local_part@\$domain -f \$sender_address -a \$original_local_part@\$original_domain\n delivery_date_add\n envelope_to_add\n return_path_add\n log_output = true\n log_defer_output = true\n user = \${extract{2}{:}{\${lookup{\$local_part}lsearch{\/etc\/exim4\/domains\/\${lookup{\$domain}dsearch{\/etc\/exim4\/domains\/}}\/passwd}}}}\n group = mail\n return_output\n\naddress_pipe:/g" /etc/exim4/exim4.conf.template
|
|
|
+ sed -i "s/address_pipe:/dovecot_virtual_delivery:\n driver = pipe\n command = \/usr\/lib\/dovecot\/dovecot-lda -e -d \$local_part@\$domain -f \$sender_address -a \$original_local_part@\$original_domain\n delivery_date_add\n envelope_to_add\n return_path_add\n log_output = true\n log_defer_output = true\n user = \${extract{2}{:}{\${lookup{\$local_part}lsearch{\/etc\/exim4\/domains\/\${lookup{\$domain}dsearch{\/etc\/exim4\/domains\/}}\/passwd}}}}\n group = mail\n return_output\n\naddress_pipe:/g" /etc/exim4/exim4.conf.template
|
|
|
|
|
|
# Permission changes
|
|
|
chown -R dovecot:mail /var/log/dovecot.log
|
|
|
@@ -1954,18 +1975,18 @@ if [ "$sieve" = 'yes' ]; then
|
|
|
chmod 644 $RC_CONFIG_DIR/plugins/managesieve/config.inc.php
|
|
|
sed -i "s/'archive'/'archive', 'managesieve'/g" $RC_CONFIG_DIR/config.inc.php
|
|
|
fi
|
|
|
+
|
|
|
# Restart Dovecot and exim4
|
|
|
systemctl restart dovecot > /dev/null 2>&1
|
|
|
systemctl restart exim4 > /dev/null 2>&1
|
|
|
fi
|
|
|
|
|
|
#----------------------------------------------------------#
|
|
|
-# Comfigure API #
|
|
|
+# Configure API #
|
|
|
#----------------------------------------------------------#
|
|
|
|
|
|
-# Configuring system IPs
|
|
|
if [ "$api" = "yes" ]; then
|
|
|
- # keep legacy api enabled until transition is complete
|
|
|
+ # Keep legacy api enabled until transition is complete
|
|
|
write_config_value "API" "yes"
|
|
|
write_config_value "API_SYSTEM" "1"
|
|
|
write_config_value "API_ALLOWED_IP" ""
|
|
|
@@ -2106,7 +2127,7 @@ chown admin:admin $HESTIA/data/sessions
|
|
|
mkdir -p /backup/
|
|
|
chmod 755 /backup/
|
|
|
|
|
|
-# create cronjob to generate ssl
|
|
|
+# Create cronjob to generate ssl
|
|
|
echo "@reboot root sleep 10 && rm /etc/cron.d/hestia-ssl && PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:' && /usr/local/hestia/bin/v-add-letsencrypt-host" > /etc/cron.d/hestia-ssl
|
|
|
|
|
|
#----------------------------------------------------------#
|
|
|
@@ -2114,30 +2135,10 @@ echo "@reboot root sleep 10 && rm /etc/cron.d/hestia-ssl && PATH='/usr/local/sbi
|
|
|
#----------------------------------------------------------#
|
|
|
|
|
|
echo "[ * ] Updating configuration files..."
|
|
|
-write_config_value "PHPMYADMIN_KEY" ""
|
|
|
-write_config_value "POLICY_USER_VIEW_SUSPENDED" "no"
|
|
|
-write_config_value "POLICY_USER_VIEW_LOGS" "yes"
|
|
|
-write_config_value "POLICY_USER_EDIT_WEB_TEMPLATES" "true"
|
|
|
-write_config_value "POLICY_USER_EDIT_DNS_TEMPLATES" "yes"
|
|
|
-write_config_value "POLICY_USER_EDIT_DETAILS" "yes"
|
|
|
-write_config_value "POLICY_USER_DELETE_LOGS" "yes"
|
|
|
-write_config_value "POLICY_USER_CHANGE_THEME" "yes"
|
|
|
-write_config_value "POLICY_SYSTEM_PROTECTED_ADMIN" "no"
|
|
|
-write_config_value "POLICY_SYSTEM_PASSWORD_RESET" "yes"
|
|
|
-write_config_value "POLICY_SYSTEM_HIDE_SERVICES" "yes"
|
|
|
-write_config_value "POLICY_SYSTEM_ENABLE_BACON" "no"
|
|
|
-write_config_value "PLUGIN_APP_INSTALLER" "true"
|
|
|
-write_config_value "DEBUG_MODE" "no"
|
|
|
-write_config_value "ENFORCE_SUBDOMAIN_OWNERSHIP" "yes"
|
|
|
-write_config_value "USE_SERVER_SMTP" "false"
|
|
|
-write_config_value "SERVER_SMTP_PORT" ""
|
|
|
-write_config_value "SERVER_SMTP_HOST" ""
|
|
|
-write_config_value "SERVER_SMTP_SECURITY" ""
|
|
|
-write_config_value "SERVER_SMTP_USER" ""
|
|
|
-write_config_value "SERVER_SMTP_PASSWD" ""
|
|
|
-write_config_value "SERVER_SMTP_ADDR" ""
|
|
|
-write_config_value "POLICY_CSRF_STRICTNESS" "1"
|
|
|
-write_config_value "DISABLE_IP_CHECK" "no"
|
|
|
+
|
|
|
+BIN="$HESTIA/bin"
|
|
|
+source $HESTIA/func/syshealth.sh
|
|
|
+syshealth_repair_system_config
|
|
|
|
|
|
# Add /usr/local/hestia/bin/ to path variable
|
|
|
echo 'if [ "${PATH#*/usr/local/hestia/bin*}" = "$PATH" ]; then
|
|
|
@@ -2165,9 +2166,9 @@ You have successfully installed Hestia Control Panel on your server.
|
|
|
|
|
|
Ready to get started? Log in using the following credentials:
|
|
|
|
|
|
- Admin URL: https://$servername:$port"
|
|
|
+ Admin URL: https://$servername:$port" > $tmpfile
|
|
|
if [ "$host_ip" != "$ip" ]; then
|
|
|
- echo -n " Backup URL: https://$ip:$port"
|
|
|
+ echo " Backup URL: https://$ip:$port" >> $tmpfile
|
|
|
fi
|
|
|
echo -e -n " Username: admin
|
|
|
Password: $displaypass
|
|
|
@@ -2178,7 +2179,7 @@ we hope that you enjoy using it as much as we do!
|
|
|
Please feel free to contact us at any time if you have any questions,
|
|
|
or if you encounter any bugs or problems:
|
|
|
|
|
|
-Documentation: https://docs.hestiacp.com/
|
|
|
+Documentation: https://hestiacp.com/docs/
|
|
|
Forum: https://forum.hestiacp.com/
|
|
|
Discord: https://discord.gg/nXRUZch
|
|
|
GitHub: https://www.github.com/hestiacp/hestiacp
|
|
|
@@ -2194,7 +2195,7 @@ Sincerely yours,
|
|
|
The Hestia Control Panel development team
|
|
|
|
|
|
Made with love & pride by the open-source community around the world.
|
|
|
-" > $tmpfile
|
|
|
+" >> $tmpfile
|
|
|
|
|
|
send_mail="$HESTIA/web/inc/mail-wrapper.php"
|
|
|
cat $tmpfile | $send_mail -s "Hestia Control Panel" $email
|
|
|
@@ -2205,7 +2206,7 @@ cat $tmpfile
|
|
|
rm -f $tmpfile
|
|
|
|
|
|
# Add welcome message to notification panel
|
|
|
-$HESTIA/bin/v-add-user-notification admin 'Welcome to Hestia Control Panel!' '<br>You are now ready to begin <a href="/add/user/">adding user accounts</a> and <a href="/add/web/">domains</a>. For help and assistance, view the <a href="https://docs.hestiacp.com/" target="_new">documentation</a> or visit our <a href="https://forum.hestiacp.com/" target="_new">user forum</a>.<br><br>Please report any bugs or issues via <a href="https://github.com/hestiacp/hestiacp/issues" target="_new"><i class="fab fa-github"></i> GitHub</a>.<br><br><b>Have a wonderful day!</b><br><br><i class="fas fa-heart icon-red"></i> The Hestia Control Panel development team'
|
|
|
+$HESTIA/bin/v-add-user-notification admin 'Welcome to Hestia Control Panel!' '<br>You are now ready to begin <a href="/add/user/">adding user accounts</a> and <a href="/add/web/">domains</a>. For help and assistance, <a href="https://hestiacp.com/docs/" target="_blank">view the documentation</a> or <a href="https://forum.hestiacp.com/" target="_blank">visit our forum</a>.<br><br>Please <a href="https://github.com/hestiacp/hestiacp/issues" target="_blank">report any issues via GitHub</a>.<br><br><b>Have a wonderful day!</b><br><br><i class="fas fa-heart icon-red"></i> The Hestia Control Panel development team'
|
|
|
|
|
|
# Clean-up
|
|
|
# Sort final configuration file
|