#!/bin/bash # 情绪博物馆容器部署脚本 # 作者: EmotionMuseum Team # 版本: 1.0.0 # 日期: 2025-07-13 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 "${GREEN}[INFO]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } log_step() { echo -e "${BLUE}[STEP]${NC} $1" } # 检查Docker和Docker Compose check_requirements() { log_step "检查系统要求..." if ! command -v docker &> /dev/null; then log_error "Docker未安装,请先安装Docker" exit 1 fi if ! command -v docker-compose &> /dev/null; then log_error "Docker Compose未安装,请先安装Docker Compose" exit 1 fi log_info "Docker和Docker Compose检查通过" } # 创建必要的目录 create_directories() { log_step "创建部署目录..." mkdir -p deploy/{mysql/conf.d,redis,nginx/{conf.d,ssl},logs} mkdir -p data/{mysql,redis,nacos} log_info "目录创建完成" } # 生成配置文件 generate_configs() { log_step "生成配置文件..." # MySQL配置 if [ ! -f "deploy/mysql/conf.d/my.cnf" ]; then cat > deploy/mysql/conf.d/my.cnf << 'EOF' [mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci default-time-zone='+8:00' max_connections=1000 max_allowed_packet=64M innodb_buffer_pool_size=512M innodb_log_file_size=256M slow_query_log=1 slow_query_log_file=/var/log/mysql/slow.log long_query_time=2 EOF log_info "MySQL配置文件已生成" fi # Redis配置 if [ ! -f "deploy/redis/redis.conf" ]; then cat > deploy/redis/redis.conf << 'EOF' bind 0.0.0.0 port 6379 timeout 300 tcp-keepalive 60 maxmemory 256mb maxmemory-policy allkeys-lru save 900 1 save 300 10 save 60 10000 appendonly yes appendfsync everysec EOF log_info "Redis配置文件已生成" fi } # 构建镜像 build_images() { log_step "构建Docker镜像..." log_info "构建后端服务镜像..." docker-compose build gateway ai-service user-service log_info "构建前端应用镜像..." docker-compose build web log_info "镜像构建完成" } # 启动服务 start_services() { log_step "启动服务..." # 先启动基础服务 log_info "启动基础服务 (MySQL, Redis, Nacos)..." docker-compose up -d mysql redis nacos # 等待基础服务启动 log_info "等待基础服务启动完成..." sleep 30 # 启动应用服务 log_info "启动应用服务..." docker-compose up -d gateway ai-service user-service # 等待应用服务启动 log_info "等待应用服务启动完成..." sleep 20 # 启动前端和Nginx log_info "启动前端和Nginx..." docker-compose up -d web nginx log_info "所有服务启动完成" } # 检查服务状态 check_services() { log_step "检查服务状态..." echo "" docker-compose ps echo "" # 检查关键服务健康状态 log_info "检查服务健康状态..." # 检查MySQL if docker-compose exec -T mysql mysqladmin ping -h localhost -u root -p123456 &> /dev/null; then log_info "✅ MySQL服务正常" else log_warn "❌ MySQL服务异常" fi # 检查Redis if docker-compose exec -T redis redis-cli ping | grep -q PONG; then log_info "✅ Redis服务正常" else log_warn "❌ Redis服务异常" fi # 检查Nacos if curl -s http://localhost:8848/nacos/v1/ns/operator/metrics &> /dev/null; then log_info "✅ Nacos服务正常" else log_warn "❌ Nacos服务异常" fi # 检查网关 if curl -s http://localhost:9000/actuator/health &> /dev/null; then log_info "✅ 网关服务正常" else log_warn "❌ 网关服务异常" fi } # 显示访问信息 show_access_info() { log_step "部署完成!" echo "" echo "🎉 情绪博物馆部署成功!" echo "" echo "📱 访问地址:" echo " 前端应用: http://localhost" echo " API网关: http://localhost:9000" echo " Nacos: http://localhost:8848/nacos (用户名/密码: nacos/nacos)" echo "" echo "🔧 管理命令:" echo " 查看日志: docker-compose logs -f [服务名]" echo " 停止服务: docker-compose down" echo " 重启服务: docker-compose restart [服务名]" echo "" echo "📊 监控命令:" echo " 查看状态: docker-compose ps" echo " 查看资源: docker stats" echo "" } # 主函数 main() { echo "🚀 开始部署情绪博物馆..." echo "" check_requirements create_directories generate_configs build_images start_services echo "" log_info "等待服务完全启动..." sleep 10 check_services show_access_info } # 处理命令行参数 case "${1:-}" in "build") log_info "仅构建镜像..." check_requirements create_directories generate_configs build_images ;; "start") log_info "启动服务..." start_services check_services show_access_info ;; "stop") log_info "停止服务..." docker-compose down ;; "restart") log_info "重启服务..." docker-compose restart check_services ;; "logs") docker-compose logs -f ;; "status") check_services ;; *) main ;; esac