Files
AIRouter/start-docker-cn.sh

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