#!/bin/bash ############################################# # SSL Manager 启动脚本 ############################################# set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" BACKEND_DIR="$SCRIPT_DIR/../backend" LOG_DIR="/var/log/ssl-manager" PID_FILE="$LOG_DIR/ssl-manager.pid" # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # 检查是否已运行 check_running() { # 检查 PID 文件 if [ -f "$PID_FILE" ]; then PID=$(cat "$PID_FILE") if ps -p "$PID" > /dev/null 2>&1; then echo -e "${YELLOW}⚠️ SSL Manager 已在运行中 (PID: $PID)${NC}" return 0 else echo -e "${YELLOW}⚠️ 发现旧的 PID 文件,清理中...${NC}" rm -f "$PID_FILE" fi fi # 检查端口占用 if command -v netstat > /dev/null 2>&1; then if netstat -tlnp 2>/dev/null | grep -q ":3000"; then echo -e "${YELLOW}⚠️ 端口 3000 已被占用,服务可能已在运行${NC}" return 0 fi fi # 检查进程 if pgrep -f "node.*src/index.js" > /dev/null 2>&1; then echo -e "${YELLOW}⚠️ SSL Manager 进程已在运行${NC}" return 0 fi return 1 } # 创建日志目录 setup_logs() { if [ ! -d "$LOG_DIR" ]; then sudo mkdir -p "$LOG_DIR" sudo chmod 755 "$LOG_DIR" echo -e "${GREEN}✓ 日志目录已创建${NC}" fi } # 检查依赖 check_dependencies() { if ! command -v node &> /dev/null; then echo -e "${RED}❌ 错误:未找到 Node.js,请先安装${NC}" exit 1 fi if [ ! -f "$BACKEND_DIR/node_modules/.bin/express" ] && [ ! -d "$BACKEND_DIR/node_modules" ]; then echo -e "${YELLOW}⚠️ 后端依赖未安装,正在安装...${NC}" cd "$BACKEND_DIR" npm config set registry https://registry.npmmirror.com npm install --production fi } # 启动服务 start_service() { echo -e "${GREEN}🚀 启动 SSL Manager...${NC}" # 检查 systemd 服务是否在运行 if command -v systemctl > /dev/null 2>&1; then if systemctl is-active --quiet ssl-manager 2>/dev/null; then echo -e "${YELLOW}ℹ️ 检测到 systemd 服务正在运行${NC}" echo -e "${YELLOW} 建议使用:sudo systemctl [start|stop|restart] ssl-manager${NC}" echo -e "${YELLOW} 或使用本脚本的 restart 参数自动切换${NC}" echo "" read -p "是否停止 systemd 服务并改用脚本启动?(y/n): " choice if [ "$choice" = "y" ]; then echo -e "${YELLOW}🛑 停止 systemd 服务...${NC}" sudo systemctl stop ssl-manager sudo systemctl disable ssl-manager sleep 2 else echo -e "${GREEN}✓ 继续使用 systemd 服务${NC}" echo -e "${GREEN}📍 访问地址:http://localhost:3000${NC}" return 0 fi fi fi cd "$BACKEND_DIR" nohup node src/index.js > "$LOG_DIR/backend.log" 2>&1 & PID=$! echo "$PID" > "$PID_FILE" # 等待服务启动 sleep 3 if ps -p "$PID" > /dev/null 2>&1; then echo -e "${GREEN}✓ SSL Manager 启动成功 (PID: $PID)${NC}" echo -e "${GREEN}📍 访问地址:http://localhost:3000${NC}" echo -e "${GREEN}📝 日志文件:$LOG_DIR/backend.log${NC}" return 0 else echo -e "${RED}❌ 启动失败,请查看日志:$LOG_DIR/backend.log${NC}" cat "$LOG_DIR/backend.log" | tail -20 rm -f "$PID_FILE" return 1 fi } # 停止服务 stop_service() { echo -e "${YELLOW}🛑 停止 SSL Manager...${NC}" if [ -f "$PID_FILE" ]; then PID=$(cat "$PID_FILE") if ps -p "$PID" > /dev/null 2>&1; then kill "$PID" sleep 2 if ps -p "$PID" > /dev/null 2>&1; then kill -9 "$PID" fi echo -e "${GREEN}✓ 服务已停止${NC}" else echo -e "${YELLOW}⚠️ 服务未运行${NC}" fi rm -f "$PID_FILE" else # 尝试通过进程名停止 pkill -f "node src/index.js" 2>/dev/null && echo -e "${GREEN}✓ 服务已停止${NC}" || echo -e "${YELLOW}⚠️ 服务未运行${NC}" fi } # 重启服务 restart_service() { stop_service sleep 2 start_service } # 查看状态 show_status() { if check_running; then echo -e "${GREEN}● SSL Manager 运行中${NC}" echo " PID: $(cat "$PID_FILE")" echo " 端口:3000" echo " 日志:$LOG_DIR/backend.log" else echo -e "${YELLOW}○ SSL Manager 未运行${NC}" fi } # 查看日志 show_logs() { if [ -f "$LOG_DIR/backend.log" ]; then tail -f "$LOG_DIR/backend.log" else echo -e "${RED}❌ 日志文件不存在${NC}" exit 1 fi } # 主函数 case "${1:-start}" in start) if ! check_running; then setup_logs check_dependencies start_service fi ;; stop) stop_service ;; restart) restart_service ;; status) show_status ;; logs) show_logs ;; *) echo "用法:$0 {start|stop|restart|status|logs}" echo "" echo "命令:" echo " start - 启动服务" echo " stop - 停止服务" echo " restart - 重启服务" echo " status - 查看状态" echo " logs - 查看日志(实时)" exit 1 ;; esac