#!/bin/bash # 考培练系统开发环境启动脚本 # 使用方法: # ./start-dev.sh # 启动基础服务 # ./start-dev.sh --with-admin # 启动服务 + phpMyAdmin # ./start-dev.sh --with-mail # 启动服务 + 邮件测试 # ./start-dev.sh --full # 启动所有服务 set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 日志函数 log_info() { echo -e "${BLUE}[INFO]${NC} $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 检查Docker是否运行 check_docker() { if ! docker info >/dev/null 2>&1; then log_error "Docker 未运行,请先启动 Docker" exit 1 fi } # 清理旧容器 cleanup() { log_info "清理旧容器..." docker-compose -f docker-compose.dev.yml down --remove-orphans 2>/dev/null || true # 清理孤立的容器 docker ps -a --filter "name=kaopeilian-" --format "{{.ID}}" | xargs -r docker rm -f 2>/dev/null || true } # 构建镜像 build_images() { log_info "构建开发环境镜像..." docker-compose -f docker-compose.dev.yml build --no-cache } # 启动服务 start_services() { local profiles="" # 解析命令行参数 case "${1:-}" in --with-admin) profiles="--profile admin" log_info "启动完全Docker化服务(包含 phpMyAdmin)..." ;; --with-mail) profiles="--profile mail" log_info "启动完全Docker化服务(包含邮件测试)..." ;; --full) profiles="--profile admin --profile mail" log_info "启动所有Docker化服务..." ;; *) log_info "启动完全Docker化基础服务(前后端+数据库)..." ;; esac # 启动所有服务(包括前后端) docker-compose -f docker-compose.dev.yml up -d frontend-dev backend-dev mysql-dev redis-dev $profiles } # 等待服务就绪 wait_for_services() { log_info "等待服务启动..." # 等待数据库 log_info "等待 MySQL 数据库启动..." timeout=60 while ! docker exec kaopeilian-mysql-dev mysqladmin ping -h"localhost" --silent 2>/dev/null; do timeout=$((timeout - 1)) if [ $timeout -eq 0 ]; then log_error "MySQL 启动超时" return 1 fi sleep 1 done log_success "MySQL 数据库已就绪" # 等待 Redis log_info "等待 Redis 缓存启动..." timeout=30 while ! docker exec kaopeilian-redis-dev redis-cli ping 2>/dev/null | grep -q PONG; do timeout=$((timeout - 1)) if [ $timeout -eq 0 ]; then log_error "Redis 启动超时" return 1 fi sleep 1 done log_success "Redis 缓存已就绪" # 等待后端服务 log_info "等待后端服务启动..." timeout=60 while ! curl -s http://localhost:8000/health >/dev/null 2>&1; do timeout=$((timeout - 1)) if [ $timeout -eq 0 ]; then log_error "后端服务启动超时" return 1 fi sleep 1 done log_success "后端服务已就绪" # 等待前端服务 log_info "等待前端服务启动..." timeout=60 while ! curl -s http://localhost:3001/ >/dev/null 2>&1; do timeout=$((timeout - 1)) if [ $timeout -eq 0 ]; then log_error "前端服务启动超时" return 1 fi sleep 1 done log_success "前端服务已就绪" } # 显示服务状态 show_status() { echo "" log_success "🎉 考培练系统开发环境启动成功!" echo "" echo "📋 服务访问地址:" echo " 🌐 前端开发服务器: http://localhost:3001 (Docker容器)" echo " 🔧 后端API服务: http://localhost:8000 (Docker容器)" echo " 📚 API文档: http://localhost:8000/docs" echo " 🗄️ MySQL数据库: localhost:3306 (Docker容器)" echo " 🔄 Redis缓存: localhost:6379 (Docker容器)" if docker ps --filter "name=kaopeilian-phpmyadmin-dev" --format "{{.Names}}" | grep -q phpmyadmin; then echo " 🛠️ phpMyAdmin: http://localhost:8080" fi if docker ps --filter "name=kaopeilian-mailhog-dev" --format "{{.Names}}" | grep -q mailhog; then echo " 📧 邮件测试界面: http://localhost:8025" fi echo "" echo "🔧 常用命令:" echo " 查看日志: docker-compose -f docker-compose.dev.yml logs -f [service_name]" echo " 停止服务: docker-compose -f docker-compose.dev.yml down" echo " 重启服务: docker-compose -f docker-compose.dev.yml restart [service_name]" echo "" echo "💡 开发提示:" echo " - 🔥 代码修改会自动重载(Docker热重载已启用)" echo " - 🎨 前端: 修改 kaopeilian-frontend/src/ 目录下的文件" echo " - ⚙️ 后端: 修改 kaopeilian-backend/app/ 目录下的文件" echo " - 🐳 所有服务均运行在Docker容器中,环境完全一致" echo "" } # 主函数 main() { echo "🚀 考培练系统开发环境启动器" echo "================================" # 检查 Docker check_docker # 清理旧环境 cleanup # 构建镜像 build_images # 启动服务 start_services "$@" # 等待服务就绪 if wait_for_services; then show_status exit 0 else log_error "服务启动失败,请检查日志" docker-compose -f docker-compose.dev.yml logs --tail=50 exit 1 fi } # 如果直接运行此脚本 if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then main "$@" fi