#!/bin/bash # 清理Docker容器并重启Nacos和Redis服务 # 作者: emotion-museum # 日期: 2025-07-21 set -e REMOTE_HOST="root@47.111.10.27" # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' log_info() { echo -e "${BLUE}[INFO]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1" } log_error() { echo -e "${RED}[ERROR]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1" } # 检查SSH连接 check_connection() { log_info "检查远程服务器连接..." if ssh -o ConnectTimeout=10 "$REMOTE_HOST" "echo 'SSH连接成功'" > /dev/null 2>&1; then log_success "远程服务器连接正常" else log_error "无法连接到远程服务器: $REMOTE_HOST" exit 1 fi } # 清理Docker容器 cleanup_docker_containers() { log_info "清理Docker容器..." ssh "$REMOTE_HOST" " echo '🧹 停止并删除Nacos和Redis相关的Docker容器...' # 停止并删除emotion-nacos容器 if docker ps -a | grep -q emotion-nacos; then echo '停止emotion-nacos容器...' docker stop emotion-nacos 2>/dev/null || true docker rm emotion-nacos 2>/dev/null || true echo '✅ emotion-nacos容器已删除' fi # 停止并删除emotion-redis容器 if docker ps -a | grep -q emotion-redis; then echo '停止emotion-redis容器...' docker stop emotion-redis 2>/dev/null || true docker rm emotion-redis 2>/dev/null || true echo '✅ emotion-redis容器已删除' fi # 删除相关镜像 echo '🗑️ 删除相关Docker镜像...' docker rmi nacos/nacos-server:v2.2.0 2>/dev/null || echo 'Nacos镜像不存在' docker rmi redis:7-alpine 2>/dev/null || echo 'Redis镜像不存在' echo '✅ Docker容器清理完成' " log_success "Docker容器清理完成" } # 检查并重启Redis服务 restart_redis() { log_info "检查并重启Redis服务..." ssh "$REMOTE_HOST" " echo '🔍 检查Redis状态...' # 检查Redis进程 if pgrep -f redis-server > /dev/null; then echo '✅ Redis进程正在运行' redis_pid=\$(pgrep -f redis-server) echo \"Redis PID: \$redis_pid\" else echo '❌ Redis进程未运行,尝试启动...' # 尝试启动Redis cd /www/server/redis if [ -f redis-server ]; then nohup ./redis-server redis.conf > redis.log 2>&1 & sleep 3 if pgrep -f redis-server > /dev/null; then echo '✅ Redis启动成功' else echo '❌ Redis启动失败' exit 1 fi else echo '❌ Redis可执行文件不存在' exit 1 fi fi # 测试Redis连接 echo '🧪 测试Redis连接...' if echo 'ping' | ./redis-cli | grep -q PONG; then echo '✅ Redis连接测试成功' else echo '❌ Redis连接测试失败' exit 1 fi " log_success "Redis服务检查完成" } # 检查并重启Nacos服务 restart_nacos() { log_info "检查并重启Nacos服务..." ssh "$REMOTE_HOST" " echo '🔍 检查Nacos状态...' # 检查Nacos进程 if pgrep -f nacos-server.jar > /dev/null; then echo '✅ Nacos进程正在运行' nacos_pid=\$(pgrep -f nacos-server.jar) echo \"Nacos PID: \$nacos_pid\" # 检查端口监听 if netstat -tlnp | grep :8848 > /dev/null; then echo '✅ Nacos端口8848正在监听' else echo '❌ Nacos端口8848未监听,重启Nacos...' kill \$nacos_pid 2>/dev/null || true sleep 5 fi else echo '❌ Nacos进程未运行,启动Nacos...' fi # 如果Nacos未运行,启动它 if ! pgrep -f nacos-server.jar > /dev/null; then echo '🚀 启动Nacos服务...' # 确保目录存在 mkdir -p /data/programs/nacos/{logs,data} # 检查Nacos安装目录 if [ -d '/home/nacos' ]; then cd /home/nacos # 启动Nacos nohup java -Xms1g -Xmx1g -Xmn512m \\ -Dnacos.standalone=true \\ -Dnacos.core.auth.enabled=true \\ -Dnacos.preferHostnameOverIp=true \\ -Dnacos.home=/home/nacos \\ -jar target/nacos-server.jar \\ --spring.config.additional-location=file:/home/nacos/conf/ \\ --spring.config.name=application \\ --logging.config=/home/nacos/conf/nacos-logback.xml \\ --server.max-http-header-size=524288 > logs/start.out 2>&1 & echo '⏳ 等待Nacos启动...' sleep 30 if pgrep -f nacos-server.jar > /dev/null; then echo '✅ Nacos启动成功' else echo '❌ Nacos启动失败' tail -20 logs/start.out exit 1 fi else echo '❌ Nacos安装目录不存在: /home/nacos' exit 1 fi fi # 测试Nacos连接 echo '🧪 测试Nacos连接...' sleep 10 if curl -f -s http://localhost:8848/nacos/v1/console/health > /dev/null; then echo '✅ Nacos健康检查成功' else echo '⚠️ Nacos健康检查失败,但进程正在运行' fi " log_success "Nacos服务检查完成" } # 更新微服务配置 update_microservice_config() { log_info "更新微服务配置..." # 更新所有微服务的配置文件,确保使用正确的地址 for service in gateway user ai auth record growth explore reward websocket stats; do config_file="backend/emotion-$service/src/main/resources/application.yml" if [ -f "$config_file" ]; then log_info "更新 emotion-$service 配置..." # 备份原始配置 cp "$config_file" "$config_file.bak.$(date +%Y%m%d_%H%M%S)" # 更新配置 sed -i.tmp "s/127.0.0.1:8848/localhost:8848/g" "$config_file" sed -i.tmp "s/47.111.10.27:8848/localhost:8848/g" "$config_file" # 确保Redis配置正确 sed -i.tmp "s/redis.host=.*/redis.host=localhost/g" "$config_file" sed -i.tmp "s/redis.port=.*/redis.port=6379/g" "$config_file" # 清理临时文件 rm -f "$config_file.tmp" log_success "emotion-$service 配置已更新" else log_warning "emotion-$service 配置文件不存在: $config_file" fi done log_success "微服务配置更新完成" } # 检查服务状态 check_services_status() { log_info "检查服务状态..." ssh "$REMOTE_HOST" " echo '📊 服务状态总结:' echo '==================' # 检查Redis echo -n 'Redis (6379): ' if pgrep -f redis-server > /dev/null && echo 'ping' | /www/server/redis/redis-cli | grep -q PONG; then echo '✅ 运行正常' else echo '❌ 异常' fi # 检查Nacos echo -n 'Nacos (8848): ' if pgrep -f nacos-server.jar > /dev/null && netstat -tlnp | grep :8848 > /dev/null; then echo '✅ 运行正常' else echo '❌ 异常' fi # 检查MySQL echo -n 'MySQL (3306): ' if pgrep -f mysqld > /dev/null && netstat -tlnp | grep :3306 > /dev/null; then echo '✅ 运行正常' else echo '❌ 异常' fi echo '' echo '🔍 端口监听状态:' netstat -tlnp | grep -E ':(3306|6379|8848)' || echo '没有找到相关端口' echo '' echo '🔍 进程状态:' ps aux | grep -E '(redis-server|nacos-server|mysqld)' | grep -v grep || echo '没有找到相关进程' " log_success "服务状态检查完成" } # 主函数 main() { log_info "🚀 开始清理Docker容器并重启服务..." check_connection cleanup_docker_containers restart_redis restart_nacos update_microservice_config check_services_status log_success "🎉 服务清理和重启完成!" echo "" echo "📋 服务访问信息:" echo " Redis: localhost:6379" echo " Nacos: http://47.111.10.27:8848/nacos" echo " MySQL: localhost:3306" echo "" echo "🔧 下一步:" echo " 1. 重新构建微服务: cd backend && ./build-all.sh" echo " 2. 重新部署微服务: cd backend && ./deploy-remote.sh" } # 执行主函数 main "$@"