207 lines
5.6 KiB
Bash
Executable File
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
|