Files
novalon-website/scripts/fix-service-restart.sh
T
张翔 7cbb7a9ac8
ci/woodpecker/push/woodpecker Pipeline failed
fix(test): 修复测试环境问题
1. jest.setup.js:
   - 添加 Request/Response/Headers 全局对象 mock
   - 解决 'Request is not defined' 错误

2. .eslintrc.json:
   - 将 jest.setup.js 添加到忽略列表

3. shared-mocks.tsx:
   - 添加 ArrowUp 图标 mock

4. back-to-top.test.tsx:
   - 重写测试使用 import 语法
   - 使用 fireEvent.scroll 触发滚动事件
   - 修复组件渲染测试
2026-03-29 14:50:09 +08:00

238 lines
5.6 KiB
Bash
Executable File

#!/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