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