install.sh 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846
  1. #!/usr/bin/env bash
  2. export PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  3. export TMOUT=0
  4. current_dir=$(cd `dirname "${BASH_SOURCE}"` ; pwd)
  5. log_path="${current_dir}"/install.log
  6. function InstallLog(){
  7. [[ $# -ne 2 ]] && return 0
  8. case $1 in
  9. -E|-e)
  10. echo -e "$(date +%Y-%m-%d\ %H:%M:%S) [ERROR] [${FUNCNAME[2]}]: ${2}" >> "${log_path}"
  11. echo -e "\033[1;31m$(date +%Y-%m-%d\ %H:%M:%S) [ERROR] [${FUNCNAME[1]}]: ${2}\033[0m"
  12. ;;
  13. -I|-i)
  14. echo -e "$(date +%Y-%m-%d\ %H:%M:%S) [INFO] [${FUNCNAME[2]}]: ${2}" >> "${log_path}"
  15. echo -e "\033[1;32m$(date +%Y-%m-%d\ %H:%M:%S) [INFO] [${FUNCNAME[1]}]: ${2}\033[0m"
  16. ;;
  17. -C|-c)
  18. echo -e "$(date +%Y-%m-%d\ %H:%M:%S) [INPUT] [${FUNCNAME[2]}]: ${2}" >> "${log_path}"
  19. echo -e "\033[1;34m$(date +%Y-%m-%d\ %H:%M:%S) [INPUT] [${FUNCNAME[1]}]: ${2}\033[0m"
  20. ;;
  21. -W|-w)
  22. echo -e "$(date +%Y-%m-%d\ %H:%M:%S) [WARN] [${FUNCNAME[2]}]: ${2}" >> "${log_path}"
  23. echo -e "\033[1;33m$(date +%Y-%m-%d\ %H:%M:%S) [WARN] [${FUNCNAME[1]}]: ${2}\033[0m"
  24. ;;
  25. *)
  26. echo -e "$(date +%Y-%m-%d\ %H:%M:%S)[Other] [${FUNCNAME[2]}]: ${2}" >> "${log_path}"
  27. echo -e "$(date +%Y-%m-%d\ %H:%M:%S)[Other] [${FUNCNAME[1]}]: ${2}"
  28. esac
  29. }
  30. function CheckRunning() {
  31. TMPFILE=/tmp/install.run
  32. if [ -e $TMPFILE ]; then
  33. InstallLog -e "Other instance is running!"
  34. exit 0
  35. else
  36. touch $TMPFILE
  37. chmod 600 $TMPFILE
  38. fi
  39. # shellcheck disable=SC2064
  40. trap "rm -f ${TMPFILE}; exit" 0 1 2 3 15
  41. if [ "$(id -u)" != "0" ]; then
  42. InstallLog -e "Require user root to run the script."
  43. exit 1
  44. fi
  45. }
  46. CheckRunning
  47. Kill_PM()
  48. {
  49. if ps aux | grep -E "yum|dnf" | grep -qv "grep"; then
  50. kill -9 $(ps -ef|grep -E "yum|dnf"|grep -v grep|awk '{print $2}')
  51. if [ -s /var/run/yum.pid ]; then
  52. rm -f /var/run/yum.pid
  53. fi
  54. elif ps aux | grep -E "apt-get|dpkg|apt" | grep -qv "grep"; then
  55. kill -9 $(ps -ef|grep -E "apt-get|apt|dpkg"|grep -v grep|awk '{print $2}')
  56. if [[ -s /var/lib/dpkg/lock-frontend || -s /var/lib/dpkg/lock ]]; then
  57. rm -f /var/lib/dpkg/lock-frontend
  58. rm -f /var/lib/dpkg/lock
  59. dpkg --configure -a
  60. fi
  61. fi
  62. }
  63. Press_Start()
  64. {
  65. echo ""
  66. InstallLog -i "Press any key to start...or Press Ctrl+c to cancel"
  67. OLDCONFIG=`stty -g`
  68. stty -icanon -echo min 1 time 0
  69. dd count=1 2>/dev/null
  70. stty ${OLDCONFIG}
  71. }
  72. Install_LSB()
  73. {
  74. echo "[+] Installing lsb..."
  75. if [ "$PM" == "yum" ]; then
  76. yum -y install redhat-lsb
  77. elif [ "$PM" == "apt" ]; then
  78. apt-get update
  79. apt-get --no-install-recommends install -y lsb-release
  80. fi
  81. }
  82. Get_Dist_Version()
  83. {
  84. if command -v lsb_release >/dev/null 2>&1; then
  85. DISTRO_Version=$(lsb_release -sr)
  86. elif [ -f /etc/lsb-release ]; then
  87. . /etc/lsb-release
  88. DISTRO_Version="$DISTRIB_RELEASE"
  89. elif [ -f /etc/os-release ]; then
  90. . /etc/os-release
  91. DISTRO_Version="$VERSION_ID"
  92. fi
  93. if [[ "${DISTRO}" = "" || "${DISTRO_Version}" = "" ]]; then
  94. if command -v python2 >/dev/null 2>&1; then
  95. DISTRO_Version=$(python2 -c 'import platform; print platform.linux_distribution()[1]')
  96. elif command -v python3 >/dev/null 2>&1; then
  97. DISTRO_Version=$(python3 -c 'import platform; print(platform.linux_distribution()[1])')
  98. else
  99. Install_LSB
  100. DISTRO_Version=`lsb_release -rs`
  101. fi
  102. fi
  103. printf -v "${DISTRO}_Version" '%s' "${DISTRO_Version}"
  104. }
  105. Get_Dist_Name()
  106. {
  107. if grep -Eqi "Alibaba" /etc/issue || grep -Eq "Alibaba Cloud Linux" /etc/*-release; then
  108. DISTRO='Alibaba'
  109. PM='yum'
  110. elif grep -Eqi "Aliyun" /etc/issue || grep -Eq "Aliyun Linux" /etc/*-release; then
  111. DISTRO='Aliyun'
  112. PM='yum'
  113. elif grep -Eqi "Amazon Linux" /etc/issue || grep -Eq "Amazon Linux" /etc/*-release; then
  114. DISTRO='Amazon'
  115. PM='yum'
  116. elif grep -Eqi "Fedora" /etc/issue || grep -Eq "Fedora" /etc/*-release; then
  117. DISTRO='Fedora'
  118. PM='yum'
  119. elif grep -Eqi "Oracle Linux" /etc/issue || grep -Eq "Oracle Linux" /etc/*-release; then
  120. DISTRO='Oracle'
  121. PM='yum'
  122. elif grep -Eqi "rockylinux" /etc/issue || grep -Eq "Rocky Linux" /etc/*-release; then
  123. DISTRO='Rocky'
  124. PM='yum'
  125. elif grep -Eqi "almalinux" /etc/issue || grep -Eq "AlmaLinux" /etc/*-release; then
  126. DISTRO='Alma'
  127. PM='yum'
  128. elif grep -Eqi "openEuler" /etc/issue || grep -Eq "openEuler" /etc/*-release; then
  129. DISTRO='openEuler'
  130. PM='yum'
  131. elif grep -Eqi "Anolis OS" /etc/issue || grep -Eq "Anolis OS" /etc/*-release; then
  132. DISTRO='Anolis'
  133. PM='yum'
  134. elif grep -Eqi "Kylin Linux Advanced Server" /etc/issue || grep -Eq "Kylin Linux Advanced Server" /etc/*-release; then
  135. DISTRO='Kylin'
  136. PM='yum'
  137. elif grep -Eqi "OpenCloudOS" /etc/issue || grep -Eq "OpenCloudOS" /etc/*-release; then
  138. DISTRO='OpenCloudOS'
  139. PM='yum'
  140. elif grep -Eqi "Huawei Cloud EulerOS" /etc/issue || grep -Eq "Huawei Cloud EulerOS" /etc/*-release; then
  141. DISTRO='HCE'
  142. PM='yum'
  143. elif grep -Eqi "CentOS" /etc/issue || grep -Eq "CentOS" /etc/*-release; then
  144. DISTRO='CentOS'
  145. PM='yum'
  146. if grep -Eq "CentOS Stream" /etc/*-release; then
  147. isCentosStream='y'
  148. fi
  149. elif grep -Eqi "Red Hat Enterprise Linux" /etc/issue || grep -Eq "Red Hat Enterprise Linux" /etc/*-release; then
  150. DISTRO='RHEL'
  151. PM='yum'
  152. elif grep -Eqi "Ubuntu" /etc/issue || grep -Eq "Ubuntu" /etc/*-release; then
  153. DISTRO='Ubuntu'
  154. PM='apt'
  155. elif grep -Eqi "Raspbian" /etc/issue || grep -Eq "Raspbian" /etc/*-release; then
  156. DISTRO='Raspbian'
  157. PM='apt'
  158. elif grep -Eqi "Deepin" /etc/issue || grep -Eq "Deepin" /etc/*-release; then
  159. DISTRO='Deepin'
  160. PM='apt'
  161. elif grep -Eqi "Mint" /etc/issue || grep -Eq "Mint" /etc/*-release; then
  162. DISTRO='Mint'
  163. PM='apt'
  164. elif grep -Eqi "Kali" /etc/issue || grep -Eq "Kali" /etc/*-release; then
  165. DISTRO='Kali'
  166. PM='apt'
  167. elif grep -Eqi "Debian" /etc/issue || grep -Eq "Debian" /etc/*-release; then
  168. DISTRO='Debian'
  169. PM='apt'
  170. elif grep -Eqi "UnionTech OS|UOS" /etc/issue || grep -Eq "UnionTech OS|UOS" /etc/*-release; then
  171. DISTRO='UOS'
  172. if command -v apt >/dev/null 2>&1; then
  173. PM='apt'
  174. elif command -v yum >/dev/null 2>&1; then
  175. PM='yum'
  176. fi
  177. elif grep -Eqi "Kylin Linux Desktop" /etc/issue || grep -Eq "Kylin Linux Desktop" /etc/*-release; then
  178. DISTRO='Kylin'
  179. PM='apt'
  180. else
  181. DISTRO='unknow'
  182. fi
  183. Get_OS_Bit
  184. }
  185. Get_RHEL_Version()
  186. {
  187. Get_Dist_Name
  188. if [ "${DISTRO}" = "RHEL" ]; then
  189. if grep -Eqi "release 5." /etc/redhat-release; then
  190. echo "Current Version: RHEL Ver 5"
  191. RHEL_Ver='5'
  192. elif grep -Eqi "release 6." /etc/redhat-release; then
  193. echo "Current Version: RHEL Ver 6"
  194. RHEL_Ver='6'
  195. elif grep -Eqi "release 7." /etc/redhat-release; then
  196. echo "Current Version: RHEL Ver 7"
  197. RHEL_Ver='7'
  198. elif grep -Eqi "release 8." /etc/redhat-release; then
  199. echo "Current Version: RHEL Ver 8"
  200. RHEL_Ver='8'
  201. elif grep -Eqi "release 9." /etc/redhat-release; then
  202. echo "Current Version: RHEL Ver 9"
  203. RHEL_Ver='9'
  204. fi
  205. RHEL_Version="$(cat /etc/redhat-release | sed 's/.*release\ //' | sed 's/\ .*//')"
  206. fi
  207. }
  208. Get_OS_Bit()
  209. {
  210. if [[ `getconf WORD_BIT` = '32' && `getconf LONG_BIT` = '64' ]] ; then
  211. Is_64bit='y'
  212. ARCH='x86_64'
  213. DB_ARCH='x86_64'
  214. else
  215. Is_64bit='n'
  216. ARCH='i386'
  217. DB_ARCH='i686'
  218. fi
  219. if uname -m | grep -Eqi "arm|aarch64"; then
  220. Is_ARM='y'
  221. if uname -m | grep -Eqi "armv7|armv6"; then
  222. ARCH='armhf'
  223. elif uname -m | grep -Eqi "aarch64"; then
  224. ARCH='aarch64'
  225. DB_ARCH='aarch64'
  226. else
  227. ARCH='arm'
  228. fi
  229. fi
  230. }
  231. Get_Server_Type()
  232. {
  233. if [[ $(hostname) =~ "iZbp" ]]
  234. then
  235. SERVER_TYPE="aliyun"
  236. elif [[ $(hostname) =~ "lacew" ]]
  237. then
  238. SERVER_TYPE="aliyun"
  239. elif [[ $(hostname) =~ "VM-" ]]
  240. then
  241. SERVER_TYPE="qcloud"
  242. elif [[ $(hostname) =~ "ecs-" ]]
  243. then
  244. SERVER_TYPE="huawei"
  245. else
  246. SERVER_TYPE="unknown"
  247. fi
  248. }
  249. PressInstall() {
  250. InstallLog -I "按任意键开始安装,按Ctrl+C中止安装"
  251. local OLDCONFIG
  252. OLDCONFIG=$(stty -g)
  253. stty cbreak
  254. # dd if=/dev/tty bs=1 count=1 2> /dev/null
  255. stty -raw
  256. stty echo
  257. # stty -icanon -echo min 1 time 0
  258. dd count=1 2>/dev/null
  259. stty "${OLDCONFIG}"
  260. }
  261. #检测端口
  262. function CheckPort() {
  263. local port
  264. port=$1
  265. InstallLog -I "检测端口 [$port]"
  266. local checkResult
  267. checkResult=$(netstat -tlpn | grep "\b$port\b")
  268. if [ -n "$checkResult" ]; then
  269. InstallLog -E "端口 $port 被占用"
  270. exit 1
  271. fi
  272. }
  273. function CheckEmpty() {
  274. if [ -z "$1" ]; then
  275. InstallLog -E "$2"
  276. exit 1
  277. fi
  278. }
  279. #检查API
  280. CheckAPI() {
  281. # shellcheck disable=SC1083
  282. local code
  283. code=$(curl -I -m 5 -X POST -o /dev/null -s -w "%{http_code}" "$1")
  284. if [ "${code}" != 200 ]; then
  285. code=$(curl -I -m 5 -o /dev/null -s -w "%{http_code}" "$1&check")
  286. if [ "${code}" != 200 ]; then
  287. InstallLog -E "API $1 检查失败,返回代码 ${code}, 中止安装"
  288. exit
  289. else
  290. InstallLog -I "API $1 检查通过"
  291. fi
  292. else
  293. InstallLog -I "API $1 检查通过"
  294. fi
  295. }
  296. #更新repo源
  297. function UpdateRepo() {
  298. Get_Dist_Name
  299. Get_Server_Type
  300. local install=0
  301. InstallLog -I "修改 ${DISTRO} 镜像源,服务器类型 ${SERVER_TYPE}"
  302. if [ "${DISTRO}" == "Debian" ]; then
  303. #阿里云
  304. if [[ ${SERVER_TYPE} == "aliyun" ]]; then
  305. if [ -f /etc/apt/sources.list ] && grep -Eqi "mirrors.cloud.aliyuncs.com" /etc/apt/sources.list; then
  306. InstallLog -i "Aliyun apt repo already installed, skip..."
  307. else
  308. InstallLog -i "Change /etc/apt/sources.list to mirrors.cloud.aliyuncs.com"
  309. sed -i "s#deb https\?://.*/debian#deb http://mirrors.cloud.aliyuncs.com/debian#" /etc/apt/sources.list
  310. sed -i "s/^deb-src/#deb-src/" /etc/apt/sources.list
  311. apt update
  312. fi
  313. #腾讯云
  314. elif [[ ${SERVER_TYPE} == "qcloud" ]]; then
  315. if [ -f /etc/apt/sources.list ] && grep -Eqi "mirrors.tencentyun.com" /etc/apt/sources.list; then
  316. InstallLog -i "Tencent apt repo already installed, skip..."
  317. else
  318. InstallLog -i "Change /etc/apt/sources.list to mirrors.tencentyun.com"
  319. sed -i "s#deb https\?://.*/debian#deb http://mirrors.tencentyun.com/debian#" /etc/apt/sources.list
  320. sed -i "s/^deb-src/#deb-src/" /etc/apt/sources.list
  321. apt update
  322. fi
  323. fi
  324. elif [ "${DISTRO}" == "Ubuntu" ]; then
  325. #阿里云
  326. if [[ ${SERVER_TYPE} == "aliyun" ]]; then
  327. if [ -f /etc/apt/sources.list ] && grep -Eqi "mirrors.cloud.aliyuncs.com" /etc/apt/sources.list; then
  328. InstallLog -i "Aliyun apt repo already installed, skip..."
  329. else
  330. InstallLog -i "Change /etc/apt/sources.list to mirrors.cloud.aliyuncs.com"
  331. sed -i "s#deb http\?://.*/ubuntu/#deb http://mirrors.cloud.aliyuncs.com/ubuntu/#" /etc/apt/sources.list
  332. sed -i "s/^deb-src/#deb-src/" /etc/apt/sources.list
  333. apt update
  334. fi
  335. #腾讯云
  336. elif [[ ${SERVER_TYPE} == "qcloud" ]]; then
  337. if [ -f /etc/apt/sources.list ] && grep -Eqi "mirrors.tencentyun.com" /etc/apt/sources.list; then
  338. InstallLog -i "Tencent apt repo already installed, skip..."
  339. else
  340. InstallLog -i "Change /etc/apt/sources.list to mirrors.tencentyun.com"
  341. sed -i "s#deb https\?://.*/ubuntu#deb http://mirrors.tencentyun.com/ubuntu#" /etc/apt/sources.list
  342. sed -i "s/^deb-src/#deb-src/" /etc/apt/sources.list
  343. apt update
  344. fi
  345. fi
  346. elif [ "${DISTRO}" == "CentOS" ]; then
  347. #阿里云
  348. if [[ ${SERVER_TYPE} == "aliyun" ]]; then
  349. if [ -f /etc/yum.repos.d/CentOS-Base.repo ] && grep -Eqi "mirrors.cloud.aliyuncs.com" /etc/yum.repos.d/CentOS-Base.repo; then
  350. InstallLog -i "Aliyun yum repo already installed, skip..."
  351. else
  352. # shellcheck disable=SC2004
  353. install=$(($install + 1))
  354. wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.aliyuncs.com/repo/Centos-7.repo
  355. fi
  356. if [ -f /etc/yum.repos.d/ius.repo ] && grep -Eqi "mirrors.cloud.aliyuncs.com" /etc/yum.repos.d/ius.repo; then
  357. InstallLog -i "Aliyun ius repo already installed, skip..."
  358. else
  359. # shellcheck disable=SC2004
  360. install=$(($install + 1))
  361. yum install -y http://mirrors.cloud.aliyuncs.com/ius/ius-release-el7.rpm
  362. sed -i 's|baseurl.*/ius|baseurl=http://mirrors.cloud.aliyuncs.com/ius|g' /etc/yum.repos.d/ius*
  363. rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
  364. fi
  365. if [ -f /etc/yum.repos.d/epel.repo ] && grep -Eqi "mirrors.cloud.aliyuncs.com" /etc/yum.repos.d/epel.repo; then
  366. InstallLog -i "Aliyun epel repo already installed, skip..."
  367. else
  368. # shellcheck disable=SC2004
  369. install=$(($install + 1))
  370. wget -O /etc/yum.repos.d/epel.repo http://mirrors.cloud.aliyuncs.com/repo/epel-7.repo
  371. sed -i 's|#\?baseurl.*/epel|baseurl=http://mirrors.cloud.aliyuncs.com/epel|' /etc/yum.repos.d/epel*
  372. fi
  373. elif [[ ${SERVER_TYPE} == "qcloud" ]]; then
  374. #腾讯云
  375. if [ -f /etc/yum.repos.d/CentOS-Base.repo ] && grep -Eqi "mirrors.cloud.tencent.com" /etc/yum.repos.d/CentOS-Base.repo; then
  376. InstallLog -i "Tencent yum repo already installed, skip..."
  377. else
  378. # shellcheck disable=SC2004
  379. install=$(($install + 1))
  380. wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/centos7_base.repo
  381. fi
  382. if [ -f /etc/yum.repos.d/ius.repo ] && grep -Eqi "mirrors.cloud.tencent.com" /etc/yum.repos.d/ius.repo; then
  383. InstallLog -i "Tencent ius repo already installed, skip..."
  384. else
  385. # shellcheck disable=SC2004
  386. install=$(($install + 1))
  387. yum install -y https://mirrors.cloud.tencent.com/ius/ius-release-el7.rpm
  388. rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
  389. sed -i 's|baseurl.*/ius|baseurl=http://mirrors.cloud.tencent.com/ius|g' /etc/yum.repos.d/ius*
  390. fi
  391. if [ -f /etc/yum.repos.d/epel.repo ] && grep -Eqi "mirrors.cloud.tencent.com" /etc/yum.repos.d/epel.repo; then
  392. InstallLog -i "Tencent epel repo already installed, skip..."
  393. else
  394. # shellcheck disable=SC2004
  395. install=$(($install + 1))
  396. wget -O /etc/yum.repos.d/epel.repo http://mirrors.cloud.tencent.com/repo/epel-7.repo
  397. sed -i 's|baseurl.*/epel|baseurl=http://mirrors.cloud.tencent.com/epel|g' /etc/yum.repos.d/epel*
  398. fi
  399. elif [[ ${SERVER_TYPE} == "huawei" ]]; then
  400. InstallLog -e "华为服务器"
  401. elif [[ ${SERVER_TYPE} == "unknown" ]]; then
  402. InstallLog -e "服务器类型不支持"
  403. exit
  404. fi
  405. if [ "$install" -gt 0 ]; then
  406. if [ "$PM" == "yum" ];then
  407. yum clean all
  408. yum makecache
  409. fi
  410. fi
  411. fi
  412. }
  413. function InstallNecessary() {
  414. Get_Dist_Name
  415. Get_Server_Type
  416. InstallLog -I "安装必要支持软件"
  417. ${PM} install -y ca-certificates &> /dev/null
  418. if ! command -v wget >/dev/null; then
  419. InstallLog -I "安装wget"
  420. ${PM} install -y wget &> /dev/null
  421. fi
  422. if ! command -v rsync >/dev/null; then
  423. InstallLog -I "安装rsync"
  424. ${PM} install -y rsync &> /dev/null
  425. fi
  426. if ! command -v curl >/dev/null; then
  427. InstallLog -I "安装curl"
  428. ${PM} install -y curl &> /dev/null
  429. fi
  430. if ! command -v netstat >/dev/null; then
  431. InstallLog -I "安装net-tools"
  432. ${PM} install -y net-tools &> /dev/null
  433. fi
  434. if ! command -v screen >/dev/null; then
  435. InstallLog -I "安装screen"
  436. ${PM} install -y screen &> /dev/null
  437. fi
  438. if ! command -v vim >/dev/null; then
  439. InstallLog -I "安装vi"
  440. ${PM} install -y vim &> /dev/null
  441. fi
  442. echo 'set mouse=""' >> ~/.vimrc
  443. if ! command -v gpg >/dev/null; then
  444. InstallLog -I "安装gnupg"
  445. ${PM} install -y gnupg &> /dev/null
  446. fi
  447. if ! command -v git >/dev/null; then
  448. InstallLog -I "安装git"
  449. if [ "${DISTRO}" == "Debian" ] || [ "${DISTRO}" == "Ubuntu" ]; then
  450. ${PM} install -y git &> /dev/null
  451. elif [ "${DISTRO}" == "CentOS" ]; then
  452. ${PM} install -y git236 &> /dev/null
  453. fi
  454. fi
  455. if ! command -v rz >/dev/null; then
  456. InstallLog -I "安装lrzsz"
  457. ${PM} install -y lrzsz &> /dev/null
  458. fi
  459. if ! command -v docker >/dev/null; then
  460. InstallLog -I "安装docker和docker-compose"
  461. if [ "${DISTRO}" == "Debian" ]; then
  462. if [[ ${SERVER_TYPE} == "aliyun" ]]; then
  463. curl -fsSL http://mirrors.cloud.aliyuncs.com/docker-ce/linux/debian/gpg | gpg --yes --dearmor -o /usr/share/keyrings/aliyun-docker-ce-keyring.gpg
  464. echo "deb [arch=amd64 signed-by=/usr/share/keyrings/aliyun-docker-ce-keyring.gpg] http://mirrors.cloud.aliyuncs.com/docker-ce/linux/debian/ \
  465. $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/aliyun-docker-ce.list > /dev/null
  466. elif [[ ${SERVER_TYPE} == "qcloud" ]]; then
  467. curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/debian/gpg | gpg --yes --dearmor -o /usr/share/keyrings/aliyun-docker-ce-keyring.gpg
  468. echo "deb [arch=amd64 signed-by=/usr/share/keyrings/aliyun-docker-ce-keyring.gpg] http://mirrors.aliyun.com/docker-ce/linux/debian/ \
  469. $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/aliyun-docker-ce.list > /dev/null
  470. elif [[ ${SERVER_TYPE} == "huawei" ]]; then
  471. curl -fsSL http://mirrors.huaweicloud.com/docker-ce/linux/debian/gpg | gpg --yes --dearmor -o /usr/share/keyrings/aliyun-docker-ce-keyring.gpg
  472. echo "deb [arch=amd64 signed-by=/usr/share/keyrings/aliyun-docker-ce-keyring.gpg] http://mirrors.huaweicloud.com/docker-ce/linux/debian/ \
  473. $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/aliyun-docker-ce.list > /dev/null
  474. elif [[ ${SERVER_TYPE} == "unknown" ]]; then
  475. InstallLog -e "服务器类型不支持"
  476. exit
  477. fi
  478. apt update
  479. apt install -y docker-ce docker-ce-cli containerd.io
  480. elif [ "${DISTRO}" == "Ubuntu" ]; then
  481. if [[ ${SERVER_TYPE} == "aliyun" ]]; then
  482. curl -fsSL http://mirrors.cloud.aliyuncs.com/docker-ce/linux/ubuntu/gpg | gpg --yes --dearmor -o /usr/share/keyrings/aliyun-docker-ce-keyring.gpg
  483. echo "deb [arch=amd64 signed-by=/usr/share/keyrings/aliyun-docker-ce-keyring.gpg] http://mirrors.cloud.aliyuncs.com/docker-ce/linux/ubuntu/ \
  484. $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/aliyun-docker-ce.list > /dev/null
  485. elif [[ ${SERVER_TYPE} == "qcloud" ]]; then
  486. curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | gpg --yes --dearmor -o /usr/share/keyrings/aliyun-docker-ce-keyring.gpg
  487. echo "deb [arch=amd64 signed-by=/usr/share/keyrings/aliyun-docker-ce-keyring.gpg] http://mirrors.aliyun.com/docker-ce/linux/ubuntu/ \
  488. $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/aliyun-docker-ce.list > /dev/null
  489. elif [[ ${SERVER_TYPE} == "huawei" ]]; then
  490. curl -fsSL http://mirrors.huaweicloud.com/docker-ce/linux/ubuntu/gpg | gpg --yes --dearmor -o /usr/share/keyrings/aliyun-docker-ce-keyring.gpg
  491. echo "deb [arch=amd64 signed-by=/usr/share/keyrings/aliyun-docker-ce-keyring.gpg] http://mirrors.huaweicloud.com/docker-ce/linux/ubuntu/ \
  492. $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/aliyun-docker-ce.list > /dev/null
  493. elif [[ ${SERVER_TYPE} == "unknown" ]]; then
  494. InstallLog -e "服务器类型不支持"
  495. exit
  496. fi
  497. apt update
  498. apt install -y docker-ce docker-ce-cli containerd.io
  499. elif [ "${DISTRO}" == "CentOS" ]; then
  500. yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  501. #yum list docker-ce --showduplicates | sort -r
  502. yum -y install docker-ce-26.1.4-1.el7 &> /dev/null
  503. fi
  504. systemctl enable docker
  505. systemctl start docker
  506. apt upgrade -y
  507. fi
  508. if [ ! -f /usr/bin/docker-compose ];then
  509. wget -O /usr/bin/docker-compose http://mi.lacecdn.com/docker/docker-compose-linux-x86_64-v2.32.4
  510. chmod +x /usr/bin/docker-compose
  511. fi
  512. }
  513. #克隆代码
  514. function CloneCode() {
  515. InstallLog -I "克隆代码..."
  516. if [ -d ${LACEMI_CODE_PROD_PATH} ]; then
  517. InstallLog -E "安装目录 ${LACEMI_CODE_PROD_PATH} 已存在,中止安装..."
  518. exit
  519. fi
  520. if [ -d /tmp/lacemi ]; then
  521. rm -rf /tmp/lacemi
  522. fi
  523. git clone "${LACEMI_CODE_URL}" /tmp/lacemi
  524. InstallLog -I "复制代码至目录 ${LACEMI_CODE_PROD_PATH} "
  525. mv -f /tmp/lacemi "${LACEMI_CODE_PROD_PATH}"
  526. chmod 777 -R "${LACEMI_CODE_PROD_PATH}/sapi/runtime"
  527. chmod 777 -R "${LACEMI_CODE_PROD_PATH}/sapi/web"
  528. }
  529. function CloneShareCode() {
  530. InstallLog -I "克隆共享版代码..."
  531. if [ -d ${LACEMI_CODE_SHARE_PATH} ]; then
  532. InstallLog -E "安装目录 ${LACEMI_CODE_SHARE_PATH} 已存在,中止安装..."
  533. exit
  534. fi
  535. if [ -d /tmp/lacemi ]; then
  536. rm -rf /tmp/lacemi
  537. fi
  538. git clone "${LACEMI_SHARE_CODE_URL}" /tmp/lacemi
  539. InstallLog -I "复制代码至目录 ${LACEMI_CODE_SHARE_PATH} "
  540. mv -f /tmp/lacemi "${LACEMI_CODE_SHARE_PATH}"
  541. chmod 777 -R "${LACEMI_CODE_SHARE_PATH}/sapi/runtime"
  542. chmod 777 -R "${LACEMI_CODE_SHARE_PATH}/sapi/web"
  543. }
  544. function SecuritySSHLogin()
  545. {
  546. if [ -s /root/.ssh/authorized_keys ]; then
  547. InstallLog -I "成功禁用密码登录"
  548. chattr -i /etc/ssh/sshd_config
  549. sed -i "s/#\+PasswordAuthentication \w\+/PasswordAuthentication no/g" /etc/ssh/sshd_config
  550. systemctl restart sshd
  551. else
  552. InstallLog -W "由于未启用SSH公钥登录,不允许禁用密码登录"
  553. fi
  554. iFlag=$(lsattr /etc/ssh/sshd_config | cut -d "-" -f 5)
  555. if [ "$iFlag" != "i" ]; then
  556. chattr +i /etc/ssh/sshd_config
  557. fi
  558. iFlag=$(lsattr /root/.ssh/authorized_keys | cut -d "-" -f 5)
  559. if [ "$iFlag" != "i" ]; then
  560. chattr +i /root/.ssh/authorized_keys
  561. fi
  562. grep 'PasswordAuthentication ' /etc/ssh/sshd_config
  563. }
  564. #下载公钥并允许公钥登录
  565. function EnableSSHLogin() {
  566. InstallLog -I "允许SSH登陆"
  567. CheckEmpty "${LACEMI_KEY}" "安装密钥为空,安装中止"
  568. local rsaPublicKey
  569. rsaPublicKey=$(curl -s -H "Accept:text/html" "${LACEMI_API}" -X POST -d "{\"op\": \"get-pub\",\"key\":\"${LACEMI_KEY}\"}")
  570. InstallLog -E "$rsaPublicKey"
  571. # rsaPublicKey=$(curl -s -H "Accept:text/html" "${getPubApi}")
  572. if [ -z "${rsaPublicKey}" ]; then
  573. InstallLog -E "无法获取公钥,安装中止"
  574. exit 1
  575. fi
  576. # shellcheck disable=SC2046
  577. if [ $(echo "${rsaPublicKey}" | grep -c 'ssh-rsa') -eq 0 ]; then
  578. InstallLog -E "公钥格式不正确,安装中止"
  579. exit 1
  580. fi
  581. local checkString="${rsaPublicKey:50:36}"
  582. InstallLog -I "检查公钥字符串 ${checkString}"
  583. # shellcheck disable=SC2046
  584. if [ $(grep -c "${checkString}" /root/.ssh/authorized_keys) -gt 0 ]; then
  585. InstallLog -W "公钥已存在,跳过"
  586. else
  587. InstallLog -I "公钥不存在,附加"
  588. chattr -i /root/.ssh/authorized_keys
  589. cat >>/root/.ssh/authorized_keys <<EOF
  590. ${rsaPublicKey}
  591. EOF
  592. fi
  593. }
  594. function rand(){
  595. min=$1
  596. max=$(($2-$min+1))
  597. num=$(cat /proc/sys/kernel/random/uuid | cksum | awk -F ' ' '{print $1}')
  598. echo $(($num%$max+$min))
  599. }
  600. function InstallCrontabTask() {
  601. if [ -f /var/spool/cron/root ]; then
  602. sed -i "/systemctl restart docker/d" /var/spool/cron/root
  603. echo "0 4 * * * systemctl restart docker" >>/var/spool/cron/root
  604. sed -i "/docker exec ${LACEMI_DOMAIN_NAME} /app/bin/utool.sh cT/d" /var/spool/cron/root
  605. rndMinute=$(rand 10 59)
  606. rndHour=$(rand 1 6)
  607. echo "${rndMinute} ${rndHour} * * * docker exec ${LACEMI_DOMAIN_NAME} /app/bin/utool.sh cT" >> /var/spool/cron/root
  608. fi
  609. if [ -f /var/spool/cron/crontabs/root ]; then
  610. sed -i "/systemctl restart docker/d" /var/spool/cron/crontabs/root
  611. echo "0 4 * * * systemctl restart docker" >> /var/spool/cron/crontabs/root
  612. sed -i "/docker exec ${LACEMI_DOMAIN_NAME} /app/bin/utool.sh cT/d" /var/spool/cron/crontabs/root
  613. rndMinute=$(rand 10 59)
  614. rndHour=$(rand 1 6)
  615. echo "${rndMinute} ${rndHour} * * * docker exec ${LACEMI_DOMAIN_NAME} /app/bin/utool.sh cT" >> /var/spool/cron/crontabs/root
  616. fi
  617. }
  618. Get_Dist_Name
  619. if [ "${DISTRO}" = "unknow" ]; then
  620. Echo_Red "Unable to get Linux distribution name, or do NOT support the current distribution."
  621. exit 1
  622. fi
  623. ################
  624. VERSION="v3.1.0"
  625. RELEASE="2025-03-18"
  626. SEED=$(date +%Y%m%d%H%M%S)
  627. LACEMI_API_VERSION="v32"
  628. LACEMI_METHOD="install"
  629. LACEMI_CODE_DEV_PATH="/home/lacemi_api_dev_${LACEMI_API_VERSION}"
  630. LACEMI_CODE_SHARE_PATH="/home/lacemi_api_share_${LACEMI_API_VERSION}"
  631. LACEMI_CODE_PROD_PATH="/home/lacemi_api_prod_${LACEMI_API_VERSION}"
  632. LACEMI_API="https://api.hlace.com/v1/install"
  633. LACEMI_SHARE_CODE_URL="https://gogs.hlace.com/centrenda/lacemi_share_${LACEMI_API_VERSION}.git"
  634. LACEMI_DEV_CODE_URL="https://gogs.hlace.com/centrenda/lacemi_dev_${LACEMI_API_VERSION}.git"
  635. LACEMI_CODE_URL="https://gogs.hlace.com/centrenda/lacemi_${LACEMI_API_VERSION}.git"
  636. LACEMI_QUIET="0"
  637. LACEMI_DOMAIN=""
  638. LACEMI_DOMAIN_NAME=""
  639. LACEMI_KEY=""
  640. ################
  641. start_date=$(date +'%Y-%m-%d %H:%M:%S')
  642. step=0
  643. steps=12
  644. VERSION_POSTGRESQL="17.4.0"
  645. VERSION_MARIADB="11.6.2"
  646. VERSION_MONGODB="8.0.5"
  647. VERSION_NGINX="1.27.4"
  648. VERSION_REDIS="7.4.2"
  649. VERSION_PHP="8.1.31"
  650. Usage() {
  651. cat <<EOF
  652. $(basename "$0") [options]
  653. Usage:
  654. -a specify api version: v32/v4
  655. -k, --key target key
  656. -m, --method=[install|upgrade|append] method to execute, options for install or upgrade, default to execute install
  657. -H, --help show usage
  658. -Q, --quiet execute with quiet mode without pressing key to autostart
  659. -V, --version print version information
  660. EOF
  661. # 短格式中,选项值为可选的选项,选项值只能紧接选项而不可使用任何符号将其他选项隔开;如-p80,不要写成-p
  662. # 短格式中,选项值为必有的选项,选项值既可紧接选项也可以使用空格与选项隔开;如-i192.168.1.,也可写成-i 192.168.1.1
  663. # 长格式中,选项值为可选的选项,选项值只能使用=号连接选项;如--port=,不可写成性--port80或--port
  664. # 长格式中,选项值为必有的选项,选项值既可使用=号连接选项也可使用空格连接选项;如--ip=192.168.1.1,也可写成--ip 192.168.1.1
  665. # 为简便起见,建议凡是短格式都使用“选项+选项值”的形式(-p80),凡是长格式都使用“选项+=+选项值”的形式(--port=)
  666. }
  667. main() {
  668. echo ""
  669. local optstring="k:m:H::Q::V::"
  670. local optstringLong="key:,method:,help::,quiet::,version::"
  671. local GETOPT_OUT
  672. GETOPT_OUT=$(getopt --options $optstring --longoptions $optstringLong -- "$@")
  673. local exitCode=$?
  674. if [ $exitCode -ne 0 ]; then
  675. Usage
  676. exit 1
  677. fi
  678. eval set -- "$GETOPT_OUT"
  679. while true; do
  680. case "$1" in
  681. -a)
  682. LACEMI_API_VERSION="$2"
  683. shift
  684. ;;
  685. -k | --key)
  686. LACEMI_KEY="$2"
  687. shift
  688. ;;
  689. -m | --method)
  690. LACEMI_METHOD="$2"
  691. shift
  692. ;;
  693. -H | --help)
  694. Usage
  695. exit
  696. ;;
  697. -Q | --quiet)
  698. LACEMI_QUIET="1"
  699. shift
  700. ;;
  701. -V | --version)
  702. InstallLog -I "Version: ${VERSION}, Release: ${RELEASE}"
  703. exit
  704. ;;
  705. --)
  706. shift
  707. break
  708. ;;
  709. *)
  710. InstallLog -E "非法参数: $1"
  711. Usage
  712. ;;
  713. esac
  714. shift
  715. done
  716. UpdateRepo
  717. InstallNecessary
  718. # PullDockerImage
  719. # PullCode
  720. if [ ! -d /root/server_blocks ]; then
  721. mkdir /root/server_blocks
  722. fi
  723. if [ "${LACEMI_METHOD}" == "install" ]; then
  724. #全新安装
  725. InstallLog -I "全新安装"
  726. CheckAPI "${LACEMI_API}"
  727. CheckEmpty "${LACEMI_KEY}" "安装密钥为空,请使用-k指定安装密钥"
  728. LACEMI_DOMAIN=$(curl -s -H "Accept:text/html" "${LACEMI_API}" -X POST -d "{\"op\": \"get-domain\",\"key\":\"${LACEMI_KEY}\"}")
  729. LACEMI_DOMAIN_NAME=$(echo "${LACEMI_DOMAIN}" | cut -d \. -f 1)
  730. InstallLog -I "获取域名:${LACEMI_DOMAIN}"
  731. 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"
  732. PressInstall
  733. rm -rf /root/server_blocks/*
  734. CloneCode
  735. InstallLog -I "获取docker-compose.yml"
  736. 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
  737. InstallLog -I "获取local.lic"
  738. 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"
  739. docker-compose up -d
  740. wget -O /root/my.cnf https://mi.lacecdn.com/my.cnf
  741. docker cp /root/my.cnf root-mariadb-1:/opt/bitnami/mariadb/conf/bitnami/
  742. docker restart root-mariadb-1
  743. InstallLog -I "获取${LACEMI_DOMAIN_NAME}.conf"
  744. 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"
  745. InstallLog -I "获取default.conf"
  746. 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
  747. InstallLog -I "获取授权文件"
  748. curl -s -H "Accept:text/html" "${LACEMI_API}" -X POST -d "{\"op\": \"get-license\",\"key\":\"${LACEMI_KEY}\"}" -o "${LACEMI_DOMAIN_NAME}.lic"
  749. runCmd=$(curl -s -H "Accept:text/html" "${LACEMI_API}" -X POST -d "{\"op\": \"get-template\",\"key\":\"${LACEMI_KEY}\",\"data\":\"INSTALL_DOCKER_RUN_CMD\"}")
  750. InstallLog -I "生成docker run命令: ${runCmd}"
  751. if [[ -n $(docker ps -q -f "name=${LACEMI_DOMAIN_NAME}") ]];then
  752. echo "Docker container ${LACEMI_DOMAIN_NAME} is running, aborting."
  753. else
  754. ${runCmd}
  755. fi
  756. docker restart root-nginx-1
  757. sleep 10
  758. docker exec "${LACEMI_DOMAIN_NAME}" /app/bin/utool.sh fI
  759. chmod 777 -R "${LACEMI_CODE_PROD_PATH}/sapi/web"
  760. InstallCrontabTask
  761. elif [ "${LACEMI_METHOD}" == "append" ]; then
  762. #增量安装
  763. InstallLog -i "增量安装"
  764. CheckAPI "${LACEMI_API}"
  765. CheckEmpty "${LACEMI_KEY}" "安装密钥为空,请使用-k指定安装密钥"
  766. LACEMI_DOMAIN=$(curl -s -H "Accept:text/html" "${LACEMI_API}" -X POST -d "{\"op\": \"get-domain\",\"key\":\"${LACEMI_KEY}\"}")
  767. LACEMI_DOMAIN_NAME=$(echo "${LACEMI_DOMAIN}" | cut -d \. -f 1)
  768. InstallLog -I "获取域名:${LACEMI_DOMAIN}"
  769. 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"
  770. PressInstall
  771. InstallLog -I "获取${LACEMI_DOMAIN_NAME}.conf"
  772. 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"
  773. InstallLog -I "获取授权文件"
  774. curl -s -H "Accept:text/html" "${LACEMI_API}" -X POST -d "{\"op\": \"get-license\",\"key\":\"${LACEMI_KEY}\"}" -o "${LACEMI_DOMAIN_NAME}.lic"
  775. runCmd=$(curl -s -H "Accept:text/html" "${LACEMI_API}" -X POST -d "{\"op\": \"get-template\",\"key\":\"${LACEMI_KEY}\",\"data\":\"INSTALL_DOCKER_RUN_CMD\"}")
  776. InstallLog -I "生成docker run命令: ${runCmd}"
  777. if [[ -n $(docker ps -q -f "name=${LACEMI_DOMAIN_NAME}") ]];then
  778. echo "Docker container ${LACEMI_DOMAIN_NAME} is running, aborting."
  779. else
  780. ${runCmd}
  781. fi
  782. docker restart root-nginx-1
  783. sleep 5
  784. docker exec "${LACEMI_DOMAIN_NAME}" /app/bin/utool.sh fI
  785. InstallCrontabTask
  786. elif [ "${LACEMI_METHOD}" == "share" ]; then
  787. #增量安装
  788. InstallLog -i "共享版"
  789. if [ ! -d "${LACEMI_CODE_SHARE_PATH}" ];then
  790. CloneShareCode
  791. fi
  792. CheckAPI "${LACEMI_API}"
  793. CheckEmpty "${LACEMI_KEY}" "安装密钥为空,请使用-k指定安装密钥"
  794. LACEMI_DOMAIN=$(curl -s -H "Accept:text/html" "${LACEMI_API}" -X POST -d "{\"op\": \"get-domain\",\"key\":\"${LACEMI_KEY}\"}")
  795. LACEMI_DOMAIN_NAME=$(echo "${LACEMI_DOMAIN}" | cut -d \. -f 1)
  796. InstallLog -I "获取域名:${LACEMI_DOMAIN}"
  797. 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"
  798. PressInstall
  799. InstallLog -I "获取${LACEMI_DOMAIN_NAME}.conf"
  800. 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"
  801. runCmd=$(curl -s -H "Accept:text/html" "${LACEMI_API}" -X POST -d "{\"op\": \"get-template\",\"key\":\"${LACEMI_KEY}\",\"data\":\"INSTALL_DOCKER_RUN_CMD\"}")
  802. InstallLog -I "生成docker run命令: ${runCmd}"
  803. if [[ -n $(docker ps -q -f "name=${LACEMI_DOMAIN_NAME}") ]];then
  804. echo "Docker container ${LACEMI_DOMAIN_NAME} is running, aborting."
  805. else
  806. ${runCmd}
  807. fi
  808. docker restart root-nginx-1
  809. fi
  810. # EnableSSHLogin
  811. # SecuritySSHLogin
  812. }
  813. # shellcheck disable=SC2068
  814. clear
  815. echo "+------------------------------------------------------------------------+"
  816. echo "| LACEMI ${VERSION}(${RELEASE}) for ${DISTRO} Linux Server |"
  817. echo "+------------------------------------------------------------------------+"
  818. echo "| A tool to install lacemi on Linux |"
  819. echo "+------------------------------------------------------------------------+"
  820. echo "| For more information please visit https://hlace.com |"
  821. echo "+------------------------------------------------------------------------+"
  822. main "$@"