diff --git a/installer/.gitignore b/installer/.gitignore new file mode 100644 index 0000000000..7af5126512 --- /dev/null +++ b/installer/.gitignore @@ -0,0 +1,4 @@ +.idea/ +*.iml +target/ +.DS_Store diff --git a/installer/README.md b/installer/README.md new file mode 100644 index 0000000000..a12e727a9c --- /dev/null +++ b/installer/README.md @@ -0,0 +1,5 @@ +# DataEase 离线安装包制作工程 + +本工程用来制作 DataEase 离线安装包。 + +如需下载 DataEase 安装包,请移步:https://community.fit2cloud.com/#/products/dataease/downloads diff --git a/installer/dataease/bin/dataease/dataease.service b/installer/dataease/bin/dataease/dataease.service new file mode 100644 index 0000000000..6e6e57396c --- /dev/null +++ b/installer/dataease/bin/dataease/dataease.service @@ -0,0 +1,43 @@ +#!/bin/bash +# chkconfig: 2345 10 90 +# description: DATAEASE service + +function startDATAEASE +{ + dectl reload +} + +function stopDATAEASE +{ + dectl uninstall +} + +function restartDATAEASE +{ + stopDATAEASE + startDATAEASE +} + +function statusDATAEASE +{ + dectl status +} + +export HOSTNAME=$HOSTNAME +case "$1" in + start) + startDATAEASE + ;; + stop) + stopDATAEASE + ;; + restart) + restartDATAEASE + ;; + status) + statusDATAEASE + ;; + *) + echo "Usage: $0 {start|stop|restart|status}" + ;; +esac diff --git a/installer/dataease/bin/doris/init.sql b/installer/dataease/bin/doris/init.sql new file mode 100644 index 0000000000..27dae19bde --- /dev/null +++ b/installer/dataease/bin/doris/init.sql @@ -0,0 +1,3 @@ +CREATE DATABASE IF NOT EXISTS dataease; +SET PASSWORD FOR 'root' = PASSWORD('Password123@doris'); +SET GLOBAL enable_spilling = true; \ No newline at end of file diff --git a/installer/dataease/bin/mysql/init.sql b/installer/dataease/bin/mysql/init.sql new file mode 100644 index 0000000000..a22e088b57 --- /dev/null +++ b/installer/dataease/bin/mysql/init.sql @@ -0,0 +1 @@ +CREATE DATABASE `dataease` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; \ No newline at end of file diff --git a/installer/dataease/dectl b/installer/dataease/dectl new file mode 100755 index 0000000000..f234ad562f --- /dev/null +++ b/installer/dataease/dectl @@ -0,0 +1,317 @@ +#!/bin/bash +action=$1 +target=$2 +args=$@ + +DE_BASE=/opt + +source ${DE_BASE}/dataease/.env + +export COMPOSE_HTTP_TIMEOUT=180 + +compose_files="-f docker-compose.yml" + +compose_cmd="docker-compose" + +docker-compose version >/dev/null 2>&1 +if [ $? -ne 0 ]; then + docker compose version >/dev/null 2>&1 + if [ $? -ne 0 ]; then + compose_cmd="docker compose" + fi +fi + + +if [ "${DE_ENGINE_MODE}" = "local" ]; then + if [[ ! ${DE_EXTERNAL_KETTLE} ]] || [ ${DE_EXTERNAL_KETTLE} = "false" ]; then + compose_files="${compose_files} -f docker-compose-kettle.yml" + fi + + if [[ ! ${DE_EXTERNAL_DORIS} ]] || [ ${DE_EXTERNAL_DORIS} = "false" ]; then + compose_files="${compose_files} -f docker-compose-doris.yml" + fi +fi + +if [[ ! ${DE_EXTERNAL_MYSQL} ]] || [ ${DE_EXTERNAL_MYSQL} = "false" ]; then + compose_files="${compose_files} -f docker-compose-mysql.yml" +fi + +function usage() { + echo "DATAEASE 控制脚本" + echo + echo "Usage: " + echo " ./dectl [COMMAND] [ARGS...]" + echo " ./dectl --help" + echo + echo "Commands: " + echo " status 查看 DATAEASE 服务运行状态" + echo " start 启动 DATAEASE 服务" + echo " stop 停止 DATAEASE 服务" + echo " restart 重启 DATAEASE 服务" + echo " reload 重新加载 DATAEASE 服务" + echo " uninstall 卸载 DATAEASE 服务" + echo " upgrade 升级 DATAEASE 服务" + echo " version 查看 DATAEASE 版本信息" + echo " clear-images 清理 DATAEASE 旧版本的相关镜像" + echo " clear-logs 清理 DATAEASE 历史日志以及 Doris 临时日志" +} +function _healthcheck() { + echo + for b in {1..30} + do + sleep 3 + http_code=$(curl -sILw "%{http_code}\n" http://localhost:${DE_PORT} -o /dev/null) + if [[ $http_code == 000 ]];then + echo "DataEase 服务状态 : 正在启动" + elif [[ $http_code == 200 ]];then + echo "DataEase 服务状态 : 正常运行" + break; + else + echo -e "DataEase 服务状态 : \033[31m无法访问\033[0m" + exit 1 + fi + done + echo +} +function status() { + echo + echo "DataEase 容器运行状态" + cd ${DE_BASE}/dataease; ${compose_cmd} ${compose_files} ps + + echo + docker_root_dir=$(docker info | grep "Docker Root Dir" | awk -F': ' '{print $2}') + echo "Docker 目录及文件大小 : " + du -sh $docker_root_dir + echo + echo "Docker 目录所在磁盘使用情况 : " + df -H $docker_root_dir + + echo + echo "日志文件大小 : " + du -Sh ${DE_BASE}/dataease/logs/ + + echo + echo "DataEase 运行目录及文件大小 : " + du -sh ${DE_BASE} + echo + echo "DataEase 运行目录使用情况 : " + df -H ${DE_BASE} + + echo + read available_disk percent_disk<<< $(df -H --output=avail,pcent ${DE_BASE} | tail -1) + available_disk=${available_disk%?} + percent_disk=${percent_disk%?} + if [[ $available_disk < 2.0 ]] && [[ $percent_disk > 85 ]];then + echo -e "\033[31m[警告] DataEase 运行目录所在磁盘剩余空间不足 2G 且磁盘使用率超过 85%,Apache Doris 可能无法正常启动!\033[0m" + fi + + _healthcheck +} +function start() { + echo + cd ${DE_BASE}/dataease; ${compose_cmd} ${compose_files} start ${target} + _healthcheck +} +function stop() { + echo + cd ${DE_BASE}/dataease; ${compose_cmd} ${compose_files} stop ${target} +} +function restart() { + echo + cd ${DE_BASE}/dataease; ${compose_cmd} ${compose_files} restart ${target} + _healthcheck +} +function reload() { + echo + cd ${DE_BASE}/dataease; ${compose_cmd} ${compose_files} up -d + _healthcheck +} +function uninstall() { + echo + cd ${DE_BASE}/dataease; ${compose_cmd} ${compose_files} down -v ${target} +} +function version() { + echo + de_version=$(grep "^ image:.*/dataease:" ${DE_BASE}/dataease/docker-compose.yml | awk -F'dataease:' '{print $2}') + echo $de_version +} +function _clear_component_docker_images() { + component=$1 + compose_file=${DE_BASE}/dataease/docker-compose-${component}.yml + if [ $1 = "dataease" ];then + compose_file=${DE_BASE}/dataease/docker-compose.yml + fi + component_image_defined=$(grep "^ image:.*/$component:" ${compose_file} | uniq) + component_version=$(echo ${component_image_defined} | awk -F"${component}:" '{print $2}' | uniq) + component_image=$(echo ${component_image_defined} | awk -F'image: ' '{print $2}' | awk -F':' '{print $1}') + + if test -z $(docker images | grep "dataease" | grep "$component_image" | grep -v " $component_version "); then + echo "$component_image 不存在旧版本镜像" + else + echo "清理${component}镜像" + docker rmi $(docker images | grep "dataease" | grep "$component_image" | grep -v " $component_version " | awk -F' ' '{print $1":"$2}') + echo "清理完毕" + fi +} +function clear_images() { + echo + _clear_component_docker_images 'dataease' + _clear_component_docker_images 'doris' + _clear_component_docker_images 'kettle' + _clear_component_docker_images 'mysql' + if test ! -z "$(docker images -f dangling=true -q)"; then + echo "清理虚悬镜像" + docker rmi $(docker images -f dangling=true -q) + echo "清理完毕" + fi +} +function clear_logs() { + echo "开始清理 DataEase 历史日志" + rm -rf ${DE_BASE}/dataease/logs/dataease/history/* + echo "清理完毕" + + echo "开始清理 Apache Doris FE 日志" + rm -rf ${DE_BASE}/dataease/logs/fe/fe.gc.log.* + echo "" > ${DE_BASE}/dataease/logs/fe/fe.out + echo "清理完毕" + + echo "开始清理 Apache Doris BE 日志" + echo "" > ${DE_BASE}/dataease/logs/be/be.INFO + echo "" > ${DE_BASE}/dataease/logs/be/be.WARNING + echo "" > ${DE_BASE}/dataease/logs/be/be.out + echo "清理完毕" +} +function upgrade() { + echo + git_urls=('gitee.com' 'github.com') + if [[ -x "$(command -v python)" ]];then + py_cmd='python' + elif [[ -x "$(command -v python3)" ]]; then + py_cmd='python3' + else + git_urls=('github.com') + fi + + for git_url in ${git_urls[*]} + do + success="true" + for i in {1..3} + do + echo -ne "检测 ${git_url} ... ${i} " + curl -m 5 -kIs https://${git_url} >/dev/null + if [ $? != 0 ];then + echo "failed" + success="false" + break + else + echo "ok" + fi + done + if [[ ${success} == "true" ]];then + server_url=${git_url} + break + fi + done + + if [[ "x${server_url}" == "x" ]];then + echo "没有找到稳定的下载服务器,请稍候重试" + exit 1 + fi + + if [[ "${server_url}" == "gitee.com" ]];then + owner='fit2cloud-feizhiyun' + repo='DataEase' + gitee_release_content=$(curl -s https://gitee.com/api/v5/repos/${owner}/${repo}/releases/latest) + # export LC_ALL="en_US.utf8" + latest_version=$($py_cmd -c "import json; obj=json.loads('$gitee_release_content', strict=False); print(obj['tag_name']);") + else + owner='dataease' + repo='dataease' + latest_version=$(curl -s https://api.github.com/repos/${owner}/${repo}/releases/latest | grep -e "\"tag_name\"" | sed -r 's/.*: "(.*)",/\1/') + fi + + current_version=$(grep "^ image:.*/dataease:" ${DE_BASE}/dataease/docker-compose.yml | awk -F'dataease:' '{print $2}') + + if [ "${latest_version}" = "" ];then + echo "未获取到最新版本" + exit 1 + elif [ "${latest_version}" = "${current_version}" ];then + echo "最新版本与当前版本一致,退出升级过程" + exit 0 + else + echo -e "\e[32m 检测到最新版本为\e[1;33m${latest_version}\e[0;32m 即将执行在线升级...\e[0m" + fi + sleep 2s + + echo "使用下载服务器 ${server_url}" + cd /tmp + download_url="https://${server_url}/${owner}/${repo}/releases/download/${latest_version}/dataease-${latest_version}-online.tar.gz" + curl -LOk -m 60 -o dataease-${latest_version}-online.tar.gz $download_url + if [ $? -ne 0 ]; then + echo -e "\e[31m升级失败:连接下载服务器超时!\n可手动下载升级包,然后执行\e[1;33m /bin/bash install.sh \e[0;31m离线升级,也可以重新执行一次 dectl upgrade 命令。\e[0m" + return 2 + fi + + if [ ! -f dataease-${latest_version}-online.tar.gz ];then + echo "下载在线安装包失败,请试试重新执行一次安装命令。" + exit 1 + fi + + tar zxvf dataease-${latest_version}-online.tar.gz + if [ $? != 0 ];then + echo "下载在线安装包失败,请试试重新执行一次安装命令。" + rm -f dataease-${latest_version}-online.tar.gz + exit 1 + fi + + cd dataease-${latest_version}-online + /bin/bash install.sh + + cd .. + rm -rf /tmp/dataease-${latest_version}-online +} + +function main() { + case "${action}" in + status) + status + ;; + start) + start + ;; + stop) + stop + ;; + restart) + restart + ;; + reload) + reload + ;; + uninstall) + uninstall + ;; + upgrade) + upgrade + ;; + version) + version + ;; + clear-images) + clear_images + ;; + clear-logs) + clear_logs + ;; + help) + usage + ;; + --help) + usage + ;; + *) + echo "不支持的参数,请使用 help 或 --help 参数获取帮助" + ;; + esac +} +main \ No newline at end of file diff --git a/installer/dataease/docker-compose-doris.yml b/installer/dataease/docker-compose-doris.yml new file mode 100644 index 0000000000..9f769b8d7b --- /dev/null +++ b/installer/dataease/docker-compose-doris.yml @@ -0,0 +1,50 @@ +version: '2.1' +services: + + doris-fe: + image: registry.cn-qingdao.aliyuncs.com/dataease/doris:v1.2.4.1-0606 + container_name: doris-fe + privileged: true + environment: + - DORIS_ROLE=fe-leader + - FE_SERVERS=fe1:${DE_DORIS_FE_IP}:9010 + - FE_ID=1 + volumes: + - ${DE_BASE}/dataease/data/fe:/opt/apache-doris/fe/doris-meta + - ${DE_BASE}/dataease/logs/fe:/opt/apache-doris/fe/log + - ${DE_BASE}/dataease/conf/fe.conf:/opt/apache-doris/fe/conf/fe.conf + networks: + dataease-network : + ipv4_address: ${DE_DORIS_FE_IP} + restart: always + healthcheck: + test: [ "CMD-SHELL", "curl -sS 127.0.0.1:8030 || exit 1" ] + interval: 10s + timeout: 5s + retries: 3 + + doris-be: + image: registry.cn-qingdao.aliyuncs.com/dataease/doris:v1.2.4.1-0606 + container_name: doris-be + privileged: true + environment: + - DORIS_ROLE=be + - FE_SERVERS=fe1:${DE_DORIS_FE_IP}:9010 + - BE_ADDR=${DE_DORIS_BE_IP}:9050 + volumes: + - ${DE_BASE}/dataease/data/be:/opt/apache-doris/be/storage + - ${DE_BASE}/dataease/logs/be:/opt/apache-doris/be/log + - ${DE_BASE}/dataease/conf/be.conf:/opt/apache-doris/be/conf/be.conf + - ${DE_BASE}/dataease/bin/doris:/docker-entrypoint-initdb.d/ + depends_on: + doris-fe: + condition: service_healthy + networks: + dataease-network : + ipv4_address: ${DE_DORIS_BE_IP} + restart: always + healthcheck: + test: [ "CMD-SHELL", "curl -sS 127.0.0.1:8040 || exit 1" ] + interval: 10s + timeout: 5s + retries: 3 \ No newline at end of file diff --git a/installer/dataease/docker-compose-kettle.yml b/installer/dataease/docker-compose-kettle.yml new file mode 100644 index 0000000000..23010eb868 --- /dev/null +++ b/installer/dataease/docker-compose-kettle.yml @@ -0,0 +1,14 @@ +version: '2.1' +services: + + kettle: + image: registry.cn-qingdao.aliyuncs.com/dataease/kettle:v8.3-0318 + container_name: kettle + environment: + - PENTAHO_DI_JAVA_OPTIONS=-Xms1024m -Xmx4096m -XX:MaxPermSize=256m -Dfile.encoding=utf-8 + volumes: + - ${DE_BASE}/dataease/conf/:/opt/dataease/conf + - ${DE_BASE}/dataease/data/kettle:/opt/dataease/data/kettle + networks: + - dataease-network + restart: always \ No newline at end of file diff --git a/installer/dataease/docker-compose-mysql.yml b/installer/dataease/docker-compose-mysql.yml new file mode 100644 index 0000000000..013587acde --- /dev/null +++ b/installer/dataease/docker-compose-mysql.yml @@ -0,0 +1,21 @@ +version: '2.1' +services: + + mysql: + image: registry.cn-qingdao.aliyuncs.com/dataease/mysql:5.7.43 + container_name: mysql + healthcheck: + test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost", "-u${DE_MYSQL_USER}", "-p${DE_MYSQL_PASSWORD}"] + interval: 5s + timeout: 3s + retries: 10 + env_file: + - ${DE_BASE}/dataease/conf/mysql.env + ports: + - ${DE_MYSQL_PORT}:3306 + volumes: + - ${DE_BASE}/dataease/conf/my.cnf:/etc/mysql/conf.d/my.cnf + - ${DE_BASE}/dataease/bin/mysql:/docker-entrypoint-initdb.d/ + - ${DE_BASE}/dataease/data/mysql:/var/lib/mysql + networks: + - dataease-network \ No newline at end of file diff --git a/installer/dataease/docker-compose.yml b/installer/dataease/docker-compose.yml new file mode 100644 index 0000000000..6a9d9480c8 --- /dev/null +++ b/installer/dataease/docker-compose.yml @@ -0,0 +1,34 @@ +version: '2.1' +services: + + dataease: + image: registry.cn-qingdao.aliyuncs.com/dataease/dataease:DE_TAG + container_name: dataease + ports: + - ${DE_PORT}:8081 + mem_limit: 4096m + volumes: + - ${DE_BASE}/dataease/conf:/opt/dataease/conf + - ${DE_BASE}/dataease/logs:/opt/dataease/logs + - ${DE_BASE}/dataease/plugins/thirdpart:/opt/dataease/plugins/thirdpart + - ${DE_BASE}/dataease/data/kettle:/opt/dataease/data/kettle + - ${DE_BASE}/dataease/data/static-resource:/opt/dataease/data/static-resource + - ${DE_BASE}/dataease/custom-drivers:/opt/dataease/custom-drivers + - ${DE_BASE}/dataease/data/custom:/opt/dataease/data/custom + - ${DE_BASE}/dataease/data/business:/opt/dataease/data/business + - ${DE_BASE}/dataease/data/ehcache:/opt/dataease/data/ehcache + shm_size: 1gb + depends_on: + mysql: + condition: service_healthy + networks: + - dataease-network + +networks: + dataease-network: + driver: bridge + ipam: + driver: default + config: + - subnet: ${DE_DOCKER_SUBNET} + gateway: ${DE_DOCKER_GATEWAY} diff --git a/installer/dataease/install.conf b/installer/dataease/install.conf new file mode 100644 index 0000000000..a5ab1c7962 --- /dev/null +++ b/installer/dataease/install.conf @@ -0,0 +1,61 @@ +# 基础配置 +## 安装目录 +DE_BASE=/opt +## Service 端口 +DE_PORT=80 +## 部署及运行模式,可选值有 local、simple、cluster,分别对应 本地模式、精简模式、集群模式 +DE_ENGINE_MODE=simple +## docker 网段设置 +DE_DOCKER_SUBNET=172.19.0.0/16 +## docker 网关 IP +DE_DOCKER_GATEWAY=172.19.0.1 +## Apache Doris FE IP (外部 Doris 此参数无效) +DE_DORIS_FE_IP=172.19.0.198 +## Apache Doris BE IP (外部 Doris 此参数无效) +DE_DORIS_BE_IP=172.19.0.199 +## 登录超时时间,单位min。如果不设置则默认8小时,也就是480 +DE_LOGIN_TIMEOUT=480 + +# 数据库配置 +## 是否使用外部数据库 +DE_EXTERNAL_MYSQL=false +## 数据库地址 +DE_MYSQL_HOST=mysql +## 数据库端口 +DE_MYSQL_PORT=3306 +## DataEase 数据库库名 +DE_MYSQL_DB=dataease +## 数据库用户名 +DE_MYSQL_USER=root +## 数据库密码 +DE_MYSQL_PASSWORD=Password123@mysql +## 数据库参数 +DE_MYSQL_PARAMS="autoReconnect=false&useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false" + +# Apache Doris 配置 +## 是否使用外部 Apache Doris +DE_EXTERNAL_DORIS=false +## Doris 地址 +DE_DORIS_HOST=doris-fe +## Doris 查询连接端口 +DE_DORIS_PORT=9030 +## Doris http端口 +DE_DORIS_HTTPPORT=8030 +## Doris 数据库名称 +DE_DORIS_DB=dataease +## Doris 用户名 +DE_DORIS_USER=root +## Doris 密码 +DE_DORIS_PASSWORD=Password123@doris + +# Kettle 配置 +## 是否使用外部 Kettle - (目前还不支持外部Kettle,除非不需运行Kettle,否则请不要修改此参数) +DE_EXTERNAL_KETTLE=false +## Kettle 服务器地址 +DE_CARTE_HOST=kettle +## Kettle 访问端口 +DE_CARTE_PORT=18080 +## Kettle 用户名 +DE_CARTE_USER=cluster +## Kettle 密码 +DE_CARTE_PASSWORD=cluster diff --git a/installer/dataease/install.sh b/installer/dataease/install.sh new file mode 100755 index 0000000000..4e6c8faf8b --- /dev/null +++ b/installer/dataease/install.sh @@ -0,0 +1,375 @@ +#!/bin/bash + +CURRENT_DIR=$( + cd "$(dirname "$0")" + pwd +) + +function log() { + message="[DATAEASE Log]: $1 " + echo -e "${message}" 2>&1 | tee -a ${CURRENT_DIR}/install.log +} + +args=$@ +os=$(uname -a) +docker_config_folder="/etc/docker" +compose_files="-f docker-compose.yml" + +INSTALL_TYPE='install' +if [ -f /usr/bin/dectl ]; then + # 获取已安装的 DataEase 的运行目录 + DE_BASE=$(grep "^DE_BASE=" /usr/bin/dectl | cut -d'=' -f2) + dectl uninstall + INSTALL_TYPE='upgrade' +fi + +set -a +if [[ $DE_BASE ]] && [[ -f $DE_BASE/dataease/.env ]]; then + source $DE_BASE/dataease/.env + INSTALL_TYPE='upgrade' +else + source ${CURRENT_DIR}/install.conf + INSTALL_TYPE='install' +fi +set +a + +DE_RUN_BASE=$DE_BASE/dataease +conf_folder=${DE_RUN_BASE}/conf +templates_folder=${DE_RUN_BASE}/templates +mysql_container_name="mysql" +if [ -f ${DE_RUN_BASE}/docker-compose-mysql.yml ]; then + mysql_container_name=$(grep "container_name" ${DE_RUN_BASE}/docker-compose-mysql.yml | awk -F': ' '{print $2}') +fi + +dataease_conf=${conf_folder}/dataease.properties + +function prop { + [ -f "$1" ] | grep -P "^\s*[^#]?${2}=.*$" $1 | cut -d'=' -f2 +} + +if [ "x${DE_ENGINE_MODE}" = "x" ]; then + export DE_ENGINE_MODE="local" +fi + +if [ "x${DE_DOCKER_SUBNET}" = "x" ]; then + export DE_DOCKER_SUBNET=$(grep "^[[:blank:]]*- subnet" ${DE_RUN_BASE}/docker-compose.yml | awk -F': ' '{print $2}') +fi + +if [ "x${DE_DOCKER_GATEWAY}" = "x" ]; then + export DE_DOCKER_GATEWAY=$(grep "^[[:blank:]]*gateway" ${DE_RUN_BASE}/docker-compose.yml | awk -F': ' '{print $2}') +fi + +if [ "x${DE_DORIS_FE_IP}" = "x" ]; then + DE_DORIS_FE_IP=$(grep "^[[:blank:]]*ipv4_address" ${DE_RUN_BASE}/docker-compose-doris.yml | awk -F': ' '{print $2}' | head -n 1) + export DE_DORIS_FE_IP +fi + +if [ "x${DE_DORIS_BE_IP}" = "x" ]; then + DE_DORIS_BE_IP=$(grep "^[[:blank:]]*ipv4_address" ${DE_RUN_BASE}/docker-compose-doris.yml | awk -F': ' '{print $2}' | tail -n 1) + export DE_DORIS_BE_IP +fi + +echo -e "*******************************************************\n" 2>&1 | tee -a ${CURRENT_DIR}/install.log +echo -e " 当前部署模式为 ${DE_ENGINE_MODE},如需切换模式,\n 请修改 $DE_BASE/dataease/.env 中的 DE_ENGINE_MODE 变量后,\n 重新执行 bash install.sh 即可\n" 2>&1 | tee -a ${CURRENT_DIR}/install.log +echo -e "*******************************************************\n" 2>&1 | tee -a ${CURRENT_DIR}/install.log + +if [[ -f $dataease_conf ]]; then + DE_LOGIN_TIMEOUT=$(prop $dataease_conf dataease.login_timeout) + DE_MYSQL_PARAMS=$(grep -P "^\s*[^#]?spring.datasource.url=.*$" $dataease_conf | cut -d'=' --complement -f1 | awk -F'?' '{print $2}') +fi +export DE_MYSQL_PARAMS +export DE_LOGIN_TIMEOUT=$([[ -z $DE_LOGIN_TIMEOUT ]] && echo -n 480 || echo -n $DE_LOGIN_TIMEOUT) + +if [[ -f $dataease_conf ]] && [[ ! ${DE_EXTERNAL_DORIS} ]]; then + export DE_DORIS_DB=$(prop $dataease_conf doris.db) + export DE_DORIS_USER=$(prop $dataease_conf doris.user) + export DE_DORIS_PASSWORD=$(prop $dataease_conf doris.password) + export DE_DORIS_HOST=$(prop $dataease_conf doris.host) + export DE_DORIS_PORT=$(prop $dataease_conf doris.port) + export DE_DORIS_HTTPPORT=$(prop $dataease_conf doris.httpPort) + + if [ ${DE_DORIS_HOST} = "doris-fe" ]; then + export DE_EXTERNAL_DORIS="false" + else + export DE_EXTERNAL_DORIS="true" + fi +fi + +if [ ${DE_EXTERNAL_DORIS} = "false" ] && [ ${DE_ENGINE_MODE} = "local" ]; then + compose_files="${compose_files} -f docker-compose-doris.yml" +fi + +if [[ -f $dataease_conf ]] && [[ ! ${DE_EXTERNAL_KETTLE} ]]; then + export DE_CARTE_HOST=$(prop $dataease_conf carte.host) + export DE_CARTE_PORT=$(prop $dataease_conf carte.port) + export DE_CARTE_USER=$(prop $dataease_conf carte.user) + export DE_CARTE_PASSWORD=$(prop $dataease_conf carte.passwd) + + if [ ${DE_CARTE_HOST} = "kettle" ]; then + export DE_EXTERNAL_KETTLE="false" + else + export DE_EXTERNAL_KETTLE="true" + fi +fi + +if [ ${DE_EXTERNAL_KETTLE} = "false" ] && [ ${DE_ENGINE_MODE} = "local" ]; then + compose_files="${compose_files} -f docker-compose-kettle.yml" +fi + + +echo -e "======================= 开始安装 =======================" 2>&1 | tee -a ${CURRENT_DIR}/install.log + +keep_doris="false" +if [[ -f ${DE_RUN_BASE}/docker-compose-doris.yml ]]; then + current_doris_version=$(grep '^ image:' ${DE_RUN_BASE}/docker-compose-doris.yml | head -1 | cut -d ':' -f3) + if [[ ! $current_doris_version =~ "v1.2.4" ]]; then + echo "不升级doris,备份 docker-compose-doris.yml 文件" + keep_doris="true" + \cp ${DE_RUN_BASE}/docker-compose-doris.yml ${DE_RUN_BASE}/docker-compose-doris.yml.bak + fi +fi + +mkdir -p ${DE_RUN_BASE} + + +read available_disk <<< $(df -m --output=avail ${DE_RUN_BASE} | tail -1) +if [[ $available_disk -lt 20480 ]];then + log "\033[31m[警告] DataEase 运行目录所在磁盘剩余空间不足 20G 可能无法正常启动!\033[0m" +fi + +cp -r ./dataease/* ${DE_RUN_BASE}/ + +cd $DE_RUN_BASE +env | grep DE_ >.env + +mkdir -p $conf_folder +mkdir -p ${DE_RUN_BASE}/data/kettle +mkdir -p ${DE_RUN_BASE}/data/fe +mkdir -p ${DE_RUN_BASE}/data/be +mkdir -p ${DE_RUN_BASE}/data/mysql +mkdir -p ${DE_RUN_BASE}/data/static-resource +mkdir -p ${DE_RUN_BASE}/custom-drivers +mkdir -p ${DE_RUN_BASE}/data/business + + +if [ ${keep_doris} = "true" ]; then + \mv ${DE_RUN_BASE}/docker-compose-doris.yml.bak ${DE_RUN_BASE}/docker-compose-doris.yml +fi + +DE_MYSQL_HOST_ORIGIN=$DE_MYSQL_HOST +DE_MYSQL_PORT_ORIGIN=$DE_MYSQL_PORT + +if [ ${DE_EXTERNAL_MYSQL} = "false" ]; then + compose_files="${compose_files} -f docker-compose-mysql.yml" + export DE_MYSQL_HOST=$mysql_container_name + export DE_MYSQL_PORT=3306 + sed -i "s/^ container_name: mysql/ container_name: ${DE_MYSQL_HOST}/g" docker-compose-mysql.yml +else + sed -i -e "/^ depends_on/,+2d" docker-compose.yml +fi + +log "拷贝配置文件模板文件 -> $conf_folder" +if [[ -f $dataease_conf ]]; then + grep "redis" $dataease_conf >> $templates_folder/dataease.properties +fi +cd $DE_RUN_BASE +cp -r $templates_folder/* $conf_folder +cp -r $templates_folder/.kettle $conf_folder + +log "根据安装配置参数调整配置文件" +cd ${templates_folder} +templates_files=( dataease.properties mysql.env ) +for i in ${templates_files[@]}; do + if [ -f $i ]; then + envsubst < $i > $conf_folder/$i + fi +done + +export DE_MYSQL_HOST=$DE_MYSQL_HOST_ORIGIN +export DE_MYSQL_PORT=$DE_MYSQL_PORT_ORIGIN + +cd ${CURRENT_DIR} +sed -i -e "s#DE_BASE=.*#DE_BASE=${DE_BASE}#g" dectl +\cp dectl /usr/local/bin && chmod +x /usr/local/bin/dectl +if [ ! -f /usr/bin/dectl ]; then + ln -s /usr/local/bin/dectl /usr/bin/dectl 2>/dev/null +fi + +echo "time: $(date)" + +if which getenforce && [ $(getenforce) == "Enforcing" ];then + log "... 关闭 SELINUX" + setenforce 0 + sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config +fi + +#Install docker & docker-compose +##Install Latest Stable Docker Release +if which docker >/dev/null 2>&1; then + log "检测到 Docker 已安装,跳过安装步骤" + log "启动 Docker " + service docker start 2>&1 | tee -a ${CURRENT_DIR}/install.log +else + if [[ -d docker ]]; then + log "... 离线安装 docker" + cp docker/bin/* /usr/bin/ + cp docker/service/docker.service /etc/systemd/system/ + chmod +x /usr/bin/docker* + chmod 754 /etc/systemd/system/docker.service + log "... 启动 docker" + systemctl enable docker; systemctl daemon-reload; service docker start 2>&1 | tee -a ${CURRENT_DIR}/install.log + else + log "... 在线安装 docker" + curl -fsSL https://resource.fit2cloud.com/get-docker-linux.sh -o get-docker.sh 2>&1 | tee -a ${CURRENT_DIR}/install.log + if [[ ! -f get-docker.sh ]];then + log "docker 在线安装脚本下载失败,请稍候重试" + exit 1 + fi + sudo sh get-docker.sh 2>&1 | tee -a ${CURRENT_DIR}/install.log + log "... 启动 docker" + systemctl enable docker; systemctl daemon-reload; service docker start 2>&1 | tee -a ${CURRENT_DIR}/install.log + fi + + if [ ! -d "$docker_config_folder" ];then + mkdir -p "$docker_config_folder" + fi + + docker version >/dev/null 2>&1 + if [ $? -ne 0 ]; then + log "docker 安装失败" + exit 1 + else + log "docker 安装成功" + fi +fi + +##Install Latest Stable Docker Compose Release +docker-compose version >/dev/null 2>&1 +if [ $? -ne 0 ]; then + docker compose version >/dev/null 2>&1 + if [ $? -eq 0 ]; then + echo 'docker compose "$@"' > /usr/bin/docker-compose + chmod +x /usr/bin/docker-compose + else + if [[ -d docker ]]; then + log "... 离线安装 docker-compose" + cp docker/bin/docker-compose /usr/bin/ + chmod +x /usr/bin/docker-compose + else + log "... 在线安装 docker-compose" + curl -L https://resource.fit2cloud.com/docker/compose/releases/download/v2.16.0/docker-compose-$(uname -s | tr A-Z a-z)-$(uname -m) -o /usr/local/bin/docker-compose 2>&1 | tee -a ${CURRENT_DIR}/install.log + if [[ ! -f /usr/local/bin/docker-compose ]];then + log "docker-compose 下载失败,请稍候重试" + exit 1 + fi + chmod +x /usr/local/bin/docker-compose + ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose + fi + fi + + docker-compose version >/dev/null + if [ $? -ne 0 ]; then + log "docker-compose 安装失败" + exit 1 + else + log "docker-compose 安装成功" + fi +else + log "检测到 Docker Compose 已安装,跳过安装步骤" +fi + +export COMPOSE_HTTP_TIMEOUT=180 +cd ${CURRENT_DIR} +# 加载镜像 +if [[ -d images ]]; then + log "加载镜像" + for i in $(ls images); do + if [ ${DE_ENGINE_MODE} != "local" ]; then + if [[ $i =~ "doris" ]] || [[ $i =~ "kettle" ]]; then + continue + fi + fi + docker load -i images/$i 2>&1 | tee -a ${CURRENT_DIR}/install.log + done +else + log "拉取镜像" + cd ${DE_RUN_BASE} && docker-compose $compose_files pull 2>&1 + + DEVERSION=$(cat ${CURRENT_DIR}/dataease/templates/version) + curl -sfL https://resource.fit2cloud.com/installation-log.sh | sh -s de ${INSTALL_TYPE} ${DEVERSION} + cd - +fi + +log "配置 dataease Service" +cp ${DE_RUN_BASE}/bin/dataease/dataease.service /etc/init.d/dataease +chmod a+x /etc/init.d/dataease +if which chkconfig;then + chkconfig --add dataease +fi + +if [ -f /etc/rc.d/rc.local ];then + dataeaseService=$(grep "service dataease start" /etc/rc.d/rc.local | wc -l) + if [ "$dataeaseService" -eq 0 ]; then + echo "sleep 10" >> /etc/rc.d/rc.local + echo "service dataease start" >> /etc/rc.d/rc.local + fi + chmod +x /etc/rc.d/rc.local +fi + +if [[ $(grep "vm.max_map_count" /etc/sysctl.conf | wc -l) -eq 0 ]];then + sysctl -w vm.max_map_count=2000000 + echo "vm.max_map_count=2000000" >> /etc/sysctl.conf +elif (( $(grep "vm.max_map_count" /etc/sysctl.conf | awk -F'=' '{print $2}') < 2000000 ));then + sysctl -w vm.max_map_count=2000000 + sed -i 's/^vm\.max_map_count.*/vm\.max_map_count=2000000/' /etc/sysctl.conf +fi + +if [ $(grep "net.ipv4.ip_forward" /etc/sysctl.conf | wc -l) -eq 0 ];then + sysctl -w net.ipv4.ip_forward=1 + echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf +else + sed -i 's/^net\.ipv4\.ip_forward.*/net\.ipv4\.ip_forward=1/' /etc/sysctl.conf +fi + +if which firewall-cmd >/dev/null; then + if systemctl is-active firewalld &>/dev/null ;then + log "防火墙端口开放" + firewall-cmd --zone=public --add-port=${DE_PORT}/tcp --permanent + firewall-cmd --reload + else + log "防火墙未开启,忽略端口开放" + fi +fi + +http_code=$(curl -sILw "%{http_code}\n" http://localhost:${DE_PORT} -o /dev/null) +if [[ $http_code == 200 ]];then + log "停止服务进行升级..." + dectl uninstall +fi + +log "启动服务" +dectl reload | tee -a ${CURRENT_DIR}/install.log +dectl status 2>&1 | tee -a ${CURRENT_DIR}/install.log + +for b in {1..30} +do + sleep 3 + http_code=$(curl -sILw "%{http_code}\n" http://localhost:${DE_PORT} -o /dev/null) + if [[ $http_code == 000 ]];then + log "服务启动中,请稍候 ..." + elif [[ $http_code == 200 ]];then + log "服务启动成功!" + break; + else + log "服务启动出错!" + exit 1 + fi +done + +if [[ $http_code != 200 ]];then + log "【警告】服务在等待时间内未完全启动!请稍后使用 dectl status 检查服务运行状况。" +fi + +echo -e "======================= 安装完成 =======================\n" 2>&1 | tee -a ${CURRENT_DIR}/install.log +echo -e "请通过以下方式访问:\n URL: http://\$LOCAL_IP:$DE_PORT\n 用户名: admin\n 初始密码: dataease" 2>&1 | tee -a ${CURRENT_DIR}/install.log + diff --git a/installer/dataease/logs/README.md b/installer/dataease/logs/README.md new file mode 100644 index 0000000000..904c7d9cbc --- /dev/null +++ b/installer/dataease/logs/README.md @@ -0,0 +1 @@ +# 日志目录 \ No newline at end of file diff --git a/installer/dataease/templates/.kettle/repositories.xml b/installer/dataease/templates/.kettle/repositories.xml new file mode 100644 index 0000000000..08ab05ccaf --- /dev/null +++ b/installer/dataease/templates/.kettle/repositories.xml @@ -0,0 +1,10 @@ + + + KettleFileRepository + repo + File repository + false + /opt/dataease/data/kettle + N + N + \ No newline at end of file diff --git a/installer/dataease/templates/be.conf b/installer/dataease/templates/be.conf new file mode 100644 index 0000000000..625a2f71d2 --- /dev/null +++ b/installer/dataease/templates/be.conf @@ -0,0 +1,63 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +PPROF_TMPDIR="$DORIS_HOME/log/" + +# INFO, WARNING, ERROR, FATAL +sys_log_level = INFO + +# ports for admin, web, heartbeat service +be_port = 9060 +be_rpc_port = 9070 +webserver_port = 8040 +heartbeat_service_port = 9050 +brpc_port = 8060 + +# Choose one if there are more than one ip except loopback address. +# Note that there should at most one ip match this list. +# If no ip match this rule, will choose one randomly. +# use CIDR format, e.g. 10.10.10.0/24 +# Default value is empty. +# priority_networks = 10.10.10.0/24;192.168.0.0/16 + +# data root path, separate by ';' +# you can specify the storage medium of each root path, HDD or SSD +# you can add capacity limit at the end of each root path, seperate by ',' +# eg: +# storage_root_path = /home/disk1/doris.HDD,50;/home/disk2/doris.SSD,1;/home/disk2/doris +# /home/disk1/doris.HDD, capacity limit is 50GB, HDD; +# /home/disk2/doris.SSD, capacity limit is 1GB, SSD; +# /home/disk2/doris, capacity limit is disk capacity, HDD(default) +# +# you also can specify the properties by setting ':', seperate by ',' +# property 'medium' has a higher priority than the extension of path +# +# Default value is ${DORIS_HOME}/storage, you should create it by hand. +# storage_root_path = ${DORIS_HOME}/storage + +# Advanced configurations +# sys_log_dir = ${DORIS_HOME}/log +# sys_log_roll_mode = SIZE-MB-1024 + sys_log_roll_num = 1 + load_error_log_reserve_hours=1 +# sys_log_verbose_modules = * +# log_buffer_level = -1 +# palo_cgroups + trash_file_expire_time_sec = 60 + snapshot_expire_time_sec = 60 + pending_data_expire_time_sec = 60 + enable_spilling = true \ No newline at end of file diff --git a/installer/dataease/templates/dataease.properties b/installer/dataease/templates/dataease.properties new file mode 100644 index 0000000000..64c1a3db5e --- /dev/null +++ b/installer/dataease/templates/dataease.properties @@ -0,0 +1,26 @@ +# 数据库配置 +spring.datasource.url=jdbc:mysql://${DE_MYSQL_HOST}:${DE_MYSQL_PORT}/${DE_MYSQL_DB}?${DE_MYSQL_PARAMS} +spring.datasource.username=${DE_MYSQL_USER} +spring.datasource.password=${DE_MYSQL_PASSWORD} + +carte.host=${DE_CARTE_HOST} +carte.port=${DE_CARTE_PORT} +carte.user=${DE_CARTE_USER} +carte.passwd=${DE_CARTE_PASSWORD} + +doris.db=${DE_DORIS_DB} +doris.user=${DE_DORIS_USER} +doris.password=${DE_DORIS_PASSWORD} +doris.host=${DE_DORIS_HOST} +doris.port=${DE_DORIS_PORT} +doris.httpPort=${DE_DORIS_HTTPPORT} + +#新建用户初始密码 +dataease.init_password=DataEase123456 +#登录超时时间单位min 如果不设置 默认8小时也就是480 +dataease.login_timeout=${DE_LOGIN_TIMEOUT} + +logger.level=INFO + +#DE运行模式,可选值有 local、simple、cluster,分别对应 本地模式、精简模式、集群模式 +engine_mode=${DE_ENGINE_MODE} diff --git a/installer/dataease/templates/fe.conf b/installer/dataease/templates/fe.conf new file mode 100644 index 0000000000..309eaa65bd --- /dev/null +++ b/installer/dataease/templates/fe.conf @@ -0,0 +1,76 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +##################################################################### +## The uppercase properties are read and exported by bin/start_fe.sh. +## To see all Frontend configurations, +## see fe/src/org/apache/doris/common/Config.java +##################################################################### + +# the output dir of stderr and stdout +LOG_DIR = ${DORIS_HOME}/log + +DATE = `date +%Y%m%d-%H%M%S` +JAVA_OPTS="-Xmx4096m -XX:+UseMembar -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -Xloggc:$DORIS_HOME/log/fe.gc.log.$DATE" + +# For jdk 9+, this JAVA_OPTS will be used as default JVM options +JAVA_OPTS_FOR_JDK_9="-Xmx4096m -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -Xlog:gc*:$DORIS_HOME/log/fe.gc.log.$DATE:time" + +## +## the lowercase properties are read by main program. +## + +# INFO, WARN, ERROR, FATAL +sys_log_level = INFO + +# store metadata, must be created before start FE. +# Default value is ${DORIS_HOME}/doris-meta +# meta_dir = ${DORIS_HOME}/doris-meta + +http_port = 8030 +rpc_port = 9020 +query_port = 9030 +edit_log_port = 9010 +mysql_service_nio_enabled = true + +# Choose one if there are more than one ip except loopback address. +# Note that there should at most one ip match this list. +# If no ip match this rule, will choose one randomly. +# use CIDR format, e.g. 10.10.10.0/24 +# Default value is empty. +# priority_networks = 10.10.10.0/24;192.168.0.0/16 + +# Advanced configurations +# log_roll_size_mb = 1024 +# sys_log_dir = ${DORIS_HOME}/log + sys_log_roll_num = 1 +# sys_log_verbose_modules = +# audit_log_dir = ${DORIS_HOME}/log +# audit_log_modules = slow_query, query + audit_log_roll_num = 1 +# meta_delay_toleration_second = 10 + qe_max_connection = 65535 + max_conn_per_user = 1024 +# qe_query_timeout_second = 300 +# qe_slow_log_ms = 5000 + sys_log_delete_age=1d + audit_log_delete_age=3d + exec_mem_limit=8589934592 + tablet_create_timeout_second=30 + catalog_trash_expire_second = 60 + enable_batch_delete_by_default=true + max_layout_length_per_row=10000000 diff --git a/installer/dataease/templates/my.cnf b/installer/dataease/templates/my.cnf new file mode 100644 index 0000000000..dd636171bf --- /dev/null +++ b/installer/dataease/templates/my.cnf @@ -0,0 +1,28 @@ +[mysqld] +datadir=/var/lib/mysql + +default-storage-engine=INNODB +character_set_server=utf8 +lower_case_table_names=1 +table_open_cache=128 +max_connections=2000 +max_connect_errors=6000 +innodb_file_per_table=1 +innodb_buffer_pool_size=1G +max_allowed_packet=64M +transaction_isolation=READ-COMMITTED +innodb_flush_method=O_DIRECT +innodb_lock_wait_timeout=1800 +innodb_flush_log_at_trx_commit=0 +sync_binlog=0 +group_concat_max_len=1024000 + +sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION + +skip-name-resolve + +[mysql] +default-character-set=utf8 + +[mysql.server] +default-character-set=utf8 diff --git a/installer/dataease/templates/mysql.env b/installer/dataease/templates/mysql.env new file mode 100644 index 0000000000..01f3cfff8e --- /dev/null +++ b/installer/dataease/templates/mysql.env @@ -0,0 +1 @@ +MYSQL_ROOT_PASSWORD=${DE_MYSQL_PASSWORD} \ No newline at end of file diff --git a/installer/dataease/templates/version b/installer/dataease/templates/version new file mode 100644 index 0000000000..934e848a77 --- /dev/null +++ b/installer/dataease/templates/version @@ -0,0 +1 @@ +13_20180929_184557 diff --git a/installer/dataease/uninstall.sh b/installer/dataease/uninstall.sh new file mode 100644 index 0000000000..c771897068 --- /dev/null +++ b/installer/dataease/uninstall.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +DE_BASE=/opt + +read -r -p "即将卸载 DataEase 服务,包括删除运行目录、数据及相关镜像,是否继续? [Y/n] " input + +case $input in + [yY][eE][sS]|[yY]) + echo "Yes" + ;; + [nN][oO]|[nN]) + echo "No" + exit 1 + ;; + *) + echo "无效输入..." + exit 1 + ;; +esac + +if [ -f /usr/bin/dectl ]; then + # 获取已安装的 DataEase 的运行目录 + DE_BASE=$(grep "^DE_BASE=" /usr/bin/dectl | cut -d'=' -f2) +fi + +echo "停止 DataEase 服务" +dectl uninstall + +# 清理 DataEase 相关镜像 +if test ! -z "$(docker images -f dangling=true -q)"; then + echo "清理虚悬镜像" + docker rmi $(docker images -f dangling=true -q) +fi + +if test -n "$(docker images | grep 'registry.cn-qingdao.aliyuncs.com/dataease')"; then + echo "清理 DataEase 镜像" + docker rmi $(docker images | grep "registry.cn-qingdao.aliyuncs.com/dataease" | awk -F' ' '{print $1":"$2}') +fi + +# 清理 DataEase 运行目录及命令行工具 dectl +rm -rf ${DE_BASE}/dataease /usr/local/bin/dectl /usr/bin/dectl \ No newline at end of file diff --git a/installer/quick_start.sh b/installer/quick_start.sh new file mode 100644 index 0000000000..9b93a36850 --- /dev/null +++ b/installer/quick_start.sh @@ -0,0 +1,76 @@ +git_urls=('gitee.com' 'github.com') + +if [[ -x "$(command -v python)" ]];then + py_cmd='python' +elif [[ -x "$(command -v python3)" ]]; then + py_cmd='python3' +else + git_urls=('github.com') +fi + +for git_url in ${git_urls[*]} +do + success="true" + for i in {1..3} + do + echo -ne "检测 ${git_url} ... ${i} " + curl -m 5 -kIs https://${git_url} >/dev/null + if [ $? != 0 ];then + echo "failed" + success="false" + break + else + echo "ok" + fi + done + if [[ ${success} == "true" ]];then + server_url=${git_url} + break + fi +done + +if [[ "x${server_url}" == "x" ]];then + echo "没有找到稳定的下载服务器,请稍候重试" + exit 1 +fi + +echo "使用下载服务器 ${server_url}" + +if [[ "${server_url}" == "gitee.com" ]];then + owner='fit2cloud-feizhiyun' + repo='DataEase' + gitee_release_content=$(curl -s https://gitee.com/api/v5/repos/${owner}/${repo}/releases/latest) + # export LC_ALL="en_US.utf8" + DEVERSION=$($py_cmd -c "import json; obj=json.loads('$gitee_release_content', strict=False); print(obj['tag_name']);") +else + owner='dataease' + repo='dataease' + DEVERSION=$(curl -s https://api.github.com/repos/${owner}/${repo}/releases/latest | grep -e "\"tag_name\"" | sed -r 's/.*: "(.*)",/\1/') +fi + +if [[ "x${DEVERSION}" == "x" ]];then + echo "获取最新版本失败,请稍候重试" + exit 1 +fi + +echo "开始下载 DataEase ${DEVERSION} 版本在线安装包" +dataease_online_file_name="dataease-${DEVERSION}-online.tar.gz" +download_url="https://${server_url}/${owner}/${repo}/releases/download/${DEVERSION}/${dataease_online_file_name}" +echo "下载地址: ${download_url}" + +curl -LOk -m 60 -o ${dataease_online_file_name} ${download_url} + +if [ ! -f ${dataease_online_file_name} ];then + echo "下载在线安装包失败,请试试重新执行一次安装命令。" + exit 1 +fi + +tar zxvf ${dataease_online_file_name} +if [ $? != 0 ];then + echo "下载在线安装包失败,请试试重新执行一次安装命令。" + rm -f ${dataease_online_file_name} + exit 1 +fi +cd dataease-${DEVERSION}-online + +/bin/bash install.sh \ No newline at end of file