Skip to the content.
 ██████╗  ██████╗ ██████╗ ███╗   ██╗███████╗
██╔════╝ ██╔═══██╗██╔══██╗████╗  ██║██╔════╝
██║  ███╗██║   ██║██║  ██║██╔██╗ ██║███████╗
██║   ██║██║   ██║██║  ██║██║╚██╗██║╚════██║
╚██████╔╝╚██████╔╝██████╔╝██║ ╚████║███████║
 ╚═════╝  ╚═════╝ ╚═════╝ ╚═╝  ╚═══╝╚══════╝

Apache licensed Docker Go Report Card GoDoc

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


支持的 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 的当前状态。

支持的平台

前提条件

要使用 GoDNS,假设:

或者,您可以登录 DuckDNS(使用社交账户),免费获取 duckdns.org 域名下的子域名。

安装

通过运行以下命令构建 GoDNS(从仓库根目录):

cd cmd/godns        # 进入 GoDNS 目录
go mod download     # 获取依赖项
go build            # 构建

您还可以从 releases 下载已编译的二进制文件。

使用方法

通过运行以下命令打印使用/帮助信息:

$ ./godns -h
Usage of ./godns:
  -c string
        指定配置文件(默认 "./config.json"-h    显示帮助

配置

概述

多提供商支持

🆕 GoDNS 现已支持同时使用多个 DNS 提供商!

您现在可以在单个配置文件中配置来自不同 DNS 提供商的域名,从而实现:

📖 查看完整的多提供商配置指南 了解详细的设置说明和示例。

配置文件格式

GoDNS 支持两种不同的配置文件格式:

默认情况下,GoDNS 使用 JSON 配置文件。但是,您可以通过 ./godns -c /path/to/config.yaml 指定使用 YAML 格式。

动态加载配置

GoDNS 支持动态加载配置。如果您修改了配置文件,GoDNS 将自动重新加载配置并应用更改。

配置属性

更新根域名

只需将 @ 放入 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,您需要提供 AccessKeyIDAccessKeySecret 作为 emailpassword,并配置所有域名和子域名。

示例 ```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 密钥并在配置文件中设置到 `password` 属性中。 **注意**:如果您有多个域名或子域名,请确保它们的 DDNS 密钥相同。

Scaleway

对于 Scaleway,您需要提供 API 密钥作为 login_token如何生成 API 密钥),并配置域名和子域名。domain_name 应等于 Scaleway 中的 DNS 区域或根域名。DNS 记录的 TTL 将设置为 interval 值。确保相关子域名的 AAAAA 记录存在,这些可以在 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": "", "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" } ``` </details> #### OVH 对于 OVH,您需要提供 Consumerkey、Appsecret 和 Appkey,并配置所有域名和子域名。 所需的值可以通过访问[此网站](https://www.ovh.com/auth/api/createToken)获取 权限应在 GET、POST 和 PUT 上设置为 '\*' 更多信息:[help.ovhcloud.com](https://help.ovhcloud.com/csm/en-gb-api-getting-started-ovhcloud-api?id=kb_article_view&sysparm_article=KB0042784)
示例 ```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": "" } ```
#### Porkbun 对于 Porkbun,您需要提供 API 密钥作为 `login_token` 和秘密密钥作为 `password`。 从 [Porkbun API 管理](https://porkbun.com/account/api) 获取您的 API 凭据。
示例 ```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 } ```
#### Dynu 对于 Dynu,您需要配置 `password`,配置 1 个默认域名和子域名。
示例 ```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": "" } ```
#### IONOS 这是针对 IONOS 托管服务的,**不是** IONOS 云。 您需要[注册 IONOS API 访问托管服务](https://my.ionos.com/shop/product/ionos-api),然后创建一个[API 密钥](https://developer.hosting.ionos.com/keys)。 您可以在[IONOS API 文档](https://developer.hosting.ionos.com/docs/getstarted)中找到完整指南。 **注意**:GoDNS 使用的 API 密钥必须遵循上述文档中描述的 `publicprefix.secret` 形式。
示例 ```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: "" ```
#### TransIP 对于 TransIP,您需要提供您的 API 私钥作为 `login_token`,用户名作为 `email`,并配置所有域名和子域名。
示例 ```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: "" ```
### 通知 GoDNS 可以在 IP 更改时发送通知。 #### 电子邮件 电子邮件通过 [SMTP](https://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol) 发送。使用以下片段更新您的配置: ```json "notify": { "mail": { "enabled": true, "smtp_server": "smtp.example.com", "smtp_username": "user", "smtp_password": "password", "smtp_port": 25, "send_from": "my_mail@example.com" "send_to": "my_mail@example.com" } } ``` 每次 IP 更改时,您将收到如下电子邮件: #### 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" } ```
2. 让 GoDNS 查找其运行机器的网络接口的 IPv6(稍后详细说明[网络接口 IP 地址](#网络接口-ip-地址))。 为此,只需将 `ip_urls` 和 `ipv6_urls` 留空。 请注意,网络接口必须配置 IPv6 才能正常工作。 #### 网络接口 IP 地址 由于某些原因,如果您想获取与网络接口关联的 IP 地址(而不是执行在线查找),您可以在配置文件中这样指定: ```json "ip_urls": [""], "ip_interface": "interface-name", ``` 将 `interface-name` 替换为网络接口的名称,例如 Linux 上的 `eth0` 或 Windows 上的 `Local Area Connection`。 注意:如果也指定了 `ip_urls`,它将首先用于执行在线查找,网络接口 IP 将在失败情况下用作后备。 #### SOCKS5 代理支持 您可以通过在配置文件中指定 [SOCKS5 代理](https://en.wikipedia.org/wiki/SOCKS#SOCKS5) 来使所有远程调用通过该代理: ```json "socks5_proxy": "127.0.0.1:7070" "use_proxy": true ``` #### 从 RouterOS 获取 IP 如果您想从 Mikrotik RouterOS 设备获取公共 IP,您可以使用以下配置: ```json "mikrotik": { "enabled": false, "server": "http://192.168.88.1", "username": "admin", "password": "password", "interface": "pppoe-out" } ``` #### 显示调试信息 要显示调试信息,将 `debug_info` 设置为 `true` 以启用此功能。默认情况下,调试信息被禁用。 ```json "debug_info": true, ``` #### 多个 API URL GoDNS 支持通过简单的轮询算法从多个 URL 获取公共 IP。如果第一个 URL 失败,它将尝试下一个,直到成功。以下是配置示例: ```json "ip_urls": [ "https://api.ipify.org", "https://myip.biturl.top", "https://api-ipv4.ip.sb/ip" ], ``` #### 推荐的 API - <https://api.ipify.org> - <https://myip.biturl.top> - <https://ipecho.net/plain> - <https://api-ipv4.ip.sb/ip> ## Web 面板 从版本 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,它是一个令人惊叹且高效的工具。