██████╗  ██████╗ ██████╗ ███╗   ██╗███████╗
██╔════╝ ██╔═══██╗██╔══██╗████╗  ██║██╔════╝
██║  ███╗██║   ██║██║  ██║██╔██╗ ██║███████╗
██║   ██║██║   ██║██║  ██║██║╚██╗██║╚════██║
╚██████╔╝╚██████╔╝██████╔╝██║ ╚████║███████║
 ╚═════╝  ╚═════╝ ╚═════╝ ╚═╝  ╚═══╝╚══════╝
GoDNS 是一个动态 DNS (DDNS) 客户端工具。它是用 Go 重写的我早期的 DynDNS 开源项目。

- 支持的 DNS 提供商
- 支持的平台
- 前提条件
- 安装
- 使用方法
- 配置
- Web 面板
- 运行 GoDNS
- 贡献
- 特别感谢
支持的 DNS 提供商
| 提供商 | IPv4 支持 | IPv6 支持 | 根域名 | 子域名 | 
|---|---|---|---|---|
| Cloudflare | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | 
| DigitalOcean | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | 
| Google Domains | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | 
| DNSPod | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | 
| Dynv6 | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | 
| HE.net (Hurricane Electric) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | 
| AliDNS | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | 
| DuckDNS | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | 
| Dreamhost | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | 
| No-IP | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | 
| Scaleway | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | 
| Linode | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | 
| Strato | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | 
| LoopiaSE | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | 
| Infomaniak | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | 
| Hetzner | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | 
| OVH | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | 
| Porkbun | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | 
| Dynu | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | 
| IONOS | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | 
| TransIP | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | 
提示:您可以关注此 问题 查看根域名 DDNS 的当前状态。
支持的平台
- Linux
- MacOS
- ARM Linux(如 Raspberry Pi 等)
- Windows
- 
    MIPS32 平台 要为 MIPS(mips 或 mipsle)编译二进制文件,请运行: GOOS=linux GOARCH=mips/mipsle GOMIPS=softfloat go build -a该二进制文件也可以在路由器上运行。 
前提条件
要使用 GoDNS,假设:
- 您已注册(现在拥有)一个域名
- 域名已委托给受支持的 DNS 提供商(即它有指向受支持提供商的 nameserver NS记录)
或者,您可以登录 DuckDNS(使用社交账户),免费获取 duckdns.org 域名下的子域名。
安装
通过运行以下命令构建 GoDNS(从仓库根目录):
cd cmd/godns        # 进入 GoDNS 目录
go mod download     # 获取依赖项
go build            # 构建
您还可以从 releases 下载已编译的二进制文件。
使用方法
通过运行以下命令打印使用/帮助信息:
$ ./godns -h
Usage of ./godns:
  -c string
        指定配置文件(默认 "./config.json")
  -h    显示帮助
配置
概述
- 复制 config_sample.json 并命名为 config.json,或者复制 config_sample.yaml 并命名为config.yaml。
- 配置您的提供商、域名/子域名信息、凭据等。
- 配置通知媒介(例如 SMTP 接收电子邮件),以便在您的 IP 地址更改时收到通知
- 将文件放置在 GoDNS 的同一目录中,或者使用 -c=path/to/your/file.json选项
多提供商支持
🆕 GoDNS 现已支持同时使用多个 DNS 提供商!
您现在可以在单个配置文件中配置来自不同 DNS 提供商的域名,从而实现:
- 跨多个 DNS 服务(Cloudflare、DNSPod、DigitalOcean 等)管理域名
- 为每个服务使用提供商特定的凭据
- 与现有单提供商配置保持完全向后兼容
📖 查看完整的多提供商配置指南 了解详细的设置说明和示例。
配置文件格式
GoDNS 支持两种不同的配置文件格式:
- JSON
- YAML
默认情况下,GoDNS 使用 JSON 配置文件。但是,您可以通过 ./godns -c /path/to/config.yaml 指定使用 YAML 格式。
动态加载配置
GoDNS 支持动态加载配置。如果您修改了配置文件,GoDNS 将自动重新加载配置并应用更改。
配置属性
- provider— 使用的一个 支持的提供商:- Cloudflare、- Google、- DNSPod、- AliDNS、- HE、- DuckDNS或- Dreamhost。
- email— DNS 提供商的电子邮件或账户名。
- password— DNS 提供商的密码。
- login_token— DNS 提供商的 API 令牌。
- domains— 域名列表,包含您的子域名。
- ip_urls— 用于获取公共 IPv4 地址的 URL 数组。
- ipv6_urls— 用于获取公共 IPv6 地址的 URL 数组。
- ip_type— 决定使用 IPv4 还是 IPv6 的开关(当 支持 时)。可用值:- IPv4或- IPv6。
- interval— 公共 IP 更新的频率(以秒为单位)。
- socks5_proxy— Socks5 代理服务器。
- resolver— 要使用的公共 DNS 服务器地址。例如,要使用 Google 的公共 DNS,您可以在使用 GoDNS 的 IPv4 模式时设置- 8.8.8.8,或在 IPv6 模式时设置- 2001:4860:4860::8888。
- skip_ssl_verify- 跳过对 https 请求的 SSL 证书验证。
更新根域名
只需将 @ 放入 sub_domains,例如:
"domains": [{
      "domain_name": "example.com",
      "sub_domains": ["@"]
    }]
