|
# ddns-go
1 N2 ]( i7 l& Q$ k" N* _
& P& x$ ^( u, p% ~+ b0 X- T$ T自动获得你的公网 IPv4 或 IPv6 地址,并解析到对应的域名服务。
' s& J# }- ?& w' Q
" U. }) C4 T# @- D" l& s- [特性](#特性)
; ?2 s) Z9 _- z( l' n& h, U- [系统中使用](#系统中使用)9 ^' M8 y4 l* u* x- h. b8 A7 p0 i( s
- [Docker中使用](#docker中使用)
9 q) T8 w0 U2 h' B5 p" V+ x1 d2 I- [使用IPv6](#使用ipv6)
$ ?2 C* y* F7 n5 S }- [Webhook](#webhook)
/ x0 d2 H" [# E9 N" ~( _3 ~& \- [Callback](#callback)
: k5 ~' p7 P$ f8 k; J% r, |- [界面](#界面)! @5 n E) O4 ?9 b- x
- [开发&自行编译](#开发自行编译); p6 G& U: n$ L# z$ N' L
) [ n/ @7 g# [& p
## 特性8 e5 g! @" d) z$ A, |- H% y1 ?5 g5 ?2 ^8 I
! I4 a, t0 Z# V% ] f1 k& \- 支持Mac、Windows、Linux系统,支持ARM、x86架构4 J, B8 ?' ^* t+ F, Z: ~1 Z# q3 x2 r
- 支持的域名服务商 `阿里云` `腾讯云` `Dnspod` `Cloudflare` `华为云` `Callback` `百度云` `Porkbun` `GoDaddy` `Namecheap` `NameSilo` `Dynadot`8 @3 k; ]1 y) Q4 \& m8 _
- 支持接口/网卡/[命令](https://github.com/jeessy2/ddns-go/wiki/通过命令获取IP参考)获取IP6 y$ L* M$ i3 E% I8 w0 u
- 支持以服务的方式运行& U0 Q/ q; B1 p) g
- 默认间隔5分钟同步一次0 }. \2 W$ y8 x& D' t
- 支持同时配置多个DNS服务商
3 f! ?4 }% y0 v: d( n- 支持多个域名同时解析2 {, T8 @! f% V
- 支持多级域名
6 ?& U, q7 {% j9 @8 E3 I% i; Y- 网页中配置,简单又方便,默认勾选`禁止从公网访问`; w0 i( E! {$ H" N" J2 D5 |
- 网页中方便快速查看最近50条日志2 i+ l' i% ?! H8 w F9 _" u
- 支持Webhook通知3 v: D% j4 m4 W* ]: b
- 支持TTL: j! e2 p( R1 Y! D7 W1 c \" E/ f
- 支持部分DNS服务商[传递自定义参数]
" G. K0 q( `1 A+ T# @
0 o5 G+ d* y$ T L5 i4 m* U> [!NOTE]# a9 _: W4 z) \- T6 ^/ H
> 建议在启用公网访问时,使用 Nginx 等反向代理软件启用 HTTPS 访问,以保证安全性。
4 @' D- O, S% c6 G## 系统中使用
" S) q* K( [8 L4 c- }+ D" |- A/ g/ s" K% v% [
- 从 [Releases] 下载并解压 ddns-go4 E; U! }( }; z+ }
- 安装服务7 j4 |6 q2 ^2 I- I+ i: I
- Mac/Linux: `sudo ./ddns-go -s install`
9 ~% S/ C0 b5 \! `3 F! g - Win(以管理员打开cmd): `.\ddns-go.exe -s install`6 C. W' C0 N2 I% f, m9 V$ r
- [可选] 服务卸载
+ g( }' e6 n: d - Mac/Linux: `sudo ./ddns-go -s uninstall`& ?. o' Y. i- H
- Win(以管理员打开cmd): `.\ddns-go.exe -s uninstall`& ~6 H0 B+ ~1 U! u \
- [可选] 支持安装带参数% A, T, ] |# l8 ?: x0 F
- `-l` 监听地址
$ s/ Y7 r* Z3 P - `-f` 同步间隔时间(秒)- }* O2 V7 E- Q9 ~
- `-cacheTimes` 间隔N次与服务商比对2 {1 V, e% E7 Q" _- q
- `-c` 自定义配置文件路径
2 t$ [) v! {5 }' o - `-noweb` 不启动web服务% a, f0 I4 r& h! W5 I7 M
- `-skipVerify` 跳过证书验证+ i1 J' B- \- q1 ^' K a
- `-dns` 自定义 DNS 服务器5 l1 n# L/ w; x# s! i
- [可选] 参考示例$ N) w# f( t% r& ]1 l- Z
- 10分钟同步一次, 并指定了配置文件地址
2 \' `9 o J( V* d/ e ```bash. v$ K3 G( G: k* i8 d, m
./ddns-go -s install -f 600 -c /Users/name/.ddns_go_config.yaml
1 A4 I g/ m" F& b1 {9 y7 ? ```
9 f# E) p. N9 V$ C2 t" b3 D - 每 10 秒检查一次本地 IP 变化, 每 30 分钟对比一下 IP 变化, 实现 IP 变化即时触发更新且不会被服务商限流, 如果使用接口获取IP, 需要注意接口限流
0 u8 v Z( Z9 p" J# b ```bash
$ u3 E; f+ y& p5 A# {6 u+ L ./ddns-go -s install -f 10 -cacheTimes 180/ J: m/ S; w; \& U6 ]& ~/ r
```
& `: _9 d. A0 e4 Q! a5 t- [可选] 使用 [Homebrew](https://brew.sh) 安装 [ddns-go](https://formulae.brew.sh/formula/ddns-go):
! y9 y$ Z2 V8 i3 a# Y5 ~; H% L' H) D" Q) K" c5 n% \2 i4 ?
```bash
+ N- ~" t, N9 ?7 N9 f: ?# N brew install ddns-go5 Q' |( N+ Z4 X9 `; [ `5 ~
```* Y8 m. E* V# c8 ?* Z1 Y. X; K( `
$ R3 o: q c, j* M' G8 Z3 ^0 X
## Docker中使用- W, B) ~; U5 e1 A
+ g! \- K" a6 a& [5 }3 y, f l
- 挂载主机目录, 使用docker host模式。可把 `/opt/ddns-go` 替换为你主机任意目录, 配置文件为隐藏文件9 D. s0 y( D7 w
7 u5 b. S9 n4 \, H! B# o
```bash
% O3 M8 k4 ]- l7 y& C* H docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root jeessy/ddns-go
5 {) A3 c) q( u ``` W: d$ c& t/ X
9 U/ e$ |1 @$ k! X
- 在浏览器中打开`http://主机IP:9876`,并修改你的配置1 _3 e' u. }1 q7 J. R
; j9 z/ L& [+ o0 y1 E& I- [可选] 使用 `ghcr.io` 镜像$ G( u l% g7 i; y j" I7 C
5 S9 P2 j6 {# Y) l
```bash1 Z; x v2 C$ s7 r# r* J0 B1 X2 S' m
docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root ghcr.io/jeessy2/ddns-go; Q( h9 l; ~* a5 {; r$ [5 U& c
```' t% Q+ [& E5 ?/ Q
3 ^' t( s) k5 s9 z
- [可选] 支持启动带参数 `-l`监听地址 `-f`间隔时间(秒)
% `* q8 T# s5 n4 L, q0 ~- I- n$ ~1 R3 [1 I
```bash
; Y: u5 }5 r) A y: c2 Q! L7 p docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root jeessy/ddns-go -l :9877 -f 600
- W# R- U6 m* [$ e; u ```! F2 a( f- C/ S* u) o
X: L# S2 x) E$ x- R' |" ]
- [可选] 不使用docker host模式
! A- ]7 _7 q. f: z' z3 i M& f4 N0 R' u' v$ q" O1 x
```bash, l- w+ d' }" D/ a4 c
docker run -d --name ddns-go --restart=always -p 9876:9876 -v /opt/ddns-go:/root jeessy/ddns-go& ^- o. d1 _& b4 c) R* N
```
" x& G! [' O" L$ S# s c8 c8 a
$ ]" V: i. `$ N2 a5 g. a: V) K# S## 使用IPv6' r& J' `# m- x6 Z8 b
2 Y8 S5 S* Q1 O! R y6 n
- 前提:你的电脑或终端能正常获取IPv6,并能正常访问IPv6: k1 U! l% ~* j) R8 T' N0 q2 E7 w
- Windows/Mac:推荐 [系统中使用](#系统中使用),Windows/Mac桌面版的docker不支持`--net=host`
0 {1 D R) R0 J' X7 p6 [: `- 群晖:% S4 X Z! @& w) k3 u
- 套件中心下载docker并打开
& H9 t; n/ Z. w5 K2 [; R - 注册表中搜索`ddns-go`并下载7 ^( p1 V; F B$ R0 y
- 映像 -> 选择`jeessy/ddns-go` -> 启动 -> 高级设置 -> 网络中勾选`使用与 Docker Host 相同的网络`,高级设置中勾选`启动自动重新启动`
4 C+ K1 ~; b8 j0 q+ J' n' e2 F. C - 在浏览器中打开`http://群晖IP:9876`,修改你的配置,成功
7 n2 C {: x2 R3 f- V$ Z& P- Linux的x86或arm架构,推荐使用Docker的`--net=host`模式。参考 [Docker中使用](#Docker中使用); k1 ~4 X, ^6 @% {6 P$ ~- r
- 虚拟机中使用有可能正常获取IPv6,但不能正常访问IPv6' T T4 j( C: G' Q8 P* _
: X# S' g* N" n$ I }; {1 i
## Webhook
! z" y' L3 E0 {$ V0 z6 ?* [' `6 O9 E$ O3 g5 B7 k H
- 支持webhook, 域名更新成功或不成功时, 会回调填写的URL
3 i5 h k8 j- g3 ]' j2 e- 支持的变量
& v* |7 R5 I" |" Q j1 a+ P
8 \. }) {# V* I | 变量名 | 说明 |
% _) ^8 W& J/ _9 J | ---- | ---- |+ a; m8 P- e3 N' }! G& G. e
| #{ipv4Addr} | 新的IPv4地址 |8 C/ l0 F% D4 ^* ]
| #{ipv4Result} | IPv4地址更新结果: `未改变` `失败` `成功`| g! I6 f, _( D4 S+ r# i& M) o
| #{ipv4Domains} | IPv4的域名,多个以`,`分割 |/ [2 c5 H# m) Z$ X0 E! `( `
| #{ipv6Addr} | 新的IPv6地址 |
7 g. B! Q; ^8 v( U | #{ipv6Result} | IPv6地址更新结果: `未改变` `失败` `成功`|2 e7 b) ~- l) R y" ~! n
| #{ipv6Domains} | IPv6的域名,多个以`,`分割 |
/ z" ^4 I' i, }
: t- M0 I7 S( ~. Z" t/ C- 如 RequestBody 为空则为 GET 请求,否则为 POST 请求+ ?) q+ d, h& Z6 \2 n$ {
- <details><summary>Server酱</summary>
+ Z/ [1 H3 h- o1 B
[7 _( H0 e. Y7 Y4 ^+ F% ?1 T ```3 e6 ^! U/ J1 d2 {6 [7 l
https://sctapi.ftqq.com/[SendKey].send?title=你的公网IP变了&desp=主人IPv4变了#{ipv4Addr},域名更新结果:#{ipv4Result}
2 n/ o9 A3 `" t ```# i' ] R$ W: ]; @
- <details><summary>Bark</summary>
4 b' u( ^9 P/ q5 U1 v# A/ S
0 ^' V: I7 \8 u/ D0 G* }" \ ```" F+ c5 G9 \8 x5 ], e* _
https://api.day.app/[YOUR_KEY]/主人IPv4变了#{ipv4Addr},域名更新结果:#{ipv4Result}
0 Z2 h4 B. Q2 a1 F! _ ```
2 ?$ O( A9 @# B. f) Z" I* D </details>
- @5 k, ]) K; K0 ]. q G. o T- <details><summary>钉钉</summary>2 [) n/ T5 k% ?$ f) ]$ v- ^1 K
: L& s5 E; c3 ^ - 钉钉电脑端 -> 群设置 -> 智能群助手 -> 添加机器人 -> 自定义& y7 F. S7 D5 y" f/ p
- 只勾选 `自定义关键词`, 输入的关键字必须包含在RequestBody的content中, 如:`你的公网IP变了`
& R9 U- f& {1 c6 z8 I, k - URL中输入钉钉给你的 `Webhook地址`9 P% ~1 H- t4 M S1 ]/ h" S& G
- RequestBody中输入; ]; M9 s7 I I. X- W5 h! d/ o
```json
0 c7 s: o' |* J. ?0 e' Z( F {
* f& D, ~7 o7 P/ ~ "msgtype": "markdown",
, n; R& `9 w- a "markdown": {5 X7 S0 {+ ?' p
"title": "你的公网IP变了",/ t1 M8 ^, W0 G! [7 b
"text": "#### 你的公网IP变了 \n - IPv4地址:#{ipv4Addr} \n - 域名更新结果:#{ipv4Result} \n"
h& g- g2 K# z( |. o }
' `3 F2 c) i* S3 u }
( ]8 t; ^7 W9 L0 H# W ```
5 _8 `, I& `/ O, r5 C* ~& o! i; l </details>
& r) H: U; n* G7 K- <details><summary>飞书</summary>8 K) l4 g! U; @4 z7 i. n
5 R' ~( d3 b6 X! g0 H2 s - 飞书电脑端 -> 群设置 -> 添加机器人 -> 自定义机器人
9 o1 D1 w% _; D/ J% r - 安全设置只勾选 `自定义关键词`, 输入的关键字必须包含在RequestBody的content中, 如:`你的公网IP变了`
1 y4 N) v- x0 ~, ?( V* o# X - URL中输入飞书给你的 `Webhook地址`
! v, S8 ?0 c8 {) }0 M0 n7 G1 E* F - RequestBody中输入+ o& Y. {2 z9 k1 h& o/ J
```json* |# m9 @. O- |$ w* X) C1 \/ ~
{
" n/ m0 ^" K. e6 `# f0 N7 | "msg_type": "post",
- _* ]( v+ q* Z& N! H* g "content": {/ M# x4 w2 f2 V
"post": {- ] p! X. h) @- X; J) n6 y
"zh_cn": {
# ` _+ W1 l+ W: |" u8 G "title": "你的公网IP变了",* f# t7 N9 t5 v0 p* V
"content": [
0 P5 I8 y3 {+ s" [- f {* V" a0 M# t& f [
+ g1 |; z( g2 [; c {
8 V9 I* q( o) H* t% b1 H# }5 y2 Z/ z9 Y "tag": "text",
3 D: }8 [. g- |0 D) ~ "text": "IPv4地址:#{ipv4Addr}"
0 O5 F% ]% }0 E" W }
8 {7 h8 x) n" d, ]+ G) h ],4 X, n) J9 Q% P. q
[8 @ `4 c! t) S& C& C
{
+ [0 ?; q5 P3 E2 U5 f "tag": "text",
+ ]4 T$ D8 C$ o# i+ L% t "text": "域名更新结果:#{ipv4Result}"8 m7 s3 I' O( z i3 C
}! @+ @1 a$ n4 u1 F6 ~+ e
]
! ^" n6 u, o( o; D7 v$ m ]( J: K6 m1 v* O- y! t
}7 \: T/ f# l; v& K+ w
}
% i6 R7 [- ]: v1 A9 }- k7 | }* t0 U% C/ B/ j3 E" K
}; K5 V: w. c: W% l! J3 `' y
```
5 m7 M2 L5 p1 _ </details>- m& P- G9 b2 G6 \
- <details><summary>Telegram</summary>/ m. M ] z0 |- n! l& b
b6 r- x9 R# U' ~$ S( U [ddns-telegram-bot]
* ]9 X4 l8 B- B; {& t6 ` </details>- T+ Q8 r8 a0 d8 r
- <details><summary>plusplus 推送加</summary>
5 \# P/ g6 }3 |: Q4 G
/ x8 W$ d/ t5 Y O w. e5 v - [获取token](https://www.pushplus.plus/push1.html)& P6 W8 m3 B9 ~4 `
- URL中输入 `https://www.pushplus.plus/send`& V% l$ }# n9 u- y, V7 H
- RequestBody中输入# F. e2 }: A3 c. M1 v
```json
0 S- m! |; C' J, W {" p7 N4 K8 O, h8 _
"token": "your token"," A- }; J' z) C
"title": "你的公网IP变了",# ~+ @* s8 g4 K. X
"content": "你的公网IP变了 \n - IPv4地址:#{ipv4Addr} \n - 域名更新结果:#{ipv4Result} \n" N7 F. f1 G, z5 p* t& x% b# g% f+ A: G
}
, p4 e0 h8 K" V ```
% a9 y8 k( y8 Q5 P0 A0 A </details>
" k( P$ F2 X3 l# S- <details><summary>Discord</summary>0 O% c6 ^& a/ L. S! ~
4 Y( Z2 W: Y. v. }( I% A2 Z
- Discord任意客户端 -> 伺服器 -> 频道设置 -> 整合 -> 查看Webhook -> 新Webhook -> 复制Webhook网址
5 p, p S$ m2 G% |4 t2 m3 w - URL中输入Discord复制的 `Webhook网址`0 p9 [- E+ j5 r3 ~% `# Q) e8 b9 l
- RequestBody中输入
! G' I1 Q+ B4 v, v5 F ```json
" N+ g4 E- G+ ?& ~3 i {2 _- _9 A) ^. x& x3 H) H4 ~# ^
"content": "域名 #{ipv4Domains} 动态解析 #{ipv4Result}.",
+ x2 K8 l. r0 z "embeds": [5 z9 a% G- o5 X( Z6 l7 }% |
{
) D ~0 @5 A# v% x/ p* ? "description": "#{ipv4Domains} 的动态解析 #{ipv4Result}, IP: #{ipv4Addr}",# h N% R: N# {" ?2 _% y3 a; r4 p
"color": 15258703,
) \3 K# B5 p4 z$ V# u5 z "author": {
, Q1 i+ \, { }+ x+ G "name": "DDNS"
9 M+ J2 n1 H( A, \: W7 f },
% D6 E/ \, q) M! C6 f0 L# l1 C- C "footer": {2 A3 |1 S( a9 N6 L* O; t
"text": "DDNS #{ipv4Result}"
* [; ^/ {4 }! e8 f( d- E1 @2 w }6 f; ^! b5 n+ c% S
}2 p: w$ {1 D; n( f; y3 m, y
]4 F8 ~" i% E$ w1 u6 W6 o
}
4 }1 \* m" K2 A8 O3 q ```8 ~; B. x A# ~4 V+ n2 Y7 j& t9 Y: _
</details>
4 L& A: v Q+ A: L. I# E& c4 Z$ J/ d' F" N
## Callback: N' l0 H2 {! U3 ?7 i, U( Y$ m
$ B5 y5 c5 m" V c2 Y( |- n
- 通过自定义回调可支持更多的第三方DNS服务商2 ~' C" ?7 p# s8 t1 ]( R+ q
- 配置的域名有几行, 就会回调几次
$ I' W0 F9 |3 R- I- 支持的变量* U. r: u* w7 M3 X- S1 R8 M5 A! X
; }4 ^1 y! P) U
| 变量名 | 说明 |
. w3 S: y1 L. H* l7 X | ---- | ---- |& Q9 E2 u4 e2 }
| #{ip} | 新的IPv4/IPv6地址 |
* V, L1 [1 w/ U | #{domain} | 当前域名 |7 U! l& e6 U/ `4 ]& }
| #{recordType} | 记录类型 `A`或`AAAA` |& [! r$ G- i3 S9 {
| #{ttl} | TTL |
/ d" N& r6 Z5 R8 N- 如 RequestBody 为空则为 GET 请求,否则为 POST 请求
) i/ F! n' b! ~9 u* v- [Callback配置参考](https://github.com/jeessy2/ddns-go/wiki/Callback配置参考) |
|