Files
ssl-manager/scripts/start-ssl-manager.sh
T
2026-04-08 17:52:38 +08:00

207 lines
5.6 KiB
Bash
Executable File

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