280 lines
6.4 KiB
Bash
Executable File
280 lines
6.4 KiB
Bash
Executable File
#!/bin/bash
|
||
# PT System Checking 一键部署脚本
|
||
# 支持从 Gitea 下载并配置为 systemd 服务
|
||
|
||
set -e
|
||
|
||
# 颜色输出
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# 配置变量
|
||
GITEA_REPO="https://gitea.service.jazzwhom.top/Passthem/pt-disk-report"
|
||
SERVICE_NAME="pt_system_checking"
|
||
INSTALL_DIR="/opt/${SERVICE_NAME}"
|
||
SYSTEMD_SERVICE="/etc/systemd/system/${SERVICE_NAME}.service"
|
||
|
||
# 打印信息函数
|
||
print_info() {
|
||
echo -e "${GREEN}[INFO]${NC} $1"
|
||
}
|
||
|
||
print_warn() {
|
||
echo -e "${YELLOW}[WARN]${NC} $1"
|
||
}
|
||
|
||
print_error() {
|
||
echo -e "${RED}[ERROR]${NC} $1"
|
||
}
|
||
|
||
# 检查是否以 root 运行
|
||
check_root() {
|
||
if [ "$EUID" -ne 0 ]; then
|
||
print_error "请使用 root 权限运行此脚本"
|
||
echo "使用方法: sudo bash install.sh"
|
||
exit 1
|
||
fi
|
||
}
|
||
|
||
# 检测系统架构
|
||
detect_arch() {
|
||
local arch=$(uname -m)
|
||
case $arch in
|
||
x86_64)
|
||
echo "amd64"
|
||
;;
|
||
aarch64|arm64)
|
||
echo "arm64"
|
||
;;
|
||
*)
|
||
print_error "不支持的架构: $arch"
|
||
exit 1
|
||
;;
|
||
esac
|
||
}
|
||
|
||
# 获取最新版本
|
||
get_latest_version() {
|
||
local version=$(curl -s "${GITEA_REPO}/releases" | grep -oP 'releases/tag/v\K[0-9.]+' | head -1)
|
||
if [ -z "$version" ]; then
|
||
version="0.1.0"
|
||
print_warn "无法自动获取版本,使用默认版本 ${version}" >&2
|
||
fi
|
||
echo "$version"
|
||
}
|
||
|
||
# 下载二进制文件
|
||
download_binary() {
|
||
local arch=$1
|
||
local version=$2
|
||
local binary_name="${SERVICE_NAME}-${arch}"
|
||
local download_url="${GITEA_REPO}/releases/download/v${version}/${binary_name}"
|
||
|
||
print_info "下载 ${arch} 架构的二进制文件..."
|
||
print_info "下载地址: ${download_url}"
|
||
|
||
if ! curl -L -f -o "/tmp/${binary_name}" "${download_url}"; then
|
||
print_error "下载失败,请检查版本号和网络连接"
|
||
print_info "尝试的 URL: ${download_url}"
|
||
exit 1
|
||
fi
|
||
|
||
chmod +x "/tmp/${binary_name}"
|
||
print_info "下载完成"
|
||
}
|
||
|
||
# 交互式配置
|
||
interactive_config() {
|
||
echo ""
|
||
print_info "=== 配置服务参数 ==="
|
||
echo ""
|
||
|
||
# 检查是否为非交互模式(通过管道执行)
|
||
if [ ! -t 0 ]; then
|
||
print_info "检测到非交互模式,使用默认配置"
|
||
SERVER_URL=""
|
||
INTERVAL=300
|
||
LOG_LEVEL="info"
|
||
|
||
print_info "配置摘要:"
|
||
echo " 服务器 URL: ${SERVER_URL:-未配置}"
|
||
echo " 检查间隔: ${INTERVAL} 秒"
|
||
echo " 日志级别: ${LOG_LEVEL}"
|
||
echo ""
|
||
return
|
||
fi
|
||
|
||
# 服务器 URL
|
||
read -p "请输入服务器 URL(用于上报磁盘状态,留空则不上报): " SERVER_URL
|
||
SERVER_URL=${SERVER_URL:-""}
|
||
|
||
# 检查间隔
|
||
read -p "请输入检查间隔(秒,默认 300): " INTERVAL
|
||
INTERVAL=${INTERVAL:-300}
|
||
|
||
# 日志级别
|
||
read -p "请输入日志级别(trace/debug/info/warn/error,默认 info): " LOG_LEVEL
|
||
LOG_LEVEL=${LOG_LEVEL:-"info"}
|
||
|
||
echo ""
|
||
print_info "配置摘要:"
|
||
echo " 服务器 URL: ${SERVER_URL:-未配置}"
|
||
echo " 检查间隔: ${INTERVAL} 秒"
|
||
echo " 日志级别: ${LOG_LEVEL}"
|
||
echo ""
|
||
|
||
read -p "确认以上配置?(y/n): " confirm
|
||
if [[ ! $confirm =~ ^[Yy]$ ]]; then
|
||
print_warn "取消安装"
|
||
exit 0
|
||
fi
|
||
}
|
||
|
||
# 安装服务
|
||
install_service() {
|
||
local arch=$1
|
||
local binary_name="${SERVICE_NAME}-${arch}"
|
||
|
||
print_info "安装服务..."
|
||
|
||
# 创建安装目录
|
||
mkdir -p "${INSTALL_DIR}"
|
||
|
||
# 复制二进制文件
|
||
cp "/tmp/${binary_name}" "${INSTALL_DIR}/${SERVICE_NAME}"
|
||
chmod +x "${INSTALL_DIR}/${SERVICE_NAME}"
|
||
|
||
# 创建 systemd 服务文件
|
||
cat > "${SYSTEMD_SERVICE}" <<EOF
|
||
[Unit]
|
||
Description=PT System Disk Checking Service
|
||
After=network-online.target
|
||
Wants=network-online.target
|
||
|
||
[Service]
|
||
Type=simple
|
||
User=root
|
||
Group=root
|
||
Restart=always
|
||
RestartSec=10
|
||
|
||
# 工作目录
|
||
WorkingDirectory=${INSTALL_DIR}
|
||
|
||
# 二进制文件路径
|
||
ExecStart=${INSTALL_DIR}/${SERVICE_NAME}
|
||
|
||
# 环境变量配置
|
||
Environment="PT__SERVER_URL=${SERVER_URL}"
|
||
Environment="PT__INTERVAL=${INTERVAL}"
|
||
Environment="PT__LOG_LEVEL=${LOG_LEVEL}"
|
||
|
||
# 安全设置
|
||
NoNewPrivileges=true
|
||
PrivateTmp=true
|
||
|
||
# 日志配置
|
||
StandardOutput=journal
|
||
StandardError=journal
|
||
SyslogIdentifier=${SERVICE_NAME}
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
EOF
|
||
|
||
# 重载 systemd
|
||
systemctl daemon-reload
|
||
|
||
print_info "服务安装完成"
|
||
}
|
||
|
||
# 启动服务
|
||
start_service() {
|
||
print_info "启动服务..."
|
||
|
||
systemctl enable "${SERVICE_NAME}"
|
||
systemctl start "${SERVICE_NAME}"
|
||
|
||
sleep 2
|
||
|
||
if systemctl is-active --quiet "${SERVICE_NAME}"; then
|
||
print_info "服务启动成功!"
|
||
echo ""
|
||
print_info "常用命令:"
|
||
echo " 查看状态: systemctl status ${SERVICE_NAME}"
|
||
echo " 查看日志: journalctl -u ${SERVICE_NAME} -f"
|
||
echo " 停止服务: systemctl stop ${SERVICE_NAME}"
|
||
echo " 重启服务: systemctl restart ${SERVICE_NAME}"
|
||
else
|
||
print_error "服务启动失败,请查看日志:"
|
||
echo " journalctl -u ${SERVICE_NAME} -n 50"
|
||
exit 1
|
||
fi
|
||
}
|
||
|
||
# 卸载服务
|
||
uninstall_service() {
|
||
print_info "卸载服务..."
|
||
|
||
if systemctl is-active --quiet "${SERVICE_NAME}"; then
|
||
systemctl stop "${SERVICE_NAME}"
|
||
fi
|
||
|
||
systemctl disable "${SERVICE_NAME}" 2>/dev/null || true
|
||
|
||
rm -f "${SYSTEMD_SERVICE}"
|
||
rm -rf "${INSTALL_DIR}"
|
||
|
||
systemctl daemon-reload
|
||
|
||
print_info "服务已卸载"
|
||
}
|
||
|
||
# 主函数
|
||
main() {
|
||
echo ""
|
||
print_info "=== PT System Checking 一键部署脚本 ==="
|
||
echo ""
|
||
|
||
# 检查参数
|
||
if [ "$1" == "uninstall" ]; then
|
||
check_root
|
||
uninstall_service
|
||
exit 0
|
||
fi
|
||
|
||
check_root
|
||
|
||
# 检测架构
|
||
ARCH=$(detect_arch)
|
||
print_info "检测到系统架构: ${ARCH}"
|
||
|
||
# 获取版本
|
||
print_info "获取最新版本信息..."
|
||
VERSION=$(get_latest_version)
|
||
print_info "使用版本: v${VERSION}"
|
||
|
||
# 下载二进制文件
|
||
download_binary "${ARCH}" "${VERSION}"
|
||
|
||
# 交互式配置
|
||
interactive_config
|
||
|
||
# 安装服务
|
||
install_service "${ARCH}"
|
||
|
||
# 启动服务
|
||
start_service
|
||
|
||
# 清理临时文件
|
||
rm -f "/tmp/${SERVICE_NAME}-${ARCH}"
|
||
|
||
echo ""
|
||
print_info "部署完成!"
|
||
}
|
||
|
||
# 运行主函数
|
||
main "$@"
|