262 lines
7.0 KiB
Bash
Executable File
262 lines
7.0 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# AI Router Docker 国内网络优化版启动脚本
|
|
# 适用于网络访问 Docker Hub 受限的环境
|
|
|
|
set -e
|
|
|
|
# 颜色定义
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# 打印带颜色的消息
|
|
print_info() {
|
|
echo -e "${BLUE}[信息]${NC} $1"
|
|
}
|
|
|
|
print_success() {
|
|
echo -e "${GREEN}[成功]${NC} $1"
|
|
}
|
|
|
|
print_warning() {
|
|
echo -e "${YELLOW}[警告]${NC} $1"
|
|
}
|
|
|
|
print_error() {
|
|
echo -e "${RED}[错误]${NC} $1"
|
|
}
|
|
|
|
# 打印标题
|
|
print_header() {
|
|
echo ""
|
|
echo -e "${BLUE}========================================${NC}"
|
|
echo -e "${BLUE} AI Router Docker 国内优化版部署${NC}"
|
|
echo -e "${BLUE}========================================${NC}"
|
|
echo ""
|
|
}
|
|
|
|
# 检查 Docker 是否安装
|
|
check_docker() {
|
|
print_info "检查 Docker 安装状态..."
|
|
|
|
if ! command -v docker &> /dev/null; then
|
|
print_error "Docker 未安装,请先安装 Docker"
|
|
print_info "安装指南: https://docs.docker.com/engine/install/"
|
|
exit 1
|
|
fi
|
|
|
|
if ! command -v docker compose &> /dev/null; then
|
|
print_error "Docker Compose 未安装,请先安装 Docker Compose"
|
|
print_info "安装指南: https://docs.docker.com/compose/install/"
|
|
exit 1
|
|
fi
|
|
|
|
print_success "Docker 和 Docker Compose 已安装"
|
|
docker --version
|
|
docker compose version
|
|
}
|
|
|
|
# 检查 Docker 服务状态
|
|
check_docker_service() {
|
|
print_info "检查 Docker 服务状态..."
|
|
|
|
if ! docker info &> /dev/null; then
|
|
print_error "Docker 服务未运行,请启动 Docker 服务"
|
|
print_info "运行: sudo systemctl start docker"
|
|
exit 1
|
|
fi
|
|
|
|
print_success "Docker 服务正常运行"
|
|
}
|
|
|
|
# 配置 Docker 镜像加速器(可选)
|
|
configure_mirror() {
|
|
print_info "检查 Docker 镜像加速器配置..."
|
|
|
|
if docker info 2>/dev/null | grep -q "Registry Mirrors"; then
|
|
print_success "已配置 Docker 镜像加速器"
|
|
docker info 2>/dev/null | grep -A 5 "Registry Mirrors"
|
|
else
|
|
print_warning "未配置 Docker 镜像加速器"
|
|
print_info "如果构建失败,请参考 docker-mirror-setup.md 配置镜像加速器"
|
|
fi
|
|
}
|
|
|
|
# 清理旧容器和镜像(可选)
|
|
cleanup_old() {
|
|
read -p "是否清理旧的容器和镜像?(y/N): " -n 1 -r
|
|
echo
|
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
|
print_info "停止并删除旧容器..."
|
|
docker compose -f docker-compose.cn.yml down 2>/dev/null || true
|
|
|
|
print_info "删除旧镜像..."
|
|
docker rmi ai-router-backend:latest 2>/dev/null || true
|
|
docker rmi ai-router-frontend:latest 2>/dev/null || true
|
|
|
|
print_success "清理完成"
|
|
fi
|
|
}
|
|
|
|
# 构建镜像
|
|
build_images() {
|
|
print_info "开始构建 Docker 镜像(使用国内镜像源)..."
|
|
print_warning "首次构建可能需要较长时间,请耐心等待..."
|
|
|
|
# 使用国内优化版的 docker-compose 配置
|
|
if docker compose -f docker-compose.cn.yml build --no-cache; then
|
|
print_success "镜像构建成功"
|
|
else
|
|
print_error "镜像构建失败"
|
|
print_info "请检查网络连接或参考 docker-mirror-setup.md 配置镜像加速器"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# 启动服务
|
|
start_services() {
|
|
print_info "启动服务..."
|
|
|
|
if docker compose -f docker-compose.cn.yml up -d; then
|
|
print_success "服务启动成功"
|
|
else
|
|
print_error "服务启动失败"
|
|
print_info "查看日志: docker compose -f docker-compose.cn.yml logs"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# 等待服务就绪
|
|
wait_for_services() {
|
|
print_info "等待服务启动完成..."
|
|
|
|
# 等待后端服务
|
|
print_info "等待后端服务就绪(最多等待 60 秒)..."
|
|
TIMEOUT=60
|
|
ELAPSED=0
|
|
while [ $ELAPSED -lt $TIMEOUT ]; do
|
|
if docker compose -f docker-compose.cn.yml ps backend | grep -q "healthy"; then
|
|
print_success "后端服务已就绪"
|
|
break
|
|
fi
|
|
sleep 2
|
|
ELAPSED=$((ELAPSED + 2))
|
|
echo -n "."
|
|
done
|
|
echo ""
|
|
|
|
if [ $ELAPSED -ge $TIMEOUT ]; then
|
|
print_warning "后端服务启动超时,请检查日志"
|
|
fi
|
|
|
|
# 等待前端服务
|
|
print_info "等待前端服务就绪(最多等待 30 秒)..."
|
|
TIMEOUT=30
|
|
ELAPSED=0
|
|
while [ $ELAPSED -lt $TIMEOUT ]; do
|
|
if docker compose -f docker-compose.cn.yml ps frontend | grep -q "healthy"; then
|
|
print_success "前端服务已就绪"
|
|
break
|
|
fi
|
|
sleep 2
|
|
ELAPSED=$((ELAPSED + 2))
|
|
echo -n "."
|
|
done
|
|
echo ""
|
|
|
|
if [ $ELAPSED -ge $TIMEOUT ]; then
|
|
print_warning "前端服务启动超时,请检查日志"
|
|
fi
|
|
}
|
|
|
|
# 显示服务状态
|
|
show_status() {
|
|
print_info "服务运行状态:"
|
|
echo ""
|
|
docker compose -f docker-compose.cn.yml ps
|
|
echo ""
|
|
}
|
|
|
|
# 测试服务
|
|
test_services() {
|
|
print_info "测试服务连接..."
|
|
|
|
# 测试后端
|
|
if curl -f -s http://localhost:8080/api/providers > /dev/null 2>&1; then
|
|
print_success "后端 API 服务正常: http://localhost:8080/api"
|
|
else
|
|
print_warning "后端 API 服务可能未完全启动,请稍后再试"
|
|
fi
|
|
|
|
# 测试前端
|
|
if curl -f -s http://localhost:3000/health > /dev/null 2>&1; then
|
|
print_success "前端服务正常: http://localhost:3000"
|
|
else
|
|
print_warning "前端服务可能未完全启动,请稍后再试"
|
|
fi
|
|
}
|
|
|
|
# 显示访问信息
|
|
show_access_info() {
|
|
echo ""
|
|
echo -e "${GREEN}========================================${NC}"
|
|
echo -e "${GREEN} 部署完成!${NC}"
|
|
echo -e "${GREEN}========================================${NC}"
|
|
echo ""
|
|
echo -e " 前端访问地址: ${BLUE}http://localhost:3000${NC}"
|
|
echo -e " 后端 API: ${BLUE}http://localhost:8080/api${NC}"
|
|
echo ""
|
|
echo -e "${YELLOW}常用命令:${NC}"
|
|
echo -e " 查看日志: ${BLUE}docker compose -f docker-compose.cn.yml logs -f${NC}"
|
|
echo -e " 停止服务: ${BLUE}docker compose -f docker-compose.cn.yml stop${NC}"
|
|
echo -e " 重启服务: ${BLUE}docker compose -f docker-compose.cn.yml restart${NC}"
|
|
echo -e " 停止并删除: ${BLUE}docker compose -f docker-compose.cn.yml down${NC}"
|
|
echo -e " 查看状态: ${BLUE}docker compose -f docker-compose.cn.yml ps${NC}"
|
|
echo ""
|
|
echo -e "${YELLOW}更多信息请参考:${NC}"
|
|
echo -e " 部署文档: ${BLUE}README-DOCKER.md${NC}"
|
|
echo -e " 镜像配置: ${BLUE}docker-mirror-setup.md${NC}"
|
|
echo ""
|
|
}
|
|
|
|
# 主函数
|
|
main() {
|
|
print_header
|
|
|
|
# 检查环境
|
|
check_docker
|
|
check_docker_service
|
|
configure_mirror
|
|
|
|
echo ""
|
|
|
|
# 清理旧资源(可选)
|
|
cleanup_old
|
|
|
|
echo ""
|
|
|
|
# 构建和启动
|
|
build_images
|
|
start_services
|
|
wait_for_services
|
|
|
|
echo ""
|
|
|
|
# 显示状态
|
|
show_status
|
|
test_services
|
|
|
|
# 显示访问信息
|
|
show_access_info
|
|
}
|
|
|
|
# 错误处理
|
|
trap 'print_error "脚本执行失败,请检查错误信息"; exit 1' ERR
|
|
|
|
# 运行主函数
|
|
main
|
|
|
|
exit 0 |