配置示例
Cloudflare
对于 Cloudflare,您需要提供电子邮件和全局 API 密钥作为密码(或使用 API 令牌),并配置所有域名和子域名。
通过设置选项 proxied = true,记录将获得 Cloudflare 的性能和安全优势。此选项仅适用于 Cloudflare。
使用电子邮件和全局 API 密钥
```json { "provider": "Cloudflare", "email": "you@example.com", "password": "Global API Key", "domains": [ { "domain_name": "example.com", "sub_domains": ["www", "test"] }, { "domain_name": "example2.com", "sub_domains": ["www", "test"] } ], "resolver": "8.8.8.8", "ip_urls": ["https://api.ip.sb/ip"], "ip_type": "IPv4", "interval": 300, "socks5_proxy": "", "proxied": false } ```使用 API 令牌
```json { "provider": "Cloudflare", "login_token": "API Token", "domains": [ { "domain_name": "example.com", "sub_domains": ["www", "test"] }, { "domain_name": "example2.com", "sub_domains": ["www", "test"] } ], "resolver": "8.8.8.8", "ip_urls": ["https://api.ip.sb/ip"], "ip_type": "IPv4", "interval": 300, "socks5_proxy": "" } ```DNSPod
对于 DNSPod,您需要提供您的 API 令牌(您可以在这里创建),并配置所有域名和子域名。
示例
```json { "provider": "DNSPod", "login_token": "your_id,your_token", "domains": [ { "domain_name": "example.com", "sub_domains": ["www", "test"] }, { "domain_name": "example2.com", "sub_domains": ["www", "test"] } ], "resolver": "8.8.8.8", "ip_urls": ["https://api.ip.sb/ip"], "ip_type": "IPv4", "interval": 300, "socks5_proxy": "" } ```DigitalOcean
对于 DigitalOcean,您需要提供一个具有 domain 范围的 API 令牌(您可以在这里创建),并配置所有域名和子域名。
示例
```json { "provider": "DigitalOcean", "login_token": "dop_v1_00112233445566778899aabbccddeeff", "domains": [ { "domain_name": "example.com", "sub_domains": ["@", "www"] } ], "resolver": "8.8.8.8", "ip_urls": ["https://api.ip.sb/ip"], "ip_type": "IPv4", "interval": 300 } ```Dreamhost
对于 Dreamhost,您需要提供您的 API 令牌(您可以在这里创建),并配置所有域名和子域名。
示例
```json { "provider": "Dreamhost", "login_token": "your_api_key", "domains": [ { "domain_name": "example.com", "sub_domains": ["www", "test"] }, { "domain_name": "example2.com", "sub_domains": ["www", "test"] } ], "resolver": "8.8.8.8", "ip_urls": ["https://api.ip.sb/ip"], "ip_type": "IPv4", "interval": 300, "resolver": "ns1.dreamhost.com", "socks5_proxy": "" } ```Dynv6
对于 Dynv6,只需提供 token,配置 1 个默认域名和子域名。
示例
```json { "provider": "Dynv6", "password": "", "login_token": "1234567ABCDEFGabcdefg123456789", "domains": [ { "domain_name": "dynv6.net", "sub_domains": ["myname"] } ], "resolver": "8.8.8.8", "ip_urls": ["https://api.ip.sb/ip"], "ip_type": "IPv4", "interval": 300, "socks5_proxy": "" } ```Google Domains
对于 Google Domains,您需要提供电子邮件和密码,并配置所有域名和子域名。
示例
```json { "provider": "Google", "email": "Your_Username", "password": "Your_Password", "domains": [ { "domain_name": "example.com", "sub_domains": ["www", "test"] }, { "domain_name": "example2.com", "sub_domains": ["www", "test"] } ], "resolver": "8.8.8.8", "ip_urls": ["https://api.ip.sb/ip"], "ip_type": "IPv4", "interval": 300, "socks5_proxy": "" } ```AliDNS
对于 AliDNS,您需要提供 AccessKeyID 和 AccessKeySecret 作为 email 和 password,并配置所有域名和子域名。
示例
```json { "provider": "AliDNS", "email": "AccessKeyID", "password": "AccessKeySecret", "login_token": "", "domains": [ { "domain_name": "example.com", "sub_domains": ["www", "test"] }, { "domain_name": "example2.com", "sub_domains": ["www", "test"] } ], "resolver": "8.8.8.8", "ip_urls": ["https://api.ip.sb/ip"], "ip_type": "IPv4", "interval": 300, "socks5_proxy": "" } ```DuckDNS
对于 DuckDNS,只需提供 token,配置 1 个默认域名和子域名。
示例
```json { "provider": "DuckDNS", "password": "", "login_token": "3aaaaaaaa-f411-4198-a5dc-8381cac61b87", "domains": [ { "domain_name": "www.duckdns.org", "sub_domains": ["myname"] } ], "resolver": "8.8.8.8", "ip_urls": ["https://api.ip.sb/ip"], "ip_type": "IPv4", "interval": 300, "socks5_proxy": "" } ```No-IP
示例
```json { "provider": "NoIP", "email": "mail@example.com", "password": "YourPassword", "domains": [ { "domain_name": "ddns.net", "sub_domains": ["timothyye6"] } ], "ip_type": "IPv4", "ip_urls": ["https://api.ip.sb/ip"], "resolver": "8.8.8.8", "interval": 300, "socks5_proxy": "" } ```HE.net
对于 HE,不需要电子邮件,只需填写 DDNS 密钥作为密码,并配置所有域名和子域名。
示例
```json { "provider": "HE", "password": "Your DDNS Key", "login_token": "", "domains": [ { "domain_name": "example.com", "sub_domains": ["www", "test"] }, { "domain_name": "example2.com", "sub_domains": ["www", "test"] } ], "resolver": "8.8.8.8", "ip_urls": ["https://api.ip.sb/ip"], "ip_type": "IPv4", "interval": 300, "socks5_proxy": "" } ```提供商配置
添加一个新的 "A 记录" 并确保勾选 "启用动态 DNS 条目": 填写您自己的 DDNS 密钥或为这个新创建的 "A 记录" 生成一个随机 DDNS 密钥:
填写您自己的 DDNS 密钥或为这个新创建的 "A 记录" 生成一个随机 DDNS 密钥:
 记住 DDNS 密钥并在配置文件中设置到 `password` 属性中。
