argus/src/metric/tests/start-all.sh
2025-10-11 15:52:50 +08:00

200 lines
5.9 KiB
Bash
Executable File

#!/bin/bash
# 一键启动脚本
# 用于初始化目录、构建镜像并启动所有服务
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"
echo "=========================================="
echo " Argus Metrics 一键启动脚本"
echo "=========================================="
echo ""
echo "当前工作目录: $SCRIPT_DIR"
echo ""
# 检查 Docker 和 Docker Compose
if ! command -v docker &> /dev/null; then
echo "错误: 未找到 docker 命令,请先安装 Docker"
exit 1
fi
# 检测 docker-compose 命令(兼容新旧版本)
COMPOSE_FILE="$SCRIPT_DIR/docker-compose.yml"
if command -v docker-compose &> /dev/null; then
DOCKER_COMPOSE="docker-compose -f $COMPOSE_FILE"
echo "使用: docker-compose"
elif docker compose version &> /dev/null 2>&1; then
DOCKER_COMPOSE="docker compose -f $COMPOSE_FILE"
echo "使用: docker compose"
else
echo "错误: 未找到 docker-compose 或 docker compose 命令"
exit 1
fi
echo "Compose 文件: $COMPOSE_FILE"
echo ""
# 检查必要的构建目录
echo "检查构建目录..."
BUILD_DIRS=(
"../ftp/build"
"../prometheus/build"
"../grafana/build"
)
for dir in "${BUILD_DIRS[@]}"; do
if [ ! -d "$dir" ]; then
echo "错误: 构建目录不存在: $dir"
echo "完整路径: $(cd "$(dirname "$dir")" 2>/dev/null && pwd)/$(basename "$dir")"
exit 1
else
echo " ✓ 找到: $dir"
fi
done
echo ""
# 检查并创建 .env 文件
if [ ! -f .env ]; then
echo "未找到 .env 文件,从 env.example 创建..."
cp env.example .env
echo "已创建 .env 文件,请根据需要修改配置"
fi
# 加载环境变量
source .env
echo "1. 初始化目录结构..."
bash "$SCRIPT_DIR/init-directories.sh"
echo ""
echo "2. 准备 Docker 镜像..."
# 检查镜像是否存在
IMAGE_CACHE_DIR="./images-cache"
IMAGES=("argus-metric-ftp:latest" "argus-metric-prometheus:latest" "argus-metric-grafana:latest")
all_images_exist=true
for image in "${IMAGES[@]}"; do
if ! docker images --format "{{.Repository}}:{{.Tag}}" | grep -q "^${image}$"; then
all_images_exist=false
break
fi
done
if $all_images_exist; then
echo "所有镜像已存在,跳过构建"
else
echo "检测到缺失镜像,尝试从缓存加载..."
# 尝试从缓存加载
loaded_from_cache=false
if [ -d "$IMAGE_CACHE_DIR" ]; then
for image in "${IMAGES[@]}"; do
if ! docker images --format "{{.Repository}}:{{.Tag}}" | grep -q "^${image}$"; then
# 镜像不存在,尝试加载
case "$image" in
"argus-metric-ftp:latest")
cache_file="${IMAGE_CACHE_DIR}/argus-ftp.tar"
;;
"argus-metric-prometheus:latest")
cache_file="${IMAGE_CACHE_DIR}/argus-prometheus.tar"
;;
"argus-metric-grafana:latest")
cache_file="${IMAGE_CACHE_DIR}/argus-grafana.tar"
;;
esac
if [ -f "$cache_file" ]; then
echo " 从缓存加载: $image"
docker load -i "$cache_file"
loaded_from_cache=true
fi
fi
done
fi
# 检查加载后是否还有缺失的镜像
need_build=false
for image in "${IMAGES[@]}"; do
if ! docker images --format "{{.Repository}}:{{.Tag}}" | grep -q "^${image}$"; then
need_build=true
break
fi
done
if $need_build; then
echo ""
echo "部分镜像缺失,开始构建..."
echo "工作目录: $(pwd)"
cd "$SCRIPT_DIR"
$DOCKER_COMPOSE build
# 询问是否保存镜像
echo ""
read -p "是否保存镜像到缓存以便下次快速启动? (Y/n): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Nn]$ ]]; then
mkdir -p "$IMAGE_CACHE_DIR"
echo "保存镜像到缓存..."
for image in "${IMAGES[@]}"; do
case "$image" in
"argus-metric-ftp:latest")
docker save -o "${IMAGE_CACHE_DIR}/argus-ftp.tar" "$image" && echo " 已保存: argus-ftp.tar"
;;
"argus-metric-prometheus:latest")
docker save -o "${IMAGE_CACHE_DIR}/argus-prometheus.tar" "$image" && echo " 已保存: argus-prometheus.tar"
;;
"argus-metric-grafana:latest")
docker save -o "${IMAGE_CACHE_DIR}/argus-grafana.tar" "$image" && echo " 已保存: argus-grafana.tar"
;;
esac
done
echo "镜像已保存到: $IMAGE_CACHE_DIR/"
fi
elif $loaded_from_cache; then
echo ""
echo "所有镜像已从缓存加载完成!"
fi
fi
echo ""
echo "3. 启动服务..."
cd "$SCRIPT_DIR"
$DOCKER_COMPOSE up -d
echo ""
echo "4. 等待服务启动..."
sleep 5
echo ""
echo "5. 检查服务状态..."
cd "$SCRIPT_DIR"
$DOCKER_COMPOSE ps
echo ""
echo "=========================================="
echo " 服务启动完成!"
echo "=========================================="
echo ""
echo "服务访问地址:"
echo " - FTP: ftp://localhost:${FTP_PORT:-21}"
echo " 用户名: ftpuser"
echo " 密码: ${FTP_PASSWORD:-ZGClab1234!}"
echo ""
echo " - Prometheus: http://localhost:${PROMETHEUS_PORT:-9090}"
echo ""
echo " - Grafana: http://localhost:${GRAFANA_PORT:-3000}"
echo " 用户名: admin"
echo " 密码: admin"
echo ""
echo "常用命令:"
echo " 查看日志: $DOCKER_COMPOSE logs -f [service]"
echo " 停止服务: $DOCKER_COMPOSE stop"
echo " 重启服务: $DOCKER_COMPOSE restart"
echo " 停止并删除: $DOCKER_COMPOSE down"
echo " 停止并删除卷: $DOCKER_COMPOSE down -v"
echo ""