| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 |
- #!/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
|