start-ssl-manager.sh 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. #!/bin/bash
  2. #############################################
  3. # SSL Manager 启动脚本
  4. #############################################
  5. set -e
  6. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  7. BACKEND_DIR="$SCRIPT_DIR/../backend"
  8. LOG_DIR="/var/log/ssl-manager"
  9. PID_FILE="$LOG_DIR/ssl-manager.pid"
  10. # 颜色定义
  11. RED='\033[0;31m'
  12. GREEN='\033[0;32m'
  13. YELLOW='\033[1;33m'
  14. NC='\033[0m'
  15. # 检查是否已运行
  16. check_running() {
  17. # 检查 PID 文件
  18. if [ -f "$PID_FILE" ]; then
  19. PID=$(cat "$PID_FILE")
  20. if ps -p "$PID" > /dev/null 2>&1; then
  21. echo -e "${YELLOW}⚠️ SSL Manager 已在运行中 (PID: $PID)${NC}"
  22. return 0
  23. else
  24. echo -e "${YELLOW}⚠️ 发现旧的 PID 文件,清理中...${NC}"
  25. rm -f "$PID_FILE"
  26. fi
  27. fi
  28. # 检查端口占用
  29. if command -v netstat > /dev/null 2>&1; then
  30. if netstat -tlnp 2>/dev/null | grep -q ":3000"; then
  31. echo -e "${YELLOW}⚠️ 端口 3000 已被占用,服务可能已在运行${NC}"
  32. return 0
  33. fi
  34. fi
  35. # 检查进程
  36. if pgrep -f "node.*src/index.js" > /dev/null 2>&1; then
  37. echo -e "${YELLOW}⚠️ SSL Manager 进程已在运行${NC}"
  38. return 0
  39. fi
  40. return 1
  41. }
  42. # 创建日志目录
  43. setup_logs() {
  44. if [ ! -d "$LOG_DIR" ]; then
  45. sudo mkdir -p "$LOG_DIR"
  46. sudo chmod 755 "$LOG_DIR"
  47. echo -e "${GREEN}✓ 日志目录已创建${NC}"
  48. fi
  49. }
  50. # 检查依赖
  51. check_dependencies() {
  52. if ! command -v node &> /dev/null; then
  53. echo -e "${RED}❌ 错误:未找到 Node.js,请先安装${NC}"
  54. exit 1
  55. fi
  56. if [ ! -f "$BACKEND_DIR/node_modules/.bin/express" ] && [ ! -d "$BACKEND_DIR/node_modules" ]; then
  57. echo -e "${YELLOW}⚠️ 后端依赖未安装,正在安装...${NC}"
  58. cd "$BACKEND_DIR"
  59. npm config set registry https://registry.npmmirror.com
  60. npm install --production
  61. fi
  62. }
  63. # 启动服务
  64. start_service() {
  65. echo -e "${GREEN}🚀 启动 SSL Manager...${NC}"
  66. # 检查 systemd 服务是否在运行
  67. if command -v systemctl > /dev/null 2>&1; then
  68. if systemctl is-active --quiet ssl-manager 2>/dev/null; then
  69. echo -e "${YELLOW}ℹ️ 检测到 systemd 服务正在运行${NC}"
  70. echo -e "${YELLOW} 建议使用:sudo systemctl [start|stop|restart] ssl-manager${NC}"
  71. echo -e "${YELLOW} 或使用本脚本的 restart 参数自动切换${NC}"
  72. echo ""
  73. read -p "是否停止 systemd 服务并改用脚本启动?(y/n): " choice
  74. if [ "$choice" = "y" ]; then
  75. echo -e "${YELLOW}🛑 停止 systemd 服务...${NC}"
  76. sudo systemctl stop ssl-manager
  77. sudo systemctl disable ssl-manager
  78. sleep 2
  79. else
  80. echo -e "${GREEN}✓ 继续使用 systemd 服务${NC}"
  81. echo -e "${GREEN}📍 访问地址:http://localhost:3000${NC}"
  82. return 0
  83. fi
  84. fi
  85. fi
  86. cd "$BACKEND_DIR"
  87. nohup node src/index.js > "$LOG_DIR/backend.log" 2>&1 &
  88. PID=$!
  89. echo "$PID" > "$PID_FILE"
  90. # 等待服务启动
  91. sleep 3
  92. if ps -p "$PID" > /dev/null 2>&1; then
  93. echo -e "${GREEN}✓ SSL Manager 启动成功 (PID: $PID)${NC}"
  94. echo -e "${GREEN}📍 访问地址:http://localhost:3000${NC}"
  95. echo -e "${GREEN}📝 日志文件:$LOG_DIR/backend.log${NC}"
  96. return 0
  97. else
  98. echo -e "${RED}❌ 启动失败,请查看日志:$LOG_DIR/backend.log${NC}"
  99. cat "$LOG_DIR/backend.log" | tail -20
  100. rm -f "$PID_FILE"
  101. return 1
  102. fi
  103. }
  104. # 停止服务
  105. stop_service() {
  106. echo -e "${YELLOW}🛑 停止 SSL Manager...${NC}"
  107. if [ -f "$PID_FILE" ]; then
  108. PID=$(cat "$PID_FILE")
  109. if ps -p "$PID" > /dev/null 2>&1; then
  110. kill "$PID"
  111. sleep 2
  112. if ps -p "$PID" > /dev/null 2>&1; then
  113. kill -9 "$PID"
  114. fi
  115. echo -e "${GREEN}✓ 服务已停止${NC}"
  116. else
  117. echo -e "${YELLOW}⚠️ 服务未运行${NC}"
  118. fi
  119. rm -f "$PID_FILE"
  120. else
  121. # 尝试通过进程名停止
  122. pkill -f "node src/index.js" 2>/dev/null && echo -e "${GREEN}✓ 服务已停止${NC}" || echo -e "${YELLOW}⚠️ 服务未运行${NC}"
  123. fi
  124. }
  125. # 重启服务
  126. restart_service() {
  127. stop_service
  128. sleep 2
  129. start_service
  130. }
  131. # 查看状态
  132. show_status() {
  133. if check_running; then
  134. echo -e "${GREEN}● SSL Manager 运行中${NC}"
  135. echo " PID: $(cat "$PID_FILE")"
  136. echo " 端口:3000"
  137. echo " 日志:$LOG_DIR/backend.log"
  138. else
  139. echo -e "${YELLOW}○ SSL Manager 未运行${NC}"
  140. fi
  141. }
  142. # 查看日志
  143. show_logs() {
  144. if [ -f "$LOG_DIR/backend.log" ]; then
  145. tail -f "$LOG_DIR/backend.log"
  146. else
  147. echo -e "${RED}❌ 日志文件不存在${NC}"
  148. exit 1
  149. fi
  150. }
  151. # 主函数
  152. case "${1:-start}" in
  153. start)
  154. if ! check_running; then
  155. setup_logs
  156. check_dependencies
  157. start_service
  158. fi
  159. ;;
  160. stop)
  161. stop_service
  162. ;;
  163. restart)
  164. restart_service
  165. ;;
  166. status)
  167. show_status
  168. ;;
  169. logs)
  170. show_logs
  171. ;;
  172. *)
  173. echo "用法:$0 {start|stop|restart|status|logs}"
  174. echo ""
  175. echo "命令:"
  176. echo " start - 启动服务"
  177. echo " stop - 停止服务"
  178. echo " restart - 重启服务"
  179. echo " status - 查看状态"
  180. echo " logs - 查看日志(实时)"
  181. exit 1
  182. ;;
  183. esac