#!/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