Files
novalon-website/scripts/remote-server-diagnosis.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

313 lines
7.2 KiB
Bash
Executable File

#!/bin/bash
# 远程服务器诊断脚本
# 用途:在生产服务器上诊断连接超时问题
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 "======================================================================"
}
# 1. 检查系统资源
check_system_resources() {
separator
log_info "检查系统资源"
separator
echo ""
log_info "CPU和内存使用情况:"
top -bn1 | head -20
echo ""
log_info "磁盘使用情况:"
df -h
echo ""
log_info "内存详情:"
free -h
echo ""
log_info "系统负载:"
uptime
# 检查是否资源耗尽
MEMORY_USAGE=$(free | grep Mem | awk '{print ($3/$2) * 100.0}')
DISK_USAGE=$(df -h / | tail -1 | awk '{print $5}' | sed 's/%//')
if (( $(echo "$MEMORY_USAGE > 90" | bc -l) )); then
log_error "内存使用率过高: ${MEMORY_USAGE}%"
else
log_success "内存使用正常: ${MEMORY_USAGE}%"
fi
if [ "$DISK_USAGE" -gt 90 ]; then
log_error "磁盘使用率过高: ${DISK_USAGE}%"
else
log_success "磁盘使用正常: ${DISK_USAGE}%"
fi
}
# 2. 检查Docker容器
check_docker() {
separator
log_info "检查Docker容器"
separator
echo ""
log_info "Docker服务状态:"
systemctl status docker --no-pager | head -20
echo ""
log_info "运行中的容器:"
docker ps -a --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
echo ""
log_info "容器资源使用:"
docker stats --no-stream
# 检查容器健康状态
RUNNING_CONTAINERS=$(docker ps -q | wc -l)
STOPPED_CONTAINERS=$(docker ps -f "status=exited" -q | wc -l)
log_info "运行中容器: $RUNNING_CONTAINERS"
log_info "已停止容器: $STOPPED_CONTAINERS"
if [ "$STOPPED_CONTAINERS" -gt 0 ]; then
log_warning "发现已停止的容器:"
docker ps -f "status=exited" --format "table {{.Names}}\t{{.Status}}"
fi
# 检查容器日志
echo ""
log_info "检查容器日志(最近50行):"
for container in $(docker ps -q); do
CONTAINER_NAME=$(docker inspect --format='{{.Name}}' $container | sed 's/\///')
echo ""
log_info "容器: $CONTAINER_NAME"
docker logs --tail 50 $container 2>&1 | tail -20
done
}
# 3. 检查Nginx
check_nginx() {
separator
log_info "检查Nginx"
separator
echo ""
log_info "Nginx服务状态:"
systemctl status nginx --no-pager | head -20
echo ""
log_info "Nginx进程:"
ps aux | grep nginx | grep -v grep
echo ""
log_info "Nginx监听端口:"
netstat -tlnp | grep nginx || ss -tlnp | grep nginx
echo ""
log_info "Nginx配置测试:"
nginx -t
echo ""
log_info "Nginx错误日志(最近50行):"
tail -50 /var/log/nginx/error.log 2>/dev/null || log_warning "未找到Nginx错误日志"
echo ""
log_info "Nginx访问日志(最近20行):"
tail -20 /var/log/nginx/access.log 2>/dev/null || log_warning "未找到Nginx访问日志"
}
# 4. 检查应用服务
check_application() {
separator
log_info "检查应用服务"
separator
echo ""
log_info "Node.js进程:"
ps aux | grep node | grep -v grep
echo ""
log_info "PM2进程(如果使用):"
if command -v pm2 > /dev/null; then
pm2 list
pm2 logs --lines 20 --nostream
else
log_info "未使用PM2"
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 5 http://localhost:3000 2>&1 | grep -q "HTTP"; then
log_success "应用服务响应正常"
else
log_error "应用服务无响应"
fi
}
# 5. 检查防火墙和网络
check_network() {
separator
log_info "检查防火墙和网络"
separator
echo ""
log_info "防火墙状态:"
if command -v ufw > /dev/null; then
ufw status verbose
elif command -v firewall-cmd > /dev/null; then
firewall-cmd --list-all
else
log_info "未检测到防火墙"
fi
echo ""
log_info "网络连接状态:"
netstat -an | grep -E ":(80|443|3000)" | head -20
echo ""
log_info "系统日志(最近错误):"
journalctl -xe --no-pager | tail -50
}
# 6. 快速修复建议
suggest_fixes() {
separator
log_info "快速修复建议"
separator
echo ""
log_warning "根据诊断结果,建议执行以下操作:"
echo ""
echo "1. 如果Docker容器停止:"
echo " docker-compose -f /path/to/docker-compose.prod.yml up -d"
echo " docker-compose -f /path/to/docker-compose.prod.yml restart"
echo ""
echo "2. 如果Nginx异常:"
echo " sudo systemctl restart nginx"
echo " sudo nginx -t # 测试配置"
echo ""
echo "3. 如果应用服务异常:"
echo " docker logs <container-name> # 查看日志"
echo " docker restart <container-name> # 重启容器"
echo ""
echo "4. 如果资源耗尽:"
echo " # 清理Docker镜像"
echo " docker system prune -a -f"
echo " # 清理日志"
echo " sudo journalctl --vacuum-time=3d"
echo " # 重启服务"
echo " sudo systemctl restart docker"
echo ""
echo "5. 查看详细日志:"
echo " docker logs -f <container-name> # 实时查看容器日志"
echo " tail -f /var/log/nginx/error.log # 实时查看Nginx错误日志"
echo " journalctl -u docker -f # 实时查看Docker服务日志"
}
# 一键诊断
full_diagnosis() {
log_info "开始完整诊断..."
check_system_resources
echo ""
check_docker
echo ""
check_nginx
echo ""
check_application
echo ""
check_network
echo ""
suggest_fixes
}
# 主菜单
main_menu() {
clear
separator
echo "远程服务器诊断工具"
separator
echo ""
echo "1. 检查系统资源"
echo "2. 检查Docker容器"
echo "3. 检查Nginx"
echo "4. 检查应用服务"
echo "5. 检查防火墙和网络"
echo "6. 显示修复建议"
echo "7. 完整诊断"
echo "0. 退出"
echo ""
read -p "请选择操作 (0-7): " choice
case $choice in
1) check_system_resources ;;
2) check_docker ;;
3) check_nginx ;;
4) check_application ;;
5) check_network ;;
6) suggest_fixes ;;
7) full_diagnosis ;;
0)
log_info "退出程序"
exit 0
;;
*)
log_error "无效选择"
;;
esac
echo ""
read -p "按回车键继续..."
main_menu
}
# 主函数
main() {
log_info "远程服务器诊断工具启动"
if [ "$1" = "--full" ]; then
full_diagnosis
else
main_menu
fi
}
main "$@"