• 首页
  • 导航
磁盘阵列
一个知识记录站点
  1. 首页
  2. 未分类
  3. 正文

最小性能消耗实现阿里云DDNS

2025年2月5日 522点热度 1人点赞 0条评论

一、阿里云CLI 和 Python脚本+Docker 两种方式优缺点比较

在群晖上实现阿里云DDNS时,使用 阿里云CLI 和 Python脚本+Docker 两种方式各有优缺点。以下是两种方式的资源占用对比,帮助你选择更适合的方案:


1. 阿里云CLI方式

优点:

  • 简单直接:阿里云CLI是官方工具,无需额外编写代码,直接通过命令行调用即可。

  • 维护方便:官方工具更新及时,兼容性较好。

  • 资源占用较低:CLI工具本身是轻量级的,运行时会占用较少的内存和CPU资源。

缺点:

  • 依赖环境:需要在群晖上安装Python和阿里云CLI工具,可能会增加一些初始配置的复杂度。

  • 灵活性较低:CLI的功能受限于官方提供的命令,如果需要定制化功能(如日志记录、错误处理等),可能不够灵活。

资源占用:

  • CLI工具本身是轻量级的,运行时占用资源较少。

  • 每次执行任务时,CLI会启动一个进程,完成后立即释放资源。


2. Python脚本+Docker方式

优点:

  • 高度定制化:可以完全控制脚本逻辑,例如添加日志、错误重试、多域名支持等。

  • 环境隔离:通过Docker容器运行,避免对群晖系统环境的依赖,保持系统干净。

  • 可移植性强:Docker镜像可以轻松迁移到其他设备或平台。

缺点:

  • 资源占用较高:Docker容器本身会占用一定的内存和CPU资源,尤其是容器启动时。

  • 配置复杂:需要编写脚本、创建Dockerfile、构建镜像等,初始配置较为复杂。

  • 维护成本较高:如果脚本或Docker镜像需要更新,可能需要手动操作。

资源占用:

  • Docker容器启动时会占用一定的内存(通常几十MB到几百MB)。

  • 如果容器持续运行(例如作为后台服务),会持续占用资源。

  • 如果容器仅在需要时运行(例如通过定时任务触发),资源占用会较低。


资源占用对比

方式内存占用CPU占用启动速度适合场景
阿里云CLI低低快简单需求,资源有限的环境
Python脚本+Docker中到高(取决于容器运行方式)中到高较慢(容器启动需要时间)复杂需求,需要定制化功能

哪种方式更节省资源?

  • 如果追求最小资源占用:阿里云CLI方式 更节省资源,因为它不需要额外的Docker容器,且CLI工具本身非常轻量。

  • 如果需要定制化功能:Python脚本+Docker方式 更灵活,但会占用更多资源。


 二、aliyun-cli(Go语言编写)和aliyun-python-sdk(Python SDK)两种方式优缺点比较

 

阿里云提供了 两种不同的CLI工具,


1. 阿里云CLI的两种实现方式

阿里云官方提供了 两种不同的CLI工具:

  1. aliyun-cli(Go语言编写):独立二进制文件,无需Python环境,直接从阿里云CLI页面下载。

  2. aliyun-python-sdk(Python SDK):需通过Python的pip安装,适用于脚本开发。

两种方式均可实现DDNS,但资源占用和依赖关系不同。


2. 两种方式的对比

特性aliyun-cli(Go语言版)aliyun-python-sdk(Python版)
安装复杂度简单(直接下载二进制文件)较复杂(需安装Python和依赖库)
资源占用极低(独立二进制文件,无运行时依赖)较高(需Python解释器和SDK库)
执行速度快(编译型语言)较慢(解释型语言)
适用场景最小化资源占用、简单脚本需要复杂逻辑或Python生态集成

3. 哪种方式更节省资源?

aliyun-cli(Go语言版) 明显更节省资源:

  • 它是静态编译的二进制文件,无需Python环境或Docker容器。

  • 运行时内存占用仅几MB,启动速度极快。

  • 适合NAS等资源有限的设备。


