VPSHUB/app/install.sh
2026-05-24 03:04:41 +08:00

191 lines
4.9 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# 核云IDC服务商VPS自动监测重启程序 - 安装脚本
# 该脚本会创建一个systemd服务持续化运行当前目录下的python main.py命令
# 获取当前脚本所在目录的绝对路径
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
# 定义服务名称
SERVICE_NAME="idc-monitor"
SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"
echo "正在安装 ${SERVICE_NAME} 服务..."
# 检查是否以root权限运行
if [ "$EUID" -ne 0 ]; then
echo "错误: 请以root权限运行此脚本 (sudo ./install.sh)"
exit 1
fi
# 检查Python是否已安装
if ! command -v python3 &> /dev/null; then
if command -v python &> /dev/null; then
PYTHON_CMD="python"
else
echo "错误: 未找到Python请先安装Python"
exit 1
fi
else
PYTHON_CMD="python3"
fi
echo "检测到Python: ${PYTHON_CMD}"
# 检查并安装pip
install_pip() {
echo "正在安装pip..."
# 尝试使用系统包管理器安装pip
if command -v apt-get &> /dev/null; then
apt-get update && apt-get install -y python3-pip
PIP_CMD="pip3"
elif command -v yum &> /dev/null; then
yum install -y python3-pip
PIP_CMD="pip3"
elif command -v dnf &> /dev/null; then
dnf install -y python3-pip
PIP_CMD="pip3"
else
# 如果包管理器不可用使用get-pip.py
echo "未检测到常用包管理器尝试使用get-pip.py安装..."
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
${PYTHON_CMD} get-pip.py
rm -f get-pip.py
PIP_CMD="pip"
fi
# 验证pip安装
if command -v pip3 &> /dev/null; then
PIP_CMD="pip3"
elif command -v pip &> /dev/null; then
PIP_CMD="pip"
else
echo "错误: pip安装失败"
return 1
fi
echo "✅ pip安装成功: ${PIP_CMD}"
return 0
}
# 检查pip是否存在
if command -v pip3 &> /dev/null; then
PIP_CMD="pip3"
echo "检测到pip: ${PIP_CMD}"
elif command -v pip &> /dev/null; then
PIP_CMD="pip"
echo "检测到pip: ${PIP_CMD}"
else
echo "警告: 未检测到pip"
read -p "是否现在安装pip(Y/n): " -n 1 -r
echo
if [[ $REPLY =~ ^[Nn]$ ]]; then
echo "跳过pip安装"
PIP_CMD=""
else
if ! install_pip; then
echo "错误: pip安装失败无法继续"
exit 1
fi
fi
fi
# 安装Python依赖
if [ -f "${PROJECT_DIR}/requirements.txt" ]; then
if [ -n "${PIP_CMD}" ]; then
echo "正在安装Python依赖包..."
cd ${PROJECT_DIR}
if ${PIP_CMD} install -r requirements.txt; then
echo "✅ Python依赖包安装成功"
else
echo "❌ Python依赖包安装失败"
read -p "是否继续安装服务?(y/N): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
echo "安装已取消"
exit 1
fi
fi
else
echo "警告: 跳过依赖包安装pip不可用"
fi
else
echo "警告: ${PROJECT_DIR}/requirements.txt 文件不存在,跳过依赖安装"
fi
# 检查main.py是否存在
if [ ! -f "${PROJECT_DIR}/main.py" ]; then
echo "警告: ${PROJECT_DIR}/main.py 文件不存在"
echo "请确保main.py文件位于项目根目录下"
read -p "是否继续安装?(y/N): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
echo "安装已取消"
exit 1
fi
fi
# ... existing code ...
# 创建systemd服务文件
cat > ${SERVICE_FILE} << EOF
[Unit]
Description=Heyun IDC Monitor Service
After=network.target
Wants=network-online.target
[Service]
Type=simple
User=root
WorkingDirectory=${PROJECT_DIR}
ExecStart=${PYTHON_CMD} ${PROJECT_DIR}/main.py
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
SyslogIdentifier=${SERVICE_NAME}
# 资源限制
LimitNOFILE=65536
# 安全设置
NoNewPrivileges=true
ProtectSystem=strict
ReadWritePaths=${PROJECT_DIR}
[Install]
WantedBy=multi-user.target
EOF
# ... existing code ...
# 重新加载systemd配置
systemctl daemon-reload
# 启用服务(开机自启)
systemctl enable ${SERVICE_NAME}
# 启动服务
systemctl start ${SERVICE_NAME}
# 检查服务状态
if systemctl is-active --quiet ${SERVICE_NAME}; then
echo "${SERVICE_NAME} 服务已成功安装并启动"
echo "服务状态: 运行中"
else
echo "${SERVICE_NAME} 服务启动失败"
echo "请检查日志: journalctl -u ${SERVICE_NAME} -f"
exit 1
fi
echo ""
echo "常用命令:"
echo " 查看服务状态: systemctl status ${SERVICE_NAME}"
echo " 查看实时日志: journalctl -u ${SERVICE_NAME} -f"
echo " 停止服务: systemctl stop ${SERVICE_NAME}"
echo " 重启服务: systemctl restart ${SERVICE_NAME}"
echo " 卸载服务: ./uninstall.sh"
echo ""
echo "安装完成!"