|
|
# ddns-go: W- O/ Z* ~# E! u% J$ v
3 ~! P7 p% S+ Q; B9 z/ K
自动获得你的公网 IPv4 或 IPv6 地址,并解析到对应的域名服务。% [7 c$ ], J) j4 U
/ y" N, u3 i. t8 d4 {2 t- [特性](#特性)
1 M1 B. b# ]! }' u5 `& J- R- [系统中使用](#系统中使用)/ n! v& {* A. j: k8 ]9 d0 }
- [Docker中使用](#docker中使用) |/ m/ g: ^) w* ^( ?
- [使用IPv6](#使用ipv6)
9 Q; J1 Y. Q6 ]* L8 U* H _- [Webhook](#webhook)6 W% {8 k, G/ D' F
- [Callback](#callback)* D9 K/ j4 ^- T( d1 \
- [界面](#界面): V- ^( j. z) |* o$ W0 |
- [开发&自行编译](#开发自行编译)& G; O* i# Y& N+ L' \, F f
0 s+ b, q" ]( k## 特性& W, x6 W8 d0 ^. E2 ~$ n
/ a9 a; f* a* e% R# R! B4 ^
- 支持Mac、Windows、Linux系统,支持ARM、x86架构+ ?4 ^9 _3 `$ ~. O w5 T% ?; n7 v
- 支持的域名服务商 `阿里云` `腾讯云` `Dnspod` `Cloudflare` `华为云` `Callback` `百度云` `Porkbun` `GoDaddy` `Namecheap` `NameSilo` `Dynadot`) O- C+ e _- u/ O# N& ^
- 支持接口/网卡/[命令](https://github.com/jeessy2/ddns-go/wiki/通过命令获取IP参考)获取IP
' G0 j$ ^3 a9 Y. U- 支持以服务的方式运行5 Y" |0 v/ x9 _' F
- 默认间隔5分钟同步一次
5 u. N( w5 R+ \9 j- 支持同时配置多个DNS服务商
( Z9 U1 }. P$ Z$ o- 支持多个域名同时解析
) \* D9 b2 u3 Y$ ]$ n1 [4 a- 支持多级域名' u. v; i. ]! I6 Z0 T. g* r
- 网页中配置,简单又方便,默认勾选`禁止从公网访问`; }6 m5 ^0 ^1 U( d
- 网页中方便快速查看最近50条日志
1 O5 D8 P6 j4 P, d I- 支持Webhook通知
$ ^' d/ m) }2 \, [& v- 支持TTL
! x( u$ B* q# z' V6 y- 支持部分DNS服务商[传递自定义参数]
/ A6 b% _; G& f' }2 e& D# Z
1 I" s4 F3 b! h# a1 i> [!NOTE]5 K9 [7 V# R& R, w7 _# m* D; p
> 建议在启用公网访问时,使用 Nginx 等反向代理软件启用 HTTPS 访问,以保证安全性。6 [* U! G4 E! w) Y, w5 h* R
## 系统中使用
: o) `! C5 V3 Y7 r$ F% B/ H/ Y- r* n0 o6 Q' w& U
- 从 [Releases] 下载并解压 ddns-go% @( W# T d& z5 T# x
- 安装服务
2 `9 X$ p) T; J) k7 { - Mac/Linux: `sudo ./ddns-go -s install`: y4 i; b4 M( B- u3 v
- Win(以管理员打开cmd): `.\ddns-go.exe -s install`7 F4 r5 O$ O! M1 A% g0 N( [ M
- [可选] 服务卸载
# x9 z" a. s/ R - Mac/Linux: `sudo ./ddns-go -s uninstall`5 x3 \ F; J" V* R. ^( w
- Win(以管理员打开cmd): `.\ddns-go.exe -s uninstall`% L$ Q8 y- c# o; Z/ ~
- [可选] 支持安装带参数
* S) u9 E# P5 z6 h - `-l` 监听地址
" f# ~! M! W4 o, x - `-f` 同步间隔时间(秒)' N/ |. \% p) a
- `-cacheTimes` 间隔N次与服务商比对
2 k. P( H; X- m - `-c` 自定义配置文件路径
7 z; M1 C3 p, r( T H! @% a: j' J D - `-noweb` 不启动web服务9 ~: K" [" F, l; F* j* k9 h B! Y
- `-skipVerify` 跳过证书验证
, G/ b% G5 @0 n) a; ^ - `-dns` 自定义 DNS 服务器) O" M; c+ L1 B5 V1 v2 O
- [可选] 参考示例
+ n, E4 ?+ c' {- Y: m - 10分钟同步一次, 并指定了配置文件地址
, T7 H/ y0 \- g- Z2 k ```bash
% d! |% t: W: a6 T3 R ./ddns-go -s install -f 600 -c /Users/name/.ddns_go_config.yaml
1 d3 O+ ]( e/ i& }! b& n ```: S. n* W% `3 D+ R4 i0 l. J0 e
- 每 10 秒检查一次本地 IP 变化, 每 30 分钟对比一下 IP 变化, 实现 IP 变化即时触发更新且不会被服务商限流, 如果使用接口获取IP, 需要注意接口限流" t B8 X. i: x& g" Y9 B+ j
```bash6 G D+ g1 |1 K- S
./ddns-go -s install -f 10 -cacheTimes 1801 j. K: I/ P! t7 F8 Y
```
1 i' b9 ^2 _$ \: x$ m$ d( j I- [可选] 使用 [Homebrew](https://brew.sh) 安装 [ddns-go](https://formulae.brew.sh/formula/ddns-go):' d- E6 g* a; m i9 c
7 }1 M$ v, _3 j% d8 K6 a& H8 ? ```bash
. b! u* w# U# `" ^, x9 u brew install ddns-go
: D r0 l* C( |! [ ```6 O/ S3 r4 |' [$ W7 K8 p! {2 M. T
$ D" y# w2 C% ^! t T# c1 N## Docker中使用+ S- q9 B. w3 J' [
6 W1 R5 t: M" p3 L Z* O- 挂载主机目录, 使用docker host模式。可把 `/opt/ddns-go` 替换为你主机任意目录, 配置文件为隐藏文件) [; {' v. H N" J
. s! l7 k L5 R9 b8 a
```bash1 `& I5 N4 s4 _1 K; O
docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root jeessy/ddns-go* _( d7 p K6 \
```
# w9 T) @! k3 D" ^% W! |8 o
; J7 c1 {/ ^' V7 z6 y+ v6 \9 e. Y- 在浏览器中打开`http://主机IP:9876`,并修改你的配置
8 T1 R- L8 u* A" w _ D' v& o$ `1 `& [2 f: f! g7 T
- [可选] 使用 `ghcr.io` 镜像
0 {/ n8 _& Z j) {' ~6 g) H; v5 H% |" E: p- v% p# \" r
```bash, A% s5 @, R4 n4 m' Z
docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root ghcr.io/jeessy2/ddns-go3 M0 E1 i' e# X; f
```
% @( z" I6 z) y+ X* a: B7 c i2 W8 j0 A& j% Q& @1 d2 T3 G
- [可选] 支持启动带参数 `-l`监听地址 `-f`间隔时间(秒)$ {, X& f5 X5 |0 T' q' J7 Q* R
, q3 u8 n v& a, c: M ```bash
) c4 Y# o4 b4 ?/ y/ i: h- y' j docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root jeessy/ddns-go -l :9877 -f 600# ^7 X" M8 E; M8 r- A9 A
```, e t4 J3 i1 Y2 E- c) i- K9 S
' Q; {/ j9 y# ?$ ]- [可选] 不使用docker host模式
5 C0 ^3 y5 }, S- v3 @9 _7 w2 l9 |7 C y
```bash J: a& b4 u h$ g5 |5 L* U
docker run -d --name ddns-go --restart=always -p 9876:9876 -v /opt/ddns-go:/root jeessy/ddns-go' b6 x4 i' w' e, `' }" d
```
- m/ C4 J q4 H
) W$ E7 K! l4 y1 k! H## 使用IPv6 [* V# ]# m$ F9 t
* e T; v- s& x2 Q
- 前提:你的电脑或终端能正常获取IPv6,并能正常访问IPv6' b9 A8 B# F5 R
- Windows/Mac:推荐 [系统中使用](#系统中使用),Windows/Mac桌面版的docker不支持`--net=host`* E. l, _6 l, `7 H' X; b$ T' E
- 群晖:
. j# b" v, H1 X$ g - 套件中心下载docker并打开
9 I! I4 Z( u: Q6 `$ h - 注册表中搜索`ddns-go`并下载
( N. o0 u: z& v, a/ X, M - 映像 -> 选择`jeessy/ddns-go` -> 启动 -> 高级设置 -> 网络中勾选`使用与 Docker Host 相同的网络`,高级设置中勾选`启动自动重新启动`6 ~ q3 j9 p3 w8 P! x& K$ L
- 在浏览器中打开`http://群晖IP:9876`,修改你的配置,成功
6 d+ P7 E* b+ q: k- Linux的x86或arm架构,推荐使用Docker的`--net=host`模式。参考 [Docker中使用](#Docker中使用)
9 b. ?5 Q7 H! I* \- 虚拟机中使用有可能正常获取IPv6,但不能正常访问IPv6
1 u/ O! e2 a0 u- Y6 r; o/ w
3 n* t) }3 a- T9 @8 |: S P) K## Webhook, @3 J+ u- U( W0 ~8 }" Y2 ?
: O- a; \1 r: s! q* S- 支持webhook, 域名更新成功或不成功时, 会回调填写的URL: I1 y( r+ }- o Q9 N# ` W; c
- 支持的变量
7 `+ [; {, S/ _; m; J9 M% ~7 s* {
| 变量名 | 说明 |
" {; r M6 y, O7 z4 |7 a' e: k8 u | ---- | ---- |
( J5 f# L9 m+ Z) Y3 j | #{ipv4Addr} | 新的IPv4地址 |3 |/ j) e9 O+ r
| #{ipv4Result} | IPv4地址更新结果: `未改变` `失败` `成功`|
2 c3 u1 S# p& I% a | #{ipv4Domains} | IPv4的域名,多个以`,`分割 |
+ Q' y/ a* p4 a: A' [ | #{ipv6Addr} | 新的IPv6地址 |2 X" e5 i+ q$ q* K% Y1 N0 d9 c( u6 [& g
| #{ipv6Result} | IPv6地址更新结果: `未改变` `失败` `成功`|' ^( y) r6 N7 j6 O9 g4 p! ~: ^
| #{ipv6Domains} | IPv6的域名,多个以`,`分割 |. L. @4 w2 X/ l& D1 X
2 O% O5 j2 _) W3 Z+ d" m" d
- 如 RequestBody 为空则为 GET 请求,否则为 POST 请求; `: |5 D5 Z; G4 {
- <details><summary>Server酱</summary>) O: M3 {+ J8 p
( Q5 h# t% e$ U# e$ l
```
" i& I* z5 a$ Q% `# n2 A7 b' W5 d5 n https://sctapi.ftqq.com/[SendKey].send?title=你的公网IP变了&desp=主人IPv4变了#{ipv4Addr},域名更新结果:#{ipv4Result}
& G( p2 d+ t% n* C3 k ```
4 ~. u( Y6 \7 n$ C( R4 p2 }- <details><summary>Bark</summary>
! Z6 N- q3 R; M9 Q* h& u
# o9 `) f7 p9 o1 H' u/ u ```; U7 t! j$ o$ G8 h U
https://api.day.app/[YOUR_KEY]/主人IPv4变了#{ipv4Addr},域名更新结果:#{ipv4Result}
* E( l& R/ Z+ @& f; b' R3 ~ ```
4 N% h$ q h" J' l6 a& p" B3 W0 j- K0 | </details> ]- {# c: \$ _1 P' G
- <details><summary>钉钉</summary>( X% Y7 {2 w" u7 ~- h A# Z
3 q1 l5 t" A5 @; w! C5 z& f/ k6 j - 钉钉电脑端 -> 群设置 -> 智能群助手 -> 添加机器人 -> 自定义
: T; G4 Q. q5 G* y& \+ E - 只勾选 `自定义关键词`, 输入的关键字必须包含在RequestBody的content中, 如:`你的公网IP变了`
# F! ^- l4 D' `9 ` - URL中输入钉钉给你的 `Webhook地址`
' M; v4 D1 f- ` - RequestBody中输入
# }/ ?: G) c; i ```json# d, v! {7 C% x# i/ ]! N" w
{
9 F# u/ V2 @# s* f/ O0 [" s "msgtype": "markdown",
* i% {6 d2 K S3 g5 y, E "markdown": {
. T" X1 V! N+ ]9 |6 h- s "title": "你的公网IP变了",
0 V0 j) ]! j% S) H1 L; d3 e "text": "#### 你的公网IP变了 \n - IPv4地址:#{ipv4Addr} \n - 域名更新结果:#{ipv4Result} \n"
# I0 c9 Q, V1 @, v }
& d- Q& U7 N9 I4 i! i }
- H) x$ w; [2 v ```! X+ o8 h& D3 f! X
</details>+ A3 Z% C5 J. f, g! l
- <details><summary>飞书</summary>
$ M0 L% D$ U$ L0 M4 f/ I" Q0 i8 y) J% b5 _" R
- 飞书电脑端 -> 群设置 -> 添加机器人 -> 自定义机器人/ O; N( F% C, e! \& p* ^; n
- 安全设置只勾选 `自定义关键词`, 输入的关键字必须包含在RequestBody的content中, 如:`你的公网IP变了`
8 {1 g3 z! T2 J/ t, ` - URL中输入飞书给你的 `Webhook地址`8 e% e0 f8 U1 I: L0 h6 y' u
- RequestBody中输入9 y7 [5 P. b4 w: w
```json
; S7 m4 F+ n+ j# z {! [8 m3 f( p+ n: @/ F
"msg_type": "post",. k) N3 g" `% a( h( e1 U( ~1 B
"content": {$ N& N" \9 [# K( m7 P
"post": {
) C8 t* S( p( r7 ? "zh_cn": {' o; P) i* B/ W1 s2 v: @3 D X9 c
"title": "你的公网IP变了",/ W4 }+ Q# ?+ V* |1 @
"content": [! n) _0 ~6 @% E2 b a- e. ^2 m" L
[1 ]- X) p8 v6 _9 D# B0 ]# ^2 U
{+ w/ p9 v H9 H J J: V* e
"tag": "text",6 Z9 }5 C8 g) O7 }0 R9 h
"text": "IPv4地址:#{ipv4Addr}"# f; P- `$ [" A( Z9 N8 Z
}
6 k& U- V u( ]- @" Z6 y* I ],* b0 L9 B8 k/ O- _! V) o* G
[# C7 T* P' Y: k I1 Q
{
+ K6 T! {9 j# K/ _- O) o, ` "tag": "text",
: t3 y5 ?8 L! {1 G "text": "域名更新结果:#{ipv4Result}". P, w9 ^8 ?) J7 g
}: h! x% B4 |0 b6 y4 ^
]5 f" m9 n# P9 U( y$ @% N
]8 {' P7 H. e, j# w7 I8 D! l
}
+ v( x3 c9 w( N* T4 Y }/ c }: T( g. Z& v% S
}& q( ]. n5 o' A t
}: _% X, p1 Z, o
```0 Z" K3 Y2 g+ h& \( k/ Y! m% w
</details>
' e2 R; m L+ Q- <details><summary>Telegram</summary>
?& V9 e ]) \6 J( D
7 q+ I+ ]' w, L* t [ddns-telegram-bot]
; U. [# N) G$ C% K% I* z </details>
- V0 J" F2 \ `, k# [( j9 E) v- <details><summary>plusplus 推送加</summary>6 X+ {$ B# Q) V8 j" \
: {; E8 A& [1 A5 R: z - [获取token](https://www.pushplus.plus/push1.html)
$ M* \3 B# b. d" q1 l) K- e. v2 C1 i - URL中输入 `https://www.pushplus.plus/send`
1 r2 K' ]) K' _, ~6 _6 l0 Z - RequestBody中输入
3 m, K" O$ B, X1 `1 _ ```json0 Z! O# w3 r: l; p( S( k
{/ [4 O9 o. M3 M% M; H* p4 A
"token": "your token",
: L/ ?3 K2 Z6 e1 e3 s "title": "你的公网IP变了",
: P6 F( G) _ r4 m( U: Y2 N "content": "你的公网IP变了 \n - IPv4地址:#{ipv4Addr} \n - 域名更新结果:#{ipv4Result} \n"
+ L4 ^3 k6 k) U1 n7 e( Z2 `" z* G }
6 o# z' w8 m; y8 Z ```" f" h! S! u" G* R3 Y7 a- x
</details>
$ l) F0 T( w2 O/ b7 s6 C- <details><summary>Discord</summary>/ r, {! s2 z* C! r n
- o8 B9 T' B+ w+ g% k. t8 p x5 B - Discord任意客户端 -> 伺服器 -> 频道设置 -> 整合 -> 查看Webhook -> 新Webhook -> 复制Webhook网址; A9 k$ \! Z( j5 h. L, W; ~
- URL中输入Discord复制的 `Webhook网址`
6 B9 {$ y" I6 C" s - RequestBody中输入9 {3 R1 v! V/ h+ X5 v' C
```json0 A2 P8 ?) F9 L% l3 M4 P& u, \
{4 h* ]6 [1 e h# g
"content": "域名 #{ipv4Domains} 动态解析 #{ipv4Result}.",! J" p4 Y; z9 I# ^4 f) I3 W
"embeds": [
0 N+ C9 i. [9 u$ ^3 E {2 j0 V5 n! X9 _( d, E7 C* ?
"description": "#{ipv4Domains} 的动态解析 #{ipv4Result}, IP: #{ipv4Addr}",
% [- E& F$ a4 ^5 B! W' h7 } "color": 15258703,3 x4 m/ L- ` y5 T4 _! |8 c
"author": {. E! X+ V: r+ [$ p9 A: W
"name": "DDNS"
0 [7 I$ p" I* {5 R' E9 _ },! _7 r) c3 |$ Z3 @' i6 N
"footer": {: j- }! p: e0 E( x* H% I/ R, K
"text": "DDNS #{ipv4Result}"
* [! z( e' b5 b9 W r: S9 F o }
2 e; p8 t7 A* _" R, }* ~ }
/ N$ J7 N6 E7 r- @* k4 _ ]! o' @1 y& T, [4 v/ F- S; R
}
4 @+ G5 y5 k4 ?: J9 E ```
( w/ B1 j: \+ d </details>: L0 ]% ?; a" }: E! E* x+ U8 m( N) t
2 E. Z+ A/ b0 E+ Z$ I4 ?. z## Callback6 Z" M. p4 N& {& X% o& n4 v9 f
2 M6 w( A D% a" }- 通过自定义回调可支持更多的第三方DNS服务商$ y7 B, }7 I* o, s! p: X
- 配置的域名有几行, 就会回调几次0 a% ?/ R. G$ \4 V5 b
- 支持的变量0 P" h2 _' A" i
) _3 z7 s. u0 p+ c1 z) U8 v | 变量名 | 说明 |" P7 |0 V( ?: O7 M
| ---- | ---- |& g8 [ d- C' H& k) J8 q3 M- ]- D- A
| #{ip} | 新的IPv4/IPv6地址 |: x, O9 C( r2 H) ~- Q# j: [- H
| #{domain} | 当前域名 |
a9 P0 @- [2 q1 ]6 w3 f | #{recordType} | 记录类型 `A`或`AAAA` |
/ f j6 H! f0 D* U+ _ | #{ttl} | TTL |9 T/ C2 Q- T3 p6 T$ d6 |/ d
- 如 RequestBody 为空则为 GET 请求,否则为 POST 请求+ x1 g9 i: H; V( q8 F( J0 Q4 w
- [Callback配置参考](https://github.com/jeessy2/ddns-go/wiki/Callback配置参考) |
|