一、阿里云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工具:
-
aliyun-cli
(Go语言编写):独立二进制文件,无需Python环境,直接从阿里云CLI页面下载。 -
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
-
-
准备脚本环境
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显示版本号
-
配置阿里云账号
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
-
bash复制
#!/bin/bash # 设置环境变量 export PATH=/usr/local/bin:/usr/bin:/bin # 配置变量 MAIN_NAME="chaing.top" # 主域名 RR="nas1v6" # 子域名 LOG_DIR="/volume1/homes/chai/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
-
设置权限
bash复制chmod 700 aliyunddns.sh
-
配置计划任务
-
打开群晖控制面板 → 任务计划
-
新增任务 → 用户自定义脚本
-
设置每10分钟运行一次:
bash复制/volume1/homes/用户名/aliyunddns/aliyunddns.sh
-
验证方法
/volume1/homes/用户名/aliyunddns/aliyunddns.sh # 观察是否输入报错信息,查看log文件是否完成ip更新
注意事项
-
首次运行需手动执行一次脚本完成初始化。
-
如果使用IPv4,需修改TYPE为"A"并调整IP获取方式。
-
阿里云API调用限制为5000次/天,该配置每天最多调用288次。
-
此方案在DS218+上测试,内存占用长期稳定在3MB以下,CPU使用率每次执行不超过1%。