# DDNS JSON配置文件参考
本文档详细说明DDNS工具的JSON配置文件格式和参数。JSON配置文件优先级介于命令行参数和环境变量之间。
## 基本用法
默认情况下,DDNS会在当前目录查找`config.json`文件。您也可以使用`-c`参数指定配置文件路径:
* 当前目录 `config.json` (注意Docker运行目录是 `/ddns/`)
* 当前用户目录 `~/.ddns/config.json`
* Linux当前系统 `/etc/ddns/config.json`
> 注意:在Docker中使用配置文件时,需要通过卷映射将配置文件挂载到容器的`/ddns/`目录。详情请参考[Docker使用文档](docker.md)。
```bash
# 使用默认配置文件
# 无配置时会自动生成配置文件
ddns
# 使用指定配置文件
ddns -c /path/to/config.json
# 或者使用Python源码
python run.py -c /path/to/config.json
```
## JSON模式
DDNS配置文件遵循JSON模式(Schema),推荐在配置文件中添加`$schema`字段以获得编辑器的自动补全和验证功能:
```json
{
"$schema": "https://ddns.newfuture.cc/schema/v4.0.json"
}
```
## 配置参数表
| 键名 | 类型 | 必需 | 默认值 | 说明 | 备注 |
| :------: | :----------------: | :--: | :---------: | :---------------: | ------------------------------------------------------------------------------------------------------------ |
| id | string | 是 | 无 | API 访问 ID | Cloudflare为邮箱(使用Token时留空)
HE.net可留空
华为云为Access Key ID (AK) |
| token | string | 是 | 无 | API 授权令牌 | 部分平台叫secret key |
| dns | string | 否 | `"dnspod"` | DNS服务商 | 可选值: dnspod, alidns, cloudflare, dnscom, dnspod_com, he, huaweidns, callback |
| ipv4 | array | 否 | `[]` | IPv4域名列表 | 为`[]`时,不会获取和更新IPv4地址 |
| ipv6 | array | 否 | `[]` | IPv6域名列表 | 为`[]`时,不会获取和更新IPv6地址 |
| index4 | string\|int\|array | 否 | `"default"` | IPv4获取方式 | 详见下方说明 |
| index6 | string\|int\|array | 否 | `"default"` | IPv6获取方式 | 详见下方说明 |
| ttl | number | 否 | `null` | DNS解析TTL时间 | 单位为秒,不设置则采用DNS默认策略 |
| proxy | string\|array | 否 | 无 | HTTP代理 | 多代理逐个尝试直到成功,`DIRECT`为直连 |
| ssl | string\|boolean | 否 | `"auto"` | SSL证书验证方式 | `true`(强制验证)、`false`(禁用验证)、`"auto"`(自动降级)或自定义CA证书文件路径 |
| debug | boolean | 否 | `false` | 是否开启调试 | 等同于设置log.level=DEBUG,配置文件中设置此字段无效,仅命令行参数`--debug`有效 |
| cache | string\|bool | 否 | `true` | 是否缓存记录 | 正常情况打开避免频繁更新,默认位置为临时目录下`ddns.cache`,也可以指定具体路径 |
| log | object | 否 | `null` | 日志配置(可选) | 日志配置对象,支持`level`、`file`、`format`、`datefmt`参数 |
### log对象参数说明
| 键名 | 类型 | 必需 | 默认值 | 说明 |
| :-----: | :------: | :--: | :---------------------------------: | :--------: |
| level | string | 否 | `INFO` | 日志级别 |
| file | string | 否 | 无 | 日志文件路径 |
| format | string | 否 | `%(asctime)s %(levelname)s [%(module)s]: %(message)s` | 日志格式字符串 |
| datefmt | string | 否 | `%Y-%m-%dT%H:%M:%S` | 日期时间格式 |
### index4和index6参数说明
`index4`和`index6`参数用于指定获取IP地址的方式,可以使用以下值:
* **数字**(如`0`、`1`、`2`...):表示使用第N个网卡的IP地址
* **字符串**:
* `"default"`:系统访问外网的默认IP
* `"public"`:使用公网IP(通过API查询)
* `"url:xxx"`:通过指定URL获取IP,例如`"url:http://ip.sb"`
* `"regex:xxx"`:使用正则表达式匹配本地网络配置中的IP,例如`"regex:192\\.168\\..*"`
* 注意:JSON中反斜杠需要转义,如`"regex:10\\.00\\..*"`表示匹配`10.00.`开头的IP
* `"cmd:xxx"`:执行指定命令并使用其输出作为IP
* `"shell:xxx"`:使用系统shell运行命令并使用其输出作为IP
* **布尔值**:`false`表示禁止更新相应IP类型的DNS记录
* **数组**:按顺序尝试不同的获取方式,使用第一个成功获取的结果
## 自定义回调配置
当`dns`设置为`callback`时,可通过以下方式配置自定义回调:
* `id`字段:填写回调地址,以HTTP或HTTPS开头,支持变量替换
* `token`字段:POST请求参数(JSON对象或JSON字符串),为空则使用GET方式发起回调
详细配置请参考:[Callback Provider 配置文档](providers/callback.md)
支持的变量替换:
| 常量名称 | 常量内容 | 说明 |
|---------|---------|------|
| `__DOMAIN__` | DDNS域名 | 完整域名 |
| `__IP__` | 获取的IP地址 | IPv4或IPv6地址 |
| `__RECORDTYPE__` | DDNS记录类型 | A、AAAA、CNAME等 |
| `__TTL__` | DDNS TTL | 生存时间(秒) |
| `__LINE__` | 解析线路 | default、unicom等 |
| `__TIMESTAMP__` | 请求发起时间戳 | 包含小数 |
## 配置示例
### 基本配置示例
```json
{
"$schema": "https://ddns.newfuture.cc/schema/v4.0.json",
"id": "12345",
"token": "mytokenkey",
"dns": "dnspod",
"ipv4": ["example.com", "www.example.com"],
"ipv6": ["example.com", "ipv6.example.com"],
"ttl": 600
}
```
### 高级配置示例
```json
{
"$schema": "https://ddns.newfuture.cc/schema/v4.0.json",
"id": "12345",
"token": "mytokenkey",
"dns": "cloudflare",
"ipv4": ["example.com", "www.example.com"],
"ipv6": ["example.com", "ipv6.example.com"],
"index4": ["public", "regex:192\\.168\\.1\\..*"],
"index6": "public",
"ttl": 300,
"proxy": "127.0.0.1:1080;DIRECT",
"ssl": "auto",
"cache": "/var/cache/ddns.cache",
"log": {
"level": "DEBUG",
"file": "/var/log/ddns.log",
"format": "%(asctime)s %(levelname)s [%(filename)s:%(lineno)d]: %(message)s",
"datefmt": "%Y-%m-%d %H:%M:%S"
}
}
```
### 使用多种IP获取方式的配置
```json
{
"$schema": "https://ddns.newfuture.cc/schema/v4.0.json",
"id": "12345",
"token": "mytokenkey",
"dns": "dnspod",
"ipv4": ["example.com"],
"ipv6": ["example.com"],
"index4": ["public", 0, "regex:192\\.168\\..*"],
"index6": ["public", "url:http://ipv6.icanhazip.com"],
"ttl": 600
}
```
### 自定义回调配置示例
```json
{
"$schema": "https://ddns.newfuture.cc/schema/v4.0.json",
"id": "https://api.example.com/ddns/update?domain=__DOMAIN__&type=__RECORDTYPE__&ip=__IP__",
"token": "{\"domain\": \"__DOMAIN__\", \"ip\": \"__IP__\", \"timestamp\": \"__TIMESTAMP__\"}",
"dns": "callback",
"ipv4": ["example.com"],
"ipv6": ["example.com"],
"ttl": 600
}
```
## 配置优先级和字段覆盖关系
DDNS工具中的配置优先级顺序为:**命令行参数 > JSON配置文件 > 环境变量**。
* **命令行参数**:优先级最高,会覆盖JSON配置文件和环境变量中的相同设置
* **JSON配置文件**:介于命令行参数和环境变量之间,会覆盖环境变量中的设置
* **环境变量**:优先级最低,当命令行参数和JSON配置文件中都没有相应设置时使用
### 配置覆盖示例
假设有以下配置:
1. **环境变量**:`DDNS_TTL=600`
2. **JSON配置文件**:`"ttl": 300`
3. **命令行参数**:`--ttl 900`
最终生效的是命令行参数的值:`ttl=900`
如果没有提供命令行参数,则使用JSON配置值:`ttl=300`
### 特殊情况
* 当JSON配置文件中某个值明确设为`null`时,将覆盖环境变量设置,相当于未设置该值
* 当JSON配置文件中缺少某个键时,会尝试使用对应的环境变量
* 某些参数(如`debug`)仅在特定配置方式下有效:`debug`参数只在命令行中有效,JSON配置中的设置会被忽略
## 注意事项
1. 配置文件使用UTF-8编码,不包含BOM标记
2. JSON中所有键名区分大小写
3. 在配置文件中,对于需要使用反斜杠的字符串(如正则表达式),需要进行双重转义
4. `debug`参数在配置文件中设置无效,仅支持命令行参数`--debug`
5. 首次运行时会在当前目录自动生成一个模板配置文件
6. 推荐使用支持JSONSchema的编辑器(如VSCode)编辑配置文件,可获得自动补全和验证功能