#!/bin/bash # 方案A: 服务重启脚本 # 用途:快速重启Docker容器和Nginx服务 set -e # 颜色定义 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} $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" } separator() { echo "======================================================================" } # 记录日志 LOG_FILE="/tmp/service-restart-$(date +%Y%m%d_%H%M%S).log" exec > >(tee -a "$LOG_FILE") 2>&1 separator echo "方案A: 服务重启脚本" echo "执行时间: $(date)" separator # 1. 检查当前状态 log_info "步骤1: 检查当前服务状态" separator echo "" log_info "当前Docker容器状态:" docker ps -a --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" echo "" log_info "当前Nginx状态:" systemctl status nginx --no-pager | head -10 echo "" log_info "当前系统资源:" echo "CPU和内存:" top -bn1 | head -5 echo "" echo "磁盘使用:" df -h | grep -E "Filesystem|/$" # 2. 查找docker-compose文件 log_info "步骤2: 查找docker-compose配置文件" separator POSSIBLE_PATHS=( "/opt/novalon-website" "/var/www/novalon-website" "/home/novalon-website" "/root/novalon-website" "/srv/novalon-website" "." ) COMPOSE_FILE="" PROJECT_DIR="" for path in "${POSSIBLE_PATHS[@]}"; do if [ -f "$path/docker-compose.prod.yml" ]; then PROJECT_DIR="$path" COMPOSE_FILE="$path/docker-compose.prod.yml" log_success "找到docker-compose.prod.yml: $COMPOSE_FILE" break elif [ -f "$path/docker-compose.yml" ]; then PROJECT_DIR="$path" COMPOSE_FILE="$path/docker-compose.yml" log_success "找到docker-compose.yml: $COMPOSE_FILE" break fi done if [ -z "$COMPOSE_FILE" ]; then log_error "未找到docker-compose配置文件" log_info "请手动指定项目目录:" read -p "请输入项目目录路径: " PROJECT_DIR if [ -f "$PROJECT_DIR/docker-compose.prod.yml" ]; then COMPOSE_FILE="$PROJECT_DIR/docker-compose.prod.yml" elif [ -f "$PROJECT_DIR/docker-compose.yml" ]; then COMPOSE_FILE="$PROJECT_DIR/docker-compose.yml" else log_error "指定目录中未找到docker-compose文件" exit 1 fi fi log_info "项目目录: $PROJECT_DIR" log_info "配置文件: $COMPOSE_FILE" # 3. 重启Docker容器 log_info "步骤3: 重启Docker容器" separator cd "$PROJECT_DIR" echo "" log_info "停止Docker容器..." docker-compose -f "$COMPOSE_FILE" stop echo "" log_info "启动Docker容器..." docker-compose -f "$COMPOSE_FILE" up -d echo "" log_info "等待服务启动(10秒)..." sleep 10 echo "" log_info "检查容器状态:" docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" # 检查容器是否正常运行 RUNNING_CONTAINERS=$(docker ps -q | wc -l) STOPPED_CONTAINERS=$(docker ps -f "status=exited" -q | wc -l) if [ "$STOPPED_CONTAINERS" -gt 0 ]; then log_warning "发现已停止的容器:" docker ps -f "status=exited" --format "table {{.Names}}\t{{.Status}}" echo "" log_info "查看容器日志:" for container in $(docker ps -f "status=exited" -q); do CONTAINER_NAME=$(docker inspect --format='{{.Name}}' $container | sed 's/\///') echo "" log_info "容器: $CONTAINER_NAME" docker logs --tail 30 $container done else log_success "所有容器运行正常" fi # 4. 重启Nginx log_info "步骤4: 重启Nginx服务" separator echo "" log_info "测试Nginx配置..." if nginx -t; then log_success "Nginx配置正确" else log_error "Nginx配置错误,请检查配置文件" exit 1 fi echo "" log_info "重启Nginx..." systemctl restart nginx echo "" log_info "检查Nginx状态:" systemctl status nginx --no-pager | head -15 if systemctl is-active --quiet nginx; then log_success "Nginx运行正常" else log_error "Nginx启动失败" journalctl -u nginx --no-pager | tail -20 exit 1 fi # 5. 验证服务 log_info "步骤5: 验证服务状态" separator echo "" log_info "测试本地应用连接..." if curl -I --connect-timeout 5 http://localhost:3000 2>&1 | grep -q "HTTP"; then log_success "应用服务响应正常" curl -I http://localhost:3000 2>&1 | head -10 else log_error "应用服务无响应" log_info "查看应用日志:" docker logs --tail 50 $(docker ps -q | head -1) fi echo "" log_info "检查端口监听:" netstat -tlnp | grep -E ":(3000|80|443)" || ss -tlnp | grep -E ":(3000|80|443)" echo "" log_info "测试外部访问..." if curl -I --connect-timeout 10 https://novalon.cn 2>&1 | grep -q "HTTP"; then log_success "外部访问正常" curl -I https://novalon.cn 2>&1 | head -10 else log_warning "外部访问仍可能需要等待DNS传播或CDN刷新" fi # 6. 显示最终状态 separator log_info "服务重启完成" separator echo "" log_success "执行摘要:" echo " ✅ Docker容器已重启" echo " ✅ Nginx服务已重启" echo " ✅ 服务状态已验证" echo "" log_info "详细日志已保存到: $LOG_FILE" echo "" log_warning "后续建议:" echo " 1. 监控服务状态: watch -n 5 'docker ps && systemctl status nginx'" echo " 2. 查看实时日志: docker logs -f \$(docker ps -q | head -1)" echo " 3. 检查应用日志: tail -f /var/log/nginx/error.log" echo " 4. 验证外部访问: curl -I https://novalon.cn" echo "" log_info "如果问题仍然存在,请运行完整诊断:" echo " /tmp/remote-server-diagnosis.sh --full" separator