三、阿里云Go语言版CLI部署

   1、获取阿里云API密钥,授予DNS管理权限

    • 登录阿里云控制台

    • 创建RAM用户 → 分配AliyunDNSFullAccess权限

    • 保存生成的AccessKey ID和Secret

  1. 准备脚本环境

    bash
    复制
    curl -O https://aliyuncli.alicdn.com/aliyun-cli-linux-latest-amd64.tgz
    tar xzvf aliyun-cli-linux-latest-amd64.tgz
    rm aliyun-cli-linux-latest-amd64.tgz
    mv aliyun /usr/local/bin

    验证:aliyun version显示版本号

  2. 配置阿里云账号

    bash
    复制
    #:aliyun configure
    Configuring profile 'default' in 'AK' authenticate mode...
    Access Key Id []:Access Key Id
    Access Key Secret []:Access Key Secret 
    Default Region Id []:cn-beijing
    Default Output Format [json]: json (Only support json)
    Default Language [zh|en] en:zh
    Saving profile[default] ...Done.
    Configure Done!!!
    ..............888888888888888888888 ........=8888888888888888888D=..............
    ...........88888888888888888888888 ..........D8888888888888888888888I...........
    .........,8888888888888ZI: ...........................=Z88D8888888888D..........
    .........+88888888 ..........................................88888888D..........
    .........+88888888 .......Welcome to use Alibaba Cloud.......O8888888D..........
    .........+88888888 ............. ************* ..............O8888888D..........
    .........+88888888 .... Command Line Interface(Reloaded) ....O8888888D..........
    .........+88888888...........................................88888888D..........
    ..........D888888888888DO+. ..........................?ND888888888888D..........
    ...........O8888888888888888888888...........D8888888888888888888888=...........
    ............ .:D8888888888888888888.........78888888888888888888O ..............
    
    
    

    4.创建DDNS脚本aliyunddns.sh

  3. bash
    复制

    #!/bin/bash
    
    # 设置环境变量
    export PATH=/usr/local/bin:/usr/bin:/bin
    
    # 配置变量
    MAIN_NAME="domain.com"  # 主域名
    RR="www"             # 子域名
    LOG_DIR="/volume1/homes/用户名/aliyunddns"  # 日志目录
    LOG_FILE="$LOG_DIR/ddns_$(date +%Y%m%d).log"  # 按日期分割日志
    
    # 创建日志目录(如果不存在)
    mkdir -p "$LOG_DIR"
    
    # 记录带时间戳的日志
    log() {
      echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
    }
    
    # 清理30天前的日志
    clean_old_logs() {
      find "$LOG_DIR" -name "ddns_*.log" -mtime +30 -exec rm {} \;
      log "已清理30天前的日志"
    }
    
    # 检查aliyun CLI是否存在
    if ! command -v /usr/local/bin/aliyun &> /dev/null; then
      log "错误:aliyun CLI 未安装或路径错误"
      exit 1
    fi
    
    # 获取公网IPv6地址
    PUBLIC_IP=$(curl -6 -s http://6.ipw.cn)
    if [ -z "$PUBLIC_IP" ]; then
      log "错误:无法获取公网IPv6地址"
      exit 1
    fi
    log "当前公网IPv6地址: $PUBLIC_IP"
    
    # 获取域名解析记录
    log "正在查询域名: $MAIN_NAME, 子域名: $RR"
    RESPONSE=$(/usr/local/bin/aliyun alidns DescribeDomainRecords \
      --DomainName "$MAIN_NAME" \
      --RRKeyWord "$RR" \
      --Type AAAA 2>&1)
    if [ $? -ne 0 ]; then
      log "错误:查询域名记录失败 - $RESPONSE"
      exit 1
    fi
    log "API 返回结果: $RESPONSE"
    
    # 精确匹配子域名记录
    RECORD_ID=$(echo "$RESPONSE" | /usr/bin/jq -r '.DomainRecords.Record[] | select(.RR == "'"$RR"'") | .RecordId')
    CURRENT_IP=$(echo "$RESPONSE" | /usr/bin/jq -r '.DomainRecords.Record[] | select(.RR == "'"$RR"'") | .Value')
    
    if [ -z "$RECORD_ID" ]; then
      log "未找到域名解析记录,正在创建新记录"
      RESPONSE=$(/usr/local/bin/aliyun alidns AddDomainRecord \
        --DomainName "$MAIN_NAME" \
        --RR "$RR" \
        --Type AAAA \
        --Value "$PUBLIC_IP" 2>&1)
      if echo "$RESPONSE" | grep -q "RequestId"; then
        log "成功创建域名解析记录"
      else
        log "错误:创建记录失败 - $RESPONSE"
        exit 1
      fi
    else
      if [ "$CURRENT_IP" = "$PUBLIC_IP" ]; then
        log "IP未变化,无需更新"
        exit 0
      fi
      log "找到域名解析记录ID: $RECORD_ID,正在更新记录"
      RESPONSE=$(/usr/local/bin/aliyun alidns UpdateDomainRecord \
        --RecordId "$RECORD_ID" \
        --RR "$RR" \
        --Type AAAA \
        --Value "$PUBLIC_IP" 2>&1)
      if echo "$RESPONSE" | grep -q "RequestId"; then
        log "解析记录已更新成功"
      else
        log "错误:更新记录失败 - $RESPONSE"
        exit 1
      fi
    fi
    
    # 清理旧日志
    clean_old_logs
    
    exit 0
  4. 设置权限

    bash
    复制
    chmod 700 aliyunddns.sh
    
  5. 配置计划任务

    • 打开群晖控制面板 → 任务计划

    • 新增任务 → 用户自定义脚本

    • 设置每10分钟运行一次:

      bash
      复制
      /volume1/homes/用户名/aliyunddns/aliyunddns.sh

验证方法

bash
复制
/volume1/homes/用户名/aliyunddns/aliyunddns.sh
# 观察是否输入报错信息,查看log文件是否完成ip更新

注意事项

  1. 首次运行需手动执行一次脚本完成初始化。

  2. 如果使用IPv4,需修改TYPE为"A"并调整IP获取方式。

  3. 阿里云API调用限制为5000次/天,该配置每天最多调用288次。

  4. 此方案在DS218+上测试,内存占用长期稳定在3MB以下,CPU使用率每次执行不超过1%。


chai

标签: 暂无
最后更新:2025年5月15日

chai

这个人很懒,什么都没留下

点赞
< 上一篇

COPYRIGHT © 2022 磁盘阵列. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

冀ICP备2022005721号

冀公网安备13108202001055号