server-check.sh 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. #!/bin/bash
  2. # ============================================
  3. # 中华药典 AI Agent — 服务器环境检查脚本
  4. # 用法: bash server-check.sh
  5. # ============================================
  6. set -e
  7. RED='\033[0;31m'
  8. GREEN='\033[0;32m'
  9. YELLOW='\033[1;33m'
  10. NC='\033[0m'
  11. pass() { echo -e "${GREEN}✅ $1${NC}"; }
  12. warn() { echo -e "${YELLOW}⚠️ $1${NC}"; }
  13. fail() { echo -e "${RED}❌ $1${NC}"; }
  14. echo "╔══════════════════════════════════════════╗"
  15. echo "║ 中华药典 AI Agent 服务器环境检查 ║"
  16. echo "╚══════════════════════════════════════════╝"
  17. echo ""
  18. # ---- 系统信息 ----
  19. echo "━━━━━━━━━━ 系统信息 ━━━━━━━━━━━━"
  20. echo "主机名: $(hostname)"
  21. echo "内核: $(uname -r)"
  22. if [ -f /etc/os-release ]; then
  23. . /etc/os-release
  24. echo "系统: $NAME $VERSION"
  25. fi
  26. echo "架构: $(uname -m)"
  27. echo ""
  28. # ---- CPU ----
  29. echo "━━━━━━━━━━ CPU ━━━━━━━━━━━━"
  30. CORES=$(nproc)
  31. CPU_MODEL=$(lscpu 2>/dev/null | grep "Model name" | cut -d: -f2 | xargs)
  32. echo "型号: $CPU_MODEL"
  33. echo "核心数: $CORES"
  34. if [ "$CORES" -ge 4 ]; then
  35. pass "核心数满足要求 (≥4)"
  36. else
  37. fail "核心数不足,需要 ≥4,当前 $CORES"
  38. fi
  39. echo ""
  40. # ---- 内存 ----
  41. echo "━━━━━━━━━━ 内存 ━━━━━━━━━━━━"
  42. MEM_TOTAL_KB=$(grep MemTotal /proc/meminfo | awk '{print $2}')
  43. MEM_TOTAL_GB=$((MEM_TOTAL_KB / 1024 / 1024))
  44. echo "总内存: ${MEM_TOTAL_GB} GB"
  45. free -h | head -2
  46. if [ "$MEM_TOTAL_GB" -ge 8 ]; then
  47. pass "内存满足要求 (≥8 GB)"
  48. elif [ "$MEM_TOTAL_GB" -ge 4 ]; then
  49. warn "内存偏小,最低 8 GB,当前 ${MEM_TOTAL_GB} GB"
  50. else
  51. fail "内存不足,需要 ≥8 GB,当前 ${MEM_TOTAL_GB} GB"
  52. fi
  53. echo ""
  54. # ---- 磁盘 ----
  55. echo "━━━━━━━━━━ 磁盘 ━━━━━━━━━━━━"
  56. df -h / | tail -1
  57. DISK_AVAIL_GB=$(df -BG / | tail -1 | awk '{print $4}' | sed 's/G//')
  58. echo "可用空间: ${DISK_AVAIL_GB} GB"
  59. if [ "$DISK_AVAIL_GB" -ge 20 ]; then
  60. pass "磁盘空间满足要求 (≥20 GB)"
  61. elif [ "$DISK_AVAIL_GB" -ge 10 ]; then
  62. warn "磁盘空间偏小,建议 ≥20 GB,当前 ${DISK_AVAIL_GB} GB"
  63. else
  64. fail "磁盘空间不足,需要 ≥20 GB,当前 ${DISK_AVAIL_GB} GB"
  65. fi
  66. echo ""
  67. # ---- Docker ----
  68. echo "━━━━━━━━━━ Docker ━━━━━━━━━━━━"
  69. if command -v docker &>/dev/null; then
  70. DOCKER_VER=$(docker --version 2>/dev/null | awk '{print $3}' | sed 's/,//')
  71. echo "版本: $DOCKER_VER"
  72. if docker info &>/dev/null 2>&1; then
  73. pass "Docker 已安装且运行中 ($DOCKER_VER)"
  74. else
  75. warn "Docker 已安装但守护进程未运行"
  76. fi
  77. else
  78. fail "Docker 未安装"
  79. fi
  80. if docker compose version &>/dev/null 2>&1; then
  81. COMPOSE_VER=$(docker compose version 2>/dev/null | awk '{print $4}' | sed 's/v//')
  82. pass "Docker Compose 已安装 ($COMPOSE_VER)"
  83. elif command -v docker-compose &>/dev/null; then
  84. COMPOSE_VER=$(docker-compose --version 2>/dev/null | awk '{print $4}' | sed 's/,//')
  85. pass "Docker Compose (旧版) 已安装 ($COMPOSE_VER)"
  86. else
  87. fail "Docker Compose 未安装"
  88. fi
  89. echo ""
  90. # ---- Python ----
  91. echo "━━━━━━━━━━ Python ━━━━━━━━━━━━"
  92. if command -v python3 &>/dev/null; then
  93. PY_VER=$(python3 --version 2>&1 | awk '{print $2}')
  94. PY_MAJOR=$(echo "$PY_VER" | cut -d. -f1)
  95. PY_MINOR=$(echo "$PY_VER" | cut -d. -f2)
  96. echo "版本: $PY_VER"
  97. if [ "$PY_MAJOR" -ge 3 ] && [ "$PY_MINOR" -ge 11 ]; then
  98. pass "Python 版本满足要求 (≥3.11)"
  99. else
  100. warn "Python 版本偏低,建议 ≥3.11,当前 $PY_VER"
  101. fi
  102. else
  103. fail "Python3 未安装"
  104. fi
  105. if command -v pip3 &>/dev/null; then
  106. echo "pip: $(pip3 --version 2>&1 | awk '{print $2}')"
  107. else
  108. warn "pip3 未安装"
  109. fi
  110. echo ""
  111. # ---- Java / Maven (可选) ----
  112. echo "━━━━━━━━━━ Java (可选) ━━━━━━━━━━━━"
  113. if command -v java &>/dev/null; then
  114. JAVA_VER=$(java -version 2>&1 | head -1 | awk -F'"' '{print $2}')
  115. echo "Java: $JAVA_VER"
  116. JAVA_MAJOR=$(echo "$JAVA_VER" | cut -d. -f1)
  117. if [ "$JAVA_MAJOR" -ge 21 ]; then
  118. pass "Java 版本满足 Spring Boot 3.3 要求 (≥21)"
  119. else
  120. warn "Java 版本偏低,Spring Boot 需要 ≥21,但 Python 后端不受影响"
  121. fi
  122. else
  123. echo "Java 未安装(不影响,可用 Python 后端)"
  124. fi
  125. if command -v mvn &>/dev/null; then
  126. echo "Maven: $(mvn --version 2>&1 | head -1 | awk '{print $3}')"
  127. else
  128. echo "Maven 未安装(不影响,可用 Python 后端)"
  129. fi
  130. echo ""
  131. # ---- Nginx ----
  132. echo "━━━━━━━━━━ Nginx ━━━━━━━━━━━━"
  133. if command -v nginx &>/dev/null; then
  134. NGINX_VER=$(nginx -v 2>&1 | awk -F'/' '{print $2}')
  135. pass "Nginx 已安装 ($NGINX_VER)"
  136. else
  137. warn "Nginx 未安装(生产环境需要)"
  138. fi
  139. echo ""
  140. # ---- 关键端口 ----
  141. echo "━━━━━━━━━━ 端口占用情况 ━━━━━━━━━━━━"
  142. check_port() {
  143. local port=$1
  144. local name=$2
  145. if ss -tlnp 2>/dev/null | grep -q ":${port} "; then
  146. fail "端口 $port ($name) 已被占用"
  147. ss -tlnp | grep ":${port} "
  148. else
  149. pass "端口 $port ($name) 空闲"
  150. fi
  151. }
  152. check_port 80 "Nginx HTTP"
  153. check_port 443 "Nginx HTTPS"
  154. check_port 5432 "PostgreSQL"
  155. check_port 6379 "Redis"
  156. check_port 8000 "FastAPI"
  157. check_port 9000 "Spring Boot"
  158. echo ""
  159. # ---- 外网连通性 ----
  160. echo "━━━━━━━━━━ 外网连通 ━━━━━━━━━━━━"
  161. if curl -s --connect-timeout 5 https://dashscope.aliyuncs.com > /dev/null 2>&1; then
  162. pass "可访问 Qwen API (dashscope.aliyuncs.com)"
  163. else
  164. fail "无法访问 Qwen API,请检查网络/代理"
  165. fi
  166. if curl -s --connect-timeout 5 https://registry-1.docker.io > /dev/null 2>&1; then
  167. pass "可访问 Docker Hub"
  168. else
  169. warn "无法访问 Docker Hub(镜像拉取可能需换国内源)"
  170. fi
  171. echo ""
  172. # ---- 防火墙 ----
  173. echo "━━━━━━━━━━ 防火墙 ━━━━━━━━━━━━"
  174. if command -v ufw &>/dev/null; then
  175. sudo ufw status 2>/dev/null | head -5 || warn "无法获取 ufw 状态"
  176. elif command -v firewall-cmd &>/dev/null; then
  177. sudo firewall-cmd --list-all 2>/dev/null || warn "无法获取 firewalld 状态"
  178. else
  179. warn "未检测到防火墙工具"
  180. fi
  181. echo ""
  182. # ---- 总结 ----
  183. echo "╔══════════════════════════════════════════╗"
  184. echo "║ 检查完成 ║"
  185. echo "╚══════════════════════════════════════════╝"
  186. echo ""
  187. echo "必备项: Docker | Docker Compose | Python 3.11+ | 端口 5432/6379/8000 空闲 | Qwen API 可达"
  188. echo "可选项: Nginx (生产推荐) | Java 21+Maven (只有 Spring Boot 后端需要)"
  189. echo ""
  190. echo "详情参考: docs/SERVER_DEPLOY.md"