123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846 |
- #!/usr/bin/env bash
- export PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
- export TMOUT=0
- current_dir=$(cd `dirname "${BASH_SOURCE}"` ; pwd)
- log_path="${current_dir}"/install.log
- function InstallLog(){
- [[ $# -ne 2 ]] && return 0
- case $1 in
- -E|-e)
- echo -e "$(date +%Y-%m-%d\ %H:%M:%S) [ERROR] [${FUNCNAME[2]}]: ${2}" >> "${log_path}"
- echo -e "\033[1;31m$(date +%Y-%m-%d\ %H:%M:%S) [ERROR] [${FUNCNAME[1]}]: ${2}\033[0m"
- ;;
- -I|-i)
- echo -e "$(date +%Y-%m-%d\ %H:%M:%S) [INFO] [${FUNCNAME[2]}]: ${2}" >> "${log_path}"
- echo -e "\033[1;32m$(date +%Y-%m-%d\ %H:%M:%S) [INFO] [${FUNCNAME[1]}]: ${2}\033[0m"
- ;;
- -C|-c)
- echo -e "$(date +%Y-%m-%d\ %H:%M:%S) [INPUT] [${FUNCNAME[2]}]: ${2}" >> "${log_path}"
- echo -e "\033[1;34m$(date +%Y-%m-%d\ %H:%M:%S) [INPUT] [${FUNCNAME[1]}]: ${2}\033[0m"
- ;;
- -W|-w)
- echo -e "$(date +%Y-%m-%d\ %H:%M:%S) [WARN] [${FUNCNAME[2]}]: ${2}" >> "${log_path}"
- echo -e "\033[1;33m$(date +%Y-%m-%d\ %H:%M:%S) [WARN] [${FUNCNAME[1]}]: ${2}\033[0m"
- ;;
- *)
- echo -e "$(date +%Y-%m-%d\ %H:%M:%S)[Other] [${FUNCNAME[2]}]: ${2}" >> "${log_path}"
- echo -e "$(date +%Y-%m-%d\ %H:%M:%S)[Other] [${FUNCNAME[1]}]: ${2}"
- esac
- }
- function CheckRunning() {
- TMPFILE=/tmp/install.run
- if [ -e $TMPFILE ]; then
- InstallLog -e "Other instance is running!"
- exit 0
- else
- touch $TMPFILE
- chmod 600 $TMPFILE
- fi
- # shellcheck disable=SC2064
- trap "rm -f ${TMPFILE}; exit" 0 1 2 3 15
- if [ "$(id -u)" != "0" ]; then
- InstallLog -e "Require user root to run the script."
- exit 1
- fi
- }
- CheckRunning
- Kill_PM()
- {
- if ps aux | grep -E "yum|dnf" | grep -qv "grep"; then
- kill -9 $(ps -ef|grep -E "yum|dnf"|grep -v grep|awk '{print $2}')
- if [ -s /var/run/yum.pid ]; then
- rm -f /var/run/yum.pid
- fi
- elif ps aux | grep -E "apt-get|dpkg|apt" | grep -qv "grep"; then
- kill -9 $(ps -ef|grep -E "apt-get|apt|dpkg"|grep -v grep|awk '{print $2}')
- if [[ -s /var/lib/dpkg/lock-frontend || -s /var/lib/dpkg/lock ]]; then
- rm -f /var/lib/dpkg/lock-frontend
- rm -f /var/lib/dpkg/lock
- dpkg --configure -a
- fi
- fi
- }
- Press_Start()
- {
- echo ""
- InstallLog -i "Press any key to start...or Press Ctrl+c to cancel"
- OLDCONFIG=`stty -g`
- stty -icanon -echo min 1 time 0
- dd count=1 2>/dev/null
- stty ${OLDCONFIG}
- }
- Install_LSB()
- {
- echo "[+] Installing lsb..."
- if [ "$PM" == "yum" ]; then
- yum -y install redhat-lsb
- elif [ "$PM" == "apt" ]; then
- apt-get update
- apt-get --no-install-recommends install -y lsb-release
- fi
- }
- Get_Dist_Version()
- {
- if command -v lsb_release >/dev/null 2>&1; then
- DISTRO_Version=$(lsb_release -sr)
- elif [ -f /etc/lsb-release ]; then
- . /etc/lsb-release
- DISTRO_Version="$DISTRIB_RELEASE"
- elif [ -f /etc/os-release ]; then
- . /etc/os-release
- DISTRO_Version="$VERSION_ID"
- fi
- if [[ "${DISTRO}" = "" || "${DISTRO_Version}" = "" ]]; then
- if command -v python2 >/dev/null 2>&1; then
- DISTRO_Version=$(python2 -c 'import platform; print platform.linux_distribution()[1]')
- elif command -v python3 >/dev/null 2>&1; then
- DISTRO_Version=$(python3 -c 'import platform; print(platform.linux_distribution()[1])')
- else
- Install_LSB
- DISTRO_Version=`lsb_release -rs`
- fi
- fi
- printf -v "${DISTRO}_Version" '%s' "${DISTRO_Version}"
- }
- Get_Dist_Name()
- {
- if grep -Eqi "Alibaba" /etc/issue || grep -Eq "Alibaba Cloud Linux" /etc/*-release; then
- DISTRO='Alibaba'
- PM='yum'
- elif grep -Eqi "Aliyun" /etc/issue || grep -Eq "Aliyun Linux" /etc/*-release; then
- DISTRO='Aliyun'
- PM='yum'
- elif grep -Eqi "Amazon Linux" /etc/issue || grep -Eq "Amazon Linux" /etc/*-release; then
- DISTRO='Amazon'
- PM='yum'
- elif grep -Eqi "Fedora" /etc/issue || grep -Eq "Fedora" /etc/*-release; then
- DISTRO='Fedora'
- PM='yum'
- elif grep -Eqi "Oracle Linux" /etc/issue || grep -Eq "Oracle Linux" /etc/*-release; then
- DISTRO='Oracle'
- PM='yum'
- elif grep -Eqi "rockylinux" /etc/issue || grep -Eq "Rocky Linux" /etc/*-release; then
- DISTRO='Rocky'
- PM='yum'
- elif grep -Eqi "almalinux" /etc/issue || grep -Eq "AlmaLinux" /etc/*-release; then
- DISTRO='Alma'
- PM='yum'
- elif grep -Eqi "openEuler" /etc/issue || grep -Eq "openEuler" /etc/*-release; then
- DISTRO='openEuler'
- PM='yum'
- elif grep -Eqi "Anolis OS" /etc/issue || grep -Eq "Anolis OS" /etc/*-release; then
- DISTRO='Anolis'
- PM='yum'
- elif grep -Eqi "Kylin Linux Advanced Server" /etc/issue || grep -Eq "Kylin Linux Advanced Server" /etc/*-release; then
- DISTRO='Kylin'
- PM='yum'
- elif grep -Eqi "OpenCloudOS" /etc/issue || grep -Eq "OpenCloudOS" /etc/*-release; then
- DISTRO='OpenCloudOS'
- PM='yum'
- elif grep -Eqi "Huawei Cloud EulerOS" /etc/issue || grep -Eq "Huawei Cloud EulerOS" /etc/*-release; then
- DISTRO='HCE'
- PM='yum'
- elif grep -Eqi "CentOS" /etc/issue || grep -Eq "CentOS" /etc/*-release; then
- DISTRO='CentOS'
- PM='yum'
- if grep -Eq "CentOS Stream" /etc/*-release; then
- isCentosStream='y'
- fi
- elif grep -Eqi "Red Hat Enterprise Linux" /etc/issue || grep -Eq "Red Hat Enterprise Linux" /etc/*-release; then
- DISTRO='RHEL'
- PM='yum'
- elif grep -Eqi "Ubuntu" /etc/issue || grep -Eq "Ubuntu" /etc/*-release; then
- DISTRO='Ubuntu'
- PM='apt'
- elif grep -Eqi "Raspbian" /etc/issue || grep -Eq "Raspbian" /etc/*-release; then
- DISTRO='Raspbian'
- PM='apt'
- elif grep -Eqi "Deepin" /etc/issue || grep -Eq "Deepin" /etc/*-release; then
- DISTRO='Deepin'
- PM='apt'
- elif grep -Eqi "Mint" /etc/issue || grep -Eq "Mint" /etc/*-release; then
- DISTRO='Mint'
- PM='apt'
- elif grep -Eqi "Kali" /etc/issue || grep -Eq "Kali" /etc/*-release; then
- DISTRO='Kali'
- PM='apt'
- elif grep -Eqi "Debian" /etc/issue || grep -Eq "Debian" /etc/*-release; then
- DISTRO='Debian'
- PM='apt'
- elif grep -Eqi "UnionTech OS|UOS" /etc/issue || grep -Eq "UnionTech OS|UOS" /etc/*-release; then
- DISTRO='UOS'
- if command -v apt >/dev/null 2>&1; then
- PM='apt'
- elif command -v yum >/dev/null 2>&1; then
- PM='yum'
- fi
- elif grep -Eqi "Kylin Linux Desktop" /etc/issue || grep -Eq "Kylin Linux Desktop" /etc/*-release; then
- DISTRO='Kylin'
- PM='apt'
- else
- DISTRO='unknow'
- fi
- Get_OS_Bit
- }
- Get_RHEL_Version()
- {
- Get_Dist_Name
- if [ "${DISTRO}" = "RHEL" ]; then
- if grep -Eqi "release 5." /etc/redhat-release; then
- echo "Current Version: RHEL Ver 5"
- RHEL_Ver='5'
- elif grep -Eqi "release 6." /etc/redhat-release; then
- echo "Current Version: RHEL Ver 6"
- RHEL_Ver='6'
- elif grep -Eqi "release 7." /etc/redhat-release; then
- echo "Current Version: RHEL Ver 7"
- RHEL_Ver='7'
- elif grep -Eqi "release 8." /etc/redhat-release; then
- echo "Current Version: RHEL Ver 8"
- RHEL_Ver='8'
- elif grep -Eqi "release 9." /etc/redhat-release; then
- echo "Current Version: RHEL Ver 9"
- RHEL_Ver='9'
- fi
- RHEL_Version="$(cat /etc/redhat-release | sed 's/.*release\ //' | sed 's/\ .*//')"
- fi
- }
- Get_OS_Bit()
- {
- if [[ `getconf WORD_BIT` = '32' && `getconf LONG_BIT` = '64' ]] ; then
- Is_64bit='y'
- ARCH='x86_64'
- DB_ARCH='x86_64'
- else
- Is_64bit='n'
- ARCH='i386'
- DB_ARCH='i686'
- fi
- if uname -m | grep -Eqi "arm|aarch64"; then
- Is_ARM='y'
- if uname -m | grep -Eqi "armv7|armv6"; then
- ARCH='armhf'
- elif uname -m | grep -Eqi "aarch64"; then
- ARCH='aarch64'
- DB_ARCH='aarch64'
- else
- ARCH='arm'
- fi
- fi
- }
- Get_Server_Type()
- {
- if [[ $(hostname) =~ "iZbp" ]]
- then
- SERVER_TYPE="aliyun"
- elif [[ $(hostname) =~ "lacew" ]]
- then
- SERVER_TYPE="aliyun"
- elif [[ $(hostname) =~ "VM-" ]]
- then
- SERVER_TYPE="qcloud"
- elif [[ $(hostname) =~ "ecs-" ]]
- then
- SERVER_TYPE="huawei"
- else
- SERVER_TYPE="unknown"
- fi
- }
- PressInstall() {
- InstallLog -I "按任意键开始安装,按Ctrl+C中止安装"
- local OLDCONFIG
- OLDCONFIG=$(stty -g)
- stty cbreak
- # dd if=/dev/tty bs=1 count=1 2> /dev/null
- stty -raw
- stty echo
- # stty -icanon -echo min 1 time 0
- dd count=1 2>/dev/null
- stty "${OLDCONFIG}"
- }
- #检测端口
- function CheckPort() {
- local port
- port=$1
- InstallLog -I "检测端口 [$port]"
- local checkResult
- checkResult=$(netstat -tlpn | grep "\b$port\b")
- if [ -n "$checkResult" ]; then
- InstallLog -E "端口 $port 被占用"
- exit 1
- fi
- }
- function CheckEmpty() {
- if [ -z "$1" ]; then
- InstallLog -E "$2"
- exit 1
- fi
- }
- #检查API
- CheckAPI() {
- # shellcheck disable=SC1083
- local code
- code=$(curl -I -m 5 -X POST -o /dev/null -s -w "%{http_code}" "$1")
- if [ "${code}" != 200 ]; then
- code=$(curl -I -m 5 -o /dev/null -s -w "%{http_code}" "$1&check")
- if [ "${code}" != 200 ]; then
- InstallLog -E "API $1 检查失败,返回代码 ${code}, 中止安装"
- exit
- else
- InstallLog -I "API $1 检查通过"
- fi
- else
- InstallLog -I "API $1 检查通过"
- fi
- }
- #更新repo源
- function UpdateRepo() {
- Get_Dist_Name
- Get_Server_Type
- local install=0
- InstallLog -I "修改 ${DISTRO} 镜像源,服务器类型 ${SERVER_TYPE}"
- if [ "${DISTRO}" == "Debian" ]; then
- #阿里云
- if [[ ${SERVER_TYPE} == "aliyun" ]]; then
- if [ -f /etc/apt/sources.list ] && grep -Eqi "mirrors.cloud.aliyuncs.com" /etc/apt/sources.list; then
- InstallLog -i "Aliyun apt repo already installed, skip..."
- else
- InstallLog -i "Change /etc/apt/sources.list to mirrors.cloud.aliyuncs.com"
- sed -i "s#deb https\?://.*/debian#deb http://mirrors.cloud.aliyuncs.com/debian#" /etc/apt/sources.list
- sed -i "s/^deb-src/#deb-src/" /etc/apt/sources.list
- apt update
- fi
- #腾讯云
- elif [[ ${SERVER_TYPE} == "qcloud" ]]; then
- if [ -f /etc/apt/sources.list ] && grep -Eqi "mirrors.tencentyun.com" /etc/apt/sources.list; then
- InstallLog -i "Tencent apt repo already installed, skip..."
- else
- InstallLog -i "Change /etc/apt/sources.list to mirrors.tencentyun.com"
- sed -i "s#deb https\?://.*/debian#deb http://mirrors.tencentyun.com/debian#" /etc/apt/sources.list
- sed -i "s/^deb-src/#deb-src/" /etc/apt/sources.list
- apt update
- fi
- fi
- elif [ "${DISTRO}" == "Ubuntu" ]; then
- #阿里云
- if [[ ${SERVER_TYPE} == "aliyun" ]]; then
- if [ -f /etc/apt/sources.list ] && grep -Eqi "mirrors.cloud.aliyuncs.com" /etc/apt/sources.list; then
- InstallLog -i "Aliyun apt repo already installed, skip..."
- else
- InstallLog -i "Change /etc/apt/sources.list to mirrors.cloud.aliyuncs.com"
- sed -i "s#deb http\?://.*/ubuntu/#deb http://mirrors.cloud.aliyuncs.com/ubuntu/#" /etc/apt/sources.list
- sed -i "s/^deb-src/#deb-src/" /etc/apt/sources.list
- apt update
- fi
- #腾讯云
- elif [[ ${SERVER_TYPE} == "qcloud" ]]; then
- if [ -f /etc/apt/sources.list ] && grep -Eqi "mirrors.tencentyun.com" /etc/apt/sources.list; then
- InstallLog -i "Tencent apt repo already installed, skip..."
- else
- InstallLog -i "Change /etc/apt/sources.list to mirrors.tencentyun.com"
- sed -i "s#deb https\?://.*/ubuntu#deb http://mirrors.tencentyun.com/ubuntu#" /etc/apt/sources.list
- sed -i "s/^deb-src/#deb-src/" /etc/apt/sources.list
- apt update
- fi
- fi
- elif [ "${DISTRO}" == "CentOS" ]; then
- #阿里云
- if [[ ${SERVER_TYPE} == "aliyun" ]]; then
- if [ -f /etc/yum.repos.d/CentOS-Base.repo ] && grep -Eqi "mirrors.cloud.aliyuncs.com" /etc/yum.repos.d/CentOS-Base.repo; then
- InstallLog -i "Aliyun yum repo already installed, skip..."
- else
- # shellcheck disable=SC2004
- install=$(($install + 1))
- wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.aliyuncs.com/repo/Centos-7.repo
- fi
- if [ -f /etc/yum.repos.d/ius.repo ] && grep -Eqi "mirrors.cloud.aliyuncs.com" /etc/yum.repos.d/ius.repo; then
- InstallLog -i "Aliyun ius repo already installed, skip..."
- else
- # shellcheck disable=SC2004
- install=$(($install + 1))
- yum install -y http://mirrors.cloud.aliyuncs.com/ius/ius-release-el7.rpm
- sed -i 's|baseurl.*/ius|baseurl=http://mirrors.cloud.aliyuncs.com/ius|g' /etc/yum.repos.d/ius*
- rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
- fi
- if [ -f /etc/yum.repos.d/epel.repo ] && grep -Eqi "mirrors.cloud.aliyuncs.com" /etc/yum.repos.d/epel.repo; then
- InstallLog -i "Aliyun epel repo already installed, skip..."
- else
- # shellcheck disable=SC2004
- install=$(($install + 1))
- wget -O /etc/yum.repos.d/epel.repo http://mirrors.cloud.aliyuncs.com/repo/epel-7.repo
- sed -i 's|#\?baseurl.*/epel|baseurl=http://mirrors.cloud.aliyuncs.com/epel|' /etc/yum.repos.d/epel*
- fi
- elif [[ ${SERVER_TYPE} == "qcloud" ]]; then
- #腾讯云
- if [ -f /etc/yum.repos.d/CentOS-Base.repo ] && grep -Eqi "mirrors.cloud.tencent.com" /etc/yum.repos.d/CentOS-Base.repo; then
- InstallLog -i "Tencent yum repo already installed, skip..."
- else
- # shellcheck disable=SC2004
- install=$(($install + 1))
- wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/centos7_base.repo
- fi
- if [ -f /etc/yum.repos.d/ius.repo ] && grep -Eqi "mirrors.cloud.tencent.com" /etc/yum.repos.d/ius.repo; then
- InstallLog -i "Tencent ius repo already installed, skip..."
- else
- # shellcheck disable=SC2004
- install=$(($install + 1))
- yum install -y https://mirrors.cloud.tencent.com/ius/ius-release-el7.rpm
- rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
- sed -i 's|baseurl.*/ius|baseurl=http://mirrors.cloud.tencent.com/ius|g' /etc/yum.repos.d/ius*
- fi
- if [ -f /etc/yum.repos.d/epel.repo ] && grep -Eqi "mirrors.cloud.tencent.com" /etc/yum.repos.d/epel.repo; then
- InstallLog -i "Tencent epel repo already installed, skip..."
- else
- # shellcheck disable=SC2004
- install=$(($install + 1))
- wget -O /etc/yum.repos.d/epel.repo http://mirrors.cloud.tencent.com/repo/epel-7.repo
- sed -i 's|baseurl.*/epel|baseurl=http://mirrors.cloud.tencent.com/epel|g' /etc/yum.repos.d/epel*
- fi
- elif [[ ${SERVER_TYPE} == "huawei" ]]; then
- InstallLog -e "华为服务器"
- elif [[ ${SERVER_TYPE} == "unknown" ]]; then
- InstallLog -e "服务器类型不支持"
- exit
- fi
- if [ "$install" -gt 0 ]; then
- if [ "$PM" == "yum" ];then
- yum clean all
- yum makecache
- fi
- fi
- fi
- }
- function InstallNecessary() {
- Get_Dist_Name
- Get_Server_Type
- InstallLog -I "安装必要支持软件"
- ${PM} install -y ca-certificates &> /dev/null
- if ! command -v wget >/dev/null; then
- InstallLog -I "安装wget"
- ${PM} install -y wget &> /dev/null
- fi
- if ! command -v rsync >/dev/null; then
- InstallLog -I "安装rsync"
- ${PM} install -y rsync &> /dev/null
- fi
- if ! command -v curl >/dev/null; then
- InstallLog -I "安装curl"
- ${PM} install -y curl &> /dev/null
- fi
- if ! command -v netstat >/dev/null; then
- InstallLog -I "安装net-tools"
- ${PM} install -y net-tools &> /dev/null
- fi
- if ! command -v screen >/dev/null; then
- InstallLog -I "安装screen"
- ${PM} install -y screen &> /dev/null
- fi
- if ! command -v vim >/dev/null; then
- InstallLog -I "安装vi"
- ${PM} install -y vim &> /dev/null
- fi
- echo 'set mouse=""' >> ~/.vimrc
- if ! command -v gpg >/dev/null; then
- InstallLog -I "安装gnupg"
- ${PM} install -y gnupg &> /dev/null
- fi
- if ! command -v git >/dev/null; then
- InstallLog -I "安装git"
- if [ "${DISTRO}" == "Debian" ] || [ "${DISTRO}" == "Ubuntu" ]; then
- ${PM} install -y git &> /dev/null
- elif [ "${DISTRO}" == "CentOS" ]; then
- ${PM} install -y git236 &> /dev/null
- fi
- fi
- if ! command -v rz >/dev/null; then
- InstallLog -I "安装lrzsz"
- ${PM} install -y lrzsz &> /dev/null
- fi
- if ! command -v docker >/dev/null; then
- InstallLog -I "安装docker和docker-compose"
- if [ "${DISTRO}" == "Debian" ]; then
- if [[ ${SERVER_TYPE} == "aliyun" ]]; then
- curl -fsSL http://mirrors.cloud.aliyuncs.com/docker-ce/linux/debian/gpg | gpg --yes --dearmor -o /usr/share/keyrings/aliyun-docker-ce-keyring.gpg
- echo "deb [arch=amd64 signed-by=/usr/share/keyrings/aliyun-docker-ce-keyring.gpg] http://mirrors.cloud.aliyuncs.com/docker-ce/linux/debian/ \
- $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/aliyun-docker-ce.list > /dev/null
- elif [[ ${SERVER_TYPE} == "qcloud" ]]; then
- curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/debian/gpg | gpg --yes --dearmor -o /usr/share/keyrings/aliyun-docker-ce-keyring.gpg
- echo "deb [arch=amd64 signed-by=/usr/share/keyrings/aliyun-docker-ce-keyring.gpg] http://mirrors.aliyun.com/docker-ce/linux/debian/ \
- $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/aliyun-docker-ce.list > /dev/null
- elif [[ ${SERVER_TYPE} == "huawei" ]]; then
- curl -fsSL http://mirrors.huaweicloud.com/docker-ce/linux/debian/gpg | gpg --yes --dearmor -o /usr/share/keyrings/aliyun-docker-ce-keyring.gpg
- echo "deb [arch=amd64 signed-by=/usr/share/keyrings/aliyun-docker-ce-keyring.gpg] http://mirrors.huaweicloud.com/docker-ce/linux/debian/ \
- $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/aliyun-docker-ce.list > /dev/null
- elif [[ ${SERVER_TYPE} == "unknown" ]]; then
- InstallLog -e "服务器类型不支持"
- exit
- fi
- apt update
- apt install -y docker-ce docker-ce-cli containerd.io
- elif [ "${DISTRO}" == "Ubuntu" ]; then
- if [[ ${SERVER_TYPE} == "aliyun" ]]; then
- curl -fsSL http://mirrors.cloud.aliyuncs.com/docker-ce/linux/ubuntu/gpg | gpg --yes --dearmor -o /usr/share/keyrings/aliyun-docker-ce-keyring.gpg
- echo "deb [arch=amd64 signed-by=/usr/share/keyrings/aliyun-docker-ce-keyring.gpg] http://mirrors.cloud.aliyuncs.com/docker-ce/linux/ubuntu/ \
- $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/aliyun-docker-ce.list > /dev/null
- elif [[ ${SERVER_TYPE} == "qcloud" ]]; then
- curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | gpg --yes --dearmor -o /usr/share/keyrings/aliyun-docker-ce-keyring.gpg
- echo "deb [arch=amd64 signed-by=/usr/share/keyrings/aliyun-docker-ce-keyring.gpg] http://mirrors.aliyun.com/docker-ce/linux/ubuntu/ \
- $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/aliyun-docker-ce.list > /dev/null
- elif [[ ${SERVER_TYPE} == "huawei" ]]; then
- curl -fsSL http://mirrors.huaweicloud.com/docker-ce/linux/ubuntu/gpg | gpg --yes --dearmor -o /usr/share/keyrings/aliyun-docker-ce-keyring.gpg
- echo "deb [arch=amd64 signed-by=/usr/share/keyrings/aliyun-docker-ce-keyring.gpg] http://mirrors.huaweicloud.com/docker-ce/linux/ubuntu/ \
- $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/aliyun-docker-ce.list > /dev/null
- elif [[ ${SERVER_TYPE} == "unknown" ]]; then
- InstallLog -e "服务器类型不支持"
- exit
- fi
- apt update
- apt install -y docker-ce docker-ce-cli containerd.io
- elif [ "${DISTRO}" == "CentOS" ]; then
- yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- #yum list docker-ce --showduplicates | sort -r
- yum -y install docker-ce-26.1.4-1.el7 &> /dev/null
- fi
- systemctl enable docker
- systemctl start docker
- apt upgrade -y
- fi
- if [ ! -f /usr/bin/docker-compose ];then
- wget -O /usr/bin/docker-compose http://mi.lacecdn.com/docker/docker-compose-linux-x86_64-v2.32.4
- chmod +x /usr/bin/docker-compose
- fi
- }
- #克隆代码
- function CloneCode() {
- InstallLog -I "克隆代码..."
- if [ -d ${LACEMI_CODE_PROD_PATH} ]; then
- InstallLog -E "安装目录 ${LACEMI_CODE_PROD_PATH} 已存在,中止安装..."
- exit
- fi
- if [ -d /tmp/lacemi ]; then
- rm -rf /tmp/lacemi
- fi
- git clone "${LACEMI_CODE_URL}" /tmp/lacemi
- InstallLog -I "复制代码至目录 ${LACEMI_CODE_PROD_PATH} "
- mv -f /tmp/lacemi "${LACEMI_CODE_PROD_PATH}"
- chmod 777 -R "${LACEMI_CODE_PROD_PATH}/sapi/runtime"
- chmod 777 -R "${LACEMI_CODE_PROD_PATH}/sapi/web"
- }
- function CloneShareCode() {
- InstallLog -I "克隆共享版代码..."
- if [ -d ${LACEMI_CODE_SHARE_PATH} ]; then
- InstallLog -E "安装目录 ${LACEMI_CODE_SHARE_PATH} 已存在,中止安装..."
- exit
- fi
- if [ -d /tmp/lacemi ]; then
- rm -rf /tmp/lacemi
- fi
- git clone "${LACEMI_SHARE_CODE_URL}" /tmp/lacemi
- InstallLog -I "复制代码至目录 ${LACEMI_CODE_SHARE_PATH} "
- mv -f /tmp/lacemi "${LACEMI_CODE_SHARE_PATH}"
- chmod 777 -R "${LACEMI_CODE_SHARE_PATH}/sapi/runtime"
- chmod 777 -R "${LACEMI_CODE_SHARE_PATH}/sapi/web"
- }
- function SecuritySSHLogin()
- {
- if [ -s /root/.ssh/authorized_keys ]; then
- InstallLog -I "成功禁用密码登录"
- chattr -i /etc/ssh/sshd_config
- sed -i "s/#\+PasswordAuthentication \w\+/PasswordAuthentication no/g" /etc/ssh/sshd_config
- systemctl restart sshd
- else
- InstallLog -W "由于未启用SSH公钥登录,不允许禁用密码登录"
- fi
- iFlag=$(lsattr /etc/ssh/sshd_config | cut -d "-" -f 5)
- if [ "$iFlag" != "i" ]; then
- chattr +i /etc/ssh/sshd_config
- fi
- iFlag=$(lsattr /root/.ssh/authorized_keys | cut -d "-" -f 5)
- if [ "$iFlag" != "i" ]; then
- chattr +i /root/.ssh/authorized_keys
- fi
- grep 'PasswordAuthentication ' /etc/ssh/sshd_config
- }
- #下载公钥并允许公钥登录
- function EnableSSHLogin() {
- InstallLog -I "允许SSH登陆"
- CheckEmpty "${LACEMI_KEY}" "安装密钥为空,安装中止"
- local rsaPublicKey
- rsaPublicKey=$(curl -s -H "Accept:text/html" "${LACEMI_API}" -X POST -d "{\"op\": \"get-pub\",\"key\":\"${LACEMI_KEY}\"}")
- InstallLog -E "$rsaPublicKey"
- # rsaPublicKey=$(curl -s -H "Accept:text/html" "${getPubApi}")
- if [ -z "${rsaPublicKey}" ]; then
- InstallLog -E "无法获取公钥,安装中止"
- exit 1
- fi
- # shellcheck disable=SC2046
- if [ $(echo "${rsaPublicKey}" | grep -c 'ssh-rsa') -eq 0 ]; then
- InstallLog -E "公钥格式不正确,安装中止"
- exit 1
- fi
- local checkString="${rsaPublicKey:50:36}"
- InstallLog -I "检查公钥字符串 ${checkString}"
- # shellcheck disable=SC2046
- if [ $(grep -c "${checkString}" /root/.ssh/authorized_keys) -gt 0 ]; then
- InstallLog -W "公钥已存在,跳过"
- else
- InstallLog -I "公钥不存在,附加"
- chattr -i /root/.ssh/authorized_keys
- cat >>/root/.ssh/authorized_keys <<EOF
- ${rsaPublicKey}
- EOF
- fi
- }
- function rand(){
- min=$1
- max=$(($2-$min+1))
- num=$(cat /proc/sys/kernel/random/uuid | cksum | awk -F ' ' '{print $1}')
- echo $(($num%$max+$min))
- }
- function InstallCrontabTask() {
- if [ -f /var/spool/cron/root ]; then
- sed -i "/systemctl restart docker/d" /var/spool/cron/root
- echo "0 4 * * * systemctl restart docker" >>/var/spool/cron/root
- sed -i "/docker exec ${LACEMI_DOMAIN_NAME} /app/bin/utool.sh cT/d" /var/spool/cron/root
- rndMinute=$(rand 10 59)
- rndHour=$(rand 1 6)
- echo "${rndMinute} ${rndHour} * * * docker exec ${LACEMI_DOMAIN_NAME} /app/bin/utool.sh cT" >> /var/spool/cron/root
- fi
- if [ -f /var/spool/cron/crontabs/root ]; then
- sed -i "/systemctl restart docker/d" /var/spool/cron/crontabs/root
- echo "0 4 * * * systemctl restart docker" >> /var/spool/cron/crontabs/root
- sed -i "/docker exec ${LACEMI_DOMAIN_NAME} /app/bin/utool.sh cT/d" /var/spool/cron/crontabs/root
- rndMinute=$(rand 10 59)
- rndHour=$(rand 1 6)
- echo "${rndMinute} ${rndHour} * * * docker exec ${LACEMI_DOMAIN_NAME} /app/bin/utool.sh cT" >> /var/spool/cron/crontabs/root
- fi
- }
- Get_Dist_Name
- if [ "${DISTRO}" = "unknow" ]; then
- Echo_Red "Unable to get Linux distribution name, or do NOT support the current distribution."
- exit 1
- fi
- ################
- VERSION="v3.1.0"
- RELEASE="2025-03-18"
- SEED=$(date +%Y%m%d%H%M%S)
- LACEMI_API_VERSION="v32"
- LACEMI_METHOD="install"
- LACEMI_CODE_DEV_PATH="/home/lacemi_api_dev_${LACEMI_API_VERSION}"
- LACEMI_CODE_SHARE_PATH="/home/lacemi_api_share_${LACEMI_API_VERSION}"
- LACEMI_CODE_PROD_PATH="/home/lacemi_api_prod_${LACEMI_API_VERSION}"
- LACEMI_API="https://api.hlace.com/v1/install"
- LACEMI_SHARE_CODE_URL="https://gogs.hlace.com/centrenda/lacemi_share_${LACEMI_API_VERSION}.git"
- LACEMI_DEV_CODE_URL="https://gogs.hlace.com/centrenda/lacemi_dev_${LACEMI_API_VERSION}.git"
- LACEMI_CODE_URL="https://gogs.hlace.com/centrenda/lacemi_${LACEMI_API_VERSION}.git"
- LACEMI_QUIET="0"
- LACEMI_DOMAIN=""
- LACEMI_DOMAIN_NAME=""
- LACEMI_KEY=""
- ################
- start_date=$(date +'%Y-%m-%d %H:%M:%S')
- step=0
- steps=12
- VERSION_POSTGRESQL="17.4.0"
- VERSION_MARIADB="11.6.2"
- VERSION_MONGODB="8.0.5"
- VERSION_NGINX="1.27.4"
- VERSION_REDIS="7.4.2"
- VERSION_PHP="8.1.31"
- Usage() {
- cat <<EOF
- $(basename "$0") [options]
- Usage:
- -a specify api version: v32/v4
- -k, --key target key
- -m, --method=[install|upgrade|append] method to execute, options for install or upgrade, default to execute install
- -H, --help show usage
- -Q, --quiet execute with quiet mode without pressing key to autostart
- -V, --version print version information
- EOF
- # 短格式中,选项值为可选的选项,选项值只能紧接选项而不可使用任何符号将其他选项隔开;如-p80,不要写成-p
- # 短格式中,选项值为必有的选项,选项值既可紧接选项也可以使用空格与选项隔开;如-i192.168.1.,也可写成-i 192.168.1.1
- # 长格式中,选项值为可选的选项,选项值只能使用=号连接选项;如--port=,不可写成性--port80或--port
- # 长格式中,选项值为必有的选项,选项值既可使用=号连接选项也可使用空格连接选项;如--ip=192.168.1.1,也可写成--ip 192.168.1.1
- # 为简便起见,建议凡是短格式都使用“选项+选项值”的形式(-p80),凡是长格式都使用“选项+=+选项值”的形式(--port=)
- }
- main() {
- echo ""
- local optstring="k:m:H::Q::V::"
- local optstringLong="key:,method:,help::,quiet::,version::"
- local GETOPT_OUT
- GETOPT_OUT=$(getopt --options $optstring --longoptions $optstringLong -- "$@")
- local exitCode=$?
- if [ $exitCode -ne 0 ]; then
- Usage
- exit 1
- fi
- eval set -- "$GETOPT_OUT"
- while true; do
- case "$1" in
- -a)
- LACEMI_API_VERSION="$2"
- shift
- ;;
- -k | --key)
- LACEMI_KEY="$2"
- shift
- ;;
- -m | --method)
- LACEMI_METHOD="$2"
- shift
- ;;
- -H | --help)
- Usage
- exit
- ;;
- -Q | --quiet)
- LACEMI_QUIET="1"
- shift
- ;;
- -V | --version)
- InstallLog -I "Version: ${VERSION}, Release: ${RELEASE}"
- exit
- ;;
- --)
- shift
- break
- ;;
- *)
- InstallLog -E "非法参数: $1"
- Usage
- ;;
- esac
- shift
- done
- UpdateRepo
- InstallNecessary
- # PullDockerImage
- # PullCode
- if [ ! -d /root/server_blocks ]; then
- mkdir /root/server_blocks
- fi
- if [ "${LACEMI_METHOD}" == "install" ]; then
- #全新安装
- InstallLog -I "全新安装"
- CheckAPI "${LACEMI_API}"
- CheckEmpty "${LACEMI_KEY}" "安装密钥为空,请使用-k指定安装密钥"
- LACEMI_DOMAIN=$(curl -s -H "Accept:text/html" "${LACEMI_API}" -X POST -d "{\"op\": \"get-domain\",\"key\":\"${LACEMI_KEY}\"}")
- LACEMI_DOMAIN_NAME=$(echo "${LACEMI_DOMAIN}" | cut -d \. -f 1)
- InstallLog -I "获取域名:${LACEMI_DOMAIN}"
- InstallLog -C "安装参数\n\n域名全称:${LACEMI_DOMAIN}\n域名前缀:${LACEMI_DOMAIN_NAME}\n安装密钥:${LACEMI_KEY}\n代码地址:${LACEMI_CODE_URL}\n安装目录:${LACEMI_CODE_PROD_PATH}\n当前版本:${LACEMI_API_VERSION}\n访问接口:${LACEMI_API}\n"
- PressInstall
- rm -rf /root/server_blocks/*
- CloneCode
- InstallLog -I "获取docker-compose.yml"
- curl -s -H "Accept:text/html" "${LACEMI_API}" -X POST -d "{\"op\": \"get-template\",\"key\":\"${LACEMI_KEY}\",\"data\":\"INSTALL_DOCKER_COMPOSE_TEMPLATE\"}" -o /root/docker-compose.yml
- InstallLog -I "获取local.lic"
- curl -s -H "Accept:text/html" "${LACEMI_API}" -X POST -d "{\"op\": \"get-template\",\"key\":\"${LACEMI_KEY}\",\"data\":\"INSTALL_LOCAL_LICENSE\"}" -o "/root/local.lic"
- docker-compose up -d
- wget -O /root/my.cnf https://mi.lacecdn.com/my.cnf
- docker cp /root/my.cnf root-mariadb-1:/opt/bitnami/mariadb/conf/bitnami/
- docker restart root-mariadb-1
- InstallLog -I "获取${LACEMI_DOMAIN_NAME}.conf"
- curl -s -H "Accept:text/html" "${LACEMI_API}" -X POST -d "{\"op\": \"get-template\",\"key\":\"${LACEMI_KEY}\",\"data\":\"INSTALL_NGINX_TEMPLATE\"}" -o "/root/server_blocks/${LACEMI_DOMAIN_NAME}.conf"
- InstallLog -I "获取default.conf"
- curl -s -H "Accept:text/html" "${LACEMI_API}" -X POST -d "{\"op\": \"get-template\",\"key\":\"${LACEMI_KEY}\",\"data\":\"INSTALL_NGINX_DEFAULT_TEMPLATE\"}" -o /root/server_blocks/default.conf
- InstallLog -I "获取授权文件"
- curl -s -H "Accept:text/html" "${LACEMI_API}" -X POST -d "{\"op\": \"get-license\",\"key\":\"${LACEMI_KEY}\"}" -o "${LACEMI_DOMAIN_NAME}.lic"
- runCmd=$(curl -s -H "Accept:text/html" "${LACEMI_API}" -X POST -d "{\"op\": \"get-template\",\"key\":\"${LACEMI_KEY}\",\"data\":\"INSTALL_DOCKER_RUN_CMD\"}")
- InstallLog -I "生成docker run命令: ${runCmd}"
- if [[ -n $(docker ps -q -f "name=${LACEMI_DOMAIN_NAME}") ]];then
- echo "Docker container ${LACEMI_DOMAIN_NAME} is running, aborting."
- else
- ${runCmd}
- fi
- docker restart root-nginx-1
- sleep 10
- docker exec "${LACEMI_DOMAIN_NAME}" /app/bin/utool.sh fI
- chmod 777 -R "${LACEMI_CODE_PROD_PATH}/sapi/web"
- InstallCrontabTask
- elif [ "${LACEMI_METHOD}" == "append" ]; then
- #增量安装
- InstallLog -i "增量安装"
- CheckAPI "${LACEMI_API}"
- CheckEmpty "${LACEMI_KEY}" "安装密钥为空,请使用-k指定安装密钥"
- LACEMI_DOMAIN=$(curl -s -H "Accept:text/html" "${LACEMI_API}" -X POST -d "{\"op\": \"get-domain\",\"key\":\"${LACEMI_KEY}\"}")
- LACEMI_DOMAIN_NAME=$(echo "${LACEMI_DOMAIN}" | cut -d \. -f 1)
- InstallLog -I "获取域名:${LACEMI_DOMAIN}"
- InstallLog -C "安装参数\n\n域名全称:${LACEMI_DOMAIN}\n域名前缀:${LACEMI_DOMAIN_NAME}\n安装密钥:${LACEMI_KEY}\n代码地址:${LACEMI_CODE_URL}\n安装目录:${LACEMI_CODE_PROD_PATH}\n当前版本:${LACEMI_API_VERSION}\n访问接口:${LACEMI_API}\n"
- PressInstall
- InstallLog -I "获取${LACEMI_DOMAIN_NAME}.conf"
- curl -s -H "Accept:text/html" "${LACEMI_API}" -X POST -d "{\"op\": \"get-template\",\"key\":\"${LACEMI_KEY}\",\"data\":\"INSTALL_NGINX_TEMPLATE\"}" -o "/root/server_blocks/${LACEMI_DOMAIN_NAME}.conf"
- InstallLog -I "获取授权文件"
- curl -s -H "Accept:text/html" "${LACEMI_API}" -X POST -d "{\"op\": \"get-license\",\"key\":\"${LACEMI_KEY}\"}" -o "${LACEMI_DOMAIN_NAME}.lic"
- runCmd=$(curl -s -H "Accept:text/html" "${LACEMI_API}" -X POST -d "{\"op\": \"get-template\",\"key\":\"${LACEMI_KEY}\",\"data\":\"INSTALL_DOCKER_RUN_CMD\"}")
- InstallLog -I "生成docker run命令: ${runCmd}"
- if [[ -n $(docker ps -q -f "name=${LACEMI_DOMAIN_NAME}") ]];then
- echo "Docker container ${LACEMI_DOMAIN_NAME} is running, aborting."
- else
- ${runCmd}
- fi
- docker restart root-nginx-1
- sleep 5
- docker exec "${LACEMI_DOMAIN_NAME}" /app/bin/utool.sh fI
- InstallCrontabTask
- elif [ "${LACEMI_METHOD}" == "share" ]; then
- #增量安装
- InstallLog -i "共享版"
- if [ ! -d "${LACEMI_CODE_SHARE_PATH}" ];then
- CloneShareCode
- fi
- CheckAPI "${LACEMI_API}"
- CheckEmpty "${LACEMI_KEY}" "安装密钥为空,请使用-k指定安装密钥"
- LACEMI_DOMAIN=$(curl -s -H "Accept:text/html" "${LACEMI_API}" -X POST -d "{\"op\": \"get-domain\",\"key\":\"${LACEMI_KEY}\"}")
- LACEMI_DOMAIN_NAME=$(echo "${LACEMI_DOMAIN}" | cut -d \. -f 1)
- InstallLog -I "获取域名:${LACEMI_DOMAIN}"
- InstallLog -C "安装参数\n\n域名全称:${LACEMI_DOMAIN}\n域名前缀:${LACEMI_DOMAIN_NAME}\n安装密钥:${LACEMI_KEY}\n代码地址:${LACEMI_SHARE_CODE_URL}\n安装目录:${LACEMI_CODE_SHARE_PATH}\n当前版本:${LACEMI_API_VERSION}\n访问接口:${LACEMI_API}\n"
- PressInstall
- InstallLog -I "获取${LACEMI_DOMAIN_NAME}.conf"
- curl -s -H "Accept:text/html" "${LACEMI_API}" -X POST -d "{\"op\": \"get-template\",\"key\":\"${LACEMI_KEY}\",\"data\":\"INSTALL_NGINX_TEMPLATE\"}" -o "/root/server_blocks/${LACEMI_DOMAIN_NAME}.conf"
- runCmd=$(curl -s -H "Accept:text/html" "${LACEMI_API}" -X POST -d "{\"op\": \"get-template\",\"key\":\"${LACEMI_KEY}\",\"data\":\"INSTALL_DOCKER_RUN_CMD\"}")
- InstallLog -I "生成docker run命令: ${runCmd}"
- if [[ -n $(docker ps -q -f "name=${LACEMI_DOMAIN_NAME}") ]];then
- echo "Docker container ${LACEMI_DOMAIN_NAME} is running, aborting."
- else
- ${runCmd}
- fi
- docker restart root-nginx-1
- fi
- # EnableSSHLogin
- # SecuritySSHLogin
- }
- # shellcheck disable=SC2068
- clear
- echo "+------------------------------------------------------------------------+"
- echo "| LACEMI ${VERSION}(${RELEASE}) for ${DISTRO} Linux Server |"
- echo "+------------------------------------------------------------------------+"
- echo "| A tool to install lacemi on Linux |"
- echo "+------------------------------------------------------------------------+"
- echo "| For more information please visit https://hlace.com |"
- echo "+------------------------------------------------------------------------+"
- main "$@"
|