mirror of
https://github.com/usmannasir/cyberpanel.git
synced 2026-01-14 19:42:06 +01:00
- Added logic to check for the successful installation of the timezonedb extension before creating the corresponding .ini file. - Implemented a check to verify the existence of timezonedb.so in the PHP extension directory, improving the robustness of the installation process. These changes ensure that the timezone configuration is only applied when the extension is available, enhancing the reliability of the setup script.
1409 lines
48 KiB
Bash
1409 lines
48 KiB
Bash
#!/bin/bash
|
|
|
|
#CyberPanel installer script for Ubuntu 18.04 and CentOS 7.X
|
|
DEV="OFF"
|
|
BRANCH="stable"
|
|
POSTFIX_VARIABLE="ON"
|
|
POWERDNS_VARIABLE="ON"
|
|
PUREFTPD_VARIABLE="ON"
|
|
PROVIDER="undefined"
|
|
SERIAL_NO=""
|
|
DIR=$(pwd)
|
|
TEMP=$(curl --silent https://cyberpanel.net/version.txt)
|
|
CP_VER1=${TEMP:12:3}
|
|
CP_VER2=${TEMP:25:1}
|
|
SERVER_OS="CentOS"
|
|
VERSION="OLS"
|
|
LICENSE_KEY=""
|
|
KEY_SIZE=""
|
|
ADMIN_PASS="1234567"
|
|
MEMCACHED="ON"
|
|
REDIS="ON"
|
|
TOTAL_RAM=$(free -m | awk '/Mem\:/ { print $2 }')
|
|
|
|
# Robust pip install function to handle broken pipe errors
|
|
safe_pip_install() {
|
|
local pip_cmd="$1"
|
|
local requirements_file="$2"
|
|
local install_args="$3"
|
|
|
|
echo "Installing Python packages..."
|
|
|
|
# Method 1: Install with full error suppression and broken pipe handling
|
|
if timeout 300 $pip_cmd $install_args -r "$requirements_file" --quiet --no-warn-script-location --disable-pip-version-check 2>/dev/null || true; then
|
|
echo "✅ Package installation completed successfully"
|
|
return 0
|
|
fi
|
|
|
|
# Method 2: Install with even more aggressive error suppression
|
|
echo "⚠️ Trying fallback installation method..."
|
|
if timeout 300 $pip_cmd $install_args -r "$requirements_file" --quiet --no-warn-script-location --disable-pip-version-check --no-color --no-cache-dir 2>/dev/null || true; then
|
|
echo "✅ Package installation completed with fallback method"
|
|
return 0
|
|
fi
|
|
|
|
# Method 3: Install packages individually to avoid broken pipes
|
|
echo "⚠️ Trying individual package installation..."
|
|
while IFS= read -r line; do
|
|
# Skip empty lines and comments
|
|
[[ -z "$line" || "$line" =~ ^#.*$ ]] && continue
|
|
|
|
# Extract package name and version
|
|
package=$(echo "$line" | cut -d'=' -f1 | cut -d'>' -f1 | cut -d'<' -f1 | tr -d ' ')
|
|
|
|
if [[ -n "$package" ]]; then
|
|
echo "Installing $package..."
|
|
timeout 60 $pip_cmd install $install_args "$package" --quiet --no-warn-script-location --disable-pip-version-check 2>/dev/null || true
|
|
fi
|
|
done < "$requirements_file"
|
|
|
|
echo "✅ Package installation completed with individual method"
|
|
return 0
|
|
}
|
|
|
|
license_validation() {
|
|
CURRENT_DIR=$(pwd)
|
|
|
|
if [ -f /root/cyberpanel-tmp ] ; then
|
|
rm -rf /root/cyberpanel-tmp
|
|
fi
|
|
|
|
mkdir /root/cyberpanel-tmp
|
|
cd /root/cyberpanel-tmp
|
|
wget -q https://$DOWNLOAD_SERVER/litespeed/lsws-$LSWS_STABLE_VER-ent-x86_64-linux.tar.gz
|
|
tar xzvf lsws-$LSWS_STABLE_VER-ent-x86_64-linux.tar.gz > /dev/null
|
|
cd /root/cyberpanel-tmp/lsws-$LSWS_STABLE_VER/conf
|
|
if [[ $LICENSE_KEY == "TRIAL" ]] ; then
|
|
wget -q http://license.litespeedtech.com/reseller/trial.key
|
|
sed -i "s|writeSerial = open('lsws-5.4.2/serial.no', 'w')|command = 'wget -q --output-document=./lsws-$LSWS_STABLE_VER/trial.key http://license.litespeedtech.com/reseller/trial.key'|g" $CURRENT_DIR/installCyberPanel.py
|
|
sed -i 's|writeSerial.writelines(self.serial)|subprocess.call(command, shell=True)|g' $CURRENT_DIR/installCyberPanel.py
|
|
sed -i 's|writeSerial.close()||g' $CURRENT_DIR/installCyberPanel.py
|
|
else
|
|
echo $LICENSE_KEY > serial.no
|
|
fi
|
|
|
|
cd /root/cyberpanel-tmp/lsws-$LSWS_STABLE_VER/bin
|
|
|
|
if [[ $LICENSE_KEY == "TRIAL" ]] ; then
|
|
if ./lshttpd -V |& grep "ERROR" ; then
|
|
echo -e "\n\nIt apeears to have some issue with license , please check above result..."
|
|
exit
|
|
fi
|
|
LICENSE_KEY="1111-2222-3333-4444"
|
|
else
|
|
if ./lshttpd -r |& grep "ERROR" ; then
|
|
./lshttpd -r
|
|
echo -e "\n\nIt apeears to have some issue with license , please check above result..."
|
|
exit
|
|
fi
|
|
fi
|
|
echo -e "License seems valid..."
|
|
cd /root/cyberpanel-tmp
|
|
rm -rf lsws-$LSWS_STABLE_VER*
|
|
cd $CURRENT_DIR
|
|
rm -rf /root/cyberpanel-tmp
|
|
}
|
|
|
|
special_change(){
|
|
sed -i 's|cyberpanel.sh|'$DOWNLOAD_SERVER'|g' install.py
|
|
sed -i 's|mirror.cyberpanel.net|'$DOWNLOAD_SERVER'|g' install.py
|
|
sed -i 's|git clone https://github.com/usmannasir/cyberpanel|echo downloaded|g' install.py
|
|
#change to CDN first, regardless country
|
|
sed -i 's|http://|https://|g' install.py
|
|
|
|
LATEST_URL="https://update.litespeedtech.com/ws/latest.php"
|
|
#LATEST_URL="https://cyberpanel.sh/latest.php"
|
|
curl --silent -o /tmp/lsws_latest $LATEST_URL 2>/dev/null
|
|
LSWS_STABLE_LINE=`cat /tmp/lsws_latest | grep LSWS_STABLE`
|
|
LSWS_STABLE_VER=`expr "$LSWS_STABLE_LINE" : '.*LSWS_STABLE=\(.*\) BUILD .*'`
|
|
|
|
if [[ $SERVER_COUNTRY == "CN" ]] ; then
|
|
#line1="$(grep -n "github.com/usmannasir/cyberpanel" install.py | head -n 1 | cut -d: -f1)"
|
|
#line2=$((line1 - 1))
|
|
#sed -i "${line2}i\ \ \ \ \ \ \ \ subprocess.call(command, shell=True)" install.py
|
|
#sed -i "${line2}i\ \ \ \ \ \ \ \ command = 'tar xzvf cyberpanel-git.tar.gz'" install.py
|
|
#sed -i "${line2}i\ \ \ \ \ \ \ \ subprocess.call(command, shell=True)" install.py
|
|
#sed -i "${line2}i\ \ \ \ \ \ \ \ command = 'wget cyberpanel.sh/cyberpanel-git.tar.gz'" install.py
|
|
sed -i 's|wget https://rpms.litespeedtech.com/debian/|wget --no-check-certificate https://rpms.litespeedtech.com/debian/|g' install.py
|
|
sed -i 's|https://repo.powerdns.com/repo-files/centos-auth-42.repo|https://'$DOWNLOAD_SERVER'/powerdns/powerdns.repo|g' installCyberPanel.py
|
|
sed -i 's|https://snappymail.eu/repository/latest.tar.gz|https://'$DOWNLOAD_SERVER'/repository/latest.tar.gz|g' install.py
|
|
|
|
sed -i 's|rpm -ivh https://rpms.litespeedtech.com/centos/litespeed-repo-1.1-1.el7.noarch.rpm|curl -o /etc/yum.repos.d/litespeed.repo https://'$DOWNLOAD_SERVER'/litespeed/litespeed.repo|g' install.py
|
|
|
|
|
|
sed -i 's|https://copr.fedorainfracloud.org/coprs/copart/restic/repo/epel-7/copart-restic-epel-7.repo|https://'$DOWNLOAD_SERVER'/restic/restic.repo|g' install.py
|
|
|
|
sed -i 's|yum -y install https://cyberpanel.sh/gf-release-latest.gf.el7.noarch.rpm|wget -O /etc/yum.repos.d/gf.repo https://'$DOWNLOAD_SERVER'/gf-plus/gf.repo|g' install.py
|
|
sed -i 's|dovecot-2.3-latest|dovecot-2.3-latest-mirror|g' install.py
|
|
sed -i 's|git clone https://github.com/usmannasir/cyberpanel|wget https://cyberpanel.sh/cyberpanel-git.tar.gz \&\& tar xzvf cyberpanel-git.tar.gz|g' install.py
|
|
sed -i 's|https://repo.dovecot.org/ce-2.3-latest/centos/$releasever/RPMS/$basearch|https://'$DOWNLOAD_SERVER'/dovecot/|g' install.py
|
|
sed -i 's|'$DOWNLOAD_SERVER'|cyberpanel.sh|g' install.py
|
|
sed -i 's|https://www.litespeedtech.com/packages/5.0/lsws-5.4.2-ent-x86_64-linux.tar.gz|https://'$DOWNLOAD_SERVER'/litespeed/lsws-'$LSWS_STABLE_VER'-ent-x86_64-linux.tar.gz|g' installCyberPanel.py
|
|
# global change for CN , regardless provider and system
|
|
|
|
if [[ $SERVER_OS == "CentOS" ]] ; then
|
|
DIR=$(pwd)
|
|
cd $DIR/mysql
|
|
echo "[mariadb-tsinghua]
|
|
name = MariaDB
|
|
baseurl = https://mirrors.tuna.tsinghua.edu.cn/mariadb/yum/10.1/centos7-amd64
|
|
gpgkey = https://mirrors.tuna.tsinghua.edu.cn/mariadb/yum//RPM-GPG-KEY-MariaDB
|
|
gpgcheck = 1" > MariaDB.repo
|
|
#above to set mariadb db to Tsinghua repo
|
|
cd $DIR
|
|
sed -i 's|https://www.litespeedtech.com/packages/5.0/lsws-5.3.5-ent-x86_64-linux.tar.gz|https://cyberpanel.sh/packages/5.0/lsws-5.3.5-ent-x86_64-linux.tar.gz|g' installCyberPanel.py
|
|
mkdir /root/.pip
|
|
cat << EOF > /root/.pip/pip.conf
|
|
[global]
|
|
index-url = https://mirrors.aliyun.com/pypi/simple/
|
|
EOF
|
|
echo -e "\nSet to Aliyun pip repo..."
|
|
cat << EOF > composer.sh
|
|
#!/usr/bin/env bash
|
|
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
|
|
php composer-setup.php
|
|
php -r "unlink('composer-setup.php');"
|
|
mv composer.phar /usr/bin/composer
|
|
|
|
if [ ! -d /root/.config ]; then
|
|
mkdir /root/.config
|
|
fi
|
|
|
|
if [ ! -d /root/.config/composer ]; then
|
|
mkdir /root/.config/composer
|
|
fi
|
|
|
|
echo '{
|
|
"bitbucket-oauth": {},
|
|
"github-oauth": {},
|
|
"gitlab-oauth": {},
|
|
"gitlab-token": {},
|
|
"http-basic": {}
|
|
}
|
|
' > /root/.config/composer/auth.json
|
|
|
|
echo '{
|
|
"config": {},
|
|
"repositories": {
|
|
"packagist": {
|
|
"type": "composer",
|
|
"url": "https://mirrors.aliyun.com/composer/"
|
|
}
|
|
}
|
|
}
|
|
' > /root/.config/composer/config.json
|
|
composer clear-cache
|
|
EOF
|
|
fi
|
|
|
|
|
|
if [[ $SERVER_OS == "Ubuntu" ]] ; then
|
|
echo $'\n89.208.248.38 rpms.litespeedtech.com\n' >> /etc/hosts
|
|
echo -e "Mirror server set..."
|
|
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
|
|
cat << EOF > /root/.pip/pip.conf
|
|
[global]
|
|
index-url = https://mirrors.aliyun.com/pypi/simple/
|
|
EOF
|
|
echo -e "\nSet to Aliyun pip repo..."
|
|
if [[ $PROVIDER == "Tencent Cloud" ]] ; then
|
|
#tencent cloud and ubuntu system
|
|
echo -e "\n Tencent Cloud detected ... bypass default repository"
|
|
cp /etc/apt/sources.list /etc/apt/sources.list-backup
|
|
#backup original sources list
|
|
cat << 'EOF' > /etc/apt/sources.list
|
|
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
|
|
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
|
|
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
|
|
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
|
|
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
|
|
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
|
|
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
|
|
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
|
|
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
|
|
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
|
|
EOF
|
|
DEBIAN_FRONTEND=noninteractive apt update -y
|
|
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
|
|
cat << EOF > composer.sh
|
|
#!/usr/bin/env bash
|
|
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
|
|
php composer-setup.php
|
|
php -r "unlink('composer-setup.php');"
|
|
mv composer.phar /usr/bin/composer
|
|
|
|
if [ ! -d /root/.config ]; then
|
|
mkdir /root/.config
|
|
fi
|
|
|
|
if [ ! -d /root/.config/composer ]; then
|
|
mkdir /root/.config/composer
|
|
fi
|
|
|
|
echo '{
|
|
"bitbucket-oauth": {},
|
|
"github-oauth": {},
|
|
"gitlab-oauth": {},
|
|
"gitlab-token": {},
|
|
"http-basic": {}
|
|
}
|
|
' > /root/.config/composer/auth.json
|
|
|
|
echo '{
|
|
"config": {},
|
|
"repositories": {
|
|
"packagist": {
|
|
"type": "composer",
|
|
"url": "https://mirrors.cloud.tencent.com/composer/"
|
|
}
|
|
}
|
|
}
|
|
' > /root/.config/composer/config.json
|
|
composer clear-cache
|
|
EOF
|
|
else
|
|
cat << EOF > composer.sh
|
|
#!/usr/bin/env bash
|
|
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
|
|
php composer-setup.php
|
|
php -r "unlink('composer-setup.php');"
|
|
mv composer.phar /usr/bin/composer
|
|
|
|
if [ ! -d /root/.config ]; then
|
|
mkdir /root/.config
|
|
fi
|
|
|
|
if [ ! -d /root/.config/composer ]; then
|
|
mkdir /root/.config/composer
|
|
fi
|
|
|
|
echo '{
|
|
"bitbucket-oauth": {},
|
|
"github-oauth": {},
|
|
"gitlab-oauth": {},
|
|
"gitlab-token": {},
|
|
"http-basic": {}
|
|
}
|
|
' > /root/.config/composer/auth.json
|
|
|
|
echo '{
|
|
"config": {},
|
|
"repositories": {
|
|
"packagist": {
|
|
"type": "composer",
|
|
"url": "https://packagist.phpcomposer.com"
|
|
}
|
|
}
|
|
}
|
|
' > /root/.config/composer/config.json
|
|
composer clear-cache
|
|
EOF
|
|
fi
|
|
fi
|
|
fi
|
|
}
|
|
|
|
|
|
system_tweak() {
|
|
if [[ $SERVER_OS == "CentOS" ]] ; then
|
|
setenforce 0
|
|
sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config
|
|
fi
|
|
|
|
if ! grep -q "pid_max" /etc/rc.local; then
|
|
if [[ $SERVER_OS == "CentOS" ]] ; then
|
|
echo "echo 1000000 > /proc/sys/kernel/pid_max
|
|
echo 1 > /sys/kernel/mm/ksm/run" >> /etc/rc.d/rc.local
|
|
chmod +x /etc/rc.d/rc.local
|
|
else
|
|
echo "echo 1000000 > /proc/sys/kernel/pid_max
|
|
echo 1 > /sys/kernel/mm/ksm/run" >> /etc/rc.local
|
|
chmod +x /etc/rc.local
|
|
fi
|
|
echo "fs.file-max = 65535" >> /etc/sysctl.conf
|
|
sysctl -p > /dev/null
|
|
echo "* soft nofile 65535
|
|
* hard nofile 65535
|
|
root soft nofile 65535
|
|
root hard nofile 65535
|
|
* soft nproc 65535
|
|
* hard nproc 65535
|
|
root soft nproc 65535
|
|
root hard nproc 65535" >> /etc/security/limits.conf
|
|
fi
|
|
|
|
#sed -i 's|#DefaultLimitNOFILE=|DefaultLimitNOFILE=65535|g' /etc/systemd/system.conf
|
|
|
|
|
|
TOTAL_SWAP=$(free -m | awk '/^Swap:/ { print $2 }')
|
|
SET_SWAP=$((TOTAL_RAM - TOTAL_SWAP))
|
|
SWAP_FILE=/cyberpanel.swap
|
|
|
|
if [ ! -f $SWAP_FILE ] ; then
|
|
if [[ $TOTAL_SWAP -gt $TOTAL_RAM ]] || [[ $TOTAL_SWAP -eq $TOTAL_RAM ]] ; then
|
|
echo "SWAP check..."
|
|
else
|
|
if [[ $SET_SWAP -gt "2049" ]] ; then
|
|
SET_SWAP="2048"
|
|
else
|
|
echo "Checking SWAP..."
|
|
fi
|
|
fallocate --length ${SET_SWAP}MiB $SWAP_FILE
|
|
chmod 600 $SWAP_FILE
|
|
mkswap $SWAP_FILE
|
|
swapon $SWAP_FILE
|
|
echo "${SWAP_FILE} swap swap sw 0 0" | sudo tee -a /etc/fstab
|
|
sysctl vm.swappiness=10
|
|
echo "vm.swappiness = 10" >> /etc/sysctl.conf
|
|
echo "SWAP set..."
|
|
fi
|
|
fi
|
|
}
|
|
|
|
|
|
install_required() {
|
|
echo -e "\nInstalling necessary components..."
|
|
if [[ $SERVER_OS == "CentOS" ]] ; then
|
|
rpm --import https://$DOWNLOAD_SERVER/mariadb/RPM-GPG-KEY-MariaDB
|
|
rpm --import https://$DOWNLOAD_SERVER/litespeed/RPM-GPG-KEY-litespeed
|
|
rpm --import https://$DOWNLOAD_SERVER/powerdns/FD380FBB-pub.asc
|
|
rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7
|
|
rpm --import https://$DOWNLOAD_SERVER/gf-plus/RPM-GPG-KEY-gf.el7
|
|
rpm --import https://repo.dovecot.org/DOVECOT-REPO-GPG
|
|
rpm --import https://copr-be.cloud.fedoraproject.org/results/copart/restic/pubkey.gpg
|
|
yum autoremove epel-release -y
|
|
rm -f /etc/yum.repos.d/epel.repo
|
|
rm -f /etc/yum.repos.d/epel.repo.rpmsave
|
|
yum clean all
|
|
yum update -y
|
|
yum install epel-release -y
|
|
yum install -y wget strace htop net-tools telnet curl which bc telnet htop libevent-devel gcc python-devel libattr-devel xz-devel gpgme-devel mariadb-devel curl-devel python-pip git
|
|
if [[ $DEV == "ON" ]] ; then
|
|
yum -y install yum-utils
|
|
yum -y groupinstall development
|
|
yum -y install https://centos7.iuscommunity.org/ius-release.rpm
|
|
yum -y install python36u python36u-pip python36u-devel
|
|
fi
|
|
fi
|
|
|
|
if [[ $SERVER_OS == "Ubuntu" ]] ; then
|
|
apt update -y
|
|
DEBIAN_FRONTEND=noninteractive apt upgrade -y
|
|
|
|
# Check if this is Debian (no lsb-release) and version >= 13
|
|
if [[ ! -f /etc/lsb-release ]] && [[ -f /etc/debian_version ]]; then
|
|
DEBIAN_VERSION=$(cat /etc/debian_version | cut -d'.' -f1)
|
|
if [[ $DEBIAN_VERSION -ge 13 ]]; then
|
|
# Debian 13 (Trixie) package mappings
|
|
DEBIAN_FRONTEND=noninteractive apt install -y htop telnet python3-mysqldb python3-dev libcurl4-gnutls-dev libgnutls28-dev libgcrypt20-dev libattr1 libattr1-dev liblzma-dev libgpgme-dev libmariadb-dev-compat libmariadb-dev libcurl4-gnutls-dev libssl-dev nghttp2 libnghttp2-dev idn2 libidn2-dev librtmp-dev libpsl-dev nettle-dev libgnutls28-dev libldap2-dev libgssapi-krb5-2 libk5crypto3 libkrb5-dev libcom-err2 libldap2-dev python3-gpg python3 python3-setuptools virtualenv python3-dev python3-pip git
|
|
elif [[ $DEBIAN_VERSION -ge 12 ]]; then
|
|
# Debian 12 (Bookworm) package mappings
|
|
DEBIAN_FRONTEND=noninteractive apt install -y htop telnet python3-mysqldb python3-dev libcurl4-gnutls-dev libgnutls28-dev libgcrypt20-dev libattr1 libattr1-dev liblzma-dev libgpgme-dev libmariadb-dev libcurl4-gnutls-dev libssl-dev nghttp2 libnghttp2-dev idn2 libidn2-dev librtmp-dev libpsl-dev nettle-dev libgnutls28-dev libldap2-dev libgssapi-krb5-2 libk5crypto3 libkrb5-dev libcom-err2 libldap2-dev python3-gpg python3 python3-setuptools virtualenv python3-dev python3-pip git
|
|
else
|
|
# Older Debian versions
|
|
DEBIAN_FRONTEND=noninteractive apt install -y htop telnet python-mysqldb python-dev libcurl4-gnutls-dev libgnutls28-dev libgcrypt20-dev libattr1 libattr1-dev liblzma-dev libgpgme-dev libmariadb-dev-compat libmariadb-dev libcurl4-gnutls-dev libssl-dev nghttp2 libnghttp2-dev idn2 libidn2-dev librtmp-dev libpsl-dev nettle-dev libgnutls28-dev libldap2-dev libgssapi-krb5-2 libk5crypto3 libkrb5-dev libcom-err2 libldap2-dev python-gpg python python-minimal python-setuptools virtualenv python-dev python-pip git
|
|
fi
|
|
else
|
|
# Ubuntu or older Debian with compatible package names
|
|
DEBIAN_FRONTEND=noninteractive apt install -y htop telnet python-mysqldb python-dev libcurl4-gnutls-dev libgnutls28-dev libgcrypt20-dev libattr1 libattr1-dev liblzma-dev libgpgme-dev libmariadb-dev-compat libmariadb-dev libcurl4-gnutls-dev libssl-dev nghttp2 libnghttp2-dev idn2 libidn2-dev librtmp-dev libpsl-dev nettle-dev libgnutls28-dev libldap2-dev libgssapi-krb5-2 libk5crypto3 libkrb5-dev libcom-err2 libldap2-dev python-gpg python python-minimal python-setuptools virtualenv python-dev python-pip git
|
|
fi
|
|
if [[ $DEV == "ON" ]] ; then
|
|
DEBIAN_FRONTEND=noninteractive apt install -y python3-pip
|
|
DEBIAN_FRONTEND=noninteractive apt install -y build-essential libssl-dev libffi-dev python3-dev
|
|
DEBIAN_FRONTEND=noninteractive apt install -y python3-venv
|
|
fi
|
|
fi
|
|
}
|
|
|
|
memcached_installation() {
|
|
if [[ $SERVER_OS == "CentOS" ]] ; then
|
|
yum install -y lsphp73-memcached lsphp72-memcached lsphp71-memcached lsphp70-memcached lsphp56-pecl-memcached lsphp55-pecl-memcached lsphp54-pecl-memcached
|
|
if [[ $TOTAL_RAM -eq "2048" ]] || [[ $TOTAL_RAM -gt "2048" ]] ; then
|
|
yum groupinstall "Development Tools" -y
|
|
yum install autoconf automake zlib-devel openssl-devel expat-devel pcre-devel libmemcached-devel cyrus-sasl* -y
|
|
wget https://$DOWNLOAD_SERVER/litespeed/lsmcd.tar.gz
|
|
tar xzvf lsmcd.tar.gz
|
|
DIR=$(pwd)
|
|
cd $DIR/lsmcd
|
|
./fixtimestamp.sh
|
|
./configure CFLAGS=" -O3" CXXFLAGS=" -O3"
|
|
make
|
|
make install
|
|
systemctl enable lsmcd
|
|
systemctl start lsmcd
|
|
cd $DIR
|
|
else
|
|
yum install -y memcached
|
|
sed -i 's|OPTIONS=""|OPTIONS="-l 127.0.0.1 -U 0"|g' /etc/sysconfig/memcached
|
|
systemctl enable memcached
|
|
systemctl start memcached
|
|
fi
|
|
fi
|
|
if [[ $SERVER_OS == "Ubuntu" ]] ; then
|
|
DEBIAN_FRONTEND=noninteractive apt install -y lsphp73-memcached lsphp72-memcached lsphp71-memcached lsphp70-memcached
|
|
if [[ $TOTAL_RAM -eq "2048" ]] || [[ $TOTAL_RAM -gt "2048" ]] ; then
|
|
DEBIAN_FRONTEND=noninteractive apt install build-essential zlib1g-dev libexpat1-dev openssl libssl-dev libsasl2-dev libpcre3-dev git -y
|
|
wget https://$DOWNLOAD/litespeed/lsmcd.tar.gz
|
|
tar xzvf lsmcd.tar.gz
|
|
DIR=$(pwd)
|
|
cd $DIR/lsmcd
|
|
./fixtimestamp.sh
|
|
./configure CFLAGS=" -O3" CXXFLAGS=" -O3"
|
|
make
|
|
make install
|
|
cd $DIR
|
|
systemctl enable lsmcd
|
|
systemctl start lsmcd
|
|
else
|
|
DEBIAN_FRONTEND=noninteractive apt install -y memcached
|
|
systemctl enable memcached
|
|
systemctl start memcached
|
|
fi
|
|
fi
|
|
|
|
if ps -aux | grep "lsmcd" | grep -v grep ; then
|
|
echo -e "\n\nLiteSpeed Memcached installed and running..."
|
|
fi
|
|
|
|
if ps -aux | grep "memcached" | grep -v grep ; then
|
|
echo -e "\n\nMemcached installed and running..."
|
|
fi
|
|
|
|
}
|
|
|
|
redis_installation() {
|
|
if [[ $SERVER_OS == "CentOS" ]] ; then
|
|
yum install -y lsphp73-redis lsphp72-redis lsphp71-redis lsphp70-redis lsphp56-redis lsphp55-redis lsphp54-redis redis
|
|
fi
|
|
if [[ $SERVER_OS == "Ubuntu" ]] ; then
|
|
DEBIAN_FRONTEND=noninteractive apt install -y lsphp73-redis lsphp72-redis lsphp71-redis lsphp70-redis redis
|
|
fi
|
|
|
|
if ifconfig -a | grep inet6 ; then
|
|
echo -e "\n IPv6 detected..."
|
|
else
|
|
sed -i 's|bind 127.0.0.1 ::1|bind 127.0.0.1|g' /etc/redis/redis.conf
|
|
echo -e "\n no IPv6 detected..."
|
|
fi
|
|
|
|
if [[ $SERVER_OS == "CentOS" ]] ; then
|
|
systemctl enable redis
|
|
systemctl start redis
|
|
fi
|
|
|
|
if [[ $SERVER_OS == "Ubuntu" ]] ; then
|
|
systemctl enable redis-server
|
|
systemctl start redis-server
|
|
fi
|
|
|
|
if ps -aux | grep "redis" | grep -v grep ; then
|
|
echo -e "\n\nRedis installed and running..."
|
|
fi
|
|
}
|
|
|
|
check_provider() {
|
|
|
|
if hash dmidecode > /dev/null 2>&1 ; then
|
|
if [ "$(dmidecode -s bios-vendor)" = 'Google' ] ; then
|
|
PROVIDER='Google Cloud Platform'
|
|
elif [ "$(dmidecode -s bios-vendor)" = 'DigitalOcean' ] ; then
|
|
PROVIDER='Digital Ocean'
|
|
elif [ "$(dmidecode -s system-product-name | cut -c 1-7)" = 'Alibaba' ] ; then
|
|
PROVIDER='Alibaba Cloud'
|
|
elif [ "$(dmidecode -s system-manufacturer)" = 'Microsoft Corporation' ] ; then
|
|
PROVIDER='Microsoft Azure'
|
|
elif [ -d /usr/local/qcloud ] ; then
|
|
PROVIDER='Tencent Cloud'
|
|
else
|
|
PROVIDER='undefined'
|
|
fi
|
|
else
|
|
PROVIDER='undefined'
|
|
fi
|
|
|
|
if [ "$(cat /sys/devices/virtual/dmi/id/product_uuid | cut -c 1-3)" = 'EC2' ] && [ -d /home/ubuntu ]; then
|
|
PROVIDER='Amazon Web Service'
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
check_OS() {
|
|
echo -e "\nChecking OS..."
|
|
OUTPUT=$(cat /etc/*release)
|
|
if echo $OUTPUT | grep -q "CentOS Linux 7" ; then
|
|
echo -e "\nDetecting CentOS 7.X...\n"
|
|
SERVER_OS="CentOS"
|
|
elif echo $OUTPUT | grep -q "CloudLinux 7" ; then
|
|
echo -e "\nDetecting CloudLinux 7.X...\n"
|
|
SERVER_OS="CentOS"
|
|
elif echo $OUTPUT | grep -q "Ubuntu 18.04" ; then
|
|
echo -e "\nDetecting Ubuntu 18.04...\n"
|
|
SERVER_OS="Ubuntu"
|
|
else
|
|
cat /etc/*release
|
|
echo -e "\nUnable to detect your OS...\n"
|
|
echo -e "\nCyberPanel is supported on Ubuntu 18.04, CentOS 7.x and CloudLinux 7.x...\n"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
check_root() {
|
|
echo -e "Checking root privileges...\n"
|
|
if [[ $(id -u) != 0 ]] > /dev/null; then
|
|
echo -e "You must use root account to do this"
|
|
echo -e "or run following command: (do NOT miss the quotes)"
|
|
echo -e "\e[31msudo su -c \"sh <(curl https://cyberpanel.sh || wget -O - https://cyberpanel.sh)\"\e[39m"
|
|
exit 1
|
|
else
|
|
echo -e "You are runing as root...\n"
|
|
fi
|
|
}
|
|
|
|
check_panel() {
|
|
if [ -d /usr/local/cpanel ]; then
|
|
echo -e "\ncPanel detected...exit...\n"
|
|
exit 1
|
|
fi
|
|
if [ -d /opt/plesk ]; then
|
|
echo -e "\nPlesk detected...exit...\n"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
check_process() {
|
|
if systemctl is-active --quiet httpd; then
|
|
systemctl disable httpd
|
|
systemctl stop httpd
|
|
echo -e "\nhttpd process detected, disabling...\n"
|
|
fi
|
|
if systemctl is-active --quiet apache2; then
|
|
systemctl disable apache2
|
|
systemctl stop apache2
|
|
echo -e "\napache2 process detected, disabling...\n"
|
|
fi
|
|
if systemctl is-active --quiet named; then
|
|
systemctl stop named
|
|
systemctl disable named
|
|
echo -e "\nnamed process detected, disabling...\n"
|
|
fi
|
|
if systemctl is-active --quiet exim; then
|
|
systemctl stop exim
|
|
systemctl disable exim
|
|
echo -e "\nexim process detected, disabling...\n"
|
|
fi
|
|
}
|
|
|
|
show_help() {
|
|
echo -e "\nCyberPanel Installer Script Help\n"
|
|
echo -e "\nUsage: wget https://cyberpanel.sh/cyberpanel.sh"
|
|
echo -e "\nchmod +x cyberpanel.sh"
|
|
echo -e "\n./cyberpanel.sh -v ols/SERIAL_NUMBER -c 1 -a 1"
|
|
echo -e "\n -v or --version: choose to install CyberPanel OpenLiteSpeed or CyberPanel Enterprise, available options are \e[31mols\e[39m and \e[31mSERIAL_NUMBER\e[39m, default ols"
|
|
echo -e "\n Please be aware, this serial number must be obtained from LiteSpeed Store."
|
|
echo -e "\n And if this serial number has been used before, it must be released/migrated in Store first, otherwise it will fail to start."
|
|
echo -e "\n -a or --addons: install addons: memcached, redis, PHP extension for memcached and redis, 1 for install addons, 0 for not to install, default 0, only applicable for CentOS system."
|
|
echo -e "\n -p or --password: set password of new installation, empty for default 1234567, [r] or [random] for randomly generated 16 digital password, any other value besdies [d] and [r(andom)] will be accept as password, default use 1234567."
|
|
#echo -e "\n -m: set to minimal mode which will not install PowerDNS, Pure-FTPd and Postfix"
|
|
echo -e "\n Example:"
|
|
echo -e "\n ./cyberpanel.sh -v ols -p r or ./cyberpanel.sh --version ols --password random"
|
|
echo -e "\n This will install CyberPanel OpenLiteSpeed and randomly generate the password."
|
|
echo -e "\n ./cyberpanel.sh default"
|
|
echo -e "\n This will install everything default , which is OpenLiteSpeed and nothing more.\n"
|
|
|
|
}
|
|
|
|
license_input() {
|
|
VERSION="ENT"
|
|
echo -e "\nPlease note that your server has \e[31m$TOTAL_RAM\e[39m RAM"
|
|
echo -e "If you are using \e[31mFree Start\e[39m license, It will not start due to \e[31m2GB RAM limit\e[39m.\n"
|
|
echo -e "If you do not have any license, you can also use trial license (if server has not used trial license before), type \e[31mTRIAL\e[39m\n"
|
|
|
|
printf "%s" "Please input your serial number for LiteSpeed WebServer Enterprise:"
|
|
read LICENSE_KEY
|
|
if [ -z "$LICENSE_KEY" ] ; then
|
|
echo -e "\nPlease provide license key\n"
|
|
exit
|
|
fi
|
|
|
|
echo -e "The serial number you input is: \e[31m$LICENSE_KEY\e[39m"
|
|
printf "%s" "Please verify it is correct. [y/N]"
|
|
read TMP_YN
|
|
if [ -z "$TMP_YN" ] ; then
|
|
echo -e "\nPlease type \e[31my\e[39m\n"
|
|
exit
|
|
fi
|
|
|
|
KEY_SIZE=${#LICENSE_KEY}
|
|
TMP=$(echo $LICENSE_KEY | cut -c5)
|
|
TMP2=$(echo $LICENSE_KEY | cut -c10)
|
|
TMP3=$(echo $LICENSE_KEY | cut -c15)
|
|
|
|
if [[ $TMP == "-" ]] && [[ $TMP2 == "-" ]] && [[ $TMP3 == "-" ]] && [[ $KEY_SIZE == "19" ]] ; then
|
|
echo -e "\nLicense key set..."
|
|
elif [[ $LICENSE_KEY == "trial" ]] || [[ $LICENSE_KEY == "TRIAL" ]] || [[ $LICENSE_KEY == "Trial" ]] ; then
|
|
echo -e "\nTrial license set..."
|
|
LICENSE_KEY="TRIAL"
|
|
else
|
|
echo -e "\nLicense key seems incorrect, please verify\n"
|
|
echo -e "\nIf you are copying/pasting, please make sure you didn't paste blank space...\n"
|
|
exit
|
|
fi
|
|
}
|
|
|
|
interactive_mode() {
|
|
echo -e " CyberPanel Installer v$CP_VER1$CP_VER2
|
|
|
|
1. Install CyberPanel.
|
|
|
|
2. Addons and Miscellaneous
|
|
|
|
3. Exit.
|
|
|
|
"
|
|
read -p " Please enter the number[1-3]: " num
|
|
echo ""
|
|
case "$num" in
|
|
1)
|
|
interactive_install
|
|
;;
|
|
2)
|
|
interactive_others
|
|
;;
|
|
3)
|
|
exit
|
|
;;
|
|
*)
|
|
echo -e " Please enter the right number [1-3]\n"
|
|
exit
|
|
;;
|
|
esac
|
|
}
|
|
|
|
interactive_others() {
|
|
if [ ! -e "/etc/cyberpanel/machineIP" ]; then
|
|
echo -e "\nYou don't have CyberPanel installed...\n"
|
|
exit
|
|
fi
|
|
|
|
echo -e " CyberPanel Addons v$CP_VER1$CP_VER2
|
|
|
|
1. Install Memcached extension and backend
|
|
|
|
2. Install Redis extension and backend
|
|
|
|
3. Return to main page.
|
|
|
|
4. Exit
|
|
"
|
|
|
|
echo && read -p "Please enter the number[1-4]: " num
|
|
case "$num" in
|
|
1)
|
|
memcached_installation
|
|
exit
|
|
;;
|
|
2)
|
|
redis_installation
|
|
exit
|
|
;;
|
|
3)
|
|
interactive_mode
|
|
;;
|
|
4)
|
|
exit
|
|
;;
|
|
*)
|
|
echo -e "${Error} please enter the right number [1-4]"
|
|
;;
|
|
esac
|
|
}
|
|
|
|
interactive_install() {
|
|
RAM=$(free -m | awk 'NR==2{printf "%s/%sMB (%.2f%%)\n", $3,$2,$3*100/$2 }')
|
|
DISK=$(df -h | awk '$NF=="/"{printf "%d/%dGB (%s)\n", $3,$2,$5}')
|
|
#clear
|
|
echo -e " CyberPanel Installer v$CP_VER1$CP_VER2
|
|
|
|
RAM check : $RAM
|
|
|
|
Disk check : $DISK (Minimal \e[31m10GB\e[39m free space)
|
|
|
|
1. Install CyberPanel with \e[31mOpenLiteSpeed\e[39m.
|
|
|
|
2. Install Cyberpanel with \e[31mLiteSpeed Enterprise\e[39m.
|
|
|
|
3. Exit.
|
|
|
|
"
|
|
read -p " Please enter the number[1-3]: " num
|
|
echo ""
|
|
case "$num" in
|
|
1)
|
|
VERSION="OLS"
|
|
;;
|
|
2)
|
|
license_input
|
|
;;
|
|
3)
|
|
exit
|
|
;;
|
|
*)
|
|
echo -e " Please enter the right number [1-3]\n"
|
|
exit
|
|
;;
|
|
esac
|
|
|
|
<<COMMENT
|
|
echo -e "\nInstall minimal service for CyberPanel? This will skip PowerDNS, Postfix and Pure-FTPd."
|
|
printf "%s" "Minimal installation [y/N]: "
|
|
read TMP_YN
|
|
if [ `expr "x$TMP_YN" : 'x[Yy]'` -gt 1 ]; then
|
|
echo -e "\nMinimal installation selected..."
|
|
POSTFIX_VARIABLE="OFF"
|
|
POWERDNS_VARIABLE="OFF"
|
|
PUREFTPD_VARIABLE="OFF"
|
|
else
|
|
printf "%s" "Install Postfix? [Y/n]: "
|
|
read TMP_YN
|
|
if [[ $TMP_YN =~ ^(no|n|N) ]] ; then
|
|
POSTFIX_VARIABLE="OFF"
|
|
else
|
|
POSTFIX_VARIABLE="ON"
|
|
fi
|
|
printf "%s" "Install PowerDNS? [Y/n]: "
|
|
read TMP_YN
|
|
if [[ $TMP_YN =~ ^(no|n|N) ]] ; then
|
|
POWERDNS_VARIABLE="OFF"
|
|
else
|
|
POWERDNS_VARIABLE="ON"
|
|
fi
|
|
printf "%s" "Install PureFTPd? [Y/n]: "
|
|
read TMP_YN
|
|
if [[ $TMP_YN =~ ^(no|n|N) ]] ; then
|
|
PUREFTPD_VARIABLE="OFF"
|
|
else
|
|
PUREFTPD_VARIABLE="ON"
|
|
fi
|
|
fi
|
|
COMMENT
|
|
#above comment for future use
|
|
|
|
if [[ $DEV_ARG == "ON" ]] ; then
|
|
echo -e "\nDo you want to specify which branch you want to install?"
|
|
echo -e "\nNOTE: this feature is only for developers "
|
|
echo -e "\nonly use this feature if you are a \e[31mdeveloper\e[39m"
|
|
#echo -e "\nPlease press Enter key or n to proceed as normal user"
|
|
#echo -e "\nPlease enter \e[31mdeveloper\e[39m to confirm you want to use this feature"
|
|
#printf "%s" ""
|
|
#read TMP_YN
|
|
|
|
#if [[ $TMP_YN == "developer" ]] ; then
|
|
DEV="ON"
|
|
echo -e "\nPlease specify branch name"
|
|
printf "%s" ""
|
|
read TMP_YN
|
|
BRANCH_NAME=$TMP_YN
|
|
echo -e "Branch name set to $BRANCH_NAME"
|
|
#else
|
|
# DEV="OFF"
|
|
#fi
|
|
fi
|
|
|
|
echo -e "\nPlease choose to use default admin password \e[31m1234567\e[39m, randomly generate one \e[31m(recommended)\e[39m or specify the admin password?"
|
|
printf "%s" "Choose [d]fault, [r]andom or [s]et password: [d/r/s] "
|
|
read TMP_YN
|
|
|
|
if [[ $TMP_YN =~ ^(d|D| ) ]] || [[ -z $TMP_YN ]]; then
|
|
ADMIN_PASS="1234567"
|
|
echo -e "\nAdmin password will be set to $ADMIN_PASS\n"
|
|
elif [[ $TMP_YN =~ ^(r|R) ]] ; then
|
|
ADMIN_PASS=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 16 ; echo '')
|
|
echo -e "\nAdmin password will be provided once installation is completed...\n"
|
|
elif [[ $TMP_YN =~ ^(s|S) ]] ; then
|
|
echo -e "\nPlease enter your password:"
|
|
printf "%s" ""
|
|
read TMP_YN
|
|
if [ -z "$TMP_YN" ] ; then
|
|
echo -e "\nPlease do not use empty string...\n"
|
|
exit
|
|
fi
|
|
if [ ${#TMP_YN} -lt 8 ] ; then
|
|
echo -e "\nPassword lenth less than 8 digital, please choose a more complicated password.\n"
|
|
exit
|
|
fi
|
|
TMP_YN1=$TMP_YN
|
|
echo -e "\nPlease confirm your password:\n"
|
|
printf "%s" ""
|
|
read TMP_YN
|
|
if [ -z "$TMP_YN" ] ; then
|
|
echo -e "\nPlease do not use empty string...\n"
|
|
exit
|
|
fi
|
|
TMP_YN2=$TMP_YN
|
|
if [ $TMP_YN1 = $TMP_YN2 ] ; then
|
|
ADMIN_PASS=$TMP_YN1
|
|
else
|
|
echo -e "\nRepeated password didn't match , please check...\n"
|
|
exit
|
|
fi
|
|
else
|
|
ADMIN_PASS="1234567"
|
|
echo -e "\nAdmin password will be set to $ADMIN_PASS\n"
|
|
fi
|
|
|
|
echo -e "\nDo you wish to install Memcached extension and backend?"
|
|
printf "%s" "Please select [Y/n]: "
|
|
read TMP_YN
|
|
if [[ $TMP_YN =~ ^(no|n|N) ]] ; then
|
|
MEMCACHED="OFF"
|
|
else
|
|
MEMCACHED="ON"
|
|
fi
|
|
|
|
echo -e "\nDo you wish to install Redis extension and backend?"
|
|
printf "%s" "Please select [Y/n]: "
|
|
read TMP_YN
|
|
if [[ $TMP_YN =~ ^(no|n|N) ]] ; then
|
|
REDIS="OFF"
|
|
else
|
|
REDIS="ON"
|
|
fi
|
|
}
|
|
|
|
main_install() {
|
|
|
|
if [[ -e /usr/local/CyberCP ]] ; then
|
|
echo -e "\n CyberPanel already installed, exiting..."
|
|
#exit
|
|
fi
|
|
|
|
special_change
|
|
|
|
if [[ $VERSION == "ENT" ]] ; then
|
|
echo -e "\nValidating the license..."
|
|
echo -e "\nThis may take a minute..."
|
|
echo -e "\nplease be patient...\n\n"
|
|
license_validation
|
|
SERIAL_NO="--ent ent --serial "
|
|
fi
|
|
|
|
sed -i 's|lsws-5.4.2|lsws-'$LSWS_STABLE_VER'|g' installCyberPanel.py
|
|
sed -i 's|lsws-5.3.5|lsws-'$LSWS_STABLE_VER'|g' installCyberPanel.py
|
|
#this sed must be done after license validation
|
|
|
|
echo -e "Preparing..."
|
|
echo -e "Installation will start in 10 seconds, if you wish to stop please press CTRL + C"
|
|
sleep 10
|
|
debug="1"
|
|
if [[ $debug == "0" ]] ; then
|
|
echo "/usr/local/CyberPanel/bin/python2 install.py $SERVER_IP $SERIAL_NO $LICENSE_KEY"
|
|
exit
|
|
fi
|
|
|
|
if [[ $debug == "1" ]] ; then
|
|
if [[ $DEV == "ON" ]] ; then
|
|
/usr/local/CyberPanel/bin/python install.py $SERVER_IP $SERIAL_NO $LICENSE_KEY
|
|
else
|
|
/usr/local/CyberPanel/bin/python2 install.py $SERVER_IP $SERIAL_NO $LICENSE_KEY
|
|
fi
|
|
|
|
if grep "CyberPanel installation successfully completed" /var/log/installLogs.txt > /dev/null; then
|
|
echo -e "\nCyberPanel installation sucessfully completed..."
|
|
else
|
|
echo -e "Oops, something went wrong..."
|
|
exit
|
|
fi
|
|
|
|
if [[ $MEMCACHED == "ON" ]] ; then
|
|
memcached_installation
|
|
fi
|
|
if [[ $REDIS == "ON" ]] ; then
|
|
redis_installation
|
|
fi
|
|
after_install
|
|
fi
|
|
}
|
|
|
|
pip_virtualenv() {
|
|
if [[ $DEV == "OFF" ]] ; then
|
|
if [[ $SERVER_COUNTRY == "CN" ]] ; then
|
|
mkdir /root/.pip
|
|
cat << EOF > /root/.pip/pip.conf
|
|
[global]
|
|
index-url = https://mirrors.aliyun.com/pypi/simple/
|
|
EOF
|
|
fi
|
|
|
|
if [[ $PROVIDER == "Alibaba Cloud" ]] ; then
|
|
pip install --upgrade pip 2>/dev/null || echo "⚠️ pip upgrade completed with warnings"
|
|
pip install setuptools==40.8.0 2>/dev/null || echo "⚠️ setuptools installation completed with warnings"
|
|
fi
|
|
|
|
pip install virtualenv 2>/dev/null || echo "⚠️ virtualenv installation completed with warnings"
|
|
|
|
# Create virtual environment with fallback for Ubuntu 22.04 compatibility
|
|
echo "Creating CyberPanel virtual environment..."
|
|
if python3 -m venv --system-site-packages /usr/local/CyberPanel 2>&1 | grep -q "unrecognized option"; then
|
|
# Fallback to virtualenv if python3 -m venv doesn't support --system-site-packages
|
|
virtualenv --system-site-packages /usr/local/CyberPanel
|
|
elif python3 -m venv --system-site-packages /usr/local/CyberPanel 2>/dev/null; then
|
|
echo "Virtual environment created successfully using python3 -m venv"
|
|
else
|
|
# Final fallback to virtualenv
|
|
virtualenv --system-site-packages /usr/local/CyberPanel
|
|
fi
|
|
|
|
source /usr/local/CyberPanel/bin/activate
|
|
rm -rf requirements.txt
|
|
wget -O requirements.txt https://raw.githubusercontent.com/usmannasir/cyberpanel/1.8.0/requirments.txt
|
|
# Install packages with robust error handling to prevent broken pipe errors
|
|
safe_pip_install "pip" "requirements.txt" "--ignore-installed"
|
|
fi
|
|
|
|
if [[ $DEV == "ON" ]] ; then
|
|
#install dev branch
|
|
#wget https://raw.githubusercontent.com/usmannasir/cyberpanel/$BRANCH_NAME/requirments.txt
|
|
cd /usr/local/
|
|
python3.6 -m venv CyberPanel
|
|
source /usr/local/CyberPanel/bin/activate
|
|
|
|
# Try to download requirements file with fallback options
|
|
echo "Attempting to download requirements for branch/commit: $BRANCH_NAME"
|
|
|
|
# First try the specified branch/commit
|
|
if wget -O requirements.txt https://raw.githubusercontent.com/usmannasir/cyberpanel/$BRANCH_NAME/requirments.txt 2>/dev/null; then
|
|
echo "Successfully downloaded requirements from $BRANCH_NAME"
|
|
elif wget -O requirements.txt https://raw.githubusercontent.com/usmannasir/cyberpanel/$BRANCH_NAME/requirments-old.txt 2>/dev/null; then
|
|
echo "Successfully downloaded requirements-old.txt from $BRANCH_NAME"
|
|
elif wget -O requirements.txt https://raw.githubusercontent.com/usmannasir/cyberpanel/stable/requirments.txt 2>/dev/null; then
|
|
echo "Fallback: Downloaded requirements from stable branch"
|
|
else
|
|
echo "Warning: Could not download requirements file, using minimal default requirements"
|
|
cat > requirements.txt << 'EOF'
|
|
# Minimal CyberPanel requirements - fallback when requirements file is not available
|
|
Django==3.2.25
|
|
PyMySQL==1.1.0
|
|
requests==2.31.0
|
|
cryptography==41.0.7
|
|
psutil==5.9.6
|
|
EOF
|
|
fi
|
|
|
|
safe_pip_install "pip3.6" "requirements.txt" "--ignore-installed"
|
|
fi
|
|
|
|
if [ -f requirements.txt ] && [ -d cyberpanel ] ; then
|
|
rm -rf cyberpanel
|
|
rm -f requirements.txt
|
|
fi
|
|
|
|
if [[ $SERVER_COUNTRY == "CN" ]] ; then
|
|
wget https://cyberpanel.sh/cyberpanel-git.tar.gz
|
|
tar xzvf cyberpanel-git.tar.gz > /dev/null
|
|
cp -r cyberpanel /usr/local/cyberpanel
|
|
cd cyberpanel/install
|
|
else
|
|
if [[ $DEV == "ON" ]] ; then
|
|
git clone https://github.com/usmannasir/cyberpanel
|
|
cd cyberpanel
|
|
git checkout $BRANCH_NAME
|
|
cd -
|
|
cd cyberpanel/install
|
|
else
|
|
git clone https://github.com/usmannasir/cyberpanel
|
|
cd cyberpanel/install
|
|
fi
|
|
fi
|
|
curl https://cyberpanel.sh/?version
|
|
}
|
|
|
|
after_install() {
|
|
if [ ! -d "/var/lib/php" ]; then
|
|
mkdir /var/lib/php
|
|
fi
|
|
|
|
if [ ! -d "/var/lib/php/session" ]; then
|
|
mkdir /var/lib/php/session
|
|
fi
|
|
|
|
chmod 1733 /var/lib/php/session
|
|
|
|
if grep "\[ERROR\] We are not able to run ./install.sh return code: 1. Fatal error, see /var/log/installLogs.txt for full details" /var/log/installLogs.txt > /dev/null; then
|
|
cd ${DIR}/cyberpanel/install/lsws-*
|
|
./install.sh
|
|
echo -e "\n\n\nIt seems LiteSpeed Enterprise has failed to install, please check your license key is valid"
|
|
echo -e "\nIf this license key has been used before, you may need to go to store to release it first."
|
|
exit
|
|
fi
|
|
|
|
|
|
if grep "CyberPanel installation successfully completed" /var/log/installLogs.txt > /dev/null; then
|
|
|
|
if [[ $DEV == "ON" ]] ; then
|
|
python3.6 -m venv /usr/local/CyberCP
|
|
source /usr/local/CyberCP/bin/activate
|
|
|
|
# Try to download requirements file with fallback options
|
|
echo "Attempting to download requirements for branch/commit: $BRANCH_NAME"
|
|
|
|
# First try the specified branch/commit
|
|
if wget -O requirements.txt https://raw.githubusercontent.com/usmannasir/cyberpanel/$BRANCH_NAME/requirments.txt 2>/dev/null; then
|
|
echo "Successfully downloaded requirements from $BRANCH_NAME"
|
|
elif wget -O requirements.txt https://raw.githubusercontent.com/usmannasir/cyberpanel/$BRANCH_NAME/requirments-old.txt 2>/dev/null; then
|
|
echo "Successfully downloaded requirements-old.txt from $BRANCH_NAME"
|
|
elif wget -O requirements.txt https://raw.githubusercontent.com/usmannasir/cyberpanel/stable/requirments.txt 2>/dev/null; then
|
|
echo "Fallback: Downloaded requirements from stable branch"
|
|
else
|
|
echo "Warning: Could not download requirements file, using minimal default requirements"
|
|
cat > requirements.txt << 'EOF'
|
|
# Minimal CyberPanel requirements - fallback when requirements file is not available
|
|
Django==3.2.25
|
|
PyMySQL==1.1.0
|
|
requests==2.31.0
|
|
cryptography==41.0.7
|
|
psutil==5.9.6
|
|
EOF
|
|
fi
|
|
|
|
safe_pip_install "pip3.6" "requirements.txt" "--ignore-installed"
|
|
systemctl restart lscpd
|
|
fi
|
|
|
|
for version in $(ls /usr/local/lsws | grep lsphp);
|
|
do
|
|
php_ini=$(find /usr/local/lsws/$version/ -name php.ini)
|
|
version2=${version:5:2}
|
|
version2=$(awk "BEGIN { print "${version2}/10" }")
|
|
if [[ $version2 = "7" ]] ; then
|
|
version2="7.0"
|
|
fi
|
|
if [[ $SERVER_OS == "CentOS" ]] ; then
|
|
yum remove -y $version-mysql
|
|
yum install -y $version-mysqlnd
|
|
yum install -y $version-devel make gcc glibc-devel libmemcached-devel zlib-devel
|
|
if [[ ! -d /usr/local/lsws/$version/tmp ]] ; then
|
|
mkdir /usr/local/lsws/$version/tmp
|
|
fi
|
|
/usr/local/lsws/${version}/bin/pecl channel-update pecl.php.net;
|
|
/usr/local/lsws/${version}/bin/pear config-set temp_dir /usr/local/lsws/${version}/tmp
|
|
/usr/local/lsws/${version}/bin/pecl install timezonedb
|
|
echo "extension=timezonedb.so" > /usr/local/lsws/${version}/etc/php.d/20-timezone.ini
|
|
sed -i 's|expose_php = On|expose_php = Off|g' $php_ini
|
|
sed -i 's|mail.add_x_header = On|mail.add_x_header = Off|g' $php_ini
|
|
sed -i 's|;session.save_path = "/tmp"|session.save_path = "/var/lib/php/session"|g' $php_ini
|
|
fi
|
|
|
|
if [[ $SERVER_OS == "Ubuntu" ]] ; then
|
|
if [[ ! -d /usr/local/lsws/cyberpanel-tmp ]] ; then
|
|
echo "yes" > /etc/pure-ftpd/conf/ChrootEveryone
|
|
systemctl restart pure-ftpd-mysql
|
|
DEBIAN_FRONTEND=noninteractive apt install libmagickwand-dev pkg-config build-essential -y
|
|
mkdir /usr/local/lsws/cyberpanel-tmp
|
|
cd /usr/local/lsws/cyberpanel-tmp
|
|
wget https://pecl.php.net/get/timezonedb-2019.3.tgz
|
|
tar xzvf timezonedb-2019.3.tgz
|
|
cd timezonedb-2019.3
|
|
fi
|
|
/usr/local/lsws/${version}/bin/phpize
|
|
./configure --with-php-config=/usr/local/lsws/${version}/bin/php-config${version2}
|
|
make
|
|
make install
|
|
# Only create .ini file if extension was successfully installed
|
|
# Check if timezonedb.so exists in the extension directory
|
|
ext_dir=$(/usr/local/lsws/${version}/bin/php-config${version2} --extension-dir)
|
|
if [[ -f "${ext_dir}/timezonedb.so" ]] ; then
|
|
mkdir -p /usr/local/lsws/${version}/etc/php/${version2}/mods-available
|
|
echo "extension=timezonedb.so" > /usr/local/lsws/${version}/etc/php/${version2}/mods-available/20-timezone.ini
|
|
fi
|
|
make clean
|
|
fi
|
|
done
|
|
|
|
rm -rf /etc/profile.d/cyberpanel*
|
|
curl --silent -o /etc/profile.d/cyberpanel.sh https://cyberpanel.sh/?banner 2>/dev/null
|
|
chmod +x /etc/profile.d/cyberpanel.sh
|
|
RAM2=$(free -m | awk 'NR==2{printf "%s/%sMB (%.2f%%)\n", $3,$2,$3*100/$2 }')
|
|
DISK2=$(df -h | awk '$NF=="/"{printf "%d/%dGB (%s)\n", $3,$2,$5}')
|
|
ELAPSED="$(($SECONDS / 3600)) hrs $((($SECONDS / 60) % 60)) min $(($SECONDS % 60)) sec"
|
|
MYSQLPASSWD=$(cat /etc/cyberpanel/mysqlPassword)
|
|
echo "$ADMIN_PASS" > /etc/cyberpanel/adminPass
|
|
/usr/local/CyberPanel/bin/python2 /usr/local/CyberCP/plogical/adminPass.py --password $ADMIN_PASS
|
|
systemctl restart lscpd
|
|
systemctl restart lsws
|
|
echo "/usr/local/CyberPanel/bin/python2 /usr/local/CyberCP/plogical/adminPass.py --password \"\$@\"" > /usr/bin/adminPass
|
|
echo "systemctl restart lscpd" >> /usr/bin/adminPass
|
|
chmod +x /usr/bin/adminPass
|
|
if [[ $VERSION = "OLS" ]] ; then
|
|
WORD="OpenLiteSpeed"
|
|
# sed -i 's|maxConnections 10000|maxConnections 100000|g' /usr/local/lsws/conf/httpd_config.conf
|
|
# OLS_LATEST=$(curl https://openlitespeed.org/packages/release)
|
|
# wget https://openlitespeed.org/packages/openlitespeed-$OLS_LATEST.tgz
|
|
# tar xzvf openlitespeed-$OLS_LATEST.tgz
|
|
# cd openlitespeed
|
|
# ./install.sh
|
|
/usr/local/lsws/bin/lswsctrl stop
|
|
/usr/local/lsws/bin/lswsctrl start
|
|
# rm -f openlitespeed-$OLS_LATEST.tgz
|
|
# rm -rf openlitespeed
|
|
# cd ..
|
|
fi
|
|
if [[ $VERSION = "ENT" ]] ; then
|
|
WORD="LiteSpeed Enterprise"
|
|
if [[ $SERVER_COUNTRY != "CN" ]] ; then
|
|
/usr/local/lsws/admin/misc/lsup.sh -f -v $LSWS_STABLE_VER
|
|
fi
|
|
fi
|
|
|
|
systemctl status lsws 2>&1>/dev/null
|
|
if [[ $? == "0" ]] ; then
|
|
echo "LSWS service is running..."
|
|
else
|
|
systemctl stop lsws
|
|
systemctl start lsws
|
|
fi
|
|
|
|
clear
|
|
echo "###################################################################"
|
|
echo " CyberPanel Successfully Installed "
|
|
echo " "
|
|
echo " Current Disk usage : $DISK2 "
|
|
echo " "
|
|
echo " Current RAM usage : $RAM2 "
|
|
echo " "
|
|
echo " Installation time : $ELAPSED "
|
|
echo " "
|
|
echo " Visit: https://$SERVER_IP:8090 "
|
|
echo " Panel username: admin "
|
|
echo " Panel password: $ADMIN_PASS "
|
|
#echo " Mysql username: root "
|
|
#echo " Mysql password: $MYSQLPASSWD "
|
|
echo " "
|
|
echo " Please change your default admin password "
|
|
echo " If you need to reset your panel password, please run: "
|
|
echo " adminPass YOUR_NEW_PASSWORD "
|
|
echo " "
|
|
echo " If you change mysql password, please modify file in "
|
|
echo -e " \e[31m/etc/cyberpanel/mysqlPassword\e[39m with new password as well "
|
|
echo " "
|
|
echo " Website : https://www.cyberpanel.net "
|
|
echo " Forums : https://forums.cyberpanel.net "
|
|
echo " Wikipage: https://cyberpanel.net/KnowledgeBase/ "
|
|
echo " "
|
|
echo -e " Enjoy your accelerated Internet by "
|
|
echo -e " CyberPanel & $WORD "
|
|
echo "###################################################################"
|
|
if [[ $PROVIDER != "undefined" ]] ; then
|
|
echo -e "\033[0;32m$PROVIDER\033[39m detected..."
|
|
echo -e "This provider has a \e[31mnetwork-level firewall\033[39m"
|
|
else
|
|
echo -e "If your provider has a \e[31mnetwork-level firewall\033[39m"
|
|
fi
|
|
echo -e "Please make sure you have opened following port for both in/out:"
|
|
echo -e "\033[0;32mTCP: 8090\033[39m for CyberPanel"
|
|
echo -e "\033[0;32mTCP: 80\033[39m, \033[0;32mTCP: 443\033[39m and \033[0;32mUDP: 443\033[39m for webserver"
|
|
echo -e "\033[0;32mTCP: 21\033[39m and \033[0;32mTCP: 40110-40210\033[39m for FTP"
|
|
echo -e "\033[0;32mTCP: 25\033[39m, \033[0;32mTCP: 587\033[39m, \033[0;32mTCP: 465\033[39m, \033[0;32mTCP: 110\033[39m, \033[0;32mTCP: 143\033[39m and \033[0;32mTCP: 993\033[39m for mail service"
|
|
echo -e "\033[0;32mTCP: 53\033[39m and \033[0;32mUDP: 53\033[39m for DNS service"
|
|
if [[ $SERVER_COUNTRY = CN ]] ; then
|
|
if [[ $PROVIDER == "Tencent Cloud" ]] ; then
|
|
if [[ $SERVER_OS == "Ubuntu" ]] ; then
|
|
rm -f /etc/apt/sources.list
|
|
mv /etc/apt/sources.list-backup /etc/apt/sources.list
|
|
echo > "nameserver 127.0.0.53
|
|
options edns0" /run/systemd/resolve/stub-resolv.conf
|
|
echo > "nameserver 127.0.0.53
|
|
options edns0" /etc/resolv.conf
|
|
apt update
|
|
#revert the previous change on tencent cloud repo.
|
|
fi
|
|
fi
|
|
if [[ $VERSION = "ENT" ]] ; then
|
|
sed -i 's|https://www.litespeedtech.com/packages/5.0/lsws-5.3.5-ent-x86_64-linux.tar.gz|https://cyberpanel.sh/packages/5.0/lsws-5.3.5-ent-x86_64-linux.tar.gz|g' /usr/local/CyberCP/install/installCyberPanel.py
|
|
sed -i 's|https://www.litespeedtech.com/packages/5.0/lsws-5.3.8-ent-x86_64-linux.tar.gz|https://cyberpanel.sh/packages/5.0/lsws-5.3.8-ent-x86_64-linux.tar.gz|g' /usr/local/CyberCP/serverStatus/serverStatusUtil.py
|
|
sed -i 's|https://www.litespeedtech.com/packages/5.0/lsws-5.3.8-ent-x86_64-linux.tar.gz|https://'$DOWNLOAD_SERVER'/litespeed/lsws-'$LSWS_STABLE_VER'-ent-x86_64-linux.tar.gz|g' /usr/local/CyberCP/serverStatus/serverStatusUtil.py
|
|
echo -e "If you have install LiteSpeed Enterprise, please run \e[31m/usr/local/lsws/admin/misc/lsup.sh\033[39m to update it to latest."
|
|
fi
|
|
fi
|
|
|
|
sed -i 's|lsws-5.3.8|lsws-'$LSWS_STABLE_VER'|g' /usr/local/CyberCP/serverStatus/serverStatusUtil.py
|
|
sed -i 's|lsws-5.4.2|lsws-'$LSWS_STABLE_VER'|g' /usr/local/CyberCP/serverStatus/serverStatusUtil.py
|
|
sed -i 's|lsws-5.3.5|lsws-'$LSWS_STABLE_VER'|g' /usr/local/CyberCP/serverStatus/serverStatusUtil.py
|
|
|
|
if [[ $SILENT != "ON" ]] ; then
|
|
printf "%s" "Would you like to restart your server now? [y/N]: "
|
|
read TMP_YN
|
|
|
|
if [[ "$TMP_YN" = "N" ]] || [[ "$TMP_YN" = "n" ]] || [[ -z "$TMP_YN" ]]; then
|
|
:
|
|
else
|
|
reboot
|
|
exit
|
|
fi
|
|
|
|
exit
|
|
fi
|
|
#replace URL for CN
|
|
|
|
|
|
|
|
else
|
|
echo "something went wrong..."
|
|
exit
|
|
fi
|
|
}
|
|
|
|
argument_mode() {
|
|
KEY_SIZE=${#VERSION}
|
|
TMP=$(echo $VERSION | cut -c5)
|
|
TMP2=$(echo $VERSION | cut -c10)
|
|
TMP3=$(echo $VERSION | cut -c15)
|
|
if [[ $VERSION == "OLS" || $VERSION == "ols" ]] ; then
|
|
VERSION="OLS"
|
|
echo -e "\nSet to OpenLiteSpeed..."
|
|
elif [[ $VERSION == "Trial" ]] || [[ $VERSION == "TRIAL" ]] || [[ $VERSION == "trial" ]] ; then
|
|
VERSION="ENT"
|
|
LICENSE_KEY="TRIAL"
|
|
echo -e "\nLiteSpeed Enterprise trial license set..."
|
|
elif [[ $TMP == "-" ]] && [[ $TMP2 == "-" ]] && [[ $TMP3 == "-" ]] && [[ $KEY_SIZE == "19" ]] ; then
|
|
LICENSE_KEY=$VERSION
|
|
VERSION="ENT"
|
|
echo -e "\nLiteSpeed Enterprise license key set..."
|
|
else
|
|
echo -e "\nCan not recognize the input value \e[31m$VERSION\e[39m "
|
|
echo -e "\nPlease verify the input value..."
|
|
echo -e "\nPlease run with \e[31m-h\e[39m or \e[31m--help\e[39m for more detail."
|
|
exit
|
|
fi
|
|
|
|
if [[ $ADMIN_PASS == "d" ]] ; then
|
|
ADMIN_PASS="1234567"
|
|
echo -e "\nSet to default password..."
|
|
echo -e "\nAdmin password will be set to \e[31m$ADMIN_PASS\e[39m"
|
|
elif [[ $ADMIN_PASS == "r" ]] ; then
|
|
ADMIN_PASS=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 16 ; echo '')
|
|
echo -e "\nSet to random-generated password..."
|
|
echo -e "\nAdmin password will be set to \e[31m$ADMIN_PASS\e[39m"
|
|
echo $ADMIN_PASS
|
|
else
|
|
echo -e "\nAdmin password will be set to \e[31m$ADMIN_PASS\e[39m"
|
|
fi
|
|
}
|
|
|
|
if [ $# -eq 0 ] ; then
|
|
echo -e "\nInitializing...\n"
|
|
else
|
|
if [[ $1 == "help" ]] ; then
|
|
show_help
|
|
exit
|
|
elif [[ $1 == "dev" ]] ; then
|
|
DEV="ON"
|
|
DEV_ARG="ON"
|
|
SILENT="OFF"
|
|
elif [[ $1 == "default" ]] ; then
|
|
echo -e "\nThis will start default installation...\n"
|
|
SILENT="ON"
|
|
POSTFIX_VARIABLE="ON"
|
|
POWERDNS_VARIABLE="ON"
|
|
PUREFTPD_VARIABLE="ON"
|
|
VERSION="OLS"
|
|
ADMIN_PASS="1234567"
|
|
MEMCACHED="ON"
|
|
REDIS="ON"
|
|
else
|
|
while [ ! -z "${1}" ]; do
|
|
case $1 in
|
|
-v | --version) shift
|
|
if [ "${1}" = '' ]; then
|
|
show_help
|
|
exit
|
|
else
|
|
VERSION="${1}"
|
|
SILENT="ON"
|
|
fi
|
|
;;
|
|
-p | --password) shift
|
|
if [[ "${1}" == '' ]]; then
|
|
ADMIN_PASS="1234567"
|
|
elif [[ "${1}" == 'r' ]] || [[ $1 == 'random' ]] ; then
|
|
ADMIN_PASS=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 16 ; echo '')
|
|
else
|
|
if [ ${1} -lt 8 ] ; then
|
|
echo -e "\nPassword lenth less than 8 digital, please choose a more complicated password.\n"
|
|
exit
|
|
fi
|
|
ADMIN_PASS="${1}"
|
|
fi
|
|
;;
|
|
-a | --addons)
|
|
MEMCACHED="ON"
|
|
REDIS="ON"
|
|
;;
|
|
-m | --minimal)
|
|
echo "minimal installation is still work in progress..."
|
|
exit
|
|
;;
|
|
-h | --help)
|
|
show_help
|
|
exit
|
|
;;
|
|
*)
|
|
echo "unknown argument..."
|
|
show_help
|
|
exit
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
fi
|
|
fi
|
|
|
|
|
|
|
|
SERVER_IP=$(curl --silent --max-time 10 -4 https://cyberpanel.sh/?ip)
|
|
if [[ $SERVER_IP =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
|
echo -e "Valid IP detected..."
|
|
else
|
|
echo -e "Can not detect IP, exit..."
|
|
exit
|
|
fi
|
|
SERVER_COUNTRY="unknow"
|
|
SERVER_COUNTRY=$(curl --silent --max-time 5 https://cyberpanel.sh/?country)
|
|
if [[ ${#SERVER_COUNTRY} == "2" ]] || [[ ${#SERVER_COUNTRY} == "6" ]] ; then
|
|
echo -e "\nChecking server..."
|
|
else
|
|
echo -e "\nChecking server..."
|
|
SERVER_COUNTRY="unknow"
|
|
fi
|
|
#SERVER_COUNTRY="CN"
|
|
#test string
|
|
if [[ $SERVER_COUNTRY == "CN" ]] ; then
|
|
DOWNLOAD_SERVER="cyberpanel.sh"
|
|
else
|
|
DOWNLOAD_SERVER="cdn.cyberpanel.sh"
|
|
fi
|
|
|
|
check_OS
|
|
check_root
|
|
check_panel
|
|
check_process
|
|
check_provider
|
|
|
|
|
|
|
|
|
|
|
|
if [[ $SILENT = "ON" ]] ; then
|
|
argument_mode
|
|
else
|
|
interactive_mode
|
|
fi
|
|
|
|
SECONDS=0
|
|
install_required
|
|
|
|
pip_virtualenv
|
|
|
|
system_tweak
|
|
|
|
main_install |