feat: 初始化考培练系统项目
- 从服务器拉取完整代码 - 按框架规范整理项目结构 - 配置 Drone CI 测试环境部署 - 包含后端(FastAPI)、前端(Vue3)、管理端 技术栈: Vue3 + TypeScript + FastAPI + MySQL
This commit is contained in:
208
deploy/scripts/start-dev.sh
Executable file
208
deploy/scripts/start-dev.sh
Executable file
@@ -0,0 +1,208 @@
|
||||
#!/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
|
||||
Reference in New Issue
Block a user