daed Geo 文件自动更新:脚本+定时任务完整配置

daed 默认不会自动更新 Geo 文件,本文提供一套完整的自动更新方案:多源轮询下载、临时目录隔离、docker 自动重启、crontab 定时执行。

daed Geo 文件自动更新:脚本+定时任务完整配置

daed 默认不会自动更新 Geo 文件(geoip.dat 和 geosite.dat)。本文提供一套完整的自动更新方案,支持多源轮询下载、断点续传、定时执行。


背景说明

daed(以及底层 dae)只负责加载 /etc/daed/ 目录下的 Geo 文件,不会主动检查更新或下载新版本。Geo 数据库(尤其是 geosite)更新频率较高,通常每月都有更新,手动更新费时费力。

本文提供一套生产级解决方案:

  • 多源轮询下载(jsDelivr CDN → Worker镜像 → GitHub原源)
  • 临时目录隔离,下载失败不影响现有文件
  • docker stop → 替换文件 → docker start 自动重启
  • 兜底保护:任何异常确保 daed 必须处于运行状态
  • crontab 每周自动执行

更新脚本

创建脚本文件

sudo nano /usr/local/bin/update-daed-geo.sh
sudo chmod +x /usr/local/bin/update-daed-geo.sh

完整脚本内容

#!/bin/bash
LOG="/var/log/daed-geo-update.log"
TARGET_DIR="/etc/daed"

echo "=== $(date '+%Y-%m-%d %H:%M:%S') 开始更新 Geo 文件 ===" >> $LOG

mkdir -p "$TARGET_DIR"
chmod 755 "$TARGET_DIR"

TMP_DIR=$(mktemp -d)
cd "$TMP_DIR" || exit 1

download_file() {
    local file_name=$1
    echo "开始下载 $file_name..." >> $LOG
    echo "  -> 尝试从 jsDelivr CDN 下载..." >> $LOG
    curl -fsSL --connect-timeout 15 --speed-limit 1024 --speed-time 10 -o "$file_name" "https://cdn.jsdelivr.net/gh/v2rayA/dist-v2ray-rules-dat@master/$file_name"
    if [ ! -s "$file_name" ]; then
        echo "  -> jsDelivr 失败,尝试从 Worker 镜像下载..." >> $LOG
        curl -fsSL --connect-timeout 15 --speed-limit 1024 --speed-time 10 -o "$file_name" "https://gh.720g.workers.dev/https://github.com/v2rayA/dist-v2ray-rules-dat/raw/master/$file_name"
    fi
    if [ ! -s "$file_name" ]; then
        echo "  -> 镜像源全败,尝试从 GitHub 原源下载..." >> $LOG
        curl -fsSL --connect-timeout 15 --speed-limit 1024 --speed-time 10 -o "$file_name" "https://github.com/v2rayA/dist-v2ray-rules-dat/raw/master/$file_name"
    fi
}

download_file "geoip.dat"
download_file "geosite.dat"

if [ -s "geoip.dat" ] && [ -s "geosite.dat" ]; then
    echo "下载成功,开始无感替换文件..." >> $LOG
    docker stop daed >> $LOG 2>&1
    mv geoip.dat "$TARGET_DIR/geoip.dat"
    mv geosite.dat "$TARGET_DIR/geosite.dat"
    chmod 644 "$TARGET_DIR"/*.dat
    docker start daed >> $LOG 2>&1
    echo "=== 更新成功 === $(date '+%Y-%m-%d %H:%M:%S')" >> $LOG
else
    echo "错误:Geo 文件下载失败,保留原系统文件!" >> $LOG
fi

if [ "$(docker inspect -f '{{.State.Running}}' daed 2>/dev/null)" != "true" ]; then
    echo "警告:检测到 daed 未在运行,正在强制拉起..." >> $LOG
    docker start daed >> $LOG 2>&1
fi

rm -rf "$TMP_DIR"
echo "" >> $LOG

多源下载策略说明

脚本采用三级降级策略,确保在国内环境下稳定下载:

优先级 来源 说明
第一优先 jsDelivr CDN 国内直连速度快且稳定
第二优先 Worker 镜像 gh.720g.workers.dev 提供 GitHub 加速
第三优先 GitHub 原源 兜底方案

安全保护机制

1. 临时目录隔离

下载在临时目录中完成,只有两个文件都下载成功才会触发替换,任何一步失败都保留原文件。

2. 无感重启

替换时自动 docker stop → 替换文件 → docker start,切换过程对用户透明。

3. 兜底保护

脚本最后检查 daed 运行状态,确保任何情况下 daed 保持运行,防止服务器断网。


配置定时任务

测试运行

sudo /usr/local/bin/update-daed-geo.sh
cat /var/log/daed-geo-update.log

设置每周自动执行

sudo crontab -e

写入以下内容(每周日凌晨 3:10 执行):

10 3 * * 0 /usr/local/bin/update-daed-geo.sh

日志查看

tail -f /var/log/daed-geo-update.log

总结

通过本文的方案,可以实现 daed Geo 文件的自动化更新,无需手动干预。建议先测试运行确认无误后,再配置定时任务。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注