Files
pt-disk-report/install.sh
2026-02-22 20:55:05 +08:00

280 lines
6.4 KiB
Bash
Executable File
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
# 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 "$@"