**注意**:如果您有多个域名或子域名,请确保它们的 DDNS 密钥相同。
记住 DDNS 密钥并在配置文件中设置到 `password` 属性中。
**注意**:如果您有多个域名或子域名,请确保它们的 DDNS 密钥相同。
Scaleway
对于 Scaleway,您需要提供 API 密钥作为 login_token(如何生成 API 密钥),并配置域名和子域名。domain_name 应等于 Scaleway 中的 DNS 区域或根域名。DNS 记录的 TTL 将设置为 interval 值。确保相关子域名的 A 或 AAAA 记录存在,这些可以在 Scaleway 控制台 中设置。
示例
```json { "provider": "Scaleway", "login_token": "API Secret Key", "domains": [ { "domain_name": "example.com", "sub_domains": ["www", "@"] }, { "domain_name": "samplednszone.example.com", "sub_domains": ["www", "test"] } ], "resolver": "8.8.8.8", "ip_urls": ["https://api.ip.sb/ip"], "ip_type": "IPv4", "interval": 300 } ```Linode
要与 Linode API 进行身份验证,您需要提供一个具有“读/写”访问权限的个人访问令牌,范围为“Domain”。Linode 有一个关于创建访问令牌的帮助页面。将此令牌传入配置文件中的 login_token 字段。
配置文件中的 domain_name 字段必须是 Linode 管理的现有域名的名称。Linode 有一个关于添加域名的帮助页面。GoDNS Linode 处理程序不会自动创建域名,但会自动创建子域名。
GoDNS Linode 处理程序目前对 Linode DNS 记录使用固定的 30 秒 TTL。
示例
```json { "provider": "Linode", "login_token": ${PERSONAL_ACCESS_TOKEN}, "domains": [{ "domain_name": "example.com", "sub_domains": ["www","@"] },{ "domain_name": "samplednszone.example.com", "sub_domains": ["www","test"] } ], "resolver": "8.8.8.8", "ip_urls": ["https://api.ip.sb/ip"], "ip_type": "IPv4", "interval": 300 } ```Strato
对于 Strato,您需要提供电子邮件和密码,并配置所有域名和子域名。 更多信息:德语 英语
示例
```json { "provider": "strato", "password": "Your_Password", "domains": [ { "domain_name": "example.com", "sub_domains": ["www", "test"] }, { "domain_name": "example2.com", "sub_domains": ["www", "test"] } ], "resolver": "8.8.8.8", "ip_urls": ["https://api.ip.sb/ip"], "ip_type": "IPv4", "interval": 300, "socks5_proxy": "" } ```LoopiaSE
对于 LoopiaSE,您需要提供用户名和密码,并配置所有域名和子域名。 更多信息:瑞典语
示例
```json { "provider": "LoopiaSE", "email": "Your_Username", "password": "Your_Password", "domains": [ { "domain_name": "example.com", "sub_domains": ["www", "test"] }, { "domain_name": "example2.com", "sub_domains": ["www", "test"] } ], "resolver": "8.8.8.8", "ip_urls": ["https://api.ip.sb/ip"], "ip_type": "IPv4", "interval": 300, "socks5_proxy": "" } ```Infomaniak
对于 Infomaniak,您需要提供用户名和密码,并配置所有域名和子域名。 更多信息:英语
示例
```json { "provider": "Infomaniak", "email": "Your_Username", "password": "Your_Password", "domains": [ { "domain_name": "example.com", "sub_domains": ["www", "test"] }, { "domain_name": "example2.com", "sub_domains": ["www", "test"] } ], "resolver": "8.8.8.8", "ip_urls": ["https://api.ip.sb/ip"], "ip_type": "IPv4", "interval": 300, "socks5_proxy": "" } ```Hetzner
对于 Hetzner,您必须创建一个访问令牌。这可以在 DNS 控制台中完成。 (左上角的个人图标 –> API 令牌) 注意:如果一个域名有多个记录,只有第一个记录会被更新。 确保只有一个记录。
示例
```json { "provider": "hetzner", "login_token": "示例
```json { "provider": "OVH", "consumer_key": "e389ac80cc8da9c7451bc7b8f171bf4f", "app_secret": "d1ffee354d3643d70deaab48a09131fd", "app_key": "cd338839d6472064", "domains": [ { "domain_name": "example.com", "sub_domains": ["www", "test"] }, { "domain_name": "example2.com", "sub_domains": ["www", "test"] } ], "resolver": "8.8.8.8", "ip_urls": ["https://api.ip.sb/ip"], "ip_type": "IPv4", "interval": 300, "socks5_proxy": "" } ```示例
```json { "provider": "Porkbun", "login_token": "pk1_your_api_key", "password": "sk1_your_secret_key", "domains": [ { "domain_name": "example.com", "sub_domains": ["@", "www", "test"] } ], "resolver": "8.8.8.8", "ip_urls": ["https://api.ipify.org"], "ip_type": "IPv4", "interval": 300 } ```示例
```json { "provider": "Dynu", "password": "Your_Password", "domains": [ { "domain_name": "your_domain.com", "sub_domains": ["your_subdomain"] } ], "resolver": "8.8.8.8", "ip_urls": ["https://api.ip.sb/ip"], "ip_type": "IPv4", "interval": 300, "socks5_proxy": "" } ```示例
```yaml provider: IONOS login_token: publicprefix.secret domains: - domain_name: example.com sub_domains: - somesubdomain - anothersubdomain resolver: 1.1.1.1 ip_urls: - https://api.ipify.org ip_type: IPv4 interval: 300 socks5_proxy: "" ```示例
```yaml provider: TransIP email: account_name login_token: api_key domains: - domain_name: example.com sub_domains: - "@" - somesubdomain - anothersubdomain resolver: 1.1.1.1 ip_urls: - https://api.ipify.org ip_type: IPv4 interval: 300 socks5_proxy: "" ``` #### Telegram
要在 IP 更改时接收 [Telegram](https://telegram.org/) 消息,使用以下片段更新您的配置:
```json
  "notify": {
    "telegram": {
      "enabled": true,
      "bot_api_key": "11111:aaaa-bbbb",
      "chat_id": "-123456",
      "message_template": "域名 ** 已更新为 %0A",
      "use_proxy": false
    },
  }
```
`message_template` 属性支持 [markdown](https://www.markdownguide.org)。新行需要用 `%0A` 转义。
#### Slack
要在 IP 更改时接收 [Slack](https://slack.com) 消息,使用以下片段更新您的配置:
```json
  "notify": {
    "slack": {
      "enabled": true,
      "bot_api_token": "xoxb-xxx",
      "channel": "your_channel",
      "message_template": "域名 ** 已更新为 \n",
      "use_proxy": false
    },
  }
```
`message_template` 属性支持 [markdown](https://www.markdownguide.org)。新行需要用 `\n` 转义。
#### Discord
要在 IP 更改时接收 [Discord](https://discord.gg) 消息,使用以下片段更新您的配置:
```json
  "notify": {
    "discord": {
          "enabled": true,
          "bot_api_token": "discord_bot_token",
          "channel": "your_channel",
          "message_template": "(可选) 域名 ** 已更新为 \n",
        }
  }
```
#### Pushover
要在 IP 更改时接收 [Pushover](https://pushover.net/) 消息,使用以下片段更新您的配置:
```json
  "notify": {
    "pushover": {
      "enabled": true,
      "token": "abcdefghijklmnopqrstuvwxyz1234",
      "user": "abcdefghijklmnopqrstuvwxyz1234",
      "message_template": "",
      "device": "",
      "title": "",
      "priority": 0,
      "html": 1
    }
  }
```
如果 `html` 参数为 `1`,`message_template` 属性支持 [html](https://pushover.net/api#html)。如果留空,将使用默认消息。
如果 `device` 和 `title` 参数留空,Pushover 将选择默认值[参见](https://pushover.net/api#messages)。有关优先级参数的更多详细信息
可以在 Pushover [API 描述](https://pushover.net/api#priority) 中找到。
#### Bark
要在 IP 更改时接收 [Bark](https://bark.day.app/) 消息,使用以下片段更新您的配置:
```json
  "notify": {
    "bark": {
      "enabled": true,
      "server": "https://api.day.app",
      "device_keys": "",
      "params": "{ \"isArchive\": 1, \"action\": \"none\" }"
    }
  }
```
`server` Bark 服务器地址,可使用官方默认服务器 `https://api.day.app`,也可设置为自建服务器地址。  
`device_keys` 设备 key,支持多个(英文逗号分隔),多个时,用于批量推送。  
`params` Bark 请求参数,可参考 [Bark API](https://bark.day.app/#/tutorial?id=%e8%af%b7%e6%b1%82%e5%8f%82%e6%95%b0)  
`user` 自建服务器 Basic auth 用户名,与服务端环境变量 `BARK_SERVER_BASIC_AUTH_USER` 一致。  
`password` 自建服务器 Basic auth 密码,与服务端环境变量 `BARK_SERVER_BASIC_AUTH_PASSWORD` 一致。  
更多内容请参阅 [Bark 官方文档](https://bark.day.app/)
### Webhook
Webhook 是 GoDNS 提供的另一个功能,用于在 IP 更改时向其他应用程序发送通知。GoDNS 通过 HTTP `GET` 或 `POST` 请求向目标 URL 发送通知。
配置部分 `webhook` 用于自定义 webhook 请求。通常,有 2 个字段用于 webhook 请求:
> - `url`:发送 webhook 请求的目标 URL。
> - `request_body`:发送 `POST` 请求的内容,如果此字段为空,则发送 HTTP GET 请求而不是 HTTP POST 请求。
可用变量:
> - `Domain`:当前域名。
> - `IP`:新 IP 地址。
> - `IPType`:IP 类型:`IPV4` 或 `IPV6`。
#### 使用 HTTP GET 请求的 Webhook
```json
"webhook": {
  "enabled": true,
  "url": "http://localhost:5000/api/v1/send?domain=&ip=&ip_type=",
  "request_body": ""
}
```
对于此示例,将向目标 URL 发送带有查询字符串参数的 webhook:
```
http://localhost:5000/api/v1/send?domain=ddns.example.com&ip=192.168.1.1&ip_type=IPV4
```
#### 使用 HTTP POST 请求的 Webhook
```json
"webhook": {
  "enabled": true,
  "url": "http://localhost:5000/api/v1/send",
  "request_body": "{ \"domain\": \"\", \"ip\": \"\", \"ip_type\": \"\" }"
}
```
对于此示例,当 IP 更改时将触发 webhook,目标 URL `http://localhost:5000/api/v1/send` 将收到带有请求体的 `HTTP POST` 请求:
```json
{ "domain": "ddns.example.com", "ip": "192.168.1.1", "ip_type": "IPV4" }
```
### 杂项主题
#### IPv6 支持
大多数 [提供商](#支持的-dns-提供商) 都支持 IPv6。
要启用 GoDNS 的 `IPv6` 支持,有两种解决方案可供选择:
1. 使用在线服务查找外部 IPv6
   为此:
   - 将 `ip_type` 设置为 `IPv6`,并确保配置了 `ipv6_urls`
   - 在您的 DNS 提供商中创建 `AAAA` 记录而不是 `A` 记录
#### Telegram
要在 IP 更改时接收 [Telegram](https://telegram.org/) 消息,使用以下片段更新您的配置:
```json
  "notify": {
    "telegram": {
      "enabled": true,
      "bot_api_key": "11111:aaaa-bbbb",
      "chat_id": "-123456",
      "message_template": "域名 ** 已更新为 %0A",
      "use_proxy": false
    },
  }
```
`message_template` 属性支持 [markdown](https://www.markdownguide.org)。新行需要用 `%0A` 转义。
#### Slack
要在 IP 更改时接收 [Slack](https://slack.com) 消息,使用以下片段更新您的配置:
```json
  "notify": {
    "slack": {
      "enabled": true,
      "bot_api_token": "xoxb-xxx",
      "channel": "your_channel",
      "message_template": "域名 ** 已更新为 \n",
      "use_proxy": false
    },
  }
```
`message_template` 属性支持 [markdown](https://www.markdownguide.org)。新行需要用 `\n` 转义。
#### Discord
要在 IP 更改时接收 [Discord](https://discord.gg) 消息,使用以下片段更新您的配置:
```json
  "notify": {
    "discord": {
          "enabled": true,
          "bot_api_token": "discord_bot_token",
          "channel": "your_channel",
          "message_template": "(可选) 域名 ** 已更新为 \n",
        }
  }
```
#### Pushover
要在 IP 更改时接收 [Pushover](https://pushover.net/) 消息,使用以下片段更新您的配置:
```json
  "notify": {
    "pushover": {
      "enabled": true,
      "token": "abcdefghijklmnopqrstuvwxyz1234",
      "user": "abcdefghijklmnopqrstuvwxyz1234",
      "message_template": "",
      "device": "",
      "title": "",
      "priority": 0,
      "html": 1
    }
  }
```
如果 `html` 参数为 `1`,`message_template` 属性支持 [html](https://pushover.net/api#html)。如果留空,将使用默认消息。
如果 `device` 和 `title` 参数留空,Pushover 将选择默认值[参见](https://pushover.net/api#messages)。有关优先级参数的更多详细信息
可以在 Pushover [API 描述](https://pushover.net/api#priority) 中找到。
#### Bark
要在 IP 更改时接收 [Bark](https://bark.day.app/) 消息,使用以下片段更新您的配置:
```json
  "notify": {
    "bark": {
      "enabled": true,
      "server": "https://api.day.app",
      "device_keys": "",
      "params": "{ \"isArchive\": 1, \"action\": \"none\" }"
    }
  }
```
`server` Bark 服务器地址,可使用官方默认服务器 `https://api.day.app`,也可设置为自建服务器地址。  
`device_keys` 设备 key,支持多个(英文逗号分隔),多个时,用于批量推送。  
`params` Bark 请求参数,可参考 [Bark API](https://bark.day.app/#/tutorial?id=%e8%af%b7%e6%b1%82%e5%8f%82%e6%95%b0)  
`user` 自建服务器 Basic auth 用户名,与服务端环境变量 `BARK_SERVER_BASIC_AUTH_USER` 一致。  
`password` 自建服务器 Basic auth 密码,与服务端环境变量 `BARK_SERVER_BASIC_AUTH_PASSWORD` 一致。  
更多内容请参阅 [Bark 官方文档](https://bark.day.app/)
### Webhook
Webhook 是 GoDNS 提供的另一个功能,用于在 IP 更改时向其他应用程序发送通知。GoDNS 通过 HTTP `GET` 或 `POST` 请求向目标 URL 发送通知。
配置部分 `webhook` 用于自定义 webhook 请求。通常,有 2 个字段用于 webhook 请求:
> - `url`:发送 webhook 请求的目标 URL。
> - `request_body`:发送 `POST` 请求的内容,如果此字段为空,则发送 HTTP GET 请求而不是 HTTP POST 请求。
可用变量:
> - `Domain`:当前域名。
> - `IP`:新 IP 地址。
> - `IPType`:IP 类型:`IPV4` 或 `IPV6`。
#### 使用 HTTP GET 请求的 Webhook
```json
"webhook": {
  "enabled": true,
  "url": "http://localhost:5000/api/v1/send?domain=&ip=&ip_type=",
  "request_body": ""
}
```
对于此示例,将向目标 URL 发送带有查询字符串参数的 webhook:
```
http://localhost:5000/api/v1/send?domain=ddns.example.com&ip=192.168.1.1&ip_type=IPV4
```
#### 使用 HTTP POST 请求的 Webhook
```json
"webhook": {
  "enabled": true,
  "url": "http://localhost:5000/api/v1/send",
  "request_body": "{ \"domain\": \"\", \"ip\": \"\", \"ip_type\": \"\" }"
}
```
对于此示例,当 IP 更改时将触发 webhook,目标 URL `http://localhost:5000/api/v1/send` 将收到带有请求体的 `HTTP POST` 请求:
```json
{ "domain": "ddns.example.com", "ip": "192.168.1.1", "ip_type": "IPV4" }
```
### 杂项主题
#### IPv6 支持
大多数 [提供商](#支持的-dns-提供商) 都支持 IPv6。
要启用 GoDNS 的 `IPv6` 支持,有两种解决方案可供选择:
1. 使用在线服务查找外部 IPv6
   为此:
   - 将 `ip_type` 设置为 `IPv6`,并确保配置了 `ipv6_urls`
   - 在您的 DNS 提供商中创建 `AAAA` 记录而不是 `A` 记录
   配置示例
```json { "domains": [ { "domain_name": "example.com", "sub_domains": ["ipv6"] } ], "resolver": "2001:4860:4860::8888", "ipv6_urls": ["https://api-ipv6.ip.sb/ip"], "ip_type": "IPv6" } ``` 从版本 3.1.0 开始,GoDNS 提供了一个 Web 面板来管理配置和监控域名状态。Web UI 默认是禁用的。要启用它,只需在配置文件中启用 `web_panel`。
```json
"web_panel": {
  "enabled": true,
  "addr": "0.0.0.0:9000",
  "username": "admin",
  "password": "123456"
}
```
启用 Web 面板后,您可以访问 `http://localhost:9000` 来管理配置和监控域名状态。
## 运行 GoDNS
有几种运行 GoDNS 的方式。
### 手动运行
注意:确保在配置文件中设置 `run_once` 参数,这样程序将在首次运行后退出(默认值为 `false`)。
它可以添加到 `cron` 或附加到系统上的其他事件。
```json
{
  "...": "...",
  "run_once": true
}
```
然后运行
```bash
./godns
```
### 作为手动守护进程
```bash
nohup ./godns &
```
注意:当程序停止时,它不会重新启动。
### 作为托管守护进程(使用 upstart)
1. 首先安装 `upstart`(如果尚未可用)
2. 将 `./config/upstart/godns.conf` 复制到 `/etc/init`(并根据需要调整)
3. 启动服务:
   ```bash
   sudo start godns
   ```
### 作为托管守护进程(使用 systemd)
1. 首先安装 `systemd`(如果尚未可用)
2. 将 `./config/systemd/godns.service` 复制到 `/lib/systemd/system`(并根据需要调整)
3. 启动服务:
   ```bash
   sudo systemctl enable godns
   sudo systemctl start godns
   ```
### 作为托管守护进程(使用 procd)
`procd` 是 OpenWRT 上的 init 系统。如果您想在 OpenWRT 和 procd 上将 godns 用作服务:
1. 将 `./config/procd/godns` 复制到 `/etc/init.d`(并根据需要调整)
2. 启动服务(需要 root 权限):
   ```bash
   service godns enable
   service godns start
   ```
### 作为 Docker 容器
可用的 docker 注册表:
- <https://hub.docker.com/r/timothyye/godns>
- <https://github.com/TimothyYe/godns/pkgs/container/godns>
访问 <https://hub.docker.com/r/timothyye/godns> 获取最新的 docker 镜像。`-p 9000:9000` 选项暴露 Web 面板。
使用 `/path/to/config.json` 作为您的本地配置文件,运行:
```bash
docker run \
-d --name godns --restart=always \
-v /path/to/config.json:/config.json \
-p 9000:9000 \
timothyye/godns:latest
```
要使用 `YAML` 配置文件运行:
```bash
docker run \
-d --name godns \
-e CONFIG=/config.yaml \
--restart=always \
-v /path/to/config.yaml:/config.yaml \
-p 9000:9000 \
timothyye/godns:latest
```
### 作为 Windows 服务
1. 下载最新版本的 [NSSM](https://nssm.cc/download)
2. 在管理员提示符中,从下载 NSSM 的文件夹(例如 `C:\Downloads\nssm\` **win64**)运行:
   ```
   nssm install YOURSERVICENAME
   ```
3. 按照界面配置服务。在"Application"选项卡中只需指明 `godns.exe` 文件的位置。您还可以选择在"Details"选项卡上定义描述,并在"I/O"选项卡上定义日志文件。点击"Install service"按钮完成。
4. 该服务现在将与 Windows 一起启动。
注意:您可以通过运行以下命令卸载服务:
```
nssm remove YOURSERVICENAME
```
## 贡献
欢迎贡献!请随时提交 Pull Request。
### 设置前端开发环境
要求:
- Node.js `18.19.0` 或更高版本
- Go `1.17` 或更高版本
前端项目使用 [Next.js](https://nextjs.org/) 和 [daisyUI](https://daisyui.com/) 构建。要启动开发环境,运行:
```bash
cd web
npm ci
npm run dev
```
### 构建前端
要构建前端,运行:
```bash
cd web
npm run build
```
### 运行前端
要运行前端,运行:
```bash
cd web
npm run start
```
## 特别感谢
从版本 3.1.0 开始,GoDNS 提供了一个 Web 面板来管理配置和监控域名状态。Web UI 默认是禁用的。要启用它,只需在配置文件中启用 `web_panel`。
```json
"web_panel": {
  "enabled": true,
  "addr": "0.0.0.0:9000",
  "username": "admin",
  "password": "123456"
}
```
启用 Web 面板后,您可以访问 `http://localhost:9000` 来管理配置和监控域名状态。
## 运行 GoDNS
有几种运行 GoDNS 的方式。
### 手动运行
注意:确保在配置文件中设置 `run_once` 参数,这样程序将在首次运行后退出(默认值为 `false`)。
它可以添加到 `cron` 或附加到系统上的其他事件。
```json
{
  "...": "...",
  "run_once": true
}
```
然后运行
```bash
./godns
```
### 作为手动守护进程
```bash
nohup ./godns &
```
注意:当程序停止时,它不会重新启动。
### 作为托管守护进程(使用 upstart)
1. 首先安装 `upstart`(如果尚未可用)
2. 将 `./config/upstart/godns.conf` 复制到 `/etc/init`(并根据需要调整)
3. 启动服务:
   ```bash
   sudo start godns
   ```
### 作为托管守护进程(使用 systemd)
1. 首先安装 `systemd`(如果尚未可用)
2. 将 `./config/systemd/godns.service` 复制到 `/lib/systemd/system`(并根据需要调整)
3. 启动服务:
   ```bash
   sudo systemctl enable godns
   sudo systemctl start godns
   ```
### 作为托管守护进程(使用 procd)
`procd` 是 OpenWRT 上的 init 系统。如果您想在 OpenWRT 和 procd 上将 godns 用作服务:
1. 将 `./config/procd/godns` 复制到 `/etc/init.d`(并根据需要调整)
2. 启动服务(需要 root 权限):
   ```bash
   service godns enable
   service godns start
   ```
### 作为 Docker 容器
可用的 docker 注册表:
- <https://hub.docker.com/r/timothyye/godns>
- <https://github.com/TimothyYe/godns/pkgs/container/godns>
访问 <https://hub.docker.com/r/timothyye/godns> 获取最新的 docker 镜像。`-p 9000:9000` 选项暴露 Web 面板。
使用 `/path/to/config.json` 作为您的本地配置文件,运行:
```bash
docker run \
-d --name godns --restart=always \
-v /path/to/config.json:/config.json \
-p 9000:9000 \
timothyye/godns:latest
```
要使用 `YAML` 配置文件运行:
```bash
docker run \
-d --name godns \
-e CONFIG=/config.yaml \
--restart=always \
-v /path/to/config.yaml:/config.yaml \
-p 9000:9000 \
timothyye/godns:latest
```
### 作为 Windows 服务
1. 下载最新版本的 [NSSM](https://nssm.cc/download)
2. 在管理员提示符中,从下载 NSSM 的文件夹(例如 `C:\Downloads\nssm\` **win64**)运行:
   ```
   nssm install YOURSERVICENAME
   ```
3. 按照界面配置服务。在"Application"选项卡中只需指明 `godns.exe` 文件的位置。您还可以选择在"Details"选项卡上定义描述,并在"I/O"选项卡上定义日志文件。点击"Install service"按钮完成。
4. 该服务现在将与 Windows 一起启动。
注意:您可以通过运行以下命令卸载服务:
```
nssm remove YOURSERVICENAME
```
## 贡献
欢迎贡献!请随时提交 Pull Request。
### 设置前端开发环境
要求:
- Node.js `18.19.0` 或更高版本
- Go `1.17` 或更高版本
前端项目使用 [Next.js](https://nextjs.org/) 和 [daisyUI](https://daisyui.com/) 构建。要启动开发环境,运行:
```bash
cd web
npm ci
npm run dev
```
### 构建前端
要构建前端,运行:
```bash
cd web
npm run build
```
### 运行前端
要运行前端,运行:
```bash
cd web
npm run start
```
## 特别感谢
 感谢 JetBrains 使用[免费开源许可证](https://www.jetbrains.com/community/opensource/)赞助此项目。
> 我喜欢 GoLand,它是一个令人惊叹且高效的工具。
感谢 JetBrains 使用[免费开源许可证](https://www.jetbrains.com/community/opensource/)赞助此项目。
> 我喜欢 GoLand,它是一个令人惊叹且高效的工具。