feat(core): 重构全球时钟同步架构,强制挂载绝对 UTC 时区,实现分布节点天然并发削峰与战报时间对齐

This commit is contained in:
hotyue
2026-04-27 01:54:59 +00:00
parent ae36155545
commit d24be4da0b
4 changed files with 32 additions and 17 deletions

View File

@@ -2,8 +2,8 @@ name: Daily Data Factory
on: on:
schedule: schedule:
# 每天 UTC 18:00 (北京时间凌晨 02:00) 执行,赶在节点凌晨3点更新前造好子弹 # 每天 UTC 03:00 执行,为各节点全天随机拉取准备好弹药
- cron: '0 18 * * *' - cron: '0 3 * * *'
workflow_dispatch: workflow_dispatch:
env: env:

View File

@@ -2,8 +2,8 @@ name: Automated Massive UA Factory
on: on:
schedule: schedule:
# 每个月 1 号凌晨 00:00 执行 # 每个月 1 号凌晨 04:00 执行
- cron: '0 0 1 * *' - cron: '0 4 1 * *'
workflow_dispatch: # 允许手动点击运行 workflow_dispatch: # 允许手动点击运行
jobs: jobs:

View File

@@ -667,8 +667,12 @@ fi
# 7. 配置系统定时任务 (高频调度与看门狗) # 7. 配置系统定时任务 (高频调度与看门狗)
echo -e "\n[7/7] 正在注入系统守护进程与调度器..." echo -e "\n[7/7] 正在注入系统守护进程与调度器..."
# [v3.3.0 新增] 初始化 UA 指纹库更新时间戳,确立 30 天滚动周期的计算锚点 # [时钟同步核心] 获取部署时的绝对 UTC 时间锚点,用于打散全球节点的云端拉取并发
echo $(date +%s) > "${INSTALL_DIR}/core/.ua_last_update" DEPLOY_UTC_HOUR=$(date -u +%H)
DEPLOY_UTC_MIN=$(date -u +%M)
# [v3.3.0 新增] 初始化 UA 指纹库更新时间戳,确立 30 天滚动周期的计算锚点 (强制 UTC)
echo $(date -u +%s) > "${INSTALL_DIR}/core/.ua_last_update"
if command -v systemctl >/dev/null 2>&1; then if command -v systemctl >/dev/null 2>&1; then
echo "💡 检测到 Systemd 环境,正在部署原生守护服务..." echo "💡 检测到 Systemd 环境,正在部署原生守护服务..."
@@ -720,7 +724,8 @@ EOF
[Unit] [Unit]
Description=Timer for IP-Sentinel Updater Service Description=Timer for IP-Sentinel Updater Service
[Timer] [Timer]
OnCalendar=*-*-* 03:00:00 # [绝对 UTC 锚点] 每天精确在部署的时刻触发,实现全球请求的天然削峰
OnCalendar=*-*-* ${DEPLOY_UTC_HOUR}:${DEPLOY_UTC_MIN}:00 UTC
Persistent=true Persistent=true
Unit=ip-sentinel-updater.service Unit=ip-sentinel-updater.service
[Install] [Install]
@@ -750,7 +755,8 @@ EOF
[Unit] [Unit]
Description=Timer for IP-Sentinel Telegram Report Service Description=Timer for IP-Sentinel Telegram Report Service
[Timer] [Timer]
OnCalendar=*-*-* 08:00:00 # [绝对 UTC 锚点] 全球统一:每天 UTC 16:00 准时向司令部发送战报
OnCalendar=*-*-* 16:00:00 UTC
Unit=ip-sentinel-report.service Unit=ip-sentinel-report.service
[Install] [Install]
WantedBy=timers.target WantedBy=timers.target
@@ -809,18 +815,22 @@ EOF
rm -f /tmp/cron_clean rm -f /tmp/cron_clean
# 2. 写入我们的死循环守护进程 # 2. 写入我们的死循环守护进程
cat > ${INSTALL_DIR}/core/sentinel_scheduler.sh << 'EOF' # [极客修复] 将 << 'EOF' 变为 << EOF以允许在安装时将部署时刻的 DEPLOY_UTC 变量作为硬编码注入脚本中
cat > ${INSTALL_DIR}/core/sentinel_scheduler.sh << EOF
#!/bin/bash #!/bin/bash
while true; do while true; do
MIN=$(date +%M) # 强制获取绝对 UTC 时分,免疫系统错误时区
HOUR=$(date +%H) MIN=\$(date -u +%M)
if [ "$MIN" == "00" ] || [ "$MIN" == "30" ]; then HOUR=\$(date -u +%H)
if [ "\$MIN" == "00" ] || [ "\$MIN" == "30" ]; then
/bin/bash /opt/ip_sentinel/core/runner.sh >/dev/null 2>&1 /bin/bash /opt/ip_sentinel/core/runner.sh >/dev/null 2>&1
fi fi
if [ "$HOUR" == "03" ] && [ "$MIN" == "00" ]; then # [绝对 UTC 锚点] 基于部署时刻的锚点触发热数据更新,天然并发削峰
if [ "\$HOUR" == "${DEPLOY_UTC_HOUR}" ] && [ "\$MIN" == "${DEPLOY_UTC_MIN}" ]; then
/bin/bash /opt/ip_sentinel/core/updater.sh >/dev/null 2>&1 /bin/bash /opt/ip_sentinel/core/updater.sh >/dev/null 2>&1
fi fi
if [ "$HOUR" == "08" ] && [ "$MIN" == "00" ]; then # [绝对 UTC 锚点] 统一 UTC 16:00 发送战报
if [ "\$HOUR" == "16" ] && [ "\$MIN" == "00" ]; then
/bin/bash /opt/ip_sentinel/core/tg_report.sh >/dev/null 2>&1 /bin/bash /opt/ip_sentinel/core/tg_report.sh >/dev/null 2>&1
fi fi
if ! pgrep -f 'webhook.py' >/dev/null; then if ! pgrep -f 'webhook.py' >/dev/null; then
@@ -851,10 +861,12 @@ EOF
# ========================================== # ==========================================
crontab -l 2>/dev/null | grep -v "ip_sentinel" > /tmp/cron_backup || true crontab -l 2>/dev/null | grep -v "ip_sentinel" > /tmp/cron_backup || true
echo "*/30 * * * * ${INSTALL_DIR}/core/runner.sh >/dev/null 2>&1" >> /tmp/cron_backup echo "*/30 * * * * ${INSTALL_DIR}/core/runner.sh >/dev/null 2>&1" >> /tmp/cron_backup
echo "0 3 * * * ${INSTALL_DIR}/core/updater.sh >/dev/null 2>&1" >> /tmp/cron_backup # [绝对 UTC 锚点] 每天精确在部署的 UTC 时刻触发
echo "${DEPLOY_UTC_MIN} ${DEPLOY_UTC_HOUR} * * * ${INSTALL_DIR}/core/updater.sh >/dev/null 2>&1" >> /tmp/cron_backup
if [[ -n "$TG_TOKEN" ]] && [[ -n "$CHAT_ID" ]]; then if [[ -n "$TG_TOKEN" ]] && [[ -n "$CHAT_ID" ]]; then
echo "0 8 * * * ${INSTALL_DIR}/core/tg_report.sh >/dev/null 2>&1" >> /tmp/cron_backup # [绝对 UTC 锚点] 统一 UTC 16:00
echo "0 16 * * * ${INSTALL_DIR}/core/tg_report.sh >/dev/null 2>&1" >> /tmp/cron_backup
echo "$SAFE_PUBLIC_IP" > "${INSTALL_DIR}/core/.last_ip" echo "$SAFE_PUBLIC_IP" > "${INSTALL_DIR}/core/.last_ip"
if command -v rc-update >/dev/null 2>&1 && [ -d "/etc/local.d" ]; then if command -v rc-update >/dev/null 2>&1 && [ -d "/etc/local.d" ]; then

