install.sh 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. #!/bin/bash
  2. # KVM Manager 一键安装脚本 (前端 + 后端)
  3. set -e
  4. RED='\033[0;31m'
  5. GREEN='\033[0;32m'
  6. YELLOW='\033[1;33m'
  7. NC='\033[0m'
  8. echo -e "${GREEN}======================================"
  9. echo -e " KVM Manager 一键安装脚本"
  10. echo -e "======================================${NC}\n"
  11. if [[ $EUID -ne 0 ]]; then
  12. echo -e "${RED}[错误] 请使用 root 用户运行此脚本${NC}"
  13. echo -e "${YELLOW}提示: sudo bash $0${NC}"
  14. exit 1
  15. fi
  16. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  17. BACKEND_DIR="$SCRIPT_DIR/backend"
  18. FRONTEND_DIR="$SCRIPT_DIR/frontend"
  19. if [[ -f /etc/debian_version ]]; then
  20. echo -e "${GREEN}[检测] Debian/Ubuntu 系统${NC}"
  21. PKG_MANAGER="apt-get"
  22. elif [[ -f /etc/redhat-release ]]; then
  23. echo -e "${GREEN}[检测] RedHat/CentOS 系统${NC}"
  24. PKG_MANAGER="yum"
  25. elif [[ -f /etc/arch-release ]]; then
  26. echo -e "${GREEN}[检测] Arch Linux 系统${NC}"
  27. PKG_MANAGER="pacman"
  28. else
  29. echo -e "${RED}[错误] 不支持的操作系统${NC}"
  30. exit 1
  31. fi
  32. # ============================================================
  33. # 后端
  34. # ============================================================
  35. echo -e "${YELLOW}[1/5] 安装后端系统依赖...${NC}"
  36. if [[ "$PKG_MANAGER" == "apt-get" ]]; then
  37. apt-get update
  38. apt-get install -y libvirt-dev pkg-config python3-dev python3-venv
  39. elif [[ "$PKG_MANAGER" == "yum" ]]; then
  40. yum install -y libvirt-devel pkg-config python3-devel python3-pip
  41. elif [[ "$PKG_MANAGER" == "pacman" ]]; then
  42. pacman -Sy --noconfirm libvirt python python-pip
  43. fi
  44. echo -e "${YELLOW}[2/5] 检查 libvirtd 服务...${NC}"
  45. if systemctl is-active --quiet libvirtd; then
  46. echo -e "${GREEN} ✓ libvirtd 运行中${NC}"
  47. else
  48. echo -e "${YELLOW} 启动 libvirtd...${NC}"
  49. systemctl start libvirtd
  50. systemctl enable libvirtd
  51. fi
  52. echo -e "${YELLOW}[3/5] 配置后端 Python 环境...${NC}"
  53. cd "$BACKEND_DIR"
  54. if [[ -d "venv" ]]; then
  55. echo -e " 删除旧 venv..."
  56. rm -rf venv
  57. fi
  58. python3 -m venv venv
  59. source venv/bin/activate
  60. pip install --upgrade pip
  61. pip install -r requirements.txt
  62. python -c "
  63. import libvirt
  64. print(f' ✓ libvirt 模块加载成功, 版本: {libvirt.getVersion() // 1000000}')
  65. " || {
  66. echo -e "${RED}[错误] libvirt 模块验证失败${NC}"
  67. exit 1
  68. }
  69. # ============================================================
  70. # 前端
  71. # ============================================================
  72. echo -e "${YELLOW}[4/5] 配置前端...${NC}"
  73. if ! command -v node &> /dev/null; then
  74. echo -e " 安装 Node.js..."
  75. if [[ "$PKG_MANAGER" == "apt-get" ]]; then
  76. curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
  77. apt-get install -y nodejs
  78. elif [[ "$PKG_MANAGER" == "yum" ]]; then
  79. curl -fsSL https://rpm.nodesource.com/setup_20.x | bash -
  80. yum install -y nodejs
  81. fi
  82. fi
  83. echo -e " Node.js: $(node -v), npm: $(npm -v)"
  84. cd "$FRONTEND_DIR"
  85. npm install
  86. npm run build
  87. # 安装前端 Python 依赖 (starlette + uvicorn)
  88. pip install -r requirements.txt
  89. echo -e "${YELLOW}[5/5] 验证前端...${NC}"
  90. if [[ -d "dist" ]]; then
  91. echo -e "${GREEN} ✓ 前端编译成功, dist/ 已生成${NC}"
  92. else
  93. echo -e "${RED}[错误] 前端编译失败${NC}"
  94. exit 1
  95. fi
  96. echo ""
  97. echo -e "${GREEN}======================================"
  98. echo -e " 安装完成!"
  99. echo -e "======================================${NC}"
  100. echo ""
  101. echo -e "${YELLOW}启动后端 (端口 8004):${NC}"
  102. echo -e " cd $BACKEND_DIR"
  103. echo -e " source venv/bin/activate"
  104. echo -e " nohup python -m uvicorn app.main:app --host 0.0.0.0 --port 8004 > app.log 2>&1 &"
  105. echo ""
  106. echo -e "${YELLOW}启动前端 (端口 8006):${NC}"
  107. echo -e " cd $FRONTEND_DIR"
  108. echo -e " nohup python serve.py > serve.log 2>&1 &"
  109. echo ""
  110. echo -e "${YELLOW}访问地址:${NC}"
  111. echo -e " http://<服务器IP>:8006"
  112. echo ""
  113. echo -e "${YELLOW}一键启动全部服务:${NC}"
  114. echo -e " cd $BACKEND_DIR && source venv/bin/activate && nohup python -m uvicorn app.main:app --host 0.0.0.0 --port 8004 > app.log 2>&1 &"
  115. echo -e " cd $FRONTEND_DIR && nohup python serve.py > serve.log 2>&1 &"
  116. echo ""