2023-10-23 22:00:14 +08:00
|
|
|
|
#!/bin/bash
|
|
|
|
|
action=$1
|
|
|
|
|
target=$2
|
|
|
|
|
|
|
|
|
|
DE_BASE=/opt
|
|
|
|
|
DE_RUNNING_BASE=${DE_BASE}/dataease2.0
|
|
|
|
|
need_init_apisix=false
|
|
|
|
|
compose_files="-f docker-compose.yml"
|
|
|
|
|
compose_cmd="docker-compose"
|
2024-01-22 18:23:07 +08:00
|
|
|
|
server_url=""
|
2024-01-22 15:26:28 +08:00
|
|
|
|
current_version=""
|
|
|
|
|
latest_version=""
|
2023-10-23 22:00:14 +08:00
|
|
|
|
|
|
|
|
|
set -a
|
|
|
|
|
source ${DE_RUNNING_BASE}/.env
|
|
|
|
|
set +a
|
|
|
|
|
export COMPOSE_HTTP_TIMEOUT=180
|
|
|
|
|
|
|
|
|
|
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_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: "
|
2024-02-05 16:19:12 +08:00
|
|
|
|
echo " status 查看 DATAEASE 服务运行状态"
|
|
|
|
|
echo " start 启动 DATAEASE 服务"
|
|
|
|
|
echo " stop 停止 DATAEASE 服务"
|
|
|
|
|
echo " restart 重启 DATAEASE 服务"
|
|
|
|
|
echo " reload 重新加载 DATAEASE 服务"
|
|
|
|
|
echo " upgrade 升级 DATAEASE 服务"
|
|
|
|
|
echo " backup 备份 DATAEASE 服务"
|
|
|
|
|
echo " restore xxx.tar.gz 还原 DATAEASE 服务"
|
|
|
|
|
echo " clear-images 清理 DATAEASE 旧版本的相关镜像"
|
|
|
|
|
echo " version 查看 DATAEASE 版本"
|
2023-10-23 22:00:14 +08:00
|
|
|
|
}
|
2023-12-18 18:04:11 +08:00
|
|
|
|
function _generate_compose_file_args() {
|
|
|
|
|
if [[ $DE_INSTALL_MODE != "community" ]];then
|
2024-03-12 15:51:25 +08:00
|
|
|
|
compose_files="${compose_files} -f docker-compose-apisix.yml"
|
|
|
|
|
if [[ -f $DE_RUNNING_BASE/docker-compose-task.yml ]];then
|
|
|
|
|
compose_files="${compose_files} -f docker-compose-task.yml"
|
|
|
|
|
fi
|
2023-12-18 18:04:11 +08:00
|
|
|
|
fi
|
|
|
|
|
}
|
2023-10-23 22:00:14 +08:00
|
|
|
|
function _check_apisix_init() {
|
2023-11-01 14:59:43 +08:00
|
|
|
|
if [[ $DE_INSTALL_MODE != "community" ]];then
|
2023-10-23 22:00:14 +08:00
|
|
|
|
_prepare_apisix
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
function _prepare_apisix() {
|
|
|
|
|
if [[ -z $DE_APISIX_KEY ]];then
|
|
|
|
|
need_init_apisix=true
|
|
|
|
|
DE_APISIX_KEY=$(uuidgen | sed 's/-//g')
|
|
|
|
|
export DE_APISIX_KEY=$DE_APISIX_KEY
|
|
|
|
|
cd $DE_RUNNING_BASE
|
|
|
|
|
env | grep DE_ >.env
|
|
|
|
|
sed -i -e "s/DE_APISIX_KEY/${DE_APISIX_KEY}/g" $DE_RUNNING_BASE/apisix/apisix_conf/config.yaml
|
2023-11-01 10:52:51 +08:00
|
|
|
|
sed -i -e "s/DE_APISIX_KEY/${DE_APISIX_KEY}/g" $DE_RUNNING_BASE/conf/application.yml
|
2023-10-23 22:00:14 +08:00
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
function _init_apisix() {
|
|
|
|
|
DE_APISIX_KEY=$DE_APISIX_KEY sh $DE_RUNNING_BASE/bin/apisix/init.sh
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function _healthcheck() {
|
|
|
|
|
echo
|
2023-11-07 17:23:07 +08:00
|
|
|
|
container_name=$(grep "container_name" $DE_RUNNING_BASE/docker-compose.yml | awk -F': ' '{print $2}')
|
|
|
|
|
sleep 1
|
|
|
|
|
if [ -z $(docker ps --filter "name=$container_name" -q) ];then
|
2023-11-07 17:28:16 +08:00
|
|
|
|
echo "未找到容器 $container_name。"
|
2023-11-07 17:23:07 +08:00
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
for b in {1..90}
|
2023-10-23 22:00:14 +08:00
|
|
|
|
do
|
2023-11-07 17:23:07 +08:00
|
|
|
|
sleep 1
|
|
|
|
|
read status healthy<<<$(docker inspect $container_name --format '{{.State.Status}} {{.State.Health.Status}}')
|
|
|
|
|
if [[ "$healthy" == "starting" ]];then
|
|
|
|
|
printf "\rDataEase 服务状态 : 正在启动 ... %3ds" $b
|
|
|
|
|
elif [[ "$status" == "running" ]] && [[ "$healthy" == "healthy" ]];then
|
|
|
|
|
printf "\rDataEase 服务状态 : 正常运行 "
|
|
|
|
|
echo
|
|
|
|
|
return;
|
2023-10-23 22:00:14 +08:00
|
|
|
|
else
|
2023-11-07 17:23:07 +08:00
|
|
|
|
echo
|
2023-10-23 22:00:14 +08:00
|
|
|
|
echo -e "DataEase 服务状态 : \033[31m无法访问\033[0m"
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
done
|
|
|
|
|
echo
|
2023-11-07 17:23:07 +08:00
|
|
|
|
echo "【警告】服务在等待时间内未完全启动!请稍后使用 dectl status 检查服务运行状况。"
|
|
|
|
|
echo
|
2023-10-23 22:00:14 +08:00
|
|
|
|
}
|
|
|
|
|
function _get_current_version() {
|
2023-11-01 10:11:37 +08:00
|
|
|
|
de_current_version=$(grep "^ image:.*dataease:" ${DE_RUNNING_BASE}/docker-compose.yml | awk -F'dataease:' '{print $2}')
|
2024-01-22 15:26:28 +08:00
|
|
|
|
if test -z $de_current_version; then
|
|
|
|
|
echo "获取当前版本失败,请检查当前版本是否正确"
|
|
|
|
|
exit 1
|
2023-10-23 22:00:14 +08:00
|
|
|
|
fi
|
2024-01-22 15:26:28 +08:00
|
|
|
|
current_version=$de_current_version
|
2023-10-23 22:00:14 +08:00
|
|
|
|
}
|
2024-01-22 15:26:28 +08:00
|
|
|
|
function _get_available_server() {
|
2023-11-02 12:02:58 +08:00
|
|
|
|
git_urls=('github.com')
|
2023-10-23 22:00:14 +08:00
|
|
|
|
|
2024-01-22 18:23:07 +08:00
|
|
|
|
for git_url in ${git_urls[*]}; do
|
2024-01-22 15:26:28 +08:00
|
|
|
|
echo -ne "检测 ${git_url} ... "
|
|
|
|
|
curl -m 5 -kIs https://${git_url} >/dev/null
|
|
|
|
|
if [ $? != 0 ]; then
|
|
|
|
|
echo "failed"
|
|
|
|
|
else
|
|
|
|
|
echo "ok"
|
2023-10-23 22:00:14 +08:00
|
|
|
|
server_url=${git_url}
|
|
|
|
|
break
|
|
|
|
|
fi
|
|
|
|
|
done
|
2024-01-22 15:26:28 +08:00
|
|
|
|
}
|
|
|
|
|
function _get_latest_version() {
|
2023-10-23 22:00:14 +08:00
|
|
|
|
rm -f /tmp/de_latest_release
|
2024-01-22 15:26:28 +08:00
|
|
|
|
|
2024-01-22 18:23:07 +08:00
|
|
|
|
_get_available_server
|
|
|
|
|
if [[ "x${server_url}" == "x" ]];then
|
|
|
|
|
echo "无法连接版本服务器,请稍候重试"
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if [[ -x "$(command -v python)" ]]; then
|
|
|
|
|
py_cmd='python'
|
|
|
|
|
elif [[ -x "$(command -v python3)" ]]; then
|
|
|
|
|
py_cmd='python3'
|
|
|
|
|
fi
|
|
|
|
|
|
2023-10-23 22:00:14 +08:00
|
|
|
|
$py_cmd - <<EOF
|
|
|
|
|
# -*- coding: UTF-8 -*-
|
|
|
|
|
import os
|
|
|
|
|
import json
|
|
|
|
|
import re
|
|
|
|
|
|
|
|
|
|
latest_release=""
|
|
|
|
|
release_pattern="v2\.\d+\.\d+$"
|
|
|
|
|
|
|
|
|
|
def get_releases(page):
|
|
|
|
|
try:
|
2024-01-22 15:26:28 +08:00
|
|
|
|
releases=os.popen("curl -s https://api.github.com/repos/dataease/dataease/releases?page=%d" % (page)).read()
|
2023-10-23 22:00:14 +08:00
|
|
|
|
releases=[ x["name"] for x in json.loads(releases) if x["prerelease"] == False ]
|
|
|
|
|
except Exception as e:
|
|
|
|
|
print(str(e))
|
2023-12-19 15:26:54 +08:00
|
|
|
|
print("Failed to obtain Release information, please check the network.")
|
2023-10-23 22:00:14 +08:00
|
|
|
|
exit(1)
|
|
|
|
|
else:
|
|
|
|
|
for release in releases:
|
|
|
|
|
if re.search(release_pattern,release) != None:
|
|
|
|
|
return release
|
|
|
|
|
|
|
|
|
|
page = 1
|
|
|
|
|
while (page <= 3):
|
|
|
|
|
latest_release = get_releases(page)
|
|
|
|
|
if (latest_release != "" and latest_release != None):
|
|
|
|
|
break
|
|
|
|
|
page += 1
|
|
|
|
|
|
|
|
|
|
if latest_release == None or latest_release == "":
|
2023-12-19 15:26:54 +08:00
|
|
|
|
print("Failed to obtain latest version, please try again.")
|
2023-10-23 22:00:14 +08:00
|
|
|
|
exit(1)
|
|
|
|
|
|
|
|
|
|
# 记录最新版本号
|
|
|
|
|
os.popen("echo "+latest_release+" > /tmp/de_latest_release")
|
|
|
|
|
EOF
|
|
|
|
|
|
|
|
|
|
if [ ! -f /tmp/de_latest_release ]; then
|
|
|
|
|
echo "获取最新版本失败,请检查网络连接是否正常"
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
latest_version=$(cat /tmp/de_latest_release)
|
2024-01-22 15:26:28 +08:00
|
|
|
|
}
|
|
|
|
|
function status() {
|
|
|
|
|
echo
|
|
|
|
|
echo "DataEase 容器运行状态"
|
|
|
|
|
_generate_compose_file_args
|
|
|
|
|
cd ${DE_RUNNING_BASE}
|
|
|
|
|
${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_RUNNING_BASE}/logs/
|
|
|
|
|
|
|
|
|
|
echo
|
|
|
|
|
echo "DataEase 运行目录及文件大小 : "
|
|
|
|
|
du -sh ${DE_BASE}
|
|
|
|
|
echo
|
|
|
|
|
echo "DataEase 运行目录使用情况 : "
|
|
|
|
|
df -H ${DE_BASE}
|
|
|
|
|
|
|
|
|
|
_healthcheck
|
|
|
|
|
}
|
|
|
|
|
function start() {
|
|
|
|
|
echo
|
|
|
|
|
_check_apisix_init
|
2024-02-08 11:35:12 +08:00
|
|
|
|
_generate_compose_file_args
|
2024-01-22 15:26:28 +08:00
|
|
|
|
cd ${DE_RUNNING_BASE}
|
|
|
|
|
${compose_cmd} ${compose_files} up -d
|
|
|
|
|
_healthcheck
|
|
|
|
|
if [ $? -eq 0 ] && [[ $need_init_apisix = true ]]; then
|
|
|
|
|
_init_apisix
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
function stop() {
|
|
|
|
|
echo
|
|
|
|
|
_generate_compose_file_args
|
|
|
|
|
cd ${DE_RUNNING_BASE}
|
|
|
|
|
${compose_cmd} ${compose_files} down -v ${target}
|
|
|
|
|
}
|
|
|
|
|
function restart() {
|
|
|
|
|
stop
|
|
|
|
|
start
|
|
|
|
|
}
|
|
|
|
|
function reload() {
|
|
|
|
|
start
|
|
|
|
|
}
|
|
|
|
|
function version() {
|
|
|
|
|
echo
|
|
|
|
|
_get_current_version
|
|
|
|
|
echo "current version is $current_version"
|
2024-01-23 14:57:36 +08:00
|
|
|
|
_get_latest_version
|
2024-01-22 18:23:07 +08:00
|
|
|
|
echo "latest version is $latest_version"
|
2024-01-22 15:26:28 +08:00
|
|
|
|
}
|
|
|
|
|
function upgrade() {
|
2024-01-22 18:23:07 +08:00
|
|
|
|
version
|
2024-01-22 15:26:28 +08:00
|
|
|
|
|
2023-10-23 22:00:14 +08:00
|
|
|
|
if [ "${latest_version}" = "" ]; then
|
|
|
|
|
echo "未获取到最新版本"
|
|
|
|
|
exit 1
|
2024-01-22 15:26:28 +08:00
|
|
|
|
elif [ "${latest_version}" = "${current_version}" ]; then
|
2023-10-23 22:00:14 +08:00
|
|
|
|
echo "最新版本与当前版本一致,退出升级过程"
|
|
|
|
|
exit 0
|
|
|
|
|
else
|
2024-01-22 18:23:07 +08:00
|
|
|
|
if [[ ! "$latest_version" =~ ^v2.* ]];then
|
|
|
|
|
echo "获取到的最新版本与当前版本不匹配,请访问 https://community.fit2cloud.com/#/products/dataease/downloads 下载离线安装包"
|
|
|
|
|
exit 1
|
|
|
|
|
else
|
|
|
|
|
echo "检测到 ${server_url} 上最新版本为 ${latest_version} 即将执行在线升级..."
|
|
|
|
|
fi
|
2023-10-23 22:00:14 +08:00
|
|
|
|
fi
|
|
|
|
|
sleep 2
|
|
|
|
|
|
|
|
|
|
echo "开始下载最新版本..."
|
|
|
|
|
echo "使用下载服务器 ${server_url}"
|
|
|
|
|
cd /tmp
|
|
|
|
|
|
2024-03-07 10:24:50 +08:00
|
|
|
|
installer_file="dataease-online-installer-${latest_version}-ce.tar.gz"
|
2024-01-22 15:26:28 +08:00
|
|
|
|
download_url="https://${server_url}/dataease/dataease/releases/download/${latest_version}/$installer_file"
|
2023-10-23 22:00:14 +08:00
|
|
|
|
curl -LOk -m 60 -o $installer_file $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"
|
2024-01-22 15:26:28 +08:00
|
|
|
|
exit 1
|
2023-10-23 22:00:14 +08:00
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if [ ! -f $installer_file ]; then
|
|
|
|
|
echo "下载在线安装包失败,请试试重新执行一次安装命令。"
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
2024-02-07 14:38:18 +08:00
|
|
|
|
tar zxf $installer_file
|
2023-10-23 22:00:14 +08:00
|
|
|
|
if [ $? != 0 ]; then
|
|
|
|
|
echo "下载在线安装包失败,请试试重新执行一次安装命令。"
|
|
|
|
|
rm -f $installer_file
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
2023-12-19 15:26:54 +08:00
|
|
|
|
cd ${installer_file%.tar.gz}
|
2023-10-23 22:00:14 +08:00
|
|
|
|
/bin/bash install.sh
|
|
|
|
|
|
|
|
|
|
cd ..
|
|
|
|
|
rm -rf /tmp/${installer_file%.*}
|
|
|
|
|
}
|
|
|
|
|
function clear_images() {
|
|
|
|
|
echo
|
|
|
|
|
for f in $DE_RUNNING_BASE/*.yml; do
|
|
|
|
|
[[ -e "$f" ]] || break
|
|
|
|
|
grep "^ image:.*:" "$f" | uniq | while read -r component_image_defined; do
|
|
|
|
|
component_version=$(echo ${component_image_defined} | awk -F":" '{print $3}' | uniq)
|
|
|
|
|
component_image=$(echo ${component_image_defined} | awk -F'image: ' '{print $2}' | awk -F':' '{print $1}')
|
|
|
|
|
|
|
|
|
|
if test -z $(docker images | grep "$component_image" | grep -v " $component_version "); then
|
|
|
|
|
echo "$component_image 不存在旧版本镜像"
|
|
|
|
|
else
|
|
|
|
|
echo "存在旧版本镜像 : "
|
|
|
|
|
docker images | grep "$component_image" | grep -v " $component_version "
|
|
|
|
|
echo "清理${component}镜像"
|
|
|
|
|
docker rmi $(docker images | grep "$component_image" | grep -v " $component_version " | awk -F' ' '{print $1":"$2}')
|
|
|
|
|
echo "清理完毕"
|
|
|
|
|
fi
|
|
|
|
|
done
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
if [ $(docker images -f dangling=true -q | wc -l) -gt 0 ]; then
|
|
|
|
|
echo "清理虚悬镜像"
|
|
|
|
|
docker rmi $(docker images -f dangling=true -q)
|
|
|
|
|
echo "清理完毕"
|
|
|
|
|
fi
|
|
|
|
|
}
|
2024-02-05 16:19:12 +08:00
|
|
|
|
function backup() {
|
|
|
|
|
backup_file_name=dataease-backup-$(date +%Y%m%d)_$(date +%H%M%S).tar.gz
|
|
|
|
|
tar --exclude=logs/dataease -zcf $backup_file_name -C $DE_RUNNING_BASE .
|
|
|
|
|
if [ $? -ne 0 ]; then
|
|
|
|
|
echo "备份失败"
|
|
|
|
|
exit 1
|
|
|
|
|
else
|
|
|
|
|
echo "备份成功,备份文件 : $backup_file_name"
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
function restore() {
|
|
|
|
|
if [[ -z $target ]];then
|
|
|
|
|
echo "未指定需要恢复的备份文件!"
|
|
|
|
|
exit 1
|
|
|
|
|
elif [[ -f $target ]];then
|
|
|
|
|
service dataease stop
|
|
|
|
|
if [[ ! -d $DE_RUNNING_BASE ]];then
|
|
|
|
|
mkdir -p $DE_RUNNING_BASE
|
|
|
|
|
fi
|
|
|
|
|
echo "恢复备份 $target"
|
|
|
|
|
tar -zxf $target --directory=$DE_RUNNING_BASE
|
|
|
|
|
service dataease start
|
|
|
|
|
else
|
|
|
|
|
echo "未找到备份文件 $target!"
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
}
|
2023-10-23 22:00:14 +08:00
|
|
|
|
function main() {
|
|
|
|
|
case "${action}" in
|
|
|
|
|
status)
|
|
|
|
|
status
|
|
|
|
|
;;
|
|
|
|
|
start)
|
|
|
|
|
start
|
|
|
|
|
;;
|
|
|
|
|
stop)
|
|
|
|
|
stop
|
|
|
|
|
;;
|
|
|
|
|
restart)
|
|
|
|
|
restart
|
|
|
|
|
;;
|
|
|
|
|
reload)
|
|
|
|
|
reload
|
|
|
|
|
;;
|
|
|
|
|
upgrade)
|
|
|
|
|
upgrade
|
|
|
|
|
;;
|
2024-02-05 16:19:12 +08:00
|
|
|
|
backup)
|
|
|
|
|
backup
|
|
|
|
|
;;
|
|
|
|
|
restore)
|
|
|
|
|
restore $target
|
|
|
|
|
;;
|
2023-10-23 22:00:14 +08:00
|
|
|
|
clear-images)
|
|
|
|
|
clear_images
|
|
|
|
|
;;
|
|
|
|
|
version)
|
|
|
|
|
version
|
|
|
|
|
;;
|
|
|
|
|
help)
|
|
|
|
|
usage
|
|
|
|
|
;;
|
|
|
|
|
--help)
|
|
|
|
|
usage
|
|
|
|
|
;;
|
|
|
|
|
*)
|
|
|
|
|
echo "不支持的参数,请使用 help 或 --help 参数获取帮助"
|
|
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
}
|
|
|
|
|
main
|