first commit
0 parents
Showing
6 changed files
with
599 additions
and
0 deletions
README.md
0 → 100644
| 1 | ## 1.目录结构 | ||
| 2 | ``` | ||
| 3 | . | ||
| 4 | ├── bin | ||
| 5 | │ ├── conf.sh | ||
| 6 | │ ├── control.sh 运维操作脚本 | ||
| 7 | │ ├── docker.sh | ||
| 8 | │ └── utils.sh | ||
| 9 | ├── configs | ||
| 10 | │ └── settings.sh 配置文件 | ||
| 11 | │ └── license 授权文件目录 | ||
| 12 | ├── logs 日志文件目录 | ||
| 13 | └── repo | ||
| 14 | ├── images docker镜像文件目录 | ||
| 15 | ├── models | ||
| 16 | └── python | ||
| 17 | ``` | ||
| 18 | --- | ||
| 19 | |||
| 20 | ## 2.服务部署 | ||
| 21 | |||
| 22 | ### 2.1 授权管理 | ||
| 23 | - 获取服务器信息,发给授权人员生成授权文件(已有授权文件忽略此步骤) | ||
| 24 | ```shell | ||
| 25 | bin/control.sh systeminfo | ||
| 26 | ``` | ||
| 27 | - 授权文件更新 | ||
| 28 | ```shell | ||
| 29 | bin/control.sh update_license /path_to/xxx.secret | ||
| 30 | ``` | ||
| 31 | |||
| 32 | ### 2.2 配置文件 | ||
| 33 | - 编辑`configs/settings.sh` | ||
| 34 | ``` | ||
| 35 | # 日志目录 | ||
| 36 | LOG_BASE_DIR=${BASE_DIR}/logs | ||
| 37 | |||
| 38 | # 端口 | ||
| 39 | BACKEND_PORT=80 | ||
| 40 | # TODO 此端口随机,不需要配置 | ||
| 41 | TRITON_HTTP_PORT=8000 | ||
| 42 | TRITON_GRPC_PORT=8001 | ||
| 43 | TRITON_METRICS_PORT=8002 | ||
| 44 | |||
| 45 | # sanic-worker TODO 可配置 | ||
| 46 | BACKEND_SANIC_WORKER_NUM=4 | ||
| 47 | |||
| 48 | # GPU/CPU | ||
| 49 | # 使用CPU: TRITON_GPUS= | ||
| 50 | # 使用GPU0/GPU1: TRITON_GPUS=0,1 | ||
| 51 | TRITON_GPUS=0 | ||
| 52 | ``` | ||
| 53 | |||
| 54 | ### 2.3 启动 | ||
| 55 | ```shell | ||
| 56 | bin/control.sh start all | ||
| 57 | ``` | ||
| 58 | |||
| 59 | ### 2.4 停止 | ||
| 60 | ```shell | ||
| 61 | bin/control.sh stop all | ||
| 62 | ``` | ||
| 63 | |||
| 64 | ### 2.5 重启 | ||
| 65 | - 重启后端服务,适用于只更新了授权文件 | ||
| 66 | ```shell | ||
| 67 | bin/control.sh restart backend | ||
| 68 | ``` | ||
| 69 | - 重启所有,适用于更新了repo文件夹 | ||
| 70 | ```shell | ||
| 71 | bin/control.sh restart all | ||
| 72 | ``` | ||
| 73 | |||
| 74 | ### 2.6 日志查看 | ||
| 75 | ```shell | ||
| 76 | bin/control.sh logs triton | ||
| 77 | bin/control.sh logs backend | ||
| 78 | ``` | ||
| 79 | |||
| 80 | ## TODO | ||
| 81 | - 授权部分 | ||
| 82 | - backend logs | ||
| 83 | - backend sanic worker num可配置 | ||
| 84 | - 随机选择triton端口,该配置项无意义 | ||
| 85 | - ASGI & supervisor ? | ||
| 86 | - async ? | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
bin/conf.sh
0 → 100644
| 1 | #!/bin/bash | ||
| 2 | set -euo pipefail | ||
| 3 | |||
| 4 | # shellcheck is a shell lint | ||
| 5 | # shellcheck disable=SC1091 | ||
| 6 | # shellcheck disable=SC1090 | ||
| 7 | source "${_BIN_DIR}/utils.sh" | ||
| 8 | |||
| 9 | # 目录相关 | ||
| 10 | # 配置文件目录 | ||
| 11 | CONFIG_DIR=${BASE_DIR}/configs | ||
| 12 | # 授权文件目录 | ||
| 13 | LICENSE_DIR=${CONFIG_DIR}/license | ||
| 14 | REPO_DIR=${BASE_DIR}/repo | ||
| 15 | # docker镜像目录 | ||
| 16 | DOCKER_IMAGE_DIR=${REPO_DIR}/images | ||
| 17 | # 模型与代码相关目录 | ||
| 18 | BACKEND_PYTHON_DIR=${REPO_DIR}/python | ||
| 19 | TRITON_MODEL_DIR=${REPO_DIR}/models | ||
| 20 | |||
| 21 | # docker相关 | ||
| 22 | # triton相关 | ||
| 23 | TRITON_CONTAINER_NAME=tritonserver | ||
| 24 | TRITON_IMAGE_NAME=tritonserver | ||
| 25 | TRITON_IMAGE_TAG=1.0 | ||
| 26 | TRITON_IMAGE=${TRITON_IMAGE_NAME}:${TRITON_IMAGE_TAG} | ||
| 27 | TRITON_IMAGE_SAVE_NAME=tritonserver-tf2-pt.tar | ||
| 28 | TRITON_IMAGE_SAVE_PATH=${DOCKER_IMAGE_DIR}/${TRITON_IMAGE_SAVE_NAME} | ||
| 29 | # 工程相关 | ||
| 30 | BACKEND_CONTAINER_NAME=situ-ocr | ||
| 31 | BACKEND_IMAGE_NAME=situ-ocr | ||
| 32 | BACKEND_IMAGE_TAG=1.0 | ||
| 33 | BACKEND_IMAGE=${BACKEND_IMAGE_NAME}:${BACKEND_IMAGE_TAG} | ||
| 34 | BACKEND_IMAGE_SAVE_NAME=situ-ocr.tar | ||
| 35 | BACKEND_IMAGE_SAVE_PATH=${DOCKER_IMAGE_DIR}/${BACKEND_IMAGE_SAVE_NAME} | ||
| 36 | |||
| 37 | # 加载配置数据 | ||
| 38 | _config_file_path="${CONFIG_DIR}/settings.sh" | ||
| 39 | |||
| 40 | if [ -f "${_config_file_path}" ]; then | ||
| 41 | # shellcheck disable=SC1091 | ||
| 42 | # shellcheck disable=SC1090 | ||
| 43 | source "${_config_file_path}" | ||
| 44 | else | ||
| 45 | _notify ERROR "config file <${_config_file_path}> does not exist" | ||
| 46 | exit 1 | ||
| 47 | fi | ||
| 48 | |||
| 49 | # 这些配置依赖configs/settings.sh, 所以需要放在source之后 | ||
| 50 | # TRITON容器启动参数相关 | ||
| 51 | # -env | ||
| 52 | TRITON_CONTAINER_ENVS=() | ||
| 53 | TRITON_ENVS_OPTION="" | ||
| 54 | if (( ${#TRITON_CONTAINER_ENVS[@]} > 0 )); then | ||
| 55 | checkEnvsOption ${TRITON_CONTAINER_ENVS[@]} | ||
| 56 | TRITON_ENVS_OPTION="$(getOption "-env" ${TRITON_CONTAINER_ENVS[@]})" | ||
| 57 | fi | ||
| 58 | # -v | ||
| 59 | TRITON_CONTAINER_MODEL_DIR=/models | ||
| 60 | TRITON_CONTAINER_VOLUMES=( | ||
| 61 | "${TRITON_MODEL_DIR}:${TRITON_CONTAINER_MODEL_DIR}" | ||
| 62 | ) | ||
| 63 | TRITON_VOLUMES_OPTION="" | ||
| 64 | if (( ${#TRITON_CONTAINER_VOLUMES[@]} > 0 )); then | ||
| 65 | checkVolumesOption ${TRITON_CONTAINER_VOLUMES[@]} | ||
| 66 | TRITON_VOLUMES_OPTION="$(getOption "-v" ${TRITON_CONTAINER_VOLUMES[@]})" | ||
| 67 | fi | ||
| 68 | # -p | ||
| 69 | TRITON_CONTAINER_PORTS=( | ||
| 70 | "${TRITON_HTTP_PORT}:8000" | ||
| 71 | "${TRITON_GRPC_PORT}:8001" | ||
| 72 | "${TRITON_METRICS_PORT}:8002" | ||
| 73 | ) | ||
| 74 | TRITON_PORTS_OPTION="" | ||
| 75 | if (( ${#TRITON_CONTAINER_PORTS[@]} > 0 )); then | ||
| 76 | checkPortUsedStatus ${TRITON_CONTAINER_PORTS[@]} | ||
| 77 | TRITON_PORTS_OPTION="$(getOption "-p" ${TRITON_CONTAINER_PORTS[@]})" | ||
| 78 | fi | ||
| 79 | # --gpus | ||
| 80 | TRITON_GPUS_OPTION="" | ||
| 81 | if [ $TRITON_GPUS ]; then | ||
| 82 | TRITON_GPUS_OPTION="--gpus \"device=${TRITON_GPUS}\"" | ||
| 83 | fi | ||
| 84 | # -env -v -p --gpus --model-repository | ||
| 85 | TRITON_OPTIONS="${TRITON_ENVS_OPTION} ${TRITON_VOLUMES_OPTION} ${TRITON_PORTS_OPTION} ${TRITON_GPUS_OPTION} --model-repository=${TRITON_CONTAINER_MODEL_DIR}" | ||
| 86 | |||
| 87 | # BACKEND容器启动参数相关 | ||
| 88 | # -env | ||
| 89 | BACKEND_CONTAINER_ENVS=( | ||
| 90 | "WORKER_NUM=${BACKEND_WORKER_NUM}" | ||
| 91 | ) | ||
| 92 | BACKEND_ENVS_OPTION="" | ||
| 93 | if (( ${#BACKEND_CONTAINER_ENVS[@]} > 0 )); then | ||
| 94 | checkEnvsOption ${BACKEND_CONTAINER_ENVS[@]} | ||
| 95 | BACKEND_ENVS_OPTION="$(getOption "-env" ${BACKEND_CONTAINER_ENVS[@]})" | ||
| 96 | fi | ||
| 97 | # -v | ||
| 98 | BACKEND_CONTAINER_VOLUMES=( | ||
| 99 | "${LOG_BASE_DIR}:/logs" | ||
| 100 | ) | ||
| 101 | BACKEND_VOLUMES_OPTION="" | ||
| 102 | if (( ${#BACKEND_CONTAINER_VOLUMES[@]} > 0 )); then | ||
| 103 | checkVolumesOption ${BACKEND_CONTAINER_VOLUMES[@]} | ||
| 104 | BACKEND_VOLUMES_OPTION="$(getOption "-v" ${BACKEND_CONTAINER_VOLUMES[@]})" | ||
| 105 | fi | ||
| 106 | # -p | ||
| 107 | BACKEND_CONTAINER_PORTS=( | ||
| 108 | "${BACKEND_PORT}:9002" | ||
| 109 | ) | ||
| 110 | BACKEND_PORTS_OPTION="" | ||
| 111 | if (( ${#BACKEND_CONTAINER_PORTS[@]} > 0 )); then | ||
| 112 | checkPortUsedStatus ${BACKEND_CONTAINER_PORTS[@]} | ||
| 113 | BACKEND_PORTS_OPTION="$(getOption "-p" ${BACKEND_CONTAINER_PORTS[@]})" | ||
| 114 | fi | ||
| 115 | # -env -v -p | ||
| 116 | BACKEND_OPTIONS="${BACKEND_ENVS_OPTION} ${BACKEND_VOLUMES_OPTION} ${BACKEND_PORTS_OPTION}" | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
bin/control.sh
0 → 100755
| 1 | #/bin/bash | ||
| 2 | set -euo pipefail | ||
| 3 | |||
| 4 | _BIN_DIR=$(dirname "$(readlink -f "$0")") | ||
| 5 | BASE_DIR=$(dirname "${_BIN_DIR}") | ||
| 6 | |||
| 7 | # shellcheck disable=SC1091 | ||
| 8 | # shellcheck disable=SC1090 | ||
| 9 | source "${_BIN_DIR}/conf.sh" | ||
| 10 | # shellcheck disable=SC1091 | ||
| 11 | # shellcheck disable=SC1090 | ||
| 12 | source "${_BIN_DIR}/docker.sh" | ||
| 13 | |||
| 14 | function _control_triton(){ | ||
| 15 | cat <<END | ||
| 16 | |||
| 17 | triton settings: | ||
| 18 | TRITON_IMAGE: ${TRITON_IMAGE} | ||
| 19 | TRITON_CONTAINER_NAME: ${TRITON_CONTAINER_NAME} | ||
| 20 | TRITON_OPTIONS: ${TRITON_OPTIONS} | ||
| 21 | TRITON_IMAGE_SAVE_PATH: ${TRITON_IMAGE_SAVE_PATH} | ||
| 22 | |||
| 23 | END | ||
| 24 | case "${1:-help}" in | ||
| 25 | start) _docker_func start "${TRITON_IMAGE}" "${TRITON_CONTAINER_NAME}" "${TRITON_OPTIONS}" "${TRITON_IMAGE_SAVE_PATH}" ;; | ||
| 26 | stop) _docker_func stop "${TRITON_CONTAINER_NAME}" ;; | ||
| 27 | restart) _docker_func restart "${TRITON_CONTAINER_NAME}" ;; | ||
| 28 | rm) _docker_func rm "${TRITON_CONTAINER_NAME}" ;; | ||
| 29 | inside) _docker_func inside "${TRITON_CONTAINER_NAME}" ;; | ||
| 30 | top) _docker_func top "${TRITON_CONTAINER_NAME}" ;; | ||
| 31 | dlogs) _docker_func logs "${TRITON_CONTAINER_NAME}" ;; | ||
| 32 | logs) _docker_func logs "${TRITON_CONTAINER_NAME}" ;; | ||
| 33 | is_running) _docker_func is_running "${TRITON_CONTAINER_NAME}" ;; | ||
| 34 | debug) _docker_func debug "${TRITON_IMAGE}" "${TRITON_CONTAINER_NAME}" "${TRITON_OPTIONS}" ;; | ||
| 35 | # 其他 | ||
| 36 | *) _echo_help_message ;; | ||
| 37 | esac | ||
| 38 | } | ||
| 39 | |||
| 40 | function _control_backend(){ | ||
| 41 | cat <<END | ||
| 42 | |||
| 43 | backend settings: | ||
| 44 | BACKEND_IMAGE: ${BACKEND_IMAGE} | ||
| 45 | BACKEND_CONTAINER_NAME: ${BACKEND_CONTAINER_NAME} | ||
| 46 | BACKEND_OPTIONS: ${BACKEND_OPTIONS} | ||
| 47 | BACKEND_IMAGE_SAVE_PATH: ${BACKEND_IMAGE_SAVE_PATH} | ||
| 48 | |||
| 49 | END | ||
| 50 | case "${1:-help}" in | ||
| 51 | start) _docker_func start "${BACKEND_IMAGE}" "${BACKEND_CONTAINER_NAME}" "${BACKEND_OPTIONS}" "${BACKEND_IMAGE_SAVE_PATH}" ;; | ||
| 52 | stop) _docker_func stop "${BACKEND_CONTAINER_NAME}" ;; | ||
| 53 | restart) _docker_func restart "${BACKEND_CONTAINER_NAME}" ;; | ||
| 54 | rm) _docker_func rm "${BACKEND_CONTAINER_NAME}" ;; | ||
| 55 | inside) _docker_func inside "${BACKEND_CONTAINER_NAME}" ;; | ||
| 56 | top) _docker_func top "${BACKEND_CONTAINER_NAME}" ;; | ||
| 57 | dlogs) _docker_func logs "${BACKEND_CONTAINER_NAME}" ;; | ||
| 58 | is_running) _docker_func is_running "${BACKEND_CONTAINER_NAME}" ;; | ||
| 59 | debug) _docker_func debug "${BACKEND_IMAGE}" "${BACKEND_CONTAINER_NAME}" "${BACKEND_OPTIONS}" ;; | ||
| 60 | # 其他 | ||
| 61 | *) _echo_help_message ;; | ||
| 62 | esac | ||
| 63 | } | ||
| 64 | |||
| 65 | function _control_all(){ | ||
| 66 | case "${1:-help}" in | ||
| 67 | start) _control_triton start && _control_backend start ;; | ||
| 68 | stop) _control_triton stop && _control_backend stop ;; | ||
| 69 | restart) _control_triton restart && _control_backend restart ;; | ||
| 70 | rm) _control_triton rm && _control_backend rm ;; | ||
| 71 | # 其他 | ||
| 72 | *) _echo_help_message ;; | ||
| 73 | esac | ||
| 74 | } | ||
| 75 | |||
| 76 | # 更新授权文件 | ||
| 77 | function _updateLincese(){ | ||
| 78 | local license_file="$1" | ||
| 79 | if ! [ -e "${license_file}" ]; | ||
| 80 | then | ||
| 81 | _notify ERROR "license file <${license_file}> does not exist" ; | ||
| 82 | exit 1 | ||
| 83 | fi | ||
| 84 | |||
| 85 | local target_file=${LICENSE_DIR}/$(basename ${license_file}) | ||
| 86 | if [ -e "${target_file}" ]; | ||
| 87 | then | ||
| 88 | now=$(date +%Y-%m-%d_%H:%M:%S) | ||
| 89 | backup_path="${target_file}__backup_${now}" | ||
| 90 | mv "${target_file}" "${backup_path}" | ||
| 91 | _notify SUCCESS "\"${target_file}\" already exists, mv to ${backup_path}" | ||
| 92 | fi | ||
| 93 | |||
| 94 | cp "${license_file}" "${LICENSE_DIR}" | ||
| 95 | _notify SUCCESS "cp \"${license_file}\" to ${LICENSE_DIR}" | ||
| 96 | } | ||
| 97 | |||
| 98 | function _echo_help_message(){ | ||
| 99 | cat <<END | ||
| 100 | |||
| 101 | 用法: $(basename "$0") [选项] [参数] ... | ||
| 102 | |||
| 103 | Container(容器): | ||
| 104 | - start triton/backend/all 启动部署用的容器 | ||
| 105 | - stop triton/backend/all 停止当前部署的容器 | ||
| 106 | - restart triton/backend/all 重启当前部署的容器 | ||
| 107 | - rm triton/backend/all 删除当前部署的容器 | ||
| 108 | - inside triton/backend 已交互式进入当前部署的容器 | ||
| 109 | - is_running triton/backend 判断当前部署的容器是否在运行 | ||
| 110 | - top triton/backend 查看当前部署的容器的进程 | ||
| 111 | - dlogs triton/backend 查看当前部署的容器的日志 | ||
| 112 | - debug triton/backend 创建并以交互式进入debug用的容器 | ||
| 113 | |||
| 114 | Tools(工具): | ||
| 115 | - logs triton/backend 查看运行日志 | ||
| 116 | - systeminfo 查看系统信息,用于授权 | ||
| 117 | - update_license 更新授权文件 | ||
| 118 | |||
| 119 | END | ||
| 120 | } | ||
| 121 | |||
| 122 | function _getSystemInfo(){ | ||
| 123 | echo "尚未完成" | ||
| 124 | } | ||
| 125 | |||
| 126 | function _server_control() { | ||
| 127 | case "${2:-help}" in | ||
| 128 | triton) _control_triton $1 ;; | ||
| 129 | backend) _control_backend $1 ;; | ||
| 130 | all) _control_all $1 ;; | ||
| 131 | # 其他 | ||
| 132 | *) _echo_help_message ;; | ||
| 133 | esac | ||
| 134 | } | ||
| 135 | |||
| 136 | case "${1:-help}" in | ||
| 137 | systeminfo) _getSystemInfo ;; | ||
| 138 | update_license) _updateLincese $2 ;; | ||
| 139 | * ) _server_control $@ ;; | ||
| 140 | esac |
bin/docker.sh
0 → 100644
| 1 | #!/bin/bash | ||
| 2 | |||
| 3 | function _docker_run(){ | ||
| 4 | local run_type=$1 | ||
| 5 | local image=$2 | ||
| 6 | local container_name=$3 | ||
| 7 | local input_options=$4 | ||
| 8 | local all_options | ||
| 9 | |||
| 10 | if [ ${run_type} = "up" ]; then | ||
| 11 | # 启动部署用的container | ||
| 12 | all_options = "-d --net=bridge ${input_options} --name ${container_name} ${image}" | ||
| 13 | else | ||
| 14 | # 创建debug用的container | ||
| 15 | all_options = "-it --rm --net=bridge ${input_options} --entrypoint=/bin/bash ${image}" | ||
| 16 | fi | ||
| 17 | |||
| 18 | _notify INFO "run image ${image} with options: ${all_options}" | ||
| 19 | docker run ${all_options} | ||
| 20 | _notify SUCCESS "run image ${image} with options: ${all_options}" | ||
| 21 | } | ||
| 22 | |||
| 23 | |||
| 24 | function _load(){ | ||
| 25 | local load_file=$1 | ||
| 26 | if ! [ -e "${load_file}" ]; | ||
| 27 | then | ||
| 28 | _notify ERROR "file <${load_file}> to be loaded does not exist" ; | ||
| 29 | exit 1 | ||
| 30 | fi | ||
| 31 | |||
| 32 | _notify INFO "loading docker image from file <${load_file}>" | ||
| 33 | docker load -i ${load_file} | ||
| 34 | _notify SUCCESS "loaded docker image from file <${load_file}>" | ||
| 35 | } | ||
| 36 | |||
| 37 | |||
| 38 | # 判断镜像是否存在 | ||
| 39 | function _is_image_exists(){ | ||
| 40 | local image_name=$1 | ||
| 41 | local image_id | ||
| 42 | image_id=$(docker image ls -a -q ${image_name}) | ||
| 43 | if [ ! "${image_id}" ]; then | ||
| 44 | echo "false" | ||
| 45 | else | ||
| 46 | echo "true" | ||
| 47 | fi | ||
| 48 | } | ||
| 49 | |||
| 50 | |||
| 51 | function _start(){ | ||
| 52 | echo $@ | ||
| 53 | local image_name=$1 | ||
| 54 | local container_name=$2 | ||
| 55 | local input_options=$3 | ||
| 56 | local load_file=$4 | ||
| 57 | local container_id | ||
| 58 | container_id=$(docker ps -a -q -f name="^/${container_name}$") | ||
| 59 | if [ ! "${container_id}" ]; then | ||
| 60 | if [ "$(_is_image_exists "${image_name}")" != "true" ]; then | ||
| 61 | _notify WARNING "image <${image_name}> does not exist" | ||
| 62 | _load ${load_file} | ||
| 63 | fi | ||
| 64 | _docker_run "up" ${image_name} ${container_name} ${input_options} | ||
| 65 | else | ||
| 66 | docker start "${container_id=}" | ||
| 67 | fi | ||
| 68 | } | ||
| 69 | |||
| 70 | |||
| 71 | # 判断容器是否存在 | ||
| 72 | function _is_container_exists(){ | ||
| 73 | local container_name=$1 | ||
| 74 | local container_id | ||
| 75 | container_id=$(docker ps -a -q -f name="^/${container_name}$") | ||
| 76 | if [ ! "${container_id}" ]; then | ||
| 77 | echo "false" | ||
| 78 | else | ||
| 79 | echo "true" | ||
| 80 | fi | ||
| 81 | } | ||
| 82 | |||
| 83 | |||
| 84 | # 检测容器是否运行 | ||
| 85 | function _is_container_running(){ | ||
| 86 | if [ "$(_is_container_exists "$1")" != "true" ]; then | ||
| 87 | _notify ERROR "container <$1> does not exist" | ||
| 88 | exit 1 | ||
| 89 | fi | ||
| 90 | docker inspect -f '{{.State.Running}}' "$1" | ||
| 91 | } | ||
| 92 | |||
| 93 | # 调用 | ||
| 94 | function _docker_func(){ | ||
| 95 | case "$1" in | ||
| 96 | start) shift 1 && _start "$@" ;; | ||
| 97 | stop) shift 1 && docker stop "$@" ;; | ||
| 98 | restart) shift 1 && docker restart "$@" ;; | ||
| 99 | rm) shift 1 && docker rm "$@" ;; | ||
| 100 | inside) shift 1 && docker exec -it "$@" /bin/bash ;; | ||
| 101 | top) shift 1 && docker top "$@" ;; | ||
| 102 | logs) shift 1 && docker logs "$@";; | ||
| 103 | is_running) shift 1 && _is_container_running "$@" ;; | ||
| 104 | debug) shift 1 && _docker_run "debug" "$@";; | ||
| 105 | esac | ||
| 106 | } | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
bin/utils.sh
0 → 100755
| 1 | #!/bin/bash | ||
| 2 | set -euo pipefail | ||
| 3 | |||
| 4 | #################################### | ||
| 5 | # 常用工具 | ||
| 6 | #################################### | ||
| 7 | |||
| 8 | # 输出带有颜色的文本 | ||
| 9 | function _notify(){ | ||
| 10 | local _type=$1 | ||
| 11 | local _msg=$2 | ||
| 12 | local _GREEN | ||
| 13 | _GREEN=$(tput setaf 2) | ||
| 14 | local _YELLOW | ||
| 15 | _YELLOW=$(tput setaf 190) | ||
| 16 | local _RED | ||
| 17 | _RED=$(tput setaf 1) | ||
| 18 | local _NORMAL | ||
| 19 | _NORMAL=$(tput sgr0) | ||
| 20 | local _color_flag | ||
| 21 | |||
| 22 | case ${_type} in | ||
| 23 | INFO) _color_flag=${_NORMAL} ;; | ||
| 24 | SUCCESS) _color_flag=${_GREEN} ;; | ||
| 25 | WARNING) _color_flag=${_YELLOW} ;; | ||
| 26 | ERROR) _color_flag=${_RED} ;; | ||
| 27 | *) | ||
| 28 | _color_flag=${_RED} | ||
| 29 | echo "${_color_flag} invalid type: ${_type}${_NORMAL}" | ||
| 30 | return 1;; | ||
| 31 | esac | ||
| 32 | |||
| 33 | printf -- "${_color_flag}${_type}\t${_NORMAL}$(date +"%F %T")\t${_msg}\\n" | ||
| 34 | } | ||
| 35 | |||
| 36 | # 检查端口占用情况 | ||
| 37 | function checkPortUsedStatus() { | ||
| 38 | if (( $# > 0 )); then | ||
| 39 | for option in $@ ; | ||
| 40 | do | ||
| 41 | local section_num | ||
| 42 | section_num=$(echo "${option}" | awk -F ':' '{print NF}') | ||
| 43 | if [ "${section_num}" -ne "2" ] ; then | ||
| 44 | _notify ERROR "invalid port config <${option}>" | ||
| 45 | exit 1 | ||
| 46 | fi | ||
| 47 | # 检查端口是否为数字 | ||
| 48 | local port | ||
| 49 | port=$(echo "${option}"| awk -F ':' '{print $1}') | ||
| 50 | if [ -n "$(echo ${port} | sed 's/[0-9]//g')" ] ; then | ||
| 51 | _notify ERROR "invalid port config <${option}>" | ||
| 52 | exit 1 | ||
| 53 | fi | ||
| 54 | # 检查端口占用情况 | ||
| 55 | if lsof -i tcp:${port} | grep -q LISTEN; then | ||
| 56 | _notify ERROR "${port}端口被占用,请手动关闭" | ||
| 57 | lsof -i tcp:${port} | grep LISTEN | ||
| 58 | exit 1 | ||
| 59 | fi | ||
| 60 | done | ||
| 61 | fi | ||
| 62 | } | ||
| 63 | |||
| 64 | # 获取容器的env配置选项 | ||
| 65 | # 判断envs配置是否合法, 方法为判断"="的个数 | ||
| 66 | function checkEnvsOption() { | ||
| 67 | if (( $# > 0 )); then | ||
| 68 | for _env in $@ ; | ||
| 69 | do | ||
| 70 | if [ "$(echo "${_env}" | awk -F '=' '{print NF}' )" -ne "2" ]; then | ||
| 71 | _notify ERROR "invalid env config <${_env}>" | ||
| 72 | exit 1 | ||
| 73 | fi | ||
| 74 | done | ||
| 75 | fi | ||
| 76 | } | ||
| 77 | |||
| 78 | # 获取容器的volume配置选项 | ||
| 79 | # 判断volumes配置是否合法 | ||
| 80 | # * local_abs_path:remote_abs_path:flag | ||
| 81 | # * local_abs_path:remote_abs_path | ||
| 82 | # 目前简单判断,仅判断是否包含":",以及local_abs_path是否存在 | ||
| 83 | function checkVolumesOption() { | ||
| 84 | if (( $# > 0 )); then | ||
| 85 | for volume in $@ ; | ||
| 86 | do | ||
| 87 | local section_num | ||
| 88 | section_num=$(echo "${volume}" | awk -F ':' '{print NF}') | ||
| 89 | if [ "${section_num}" -ne "2" ] && [ "${section_num}" -ne "3" ]; then | ||
| 90 | _notify ERROR "invalid volume config <${volume}>" | ||
| 91 | exit 1 | ||
| 92 | fi | ||
| 93 | # 判断本地文件夹是否存在 | ||
| 94 | local local_dir | ||
| 95 | local_dir=$(echo "${volume}"| awk -F ':' '{print $1}') | ||
| 96 | if ! [ -e "${local_dir}" ]; | ||
| 97 | then | ||
| 98 | _notify ERROR "dir <${local_dir}> to be mounted does not exist" ; | ||
| 99 | exit 1 | ||
| 100 | fi | ||
| 101 | done | ||
| 102 | fi | ||
| 103 | } | ||
| 104 | |||
| 105 | function getOption() { | ||
| 106 | local _type=$1 | ||
| 107 | local output_option | ||
| 108 | output_option="" | ||
| 109 | shift 1 | ||
| 110 | if (( $# > 0 )); then | ||
| 111 | for _option in $@ ; | ||
| 112 | do | ||
| 113 | output_option="${output_option}${_type} ${_option} " | ||
| 114 | done | ||
| 115 | fi | ||
| 116 | echo ${output_option} | ||
| 117 | } | ||
| 118 | |||
| 119 | # 如果文件夹存在就将其备份 | ||
| 120 | # 备份方法为将文件夹重命名为 "原始文件夹名称+当前时间+4未随机字符串" | ||
| 121 | # 使用随机字符串是为了避免同一时间多次跑脚本导致文件夹重复 | ||
| 122 | # backup_dir_if_exists $some_dir | ||
| 123 | function backup_dir_if_exists(){ | ||
| 124 | if [ -d "$1" ] | ||
| 125 | then | ||
| 126 | now=$(date +%Y-%m-%d_%H:%M:%S) | ||
| 127 | random_string=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c4) | ||
| 128 | backup_dirname="$1__backup_${now}_${random_string}" | ||
| 129 | mv "$1" "${backup_dirname}" | ||
| 130 | _notify SUCCESS "\"$1\" already exists, mv to ${backup_dirname}" | ||
| 131 | fi | ||
| 132 | } |
configs/settings.sh
0 → 100644
| 1 | #!/bin/bash | ||
| 2 | set -euo pipefail | ||
| 3 | |||
| 4 | # 日志目录 | ||
| 5 | LOG_BASE_DIR=${BASE_DIR}/logs | ||
| 6 | |||
| 7 | # 端口 | ||
| 8 | BACKEND_PORT=80 | ||
| 9 | TRITON_HTTP_PORT=8000 | ||
| 10 | TRITON_GRPC_PORT=8001 | ||
| 11 | TRITON_METRICS_PORT=8002 | ||
| 12 | |||
| 13 | # sanic-worker | ||
| 14 | BACKEND_WORKER_NUM=4 | ||
| 15 | |||
| 16 | # GPU/CPU | ||
| 17 | # 使用CPU: TRITON_GPUS= | ||
| 18 | # 使用GPU0/GPU1: TRITON_GPUS=0,1 | ||
| 19 | TRITON_GPUS=0 |
-
Please register or sign in to post a comment