pboymt / ddns-at-home

同时支持IPv4与IPv6!利用各DNS提供商的API(现已支持阿里云的OpenAPI),在具有公网IP的前提下,实现动态修改域名解析的功能,脱离花生壳的昂贵服务,将自己的域名解析为自家的IP地址。
GNU Lesser General Public License v3.0
47 stars 9 forks source link
aliyun aliyun-ddns ddns ddns-updater dns ipv4-ipv6 typescript

DDNS@Home 动态更改DNS解析记录(原aliyun-ddns)

GitHub

新版本亮点

1.2.0

1.1.0

已移除V1版本支持

本项目利用各大 DNS 服务提供商(例如:阿里云云解析 DNS)的 API,在具有公网 IP 的前提下,实现动态修改域名解析的功能,脱离花生壳的昂贵服务,将自己的域名解析为自家的 IP 地址。

代码请求

由于作者还未使用过其他提供商的 DNS,所以本项目暂时仅支持阿里云的 DNS 服务。欢迎提供其他提供商的兼容代码。

本项目同时支持IPv4与IPv6。

服务征集

由于 test-ipv6.com 等服务的 IP 探测服务存在一定的不稳定性,欢迎大家提供同时包含IPv4和IPv6的免费探测服务。未来将会增加配置 IP 探测链接。

本项目使用 TypeScript 编写,确保稳定运行。

本工具可以使用三种模式部署:

注意事项

如果获取不到公网 IPv4 地址,禁用 IPv4 配置只使用 IPv6 同样可行。

使用方法

不再支持V1配置

使用前请务必阅读注意事项

请确保您已经安装了 Node.js 16.x(较早版本并未测试不过理论上 Node.js 8.x 及以上版本均支持)并且能够运行 npm。您可以通过以下代码在命令行测试:

$ node -v # v16.13.0
$ npm -v # 8.1.3

(建议)全局安装 TypeScript:

# 推荐
$ yarn global add typescript
# 或
$ npm install -g typescript

将项目 git clone 到目录:

$ git clone https://github.com/pboymt/ddns-at-home.git
# 国内用户请配置好代理/Hosts/可靠性高的DNS服务,或者直接使用码云Gitee的镜像
$ git clone https://gitee.com/pboymt/ddns-at-home.git

切换到目录:

$ cd ddns-at-home

安装依赖:

# 本项目不再推荐使用yarn,因为没测试过
$ npm install

编译代码:

$ npx tsc # 如果没有报错就是编译成功

复制配置样板,修改设置,配置模式文件请查看 settings.schema.json

强烈使用 VSCode 等编辑器支持 JSON Schema 验证的编辑器编辑配置文件。

$ cp settings.sample.json settings.json
$ nano settings.json # 请完全遵照schema设定的规则进行配置

如果配置无效会在运行的第一时间抛出错误。

安装完毕后可以运行一次进行测试:

$ npm start

如果您使用了计划任务,建议等待第一次计划任务执行成功后结束测试。

版本更新

您只需要重新拉取后再次执行安装依赖和编译代码流程即可,如果您配置了守护进程,请重启它们(PM2会默认监控编译生成的lib目录变化自动重启)。

守护进程配置

版本 1.1.0 后,由于内置定时执行 DDNS 功能,Crontab 配置暂被删去,您可以自行配置,但请务必注意配置文件需要移除 schedule 字段以禁用定时执行功能!

如果您在 V2 配置文件中配置了计划任务,那么可以使用提供的 PM2 配置文件,甚至自行设置 Systemd 将本工具设置为服务或者。

PM2

PM2 对 Windows 的支持存在一些问题,具体请参考,建议在非 Windows 系统上使用。

本工具提供了 ecosystem.config.js 作为PM2的环境配置。

您可以全局安装pm2:

$ npm install -g pm2

配置文件需要配置 schedule 字段:

由于诸多服务的 API 存在防滥用机制,因此本工具的计划任务只支持到分钟级,如果您愿意作死可以直接修改源代码添加秒级甚至微秒级计划任务。

{
    ...
    "schedule": {
        "immediate": true, // 是否立即执行一次任务
        "hour": "*", // 每小时均可执行
        "minute": "/5" // 每封五的背书分钟执行一次任务(默认配置)
    }
}

hourminute 字段语法规则类似于 Cron,详细语法可在 Timexe 文档查看:

  • 当为 * 时,每小小时/分钟执行一次
  • 当为 n 时,每逢 n 时/分时可执行,最终决定权在 minute 字段
  • 当为 /n 时,每逢 n 的倍数时/分执行一次

然后使用 pm2 运行本工具:

# 输出更多日志
$ pm2 start ecosystem.config.js # 可不写 ecosystem.config.js,pm2 会默认搜寻目录中的配置。
# 或(输出更少日志)
$ pm2 start ecosystem.config.js --env production

可使用命令查看监控:

$ pm2 monit

停止守护进程:

$ pm2 stop

保存守护进程(防止 pm2 重启丢失配置):

$ pm2 save

配置 PM2 自启动:

注意: 可能需要管理员权限或root权限,在Linux下,root权限执行的pm2和普通用户权限执行的pm2配置不在同一目录,如果您使用的是 sudo pm2 startup ,那么请使用 sudo pm2 start 运行守护进程,并且把普通权限运行的守护进程删除,防止重复多次运行。

$ pm2 startup

Systemd

探寻中 WIP

Docker

探寻中 WIP

本项目使用的模块

依赖

包名 用途 使用版本
@alicloud/pop-core 用于请求阿里云OpenAPI @alicloud/pop-core
cloudflare 用于请求Cloudflare API cloudflare
@kocal/logger 格式化日志输出 @kocal/logger
ajv 用于验证JSON Schema ajv
axios 探测IP地址 axios
date-fns 格式化日志时间 date-fns
timexe 执行定时任务 timexe

开发依赖

包名 使用版本
@types/node @types/node
@types/cloudflare @types/cloudflare
@typescript-eslint/eslint-plugin @typescript-eslint/eslint-plugin
@typescript-eslint/parser @typescript-eslint/parser
cross-env cross-env
eslint eslint
markdown-table markdown-table
typescript typescript

开源协议

本项目随便就用了 LGPLv3 协议。