View File

@@ -164,7 +164,7 @@ else
MSG="$MSG MSG="$MSG
🕒 **最近执行快照 [${LAST_MOD:-"System"}]:** 🕒 **最近执行快照 [${LAST_MOD:-"System"}]:**
时间: ${LAST_TIME:-"暂无数据"} 时间: ${LAST_TIME:-"暂无数据"} (节点本地)
结论: ${LAST_SCORE:-"暂无数据"}" 结论: ${LAST_SCORE:-"暂无数据"}"
fi fi
@@ -174,6 +174,8 @@ fi
# ========================================== # ==========================================
# 从配置文件提取当前本地版本,若无则默认为未知 # 从配置文件提取当前本地版本,若无则默认为未知
LOCAL_VER="${AGENT_VERSION:-未知}" LOCAL_VER="${AGENT_VERSION:-未知}"
# [时区对齐] 强制获取当前绝对 UTC 时间,作为全局统一的战报落款
REPORT_UTC_TIME=$(date -u "+%Y-%m-%d %H:%M:%S UTC")
# 极轻量级探针: 抓取 GitHub 云端的 version.txt (超时 3 秒KV解析法) # 极轻量级探针: 抓取 GitHub 云端的 version.txt (超时 3 秒KV解析法)
REPO_RAW_URL="https://raw.githubusercontent.com/hotyue/IP-Sentinel/main" REPO_RAW_URL="https://raw.githubusercontent.com/hotyue/IP-Sentinel/main"
@@ -183,6 +185,7 @@ REMOTE_VER=$(curl -s -m 3 "${REPO_RAW_URL}/version.txt" | grep "^AGENT_VERSION="
MSG="$MSG MSG="$MSG
---------------------------- ----------------------------
🛡️ **系统引擎状态** 🛡️ **系统引擎状态**
⏱️ 战报生成: \`${REPORT_UTC_TIME}\`
当前运行版本: \`v${LOCAL_VER}\`" 当前运行版本: \`v${LOCAL_VER}\`"
# 比对逻辑:如果成功抓到了远端版本,且和本地不一样 # 比对逻辑:如果成功抓到了远端版本,且和本地不一样