#!/bin/bash # ================================================ # 星启面板 - 一键安装脚本 # 官网: https://xingqi.panel # ================================================ RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[0;33m' BLUE='\033[0;34m' NC='\033[0m' echo -e "${BLUE}" echo " ╔═══════════════════════════════════════════╗" echo " ║ ║" echo " ║ ⭐ 星启面板 安装程序 ⭐ ║" echo " ║ ║" echo " ║ 版本: 1.0.0 ║" echo " ║ ║" echo " ╚═══════════════════════════════════════════╝" echo -e "${NC}" # 检查root权限 if [ "$(id -u)" != "0" ]; then echo -e "${RED}错误: 请使用root权限运行此脚本${NC}" echo "使用: sudo bash install.sh" exit 1 fi # 设置管理员账号 setup_admin() { echo "" echo -e "${BLUE}════════════════════════════════════════════${NC}" echo -e "${BLUE} 设置管理员账号密码 ${NC}" echo -e "${BLUE}════════════════════════════════════════════${NC}" echo "" # 输入用户名(从终端读取) while true; do read -p "请输入管理员用户名 (默认: admin): " ADMIN_USER < /dev/tty ADMIN_USER=${ADMIN_USER:-admin} if [[ ${#ADMIN_USER} -ge 3 ]]; then break else echo -e "${RED}用户名至少3个字符${NC}" fi done # 输入密码(从终端读取,解决管道输入问题) while true; do read -s -p "请输入管理员密码 (至少6位): " ADMIN_PASS < /dev/tty echo "" if [[ ${#ADMIN_PASS} -ge 6 ]]; then read -s -p "请再次确认密码: " ADMIN_PASS2 < /dev/tty echo "" if [ "$ADMIN_PASS" == "$ADMIN_PASS2" ]; then break else echo -e "${RED}两次密码不一致,请重新输入${NC}" fi else echo -e "${RED}密码至少6个字符${NC}" fi done echo "" echo -e "${GREEN}✓ 管理员账号设置完成${NC}" echo -e " 用户名: ${YELLOW}$ADMIN_USER${NC}" echo "" } # 检查系统 check_system() { if [ -f /etc/redhat-release ]; then OS="centos" elif cat /etc/issue | grep -Eqi "debian"; then OS="debian" elif cat /etc/issue | grep -Eqi "ubuntu"; then OS="ubuntu" else echo -e "${RED}暂不支持此系统${NC}" exit 1 fi echo -e "${GREEN}✓ 检测到系统: $OS${NC}" } # 安装依赖 install_deps() { echo -e "${YELLOW}正在安装依赖...${NC}" if [ "$OS" == "centos" ]; then yum install -y curl wget git unzip nodejs npm else apt-get update apt-get install -y curl wget git unzip nodejs npm fi # 安装Node.js 18+ if ! command -v node &> /dev/null || [ "$(node -v | cut -d'v' -f2 | cut -d'.' -f1)" -lt 18 ]; then echo -e "${YELLOW}安装 Node.js 18...${NC}" curl -fsSL https://deb.nodesource.com/setup_18.x | bash - apt-get install -y nodejs || yum install -y nodejs fi echo -e "${GREEN}✓ 依赖安装完成${NC}" } # 下载面板 download_panel() { echo -e "${YELLOW}正在下载星启面板...${NC}" INSTALL_DIR="/opt/xingqipanel" WWWROOT="/www/wwwroot" mkdir -p $INSTALL_DIR mkdir -p $WWWROOT cd $INSTALL_DIR # 下载最新版本 wget -O panel.zip "https://panel.xyxhqy.com/downloads/xingqi-panel-latest.zip" 2>/dev/null || { echo -e "${YELLOW}从备用源下载...${NC}" curl -L -o panel.zip "https://panel.xyxhqy.com/downloads/xingqi-panel-latest.zip" 2>/dev/null || { echo -e "${RED}下载失败,请检查网络${NC}" exit 1 } } if [ -f panel.zip ]; then unzip -o panel.zip rm panel.zip fi echo -e "${GREEN}✓ 下载完成${NC}" } # 安装面板 install_panel() { echo -e "${YELLOW}正在安装面板...${NC}" cd /opt/xingqipanel # 安装后端依赖(前端已预构建,无需安装) npm install --omit=dev echo -e "${GREEN}✓ 面板安装完成${NC}" } # 配置管理员账号 config_admin() { echo -e "${YELLOW}正在配置管理员账号...${NC}" cd /opt/xingqipanel/server # 生成密码哈希 (使用node) PASS_HASH=$(node -e "const bcrypt = require('bcryptjs'); console.log(bcrypt.hashSync('$ADMIN_PASS', 10))") # 写入配置文件 (后端使用 config.json) cat > config.json << EOF { "username": "$ADMIN_USER", "password": "$PASS_HASH", "panelPort": 3001, "theme": "light", "language": "zh-CN", "setupComplete": true } EOF echo -e "${GREEN}✓ 管理员账号配置完成${NC}" } # 配置服务 setup_service() { echo -e "${YELLOW}正在配置系统服务...${NC}" cat > /etc/systemd/system/xingqi-panel.service << EOF [Unit] Description=星启面板 After=network.target [Service] Type=simple User=root WorkingDirectory=/opt/xingqipanel Environment=NODE_ENV=production ExecStart=/usr/bin/node server/index.js Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable xingqi-panel systemctl start xingqi-panel echo -e "${GREEN}✓ 服务配置完成${NC}" } # 显示完成信息 show_complete() { # 获取IP IP=$(curl -s ip.sb || curl -s ifconfig.me || hostname -I | awk '{print $1}') echo "" echo -e "${GREEN} ╔═══════════════════════════════════════════╗${NC}" echo -e "${GREEN} ║ ║${NC}" echo -e "${GREEN} ║ ⭐ 星启面板安装成功! ⭐ ║${NC}" echo -e "${GREEN} ║ ║${NC}" echo -e "${GREEN} ╚═══════════════════════════════════════════╝${NC}" echo "" echo -e " 面板地址: ${BLUE}http://$IP:3001${NC}" echo "" echo -e " ┌─────────────────────────────────────────┐" echo -e " │ 管理员账号: ${YELLOW}$ADMIN_USER${NC}" echo -e " │ 管理员密码: ${YELLOW}(您设置的密码)${NC}" echo -e " └─────────────────────────────────────────┘" echo "" echo -e " ${GREEN}请妥善保管您的账号密码!${NC}" echo "" echo -e "${BLUE} ════════════════════════════════════════════${NC}" echo "" echo " 常用命令:" echo " 启动: systemctl start xingqi-panel" echo " 停止: systemctl stop xingqi-panel" echo " 重启: systemctl restart xingqi-panel" echo " 状态: systemctl status xingqi-panel" echo " 日志: journalctl -u xingqi-panel -f" echo "" # 上报安装统计 curl -s -X POST "https://panel.xyxhqy.com/api/stats/install" > /dev/null 2>&1 } # 主流程 main() { setup_admin check_system install_deps download_panel install_panel config_admin setup_service show_complete } main