|
|
# ddns-go' F# ~9 z0 f% a+ {1 n
( v1 v* n( Y0 [* P9 @
自动获得你的公网 IPv4 或 IPv6 地址,并解析到对应的域名服务。 x4 g9 N$ ~/ @6 f; o3 N' y8 j
8 J3 C/ Y h( ~- [特性](#特性): p6 k; b: `7 L/ z
- [系统中使用](#系统中使用)
# r$ D, r3 u, b+ R$ L7 J/ }- [Docker中使用](#docker中使用)
c* f) r! @* K) X* k2 X+ R- [使用IPv6](#使用ipv6)+ g- o4 i/ h9 ]! R% b
- [Webhook](#webhook)
+ r5 F- _. s4 @6 a4 D- x- `+ j- [Callback](#callback)
8 J1 l5 G; p+ F' H- [界面](#界面)( n+ w8 h5 _( I3 N- f
- [开发&自行编译](#开发自行编译)4 G/ P: [0 b! Z: Q: I$ e
% m2 L% H& d$ T1 o; K5 |% Y
## 特性
3 H1 F2 E4 R; w O8 V; Z
9 X* s9 R W7 Y# y+ i; E- 支持Mac、Windows、Linux系统,支持ARM、x86架构
# Y k' |/ ^. a& C- 支持的域名服务商 `阿里云` `腾讯云` `Dnspod` `Cloudflare` `华为云` `Callback` `百度云` `Porkbun` `GoDaddy` `Namecheap` `NameSilo` `Dynadot`5 b( d! ^; R' `6 ?" n
- 支持接口/网卡/[命令](https://github.com/jeessy2/ddns-go/wiki/通过命令获取IP参考)获取IP
6 c7 ~! x& |# |8 a: b- 支持以服务的方式运行: n8 a4 l- A/ [* [) g" K
- 默认间隔5分钟同步一次1 |: b' z3 z9 P: w; Q. i
- 支持同时配置多个DNS服务商5 J z* ^% J7 `! }4 q
- 支持多个域名同时解析
! x) b o: P4 v4 n- 支持多级域名
# `1 C$ K. d9 Y+ j- E4 v- 网页中配置,简单又方便,默认勾选`禁止从公网访问`
, B2 T7 w. C2 w$ g/ h# V- 网页中方便快速查看最近50条日志
7 b7 ?/ @7 m1 x$ h- 支持Webhook通知
/ V( K1 {( h `- 支持TTL
8 O- Q9 z5 X$ O5 y3 b- 支持部分DNS服务商[传递自定义参数]
* Q* j) x. C9 a/ o- H
; l; ~0 [ U5 a' P9 W> [!NOTE]
/ G. v8 I) \) _1 \. P, x' n* v: n> 建议在启用公网访问时,使用 Nginx 等反向代理软件启用 HTTPS 访问,以保证安全性。
! J7 ^' c" y+ E" w( _## 系统中使用
4 F+ _4 j) k/ s! V% H, |, l! w) o* c8 w
- 从 [Releases] 下载并解压 ddns-go
6 i: q" j6 i. q* u- 安装服务1 l! n6 X7 x$ E7 c
- Mac/Linux: `sudo ./ddns-go -s install`
, s, a( N f( f# {5 O5 ^1 P - Win(以管理员打开cmd): `.\ddns-go.exe -s install`7 [+ Y( L+ j% {: V% C1 N4 f: j: ~
- [可选] 服务卸载 P' R- H; s" K& l# W1 q4 m+ ^
- Mac/Linux: `sudo ./ddns-go -s uninstall`
7 N( a7 i+ E/ W, Q$ _ - Win(以管理员打开cmd): `.\ddns-go.exe -s uninstall`
3 N2 j7 d2 @4 |! B- [可选] 支持安装带参数
6 Q( u9 B2 I7 ~5 \! K3 V$ w* S - `-l` 监听地址8 U9 o) S8 D* t, a4 R% \
- `-f` 同步间隔时间(秒)
) u" c" R y( I2 p - `-cacheTimes` 间隔N次与服务商比对
$ ~ X* s* p Y1 \3 |3 @9 V4 e - `-c` 自定义配置文件路径 U3 O4 ?$ F4 `( H
- `-noweb` 不启动web服务
# R9 U @8 e0 V# H3 K - `-skipVerify` 跳过证书验证" X* w4 S( w& o8 w
- `-dns` 自定义 DNS 服务器8 D6 O2 _- t5 x3 w1 ?8 I
- [可选] 参考示例
9 v/ A' m' W0 ?+ H9 u4 o9 q5 q - 10分钟同步一次, 并指定了配置文件地址
$ V" ]8 ]0 D; {* U4 s. n1 Y ```bash
* Y2 Q' f$ [4 x4 i ./ddns-go -s install -f 600 -c /Users/name/.ddns_go_config.yaml
. l& }' E3 B3 [; o( x9 o# u ```8 N. K- |% e8 J, R! E G
- 每 10 秒检查一次本地 IP 变化, 每 30 分钟对比一下 IP 变化, 实现 IP 变化即时触发更新且不会被服务商限流, 如果使用接口获取IP, 需要注意接口限流! Z/ D5 g. @/ }7 e( p! u' ^
```bash
2 J4 }, J$ d3 W- E) J; f7 t ./ddns-go -s install -f 10 -cacheTimes 180# `# M. n4 ^% `* p0 l; |
```
# U7 I2 w# {/ h3 ^+ B& [- [可选] 使用 [Homebrew](https://brew.sh) 安装 [ddns-go](https://formulae.brew.sh/formula/ddns-go):( O0 I% G7 x# u: {# v/ c" I
/ [* q2 B& @0 |. s
```bash M% C9 H8 M/ C- o$ j
brew install ddns-go& y- L8 r3 s+ V
```
2 ^, N* n1 i; ]9 S: K
4 b8 w) h7 ?. S0 u## Docker中使用, d7 b2 m" w8 g' U; a( d
7 m0 Z) ~ T O8 o3 D. L- 挂载主机目录, 使用docker host模式。可把 `/opt/ddns-go` 替换为你主机任意目录, 配置文件为隐藏文件
3 ^/ @# U% D/ l# O2 J
0 ~; {3 e z2 K& K6 u ```bash' ^- I3 g1 ^* h0 d0 E! e
docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root jeessy/ddns-go2 E: C# E* o# j" O5 L
```
- {* q: ~0 R0 H( j3 S- C# `. F5 Z) y4 a
- 在浏览器中打开`http://主机IP:9876`,并修改你的配置
5 `' ] ?! ^' \* [7 g
& Z" z& t6 {9 z: v R' }! f- [可选] 使用 `ghcr.io` 镜像0 E$ |+ A. I; S, i7 q& ?0 x1 F
* _7 X: G; [/ w& s" f
```bash
2 O% L, u! T: a# { docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root ghcr.io/jeessy2/ddns-go- r- n8 I/ T) f) x8 E/ I$ C
```8 }+ h( ^& W2 Q# C2 ]" H
+ ]6 |; G: z% h7 ]) S# w* F
- [可选] 支持启动带参数 `-l`监听地址 `-f`间隔时间(秒)" Q, E/ D9 m8 e4 I, g; _9 C3 H
- k( s% W$ C& G5 E1 A4 B5 l7 C/ ` ```bash' l3 m, Q" T- ]2 s: E3 N2 m- z8 w
docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root jeessy/ddns-go -l :9877 -f 600
+ t: o# K) j' v, Z3 H- F" b. E) C) { ```
2 P) n' T0 |2 l( ~1 J: d' e. ]; ^" C2 i @; C8 u: ~2 C' W5 g( Q: F# {
- [可选] 不使用docker host模式6 G' C' A+ v* m# p5 `3 B: k
+ L: t7 F0 X/ B5 b5 m ```bash
$ N% m, A' j- a5 e, d+ t0 U docker run -d --name ddns-go --restart=always -p 9876:9876 -v /opt/ddns-go:/root jeessy/ddns-go
* a0 H; q+ z/ A. l4 q ```
& O# G1 x7 I ]) C$ v" G( L7 w) m D1 B8 Z$ Y0 w# x6 u
## 使用IPv6, R9 g+ x0 Q/ B' ?1 |1 q, N
9 ?' x0 a- M5 ?: D7 ~- r- 前提:你的电脑或终端能正常获取IPv6,并能正常访问IPv6
) B: x6 O" C! a# D3 A: A- Windows/Mac:推荐 [系统中使用](#系统中使用),Windows/Mac桌面版的docker不支持`--net=host`
' U5 e k* `. U* E% F6 B- 群晖:- L1 ]5 ]; ^/ C8 g3 w* @8 t
- 套件中心下载docker并打开
# P7 ~3 N8 L) O+ C - 注册表中搜索`ddns-go`并下载
1 x3 w1 v7 t8 g' _0 ~ - 映像 -> 选择`jeessy/ddns-go` -> 启动 -> 高级设置 -> 网络中勾选`使用与 Docker Host 相同的网络`,高级设置中勾选`启动自动重新启动`
. m7 S& i: }# T - 在浏览器中打开`http://群晖IP:9876`,修改你的配置,成功
$ [4 ]2 C( _7 s& n0 O/ x9 ?6 _4 P- Linux的x86或arm架构,推荐使用Docker的`--net=host`模式。参考 [Docker中使用](#Docker中使用)5 R! E5 v% N2 b2 `
- 虚拟机中使用有可能正常获取IPv6,但不能正常访问IPv66 J+ l; S( `9 S; A W
+ M% [7 C4 G6 e+ c# @- R: z+ w
## Webhook3 m7 P/ |2 ]& ^" R- F) f
5 ]- x+ B, q: P$ o
- 支持webhook, 域名更新成功或不成功时, 会回调填写的URL1 U' g. @' i, d1 R7 g
- 支持的变量
3 x) x* J, N2 g3 K. @" }2 O
" ^0 \# ^9 `4 o2 C3 X | 变量名 | 说明 |
+ B/ T+ h* Z0 _ | ---- | ---- |
$ o" [: q3 l% Q h0 Y C | #{ipv4Addr} | 新的IPv4地址 |# i6 R5 |+ e: q
| #{ipv4Result} | IPv4地址更新结果: `未改变` `失败` `成功`|0 S1 y" n) [/ E' D
| #{ipv4Domains} | IPv4的域名,多个以`,`分割 |0 x9 \0 K% W C& g
| #{ipv6Addr} | 新的IPv6地址 |9 u- ?2 U5 G) X3 o
| #{ipv6Result} | IPv6地址更新结果: `未改变` `失败` `成功`|
H7 X1 b- e! w; i. ]( J* J | #{ipv6Domains} | IPv6的域名,多个以`,`分割 |
. q# _! A2 m7 t8 M
0 R- H8 b) K, V1 W* f3 G! {- 如 RequestBody 为空则为 GET 请求,否则为 POST 请求
: ?7 a7 J% }" u! ?& D% G- <details><summary>Server酱</summary>
& j' s* j+ N; V2 @& D
" e) m/ @+ x) H2 n# t4 ^ ```- l3 d' F+ Q8 r% U0 Q5 ]6 O
https://sctapi.ftqq.com/[SendKey].send?title=你的公网IP变了&desp=主人IPv4变了#{ipv4Addr},域名更新结果:#{ipv4Result}
; @3 [2 T6 L! N2 j: J ```/ m" K/ J) E0 p* W5 R
- <details><summary>Bark</summary>) ^% L- Y/ g7 G4 ~+ M( b1 W/ m
4 [) T6 f3 D" ~, \: b& k0 P5 E( y) D
```
1 z% J$ e( ?0 r- W https://api.day.app/[YOUR_KEY]/主人IPv4变了#{ipv4Addr},域名更新结果:#{ipv4Result}" A0 K; ?$ R V' I6 Q
```% q8 Q8 w, [/ A. Z% q
</details># p0 I; Q2 @2 {: z1 A3 o5 p
- <details><summary>钉钉</summary>
! u" f l- V: \; J& ?+ ^& }' C2 z( N5 |' T
- 钉钉电脑端 -> 群设置 -> 智能群助手 -> 添加机器人 -> 自定义1 Y# f0 J) z( n" e
- 只勾选 `自定义关键词`, 输入的关键字必须包含在RequestBody的content中, 如:`你的公网IP变了`3 p. Z# H4 l5 L
- URL中输入钉钉给你的 `Webhook地址`
* D/ @* V$ O/ n. u8 }' |( s* J - RequestBody中输入
6 R7 Q! [1 ]$ v8 J( `! o6 c0 R ```json
% K( P1 t3 f0 w {; [8 V' ^- q3 H+ Z `, T
"msgtype": "markdown",
* I u3 z1 F% W! S& D "markdown": {
' K) w6 F! I& t" ^. D "title": "你的公网IP变了",
/ l6 R# [& c0 U+ V5 H$ ` "text": "#### 你的公网IP变了 \n - IPv4地址:#{ipv4Addr} \n - 域名更新结果:#{ipv4Result} \n"! v' B" ]. y3 y9 l6 v
}
1 l# \; [7 g, G1 S/ D' y, }7 G }
% Z S; j; _: O2 @: B! \* R ```
8 ~, P/ g. P+ S# m/ y </details>* I" E+ G# |2 O- z1 R5 D+ L* L0 R
- <details><summary>飞书</summary>
2 T4 H9 I; s' H" c. X
: ^& F* z* K* ~/ C - 飞书电脑端 -> 群设置 -> 添加机器人 -> 自定义机器人
% a' E, N& _8 J2 K: e6 Y - 安全设置只勾选 `自定义关键词`, 输入的关键字必须包含在RequestBody的content中, 如:`你的公网IP变了`* x6 G- V0 w o2 ~8 [
- URL中输入飞书给你的 `Webhook地址`
8 c) Q; g+ f8 s: t9 T - RequestBody中输入/ {/ Y8 l4 w: m( F
```json! Q- [9 S9 {. w# _/ n1 @
{$ a K @0 z- `
"msg_type": "post",: j7 B. w1 z+ _/ E0 O
"content": {* W5 q: K# M) v" ]; k+ u7 l9 @
"post": {
: |3 Y6 \+ c" O! y "zh_cn": {! t8 k+ Y, I) X( k2 E) o* f
"title": "你的公网IP变了",+ a$ l; Q% z) h! U9 q
"content": [9 }+ f! M0 x( {- H) @
[% e6 ?0 Z1 A8 r
{
k7 u; ]2 r6 v% e8 o# v "tag": "text",/ L3 P. i" T! K8 G
"text": "IPv4地址:#{ipv4Addr}"3 e7 a) Z) R* i3 I# D
}: v( l- h; W' j! t' f2 X
],
% ]* Q7 w+ z( U4 n [
$ z0 v, [% T6 ]* _0 t {
- L8 n3 t; m7 b2 D "tag": "text"," m+ Z% K. D/ K, O$ N
"text": "域名更新结果:#{ipv4Result}"! O' t( a' G- z( ~
}
# d& _/ K6 d+ y7 |& \) v ]3 l% a( p# B) }# {
]3 r1 j3 I) ?* V4 k: ?- C
}
, s1 S( t5 c6 U9 R0 ]8 q }
$ S+ N% I1 D5 [9 m }# l0 K& W/ u! n6 N t$ ?/ C
}
3 i7 Q; V) _1 ?) Y ```
% ] S8 O7 d4 o- V4 {; r </details>
, X2 I6 S3 f/ ^- <details><summary>Telegram</summary>! l2 E) z) O7 [/ b- C% F7 E ?& C. V9 C
$ n& n4 L4 U. F; ] [ddns-telegram-bot]
- F4 Y1 ]4 J/ X w </details>& m! H( x* O0 x0 A; N( w
- <details><summary>plusplus 推送加</summary>8 }+ Z# U Z0 l' J$ K
: V1 U% O4 y* a: u5 S
- [获取token](https://www.pushplus.plus/push1.html)# g! t2 p7 k& O6 W+ Y: x9 @2 ?
- URL中输入 `https://www.pushplus.plus/send`0 O" Y" a* \$ `) _4 B& ?5 R9 q
- RequestBody中输入, Q: l! `8 _$ B b
```json/ a) Q: x# T: S0 {% B" C
{; y$ w- }" I8 k2 A2 \. N
"token": "your token",' C4 ~/ S6 d6 S# F
"title": "你的公网IP变了",8 p7 r0 d R9 v7 Y8 o$ y
"content": "你的公网IP变了 \n - IPv4地址:#{ipv4Addr} \n - 域名更新结果:#{ipv4Result} \n"
K. s, G3 }5 w# ]& D% T }
4 h$ P/ s2 T& ~- l4 a/ C% j8 Q ```
; P7 ^1 p& @5 {# K3 t </details>) ^, O, b9 x: z0 M! O, {9 Y2 g
- <details><summary>Discord</summary>" K4 N2 F$ ]0 {) e
$ `, J% N5 d d. S# h: d9 z - Discord任意客户端 -> 伺服器 -> 频道设置 -> 整合 -> 查看Webhook -> 新Webhook -> 复制Webhook网址
$ l8 C7 r1 w5 y" j& r- ] - URL中输入Discord复制的 `Webhook网址`
. g" O: o" D6 M5 f3 z - RequestBody中输入
z0 S% `# I/ w3 H7 J' _ ```json
0 e3 H, H" E# t! R5 Y( O& A. [& U {
/ P! H& _, U2 V6 j! ]/ `; j "content": "域名 #{ipv4Domains} 动态解析 #{ipv4Result}.",4 E% Z# z* q% R) z: t: R! F
"embeds": [6 k* R: I/ C+ E* `( `) C% s- p
{' ?* i& C r8 r1 |$ H
"description": "#{ipv4Domains} 的动态解析 #{ipv4Result}, IP: #{ipv4Addr}",
5 w" ^! q8 n; O6 p; ]& S, Y "color": 15258703,
. n! b b* {' t% h3 b6 B+ } "author": {$ ?7 Q; d& \: }! Y( l
"name": "DDNS"
1 ~# o2 q! ?" N5 K8 L9 G1 [9 ^5 C }," N. \" I4 @7 f2 M" k
"footer": { t# e6 ?# E" B( f- I0 G/ W
"text": "DDNS #{ipv4Result}"
# L& `4 M6 X9 |- H; @1 i; B. c }
; g |3 W' [% |0 ~ }% [- g" A) X& J4 ?
]: d$ V0 K8 o ]0 S. A1 `# r7 d" ]
}
* S) s: |+ y9 {3 ` ```
/ I; i3 r/ g; ~/ E! G" x, L0 d9 ] </details>
% P4 i( a" f1 r, m' Q, T' K1 B* B) l3 T" O$ J# S
## Callback2 P" ^3 n* O% Z! I2 ?
@) Q0 D9 T" _- h
- 通过自定义回调可支持更多的第三方DNS服务商& C3 d8 S% [( L% \& y1 E+ A% |
- 配置的域名有几行, 就会回调几次8 S/ Z; n) Y# @' ]
- 支持的变量
1 P( ]3 Q3 R5 n8 W( v% ~! H5 C% p/ ]$ d6 g1 W' s' c; w4 ^
| 变量名 | 说明 |
7 k: R7 Y# X% F# t3 @. Q, m | ---- | ---- |
* m- A& b2 H2 S* e6 h- M; F0 ] | #{ip} | 新的IPv4/IPv6地址 |6 K# S/ ^3 [+ d p. e% ?
| #{domain} | 当前域名 |
: k# \4 }, A A# ?9 e7 m' C | #{recordType} | 记录类型 `A`或`AAAA` |3 P! @5 i8 h, l! P- Y+ [) Q
| #{ttl} | TTL |
# h: l. {1 S8 Z3 ~0 ~- 如 RequestBody 为空则为 GET 请求,否则为 POST 请求0 x. C9 g, K7 `' T, |. p6 ~) `/ B
- [Callback配置参考](https://github.com/jeessy2/ddns-go/wiki/Callback配置参考) |
|