98 lines
3.2 KiB
Bash
Executable File
98 lines
3.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
set -euo pipefail
|
||
|
||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
TEST_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||
REPO_ROOT="$(cd "$TEST_ROOT/../../.." && pwd)"
|
||
|
||
compose() {
|
||
if docker compose version >/dev/null 2>&1; then
|
||
docker compose "$@"
|
||
else
|
||
docker-compose "$@"
|
||
fi
|
||
}
|
||
|
||
echo "[INFO] Bringing up system stack..."
|
||
|
||
# 加载 .env 以获取端口(由 01_bootstrap 生成)
|
||
if [[ -f "$TEST_ROOT/.env" ]]; then
|
||
set -a; source "$TEST_ROOT/.env"; set +a
|
||
fi
|
||
|
||
REQUEST_GPU=${ARGUS_SYS_ENABLE_GPU:-false}
|
||
GPU_AVAILABLE=false
|
||
GPU_CHECK_SCRIPT="$REPO_ROOT/src/metric/tests/scripts/common/check-gpu.sh"
|
||
|
||
if [[ "$REQUEST_GPU" == "true" ]]; then
|
||
echo "[INFO] --enable-gpu 生效,验证主机 GPU..."
|
||
if [[ -f "$GPU_CHECK_SCRIPT" ]]; then
|
||
if bash "$GPU_CHECK_SCRIPT" >/dev/null 2>&1; then
|
||
GPU_AVAILABLE=true
|
||
echo "[INFO] GPU 检测通过,将启动 gpu profile"
|
||
else
|
||
echo "[ERROR] 主机缺少可用 GPU,无法继续 --enable-gpu 流程" >&2
|
||
exit 1
|
||
fi
|
||
else
|
||
echo "[ERROR] 未找到 GPU 检测脚本: $GPU_CHECK_SCRIPT" >&2
|
||
exit 1
|
||
fi
|
||
else
|
||
echo "[INFO] 未启用 GPU 流程"
|
||
fi
|
||
|
||
pushd "$TEST_ROOT" >/dev/null
|
||
compose -p argus-sys down --remove-orphans || true
|
||
|
||
# 清理可能由 08 脚本创建的同名容器,避免 compose up 冲突
|
||
for name in argus-node-b; do
|
||
if docker ps -aqf "name=^${name}$" >/dev/null 2>&1 && [[ -n "$(docker ps -aqf "name=^${name}$")" ]]; then
|
||
docker rm -f "$name" >/dev/null 2>&1 || true
|
||
fi
|
||
done
|
||
|
||
# 预检:检查多端口网关所需宿主端口是否空闲
|
||
check_port_free() {
|
||
local p="$1"
|
||
if ss -ltnp 2>/dev/null | grep -q ":${p} "; then
|
||
echo "[ERR] Host port ${p} is already in use. Please free it before running 02_up.sh" >&2
|
||
ss -ltnp | awk -v p=":${p} " '$0 ~ p {print " " $0}' || true
|
||
return 1
|
||
fi
|
||
return 0
|
||
}
|
||
|
||
for port in \
|
||
"${WEB_PROXY_PORT_8080:-8080}" \
|
||
"${WEB_PROXY_PORT_8081:-8081}" \
|
||
"${WEB_PROXY_PORT_8082:-8082}" \
|
||
"${WEB_PROXY_PORT_8083:-8083}" \
|
||
"${WEB_PROXY_PORT_8084:-8084}" \
|
||
"${WEB_PROXY_PORT_8085:-8085}"; do
|
||
check_port_free "$port" || { echo "[ERR] Required port busy: $port"; exit 1; }
|
||
done
|
||
|
||
# 根据GPU可用性决定启动的服务
|
||
if [[ "$GPU_AVAILABLE" == true ]]; then
|
||
echo "[INFO] 启动所有服务(包含 gpu profile)..."
|
||
compose -p argus-sys --profile gpu up -d || true
|
||
else
|
||
echo "[INFO] 启动基础服务(不含 gpu profile)..."
|
||
compose -p argus-sys up -d || true
|
||
fi
|
||
|
||
# 若 web-proxy 处于 Created 状态,尝试单独启动一次(处理偶发 Address already in use 后端已释放的场景)
|
||
if docker ps -a --format '{{.Names}}\t{{.Status}}' | grep -q '^argus-web-proxy\s\+Created'; then
|
||
echo "[WARN] web-proxy in Created state; retry starting it..."
|
||
docker start argus-web-proxy || true
|
||
fi
|
||
|
||
popd >/dev/null
|
||
|
||
if [[ "$GPU_AVAILABLE" == true ]]; then
|
||
echo "[OK] Services started: master:${MASTER_PORT:-32300} es:${ES_HTTP_PORT:-9200} kibana:${KIBANA_PORT:-5601} node-a:${NODE_A_PORT:-2020} node-b:${NODE_B_PORT:-2021} test-gpu-node:172.31.0.51"
|
||
else
|
||
echo "[OK] Services started: master:${MASTER_PORT:-32300} es:${ES_HTTP_PORT:-9200} kibana:${KIBANA_PORT:-5601} node-a:${NODE_A_PORT:-2020} node-b:${NODE_B_PORT:-2021} (gpu skipped)"
|
||
fi
|