{"id":13412662,"url":"https://github.com/timothyye/godns","last_synced_at":"2025-05-14T03:10:52.885Z","repository":{"id":16904037,"uuid":"19664994","full_name":"TimothyYe/godns","owner":"TimothyYe","description":"A dynamic DNS client tool that supports AliDNS, Cloudflare, Google Domains, DNSPod, HE.net \u0026 DuckDNS \u0026 DreamHost, etc, written in Go.","archived":false,"fork":false,"pushed_at":"2025-04-25T01:26:36.000Z","size":2389,"stargazers_count":1561,"open_issues_count":17,"forks_count":230,"subscribers_count":35,"default_branch":"master","last_synced_at":"2025-04-25T02:39:27.181Z","etag":null,"topics":["alidns","cloudflare","ddns","dns","dnspod","dreamhost","duckdns","dynamic-dns","dyndns","godns","googledomains-dynamic-dns"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/TimothyYe.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":"TimothyYe","patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":null}},"created_at":"2014-05-11T11:49:17.000Z","updated_at":"2025-04-25T01:26:33.000Z","dependencies_parsed_at":"2023-02-15T11:01:27.444Z","dependency_job_id":"e5089b22-85c1-419a-ba14-1bc8e513075e","html_url":"https://github.com/TimothyYe/godns","commit_stats":null,"previous_names":[],"tags_count":96,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TimothyYe%2Fgodns","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TimothyYe%2Fgodns/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TimothyYe%2Fgodns/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TimothyYe%2Fgodns/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/TimothyYe","download_url":"https://codeload.github.com/TimothyYe/godns/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254059513,"owners_count":22007769,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["alidns","cloudflare","ddns","dns","dnspod","dreamhost","duckdns","dynamic-dns","dyndns","godns","googledomains-dynamic-dns"],"created_at":"2024-07-30T20:01:27.464Z","updated_at":"2025-05-14T03:10:47.873Z","avatar_url":"https://github.com/TimothyYe.png","language":"Go","funding_links":["https://github.com/sponsors/TimothyYe"],"categories":["Software Packages","Dynamic DNS","动态域名","动态DNS","软件包"],"sub_categories":["Other Software","Advanced Console UIs","Search and Analytic Databases","检索及分析资料库","SQL 查询语句构建库","其他软件"],"readme":"```text\n ██████╗  ██████╗ ██████╗ ███╗   ██╗███████╗\n██╔════╝ ██╔═══██╗██╔══██╗████╗  ██║██╔════╝\n██║  ███╗██║   ██║██║  ██║██╔██╗ ██║███████╗\n██║   ██║██║   ██║██║  ██║██║╚██╗██║╚════██║\n╚██████╔╝╚██████╔╝██████╔╝██║ ╚████║███████║\n ╚═════╝  ╚═════╝ ╚═════╝ ╚═╝  ╚═══╝╚══════╝\n```\n\n[![Apache licensed][9]][10] [![Docker][3]][4] [![Go Report Card][11]][12] [![GoDoc][13]][14]\n\n[3]: https://img.shields.io/docker/image-size/timothyye/godns/latest\n[4]: https://hub.docker.com/r/timothyye/godns\n[9]: https://img.shields.io/badge/license-Apache-blue.svg\n[10]: LICENSE\n[11]: https://goreportcard.com/badge/github.com/timothyye/godns\n[12]: https://goreportcard.com/report/github.com/timothyye/godns\n[13]: https://godoc.org/github.com/TimothyYe/godns?status.svg\n[14]: https://godoc.org/github.com/TimothyYe/godns\n\n[GoDNS](https://github.com/TimothyYe/godns) is a dynamic DNS (DDNS) client tool. It is a rewrite in [Go](https://golang.org) of my early [DynDNS](https://github.com/TimothyYe/DynDNS) open-source project.\n\n\u003cimg src=\"https://github.com/TimothyYe/godns/blob/master/assets/snapshots/web-panel.jpg?raw=true\" /\u003e\n\n- [Supported DNS Providers](#supported-dns-providers)\n- [Supported Platforms](#supported-platforms)\n- [Pre-conditions](#pre-conditions)\n- [Installation](#installation)\n- [Usage](#usage)\n- [Configuration](#configuration)\n  - [Overview](#overview)\n  - [Configuration file format](#configuration-file-format)\n  - [Dynamic loading of configuration](#dynamic-loading-of-configuration)\n  - [Configuration properties](#configuration-properties)\n  - [Update root domain](#update-root-domain)\n  - [Configuration examples](#configuration-examples)\n    - [Cloudflare](#cloudflare)\n    - [DigitalOcean](#digitalocean)\n    - [DNSPod](#dnspod)\n    - [Dreamhost](#dreamhost)\n    - [Dynv6](#dynv6)\n    - [Google Domains](#google-domains)\n    - [AliDNS](#alidns)\n    - [DuckDNS](#duckdns)\n    - [No-IP](#no-ip)\n    - [HE.net](#henet)\n    - [Scaleway](#scaleway)\n    - [Linode](#linode)\n    - [Strato](#strato)\n    - [LoopiaSE](#loopiase)\n    - [Infomaniak](#infomaniak)\n    - [Hetzner](#hetzner)\n    - [OVH](#ovh)\n    - [Dynu](#dynu)\n    - [IONOS](#ionos)\n  - [Notifications](#notifications)\n    - [Email](#email)\n    - [Telegram](#telegram)\n    - [Slack](#slack)\n    - [Discord](#discord)\n    - [Pushover](#pushover)\n  - [Webhook](#webhook)\n    - [Webhook with HTTP GET request](#webhook-with-http-get-request)\n    - [Webhook with HTTP POST request](#webhook-with-http-post-request)\n  - [Miscellaneous topics](#miscellaneous-topics)\n    - [IPv6 support](#ipv6-support)\n    - [Network interface IP address](#network-interface-ip-address)\n    - [SOCKS5 proxy support](#socks5-proxy-support)\n    - [Display debug info](#display-debug-info)\n    - [Obtain IP from RouterOS](#obtain-ip-from-router-os)\n    - [Multiple API URLs](#multiple-api-urls)\n    - [Recommended APIs](#recommended-apis)\n- [Web Panel](#web-panel)\n- [Running GoDNS](#running-godns)\n  - [Manually](#manually)\n  - [As a manual daemon](#as-a-manual-daemon)\n  - [As a managed daemon (with upstart)](#as-a-managed-daemon-with-upstart)\n  - [As a managed daemon (with systemd)](#as-a-managed-daemon-with-systemd)\n  - [As a managed daemon (with procd)](#as-a-managed-daemon-with-procd)\n  - [As a Docker container](#as-a-docker-container)\n  - [As a Windows service](#as-a-windows-service)\n- [Contributing](#contributing)\n  - [Setup the frontend development environment](#setup-the-frontend-development-environment)\n  - [Build the frontend](#build-the-frontend)\n  - [Run the frontend](#run-the-frontend)\n- [Special Thanks](#special-thanks)\n\n---\n\n## Supported DNS Providers\n\n| Provider                              |    IPv4 support    |    IPv6 support    |    Root Domain     |     Subdomains     |\n| ------------------------------------- | :----------------: | :----------------: | :----------------: | :----------------: |\n| [Cloudflare][cloudflare]              | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |\n| [DigitalOcean][digitalocean]          | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |\n| [Google Domains][google.domains]      | :white_check_mark: | :white_check_mark: |        :x:         | :white_check_mark: |\n| [DNSPod][dnspod]                      | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |\n| [Dynv6][dynv6]                        | :white_check_mark: | :white_check_mark: |        :x:         | :white_check_mark: |\n| [HE.net (Hurricane Electric)][he.net] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |\n| [AliDNS][alidns]                      | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |\n| [DuckDNS][duckdns]                    | :white_check_mark: | :white_check_mark: |        :x:         | :white_check_mark: |\n| [Dreamhost][dreamhost]                | :white_check_mark: | :white_check_mark: |        :x:         | :white_check_mark: |\n| [No-IP][no-ip]                        | :white_check_mark: | :white_check_mark: |        :x:         | :white_check_mark: |\n| [Scaleway][scaleway]                  | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |\n| [Linode][linode]                      | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |\n| [Strato][strato]                      | :white_check_mark: | :white_check_mark: |        :x:         | :white_check_mark: |\n| [LoopiaSE][loopiase]                  | :white_check_mark: | :white_check_mark: |        :x:         | :white_check_mark: |\n| [Infomaniak][infomaniak]              | :white_check_mark: | :white_check_mark: |        :x:         | :white_check_mark: |\n| [Hetzner][hetzner]                    | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |\n| [OVH][ovh]                            | :white_check_mark: | :white_check_mark: |        :x:         | :white_check_mark: |\n| [Dynu][dynu]                          | :white_check_mark: | :white_check_mark: |        :x:         | :white_check_mark: |\n| [IONOS][ionos]                          | :white_check_mark: | :white_check_mark: |        :x:         | :white_check_mark: |\n\n[cloudflare]: https://cloudflare.com\n[digitalocean]: https://digitalocean.com\n[google.domains]: https://domains.google\n[dnspod]: https://www.dnspod.cn\n[dynv6]: https://dynv6.com\n[he.net]: https://dns.he.net\n[alidns]: https://help.aliyun.com/product/29697.html\n[duckdns]: https://www.duckdns.org\n[dreamhost]: https://www.dreamhost.com\n[no-ip]: https://www.noip.com\n[scaleway]: https://www.scaleway.com/\n[linode]: https://www.linode.com\n[strato]: https://strato.de\n[loopiase]: https://www.loopia.se/\n[infomaniak]: https://www.infomaniak.com/\n[hetzner]: https://hetzner.com/\n[ovh]: https://www.ovh.com\n[dynu]: https://www.dynu.com/\n[ionos]: https://www.ionos.com/\n\nTip: You can follow this [issue](https://github.com/TimothyYe/godns/issues/76) to view the current status of DDNS for root domains.\n\n## Supported Platforms\n\n- Linux\n- MacOS\n- ARM Linux (Raspberry Pi, etc.)\n- Windows\n- MIPS32 platform\n\n  To compile binaries for MIPS (mips or mipsle), run:\n\n  ```bash\n  GOOS=linux GOARCH=mips/mipsle GOMIPS=softfloat go build -a\n  ```\n\n  The binary can run on routers as well.\n\n## Pre-conditions\n\nTo use GoDNS, it is assumed:\n\n- You registered (now own) a domain\n- Domain was delegated to a supported [DNS provider](#supported-dns-providers) (i.e. it has nameserver `NS` records pointing at a supported provider)\n\nAlternatively, you can sign in to [DuckDNS](https://www.duckdns.org) (with a social account) and get a subdomain on the duckdns.org domain for free.\n\n## Installation\n\nBuild GoDNS by running (from the root of the repository):\n\n```bash\ncd cmd/godns        # go to the GoDNS directory\ngo mod download     # get dependencies\ngo build            # build\n```\n\nYou can also download a compiled binary from the [releases](https://github.com/TimothyYe/godns/releases).\n\n## Usage\n\nPrint usage/help by running:\n\n```bash\n$ ./godns -h\nUsage of ./godns:\n  -c string\n        Specify a config file (default \"./config.json\")\n  -h    Show help\n```\n\n## Configuration\n\n### Overview\n\n- Make a copy of [config_sample.json](configs/config_sample.json) and name it as `config.json`, or make a copy of [config_sample.yaml](configs/config_sample.yaml) and name it as `config.yaml`.\n- Configure your provider, domain/subdomain info, credentials, etc.\n- Configure a notification medium (e.g. SMTP to receive emails) to get notified when your IP address changes\n- Place the file in the same directory of GoDNS or use the `-c=path/to/your/file.json` option\n\n### Configuration file format\n\nGoDNS supports 2 different configuration file formats:\n\n- JSON\n- YAML\n\nBy default, GoDNS uses `JSON` config file. However, you can specify to use the `YAML` format via: `./godns -c /path/to/config.yaml`\n\n### Dynamic loading of configuration\n\nGoDNS supports dynamic loading of configuration. If you modify the configuration file, GoDNS will automatically reload the configuration and apply the changes.\n\n### Configuration properties\n\n- `provider` — One of the [supported provider to use](#supported-dns-providers): `Cloudflare`, `Google`, `DNSPod`, `AliDNS`, `HE`, `DuckDNS` or `Dreamhost`.\n- `email` — Email or account name of the DNS provider.\n- `password` — Password of the DNS provider.\n- `login_token` — API token of the DNS provider.\n- `domains` — Domains list, with your subdomains.\n- `ip_urls` — A URL array for fetching one's public IPv4 address.\n- `ipv6_urls` — A URL array for fetching one's public IPv6 address.\n- `ip_type` — Switch deciding if IPv4 or IPv6 should be used (when [supported](#supported-dns-providers)). Available values: `IPv4` or `IPv6`.\n- `interval` — How often (in seconds) the public IP should be updated.\n- `socks5_proxy` — Socks5 proxy server.\n- `resolver` — Address of a public DNS server to use. For instance to use [Google's public DNS](https://developers.google.com/speed/public-dns/docs/using), you can set `8.8.8.8` when using GoDNS in IPv4 mode or `2001:4860:4860::8888` in IPv6 mode.\n- `skip_ssl_verify` - Skip verification of SSL certificates for https requests.\n\n### Update root domain\n\nBy simply putting `@` into `sub_domains`, for example:\n\n```json\n\"domains\": [{\n      \"domain_name\": \"example.com\",\n      \"sub_domains\": [\"@\"]\n    }]\n```\n\n### Configuration examples\n\n#### Cloudflare\n\nFor Cloudflare, you need to provide the email \u0026 Global API Key as a password (or to use the API token) and configure all the domains \u0026 subdomains.\n\nBy setting the option `proxied = true`, the record receives the performance and security benefits of Cloudflare. This option is only available for Cloudflare.\n\n\u003cdetails\u003e\n\u003csummary\u003eUsing email \u0026 Global API Key\u003c/summary\u003e\n\n```json\n{\n  \"provider\": \"Cloudflare\",\n  \"email\": \"you@example.com\",\n  \"password\": \"Global API Key\",\n  \"domains\": [\n    {\n      \"domain_name\": \"example.com\",\n      \"sub_domains\": [\"www\", \"test\"]\n    },\n    {\n      \"domain_name\": \"example2.com\",\n      \"sub_domains\": [\"www\", \"test\"]\n    }\n  ],\n  \"resolver\": \"8.8.8.8\",\n  \"ip_urls\": [\"https://api.ip.sb/ip\"],\n  \"ip_type\": \"IPv4\",\n  \"interval\": 300,\n  \"socks5_proxy\": \"\",\n  \"proxied\": false\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eUsing the API Token\u003c/summary\u003e\n\n```json\n{\n  \"provider\": \"Cloudflare\",\n  \"login_token\": \"API Token\",\n  \"domains\": [\n    {\n      \"domain_name\": \"example.com\",\n      \"sub_domains\": [\"www\", \"test\"]\n    },\n    {\n      \"domain_name\": \"example2.com\",\n      \"sub_domains\": [\"www\", \"test\"]\n    }\n  ],\n  \"resolver\": \"8.8.8.8\",\n  \"ip_urls\": [\"https://api.ip.sb/ip\"],\n  \"ip_type\": \"IPv4\",\n  \"interval\": 300,\n  \"socks5_proxy\": \"\"\n}\n```\n\n\u003c/details\u003e\n\n#### DNSPod\n\nFor DNSPod, you need to provide your API Token(you can create it [here](https://www.dnspod.cn/console/user/security)), and config all the domains \u0026 subdomains.\n\n\u003cdetails\u003e\n\u003csummary\u003eExample\u003c/summary\u003e\n\n```json\n{\n  \"provider\": \"DNSPod\",\n  \"login_token\": \"your_id,your_token\",\n  \"domains\": [\n    {\n      \"domain_name\": \"example.com\",\n      \"sub_domains\": [\"www\", \"test\"]\n    },\n    {\n      \"domain_name\": \"example2.com\",\n      \"sub_domains\": [\"www\", \"test\"]\n    }\n  ],\n  \"resolver\": \"8.8.8.8\",\n  \"ip_urls\": [\"https://api.ip.sb/ip\"],\n  \"ip_type\": \"IPv4\",\n  \"interval\": 300,\n  \"socks5_proxy\": \"\"\n}\n```\n\n\u003c/details\u003e\n\n#### DigitalOcean\n\nFor DigitalOcean, you need to provide an API Token with the `domain` scopes (you can create it [here](https://cloud.digitalocean.com/account/api/tokens/new)), and config all the domains \u0026 subdomains.\n\n\u003cdetails\u003e\n\u003csummary\u003eExample\u003c/summary\u003e\n\n```json\n{\n  \"provider\": \"DigitalOcean\",\n  \"login_token\": \"dop_v1_00112233445566778899aabbccddeeff\",\n  \"domains\": [\n    {\n      \"domain_name\": \"example.com\",\n      \"sub_domains\": [\"@\", \"www\"]\n    }\n  ],\n  \"resolver\": \"8.8.8.8\",\n  \"ip_urls\": [\"https://api.ip.sb/ip\"],\n  \"ip_type\": \"IPv4\",\n  \"interval\": 300\n}\n\n```\n\n\u003c/details\u003e\n\n#### Dreamhost\n\nFor Dreamhost, you need to provide your API Token(you can create it [here](https://panel.dreamhost.com/?tree=home.api)), and config all the domains \u0026 subdomains.\n\n\u003cdetails\u003e\n\u003csummary\u003eExample\u003c/summary\u003e\n\n```json\n{\n  \"provider\": \"Dreamhost\",\n  \"login_token\": \"your_api_key\",\n  \"domains\": [\n    {\n      \"domain_name\": \"example.com\",\n      \"sub_domains\": [\"www\", \"test\"]\n    },\n    {\n      \"domain_name\": \"example2.com\",\n      \"sub_domains\": [\"www\", \"test\"]\n    }\n  ],\n  \"resolver\": \"8.8.8.8\",\n  \"ip_urls\": [\"https://api.ip.sb/ip\"],\n  \"ip_type\": \"IPv4\",\n  \"interval\": 300,\n  \"resolver\": \"ns1.dreamhost.com\",\n  \"socks5_proxy\": \"\"\n}\n```\n\n\u003c/details\u003e\n\n#### Dynv6\n\nFor Dynv6, only need to provide the `token`, config 1 default domain \u0026 subdomains.\n\n\u003cdetails\u003e\n\u003csummary\u003eExample\u003c/summary\u003e\n\n```json\n{\n  \"provider\": \"Dynv6\",\n  \"password\": \"\",\n  \"login_token\": \"1234567ABCDEFGabcdefg123456789\",\n  \"domains\": [\n    {\n      \"domain_name\": \"dynv6.net\",\n      \"sub_domains\": [\"myname\"]\n    }\n  ],\n  \"resolver\": \"8.8.8.8\",\n  \"ip_urls\": [\"https://api.ip.sb/ip\"],\n  \"ip_type\": \"IPv4\",\n  \"interval\": 300,\n  \"socks5_proxy\": \"\"\n}\n```\n\n\u003c/details\u003e\n\n#### Google Domains\n\nFor Google Domains, you need to provide email \u0026 password, and config all the domains \u0026 subdomains.\n\n\u003cdetails\u003e\n\u003csummary\u003eExample\u003c/summary\u003e\n\n```json\n{\n  \"provider\": \"Google\",\n  \"email\": \"Your_Username\",\n  \"password\": \"Your_Password\",\n  \"domains\": [\n    {\n      \"domain_name\": \"example.com\",\n      \"sub_domains\": [\"www\", \"test\"]\n    },\n    {\n      \"domain_name\": \"example2.com\",\n      \"sub_domains\": [\"www\", \"test\"]\n    }\n  ],\n  \"resolver\": \"8.8.8.8\",\n  \"ip_urls\": [\"https://api.ip.sb/ip\"],\n  \"ip_type\": \"IPv4\",\n  \"interval\": 300,\n  \"socks5_proxy\": \"\"\n}\n```\n\n\u003c/details\u003e\n\n#### AliDNS\n\nFor AliDNS, you need to provide `AccessKeyID` \u0026 `AccessKeySecret` as `email` \u0026 `password`, and config all the domains \u0026 subdomains.\n\n\u003cdetails\u003e\n\u003csummary\u003eExample\u003c/summary\u003e\n\n```json\n{\n  \"provider\": \"AliDNS\",\n  \"email\": \"AccessKeyID\",\n  \"password\": \"AccessKeySecret\",\n  \"login_token\": \"\",\n  \"domains\": [\n    {\n      \"domain_name\": \"example.com\",\n      \"sub_domains\": [\"www\", \"test\"]\n    },\n    {\n      \"domain_name\": \"example2.com\",\n      \"sub_domains\": [\"www\", \"test\"]\n    }\n  ],\n  \"resolver\": \"8.8.8.8\",\n  \"ip_urls\": [\"https://api.ip.sb/ip\"],\n  \"ip_type\": \"IPv4\",\n  \"interval\": 300,\n  \"socks5_proxy\": \"\"\n}\n```\n\n\u003c/details\u003e\n\n#### DuckDNS\n\nFor DuckDNS, the only thing needed is to provide the `token`, config 1 default domain \u0026 subdomains.\n\n\u003cdetails\u003e\n\u003csummary\u003eExample\u003c/summary\u003e\n\n```json\n{\n  \"provider\": \"DuckDNS\",\n  \"password\": \"\",\n  \"login_token\": \"3aaaaaaaa-f411-4198-a5dc-8381cac61b87\",\n  \"domains\": [\n    {\n      \"domain_name\": \"www.duckdns.org\",\n      \"sub_domains\": [\"myname\"]\n    }\n  ],\n  \"resolver\": \"8.8.8.8\",\n  \"ip_urls\": [\"https://api.ip.sb/ip\"],\n  \"ip_type\": \"IPv4\",\n  \"interval\": 300,\n  \"socks5_proxy\": \"\"\n}\n```\n\n\u003c/details\u003e\n\n#### No-IP\n\n\u003cdetails\u003e\n\u003csummary\u003eExample\u003c/summary\u003e\n\n```json\n{\n  \"provider\": \"NoIP\",\n  \"email\": \"mail@example.com\",\n  \"password\": \"YourPassword\",\n  \"domains\": [\n    {\n      \"domain_name\": \"ddns.net\",\n      \"sub_domains\": [\"timothyye6\"]\n    }\n  ],\n  \"ip_type\": \"IPv4\",\n  \"ip_urls\": [\"https://api.ip.sb/ip\"],\n  \"resolver\": \"8.8.8.8\",\n  \"interval\": 300,\n  \"socks5_proxy\": \"\"\n}\n```\n\n\u003c/details\u003e\n\n#### HE.net\n\nFor HE, email is not needed, just fill in the DDNS key as a password, and configure all the domains \u0026 subdomains.\n\n\u003cdetails\u003e\n\u003csummary\u003eExample\u003c/summary\u003e\n\n```json\n{\n  \"provider\": \"HE\",\n  \"password\": \"Your DDNS Key\",\n  \"login_token\": \"\",\n  \"domains\": [\n    {\n      \"domain_name\": \"example.com\",\n      \"sub_domains\": [\"www\", \"test\"]\n    },\n    {\n      \"domain_name\": \"example2.com\",\n      \"sub_domains\": [\"www\", \"test\"]\n    }\n  ],\n  \"resolver\": \"8.8.8.8\",\n  \"ip_urls\": [\"https://api.ip.sb/ip\"],\n  \"ip_type\": \"IPv4\",\n  \"interval\": 300,\n  \"socks5_proxy\": \"\"\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eProvider configuration\u003c/summary\u003e\n\nAdd a new \"A record\" and make sure that \"Enable entry for dynamic dns\" is checked:\n\n\u003cimg src=\"assets/snapshots/he1.png\" width=\"640\" /\u003e\n\nFill in your own DDNS key or generate a random DDNS key for this newly created \"A record\":\n\n\u003cimg src=\"assets/snapshots/he2.png\" width=\"640\" /\u003e\n\nRemember the DDNS key and set it in the `password` property in the configuration file.\n\n**NOTICE**: If you have multiple domains or subdomains, make sure their DDNS key are the same.\n\n\u003c/details\u003e\n\n#### Scaleway\n\nFor Scaleway, you need to provide an API Secret Key as the `login_token` ([How to generate an API key](https://www.scaleway.com/en/docs/generate-api-keys/)), and configure the domains and subdomains. `domain_name` should equal a DNS zone, or the root domain in Scaleway. TTL for the DNS records will be set to the `interval` value. Make sure `A` or `AAAA` records exist for the relevant sub domains, these can be set up in the [Scaleway console](https://www.scaleway.com/en/docs/scaleway-dns/#-Managing-Records).\n\n\u003cdetails\u003e\n\u003csummary\u003eExample\u003c/summary\u003e\n\n```json\n{\n  \"provider\": \"Scaleway\",\n  \"login_token\": \"API Secret Key\",\n  \"domains\": [{\n      \"domain_name\": \"example.com\",\n      \"sub_domains\": [\"www\",\"@\"]\n    },{\n      \"domain_name\": \"samplednszone.example.com\",\n      \"sub_domains\": [\"www\",\"test\"]\n    }\n  ],\n  \"resolver\": \"8.8.8.8\",\n  \"ip_urls\": [\"https://api.ip.sb/ip\"],\n  \"ip_type\": \"IPv4\",\n  \"interval\": 300\n}\n```\n\n\u003c/details\u003e\n\n#### Linode\n\nTo authenticate with the Linode API you will need to provide a Personal Access Token with \"Read/Write\" access on the \"Domain\" scope. Linode has [a help page about creating access tokens](https://www.linode.com/docs/guides/getting-started-with-the-linode-api/). Pass this token into the `login_token` field of the config file.\n\nThe `domain_name` field of the config file must be the name of an existing Domain managed by Linode. Linode has [a help page about adding domains](https://www.linode.com/docs/guides/dns-manager/). The GoDNS Linode handler will not create domains automatically but will create subdomains automatically.\n\nThe GoDNS Linode handler currently uses a fixed TTL of 30 seconds for Linode DNS records.\n\n\u003cdetails\u003e\n\u003csummary\u003eExample\u003c/summary\u003e\n\n```json\n{\n  \"provider\": \"Linode\",\n  \"login_token\": ${PERSONAL_ACCESS_TOKEN},\n  \"domains\": [{\n      \"domain_name\": \"example.com\",\n      \"sub_domains\": [\"www\",\"@\"]\n    },{\n      \"domain_name\": \"samplednszone.example.com\",\n      \"sub_domains\": [\"www\",\"test\"]\n    }\n  ],\n  \"resolver\": \"8.8.8.8\",\n  \"ip_urls\": [\"https://api.ip.sb/ip\"],\n  \"ip_type\": \"IPv4\",\n  \"interval\": 300\n}\n```\n\n\u003c/details\u003e\n\n#### Strato\n\nFor Strato, you need to provide email \u0026 password and configure all the domains \u0026 subdomains.\nMore Info: [German](https://www.strato.de/faq/hosting/so-einfach-richten-sie-dyndns-fuer-ihre-domains-ein/) [English](https://www.strato-hosting.co.uk/faq/hosting/this-is-how-easy-it-is-to-set-up-dyndns-for-your-domains/)\n\n\u003cdetails\u003e\n\u003csummary\u003eExample\u003c/summary\u003e\n\n```json\n{\n  \"provider\": \"strato\",\n  \"password\": \"Your_Password\",\n  \"domains\": [\n    {\n      \"domain_name\": \"example.com\",\n      \"sub_domains\": [\"www\", \"test\"]\n    },\n    {\n      \"domain_name\": \"example2.com\",\n      \"sub_domains\": [\"www\", \"test\"]\n    }\n  ],\n  \"resolver\": \"8.8.8.8\",\n  \"ip_urls\": [\"https://api.ip.sb/ip\"],\n  \"ip_type\": \"IPv4\",\n  \"interval\": 300,\n  \"socks5_proxy\": \"\"\n}\n```\n\n\u003c/details\u003e\n\n#### LoopiaSE\n\nFor LoopiaSE, you need to provide a username \u0026 password and configure all the domains \u0026 subdomains.\nMore info: [Swedish](https://support.loopia.se/wiki/om-dyndns-stodet/)\n\n\u003cdetails\u003e\n\u003csummary\u003eExample\u003c/summary\u003e\n\n```json\n{\n  \"provider\": \"LoopiaSE\",\n  \"email\": \"Your_Username\",\n  \"password\": \"Your_Password\",\n  \"domains\": [\n    {\n      \"domain_name\": \"example.com\",\n      \"sub_domains\": [\"www\", \"test\"]\n    },\n    {\n      \"domain_name\": \"example2.com\",\n      \"sub_domains\": [\"www\", \"test\"]\n    }\n  ],\n  \"resolver\": \"8.8.8.8\",\n  \"ip_urls\": [\"https://api.ip.sb/ip\"],\n  \"ip_type\": \"IPv4\",\n  \"interval\": 300,\n  \"socks5_proxy\": \"\"\n}\n```\n\n\u003c/details\u003e\n\n#### Infomaniak\n\nFor Infomaniak, you need to provide a username \u0026 password and configure all the domains \u0026 subdomains.\nMore info: [English](https://faq.infomaniak.com/2376)\n\n\u003cdetails\u003e\n\u003csummary\u003eExample\u003c/summary\u003e\n\n```json\n{\n  \"provider\": \"Infomaniak\",\n  \"email\": \"Your_Username\",\n  \"password\": \"Your_Password\",\n  \"domains\": [\n    {\n      \"domain_name\": \"example.com\",\n      \"sub_domains\": [\"www\", \"test\"]\n    },\n    {\n      \"domain_name\": \"example2.com\",\n      \"sub_domains\": [\"www\", \"test\"]\n    }\n  ],\n  \"resolver\": \"8.8.8.8\",\n  \"ip_urls\": [\"https://api.ip.sb/ip\"],\n  \"ip_type\": \"IPv4\",\n  \"interval\": 300,\n  \"socks5_proxy\": \"\"\n}\n```\n\n\u003c/details\u003e\n\n#### Hetzner\n\nFor Hetzner, you have to create an access token. This can be done in the DNS-Console.\n(Person Icon in the top left corner --\u003e API Tokens)\nNotice: If a domain has multiple Records **only the first** Record will be updated.\nMake sure there is just one record.\n\n\u003cdetails\u003e\n\u003csummary\u003eExample\u003c/summary\u003e\n\n```json\n{\n  \"provider\": \"hetzner\",\n  \"login_token\": \"\u003ctoken\u003e\",\n  \"domains\": [\n    {\n      \"domain_name\": \"example.com\",\n      \"sub_domains\": [\"www\", \"test\"]\n    },\n    {\n      \"domain_name\": \"example2.com\",\n      \"sub_domains\": [\"www\", \"test\"]\n    }\n  ],\n  \"resolver\": \"8.8.8.8\",\n  \"ip_urls\": [\"https://api.ip.sb/ip\"],\n  \"ip_type\": \"IPv4\"\n}\n```\n\n\u003c/details\u003e\n\n#### OVH\n\nFor OVH, you need to provide a Consumerkey, an Appsecret, and an Appkey and configure all the domains \u0026 subdomains.\nThe needed values can be obtained by visiting [this site](https://www.ovh.com/auth/api/createToken)\nRights should be '\\*' on GET, POST and PUT\nMore info: [help.ovhcloud.com](https://help.ovhcloud.com/csm/en-gb-api-getting-started-ovhcloud-api?id=kb_article_view\u0026sysparm_article=KB0042784)\n\n\u003cdetails\u003e\n\u003csummary\u003eExample\u003c/summary\u003e\n\n```json\n{\n  \"provider\": \"OVH\",\n  \"consumer_key\": \"e389ac80cc8da9c7451bc7b8f171bf4f\",\n  \"app_secret\": \"d1ffee354d3643d70deaab48a09131fd\",\n  \"app_key\": \"cd338839d6472064\",\n  \"domains\": [\n    {\n      \"domain_name\": \"example.com\",\n      \"sub_domains\": [\"www\", \"test\"]\n    },\n    {\n      \"domain_name\": \"example2.com\",\n      \"sub_domains\": [\"www\", \"test\"]\n    }\n  ],\n  \"resolver\": \"8.8.8.8\",\n  \"ip_urls\": [\"https://api.ip.sb/ip\"],\n  \"ip_type\": \"IPv4\",\n  \"interval\": 300,\n  \"socks5_proxy\": \"\"\n}\n```\n\n\u003c/details\u003e\n\n#### Dynu\n\nFor Dynu, you need to configure the `password`, config 1 default domain \u0026 subdomain.\n\n\u003cdetails\u003e\n\u003csummary\u003eExample\u003c/summary\u003e\n\n```json\n{\n  \"provider\": \"Dynu\",\n  \"password\": \"Your_Password\",\n  \"domains\": [\n    {\n      \"domain_name\": \"your_domain.com\",\n      \"sub_domains\": [\n        \"your_subdomain\"\n      ]\n    }\n  ],\n  \"resolver\": \"8.8.8.8\",\n  \"ip_urls\": [\"https://api.ip.sb/ip\"],\n  \"ip_type\": \"IPv4\",\n  \"interval\": 300,\n  \"socks5_proxy\": \"\"\n}\n```\n\n\u003c/details\u003e\n\n#### IONOS\n\nThis is for IONOS Hosting Services, **not** IONOS Cloud.\nYou'll need to [sign up for API Access to Hosting Services](https://my.ionos.com/shop/product/ionos-api), then create an [API Key](https://developer.hosting.ionos.com/keys).\nYou can find a full guide in the [IONOS API Documentation](https://developer.hosting.ionos.com/docs/getstarted).\n**Note**: The API-Key used by GoDNS must follow the form `publicprefix.secret` as described in the aforementioned documentation.\n\n\u003cdetails\u003e\n\u003csummary\u003eExample\u003c/summary\u003e\n\n```yaml\nprovider: IONOS\nlogin_token: publicprefix.secret\ndomains:\n  - domain_name: example.com\n    sub_domains:\n      - somesubdomain\n      - anothersubdomain\nresolver: 1.1.1.1\nip_urls:\n  - https://api.ipify.org\nip_type: IPv4\ninterval: 300\nsocks5_proxy: \"\"\n```\n\n\u003c/details\u003e\n\n### Notifications\n\nGoDNS can send a notification each time the IP changes.\n\n#### Email\n\nEmails are sent over [SMTP](https://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol). Update your configuration with the following snippet:\n\n```json\n  \"notify\": {\n    \"mail\": {\n      \"enabled\": true,\n      \"smtp_server\": \"smtp.example.com\",\n      \"smtp_username\": \"user\",\n      \"smtp_password\": \"password\",\n      \"smtp_port\": 25,\n      \"send_from\": \"my_mail@example.com\"\n      \"send_to\": \"my_mail@example.com\"\n    }\n  }\n```\n\nEach time the IP changes, you will receive an email like this:\n\n\u003cimg src=\"https://github.com/TimothyYe/godns/blob/master/assets/snapshots/mail.png?raw=true\" /\u003e\n\n#### Telegram\n\nTo receive a [Telegram](https://telegram.org/) message each time the IP changes, update your configuration with the following snippet:\n\n```json\n  \"notify\": {\n    \"telegram\": {\n      \"enabled\": true,\n      \"bot_api_key\": \"11111:aaaa-bbbb\",\n      \"chat_id\": \"-123456\",\n      \"message_template\": \"Domain *{{ .Domain }}* updated to %0A{{ .CurrentIP }}\",\n      \"use_proxy\": false\n    },\n  }\n```\n\nThe `message_template` property supports [markdown](https://www.markdownguide.org). New lines need to be escaped with `%0A`.\n\n#### Slack\n\nTo receive a [Slack](https://slack.com) message each time the IP changes, update your configuration with the following snippet:\n\n```json\n  \"notify\": {\n    \"slack\": {\n      \"enabled\": true,\n      \"bot_api_token\": \"xoxb-xxx\",\n      \"channel\": \"your_channel\",\n      \"message_template\": \"Domain *{{ .Domain }}* updated to \\n{{ .CurrentIP }}\",\n      \"use_proxy\": false\n    },\n  }\n```\n\nThe `message_template` property supports [markdown](https://www.markdownguide.org). New lines needs to be escaped with `\\n`.\n\n#### Discord\n\nTo receive a [Discord](https://discord.gg) message each time the IP changes, update your configuration with the following snippit:\n\n```json\n  \"notify\": {\n    \"discord\": {\n          \"enabled\": true,\n          \"bot_api_token\": \"discord_bot_token\",\n          \"channel\": \"your_channel\",\n          \"message_template\": \"(Optional) Domain *{{ .Domain }}* updated to \\n{{ .CurrentIP }}\",\n        }\n  }\n```\n\n#### Pushover\n\nTo receive a [Pushover](https://pushover.net/) message each time the IP changes, update your configuration with the following snippet:\n\n```json\n  \"notify\": {\n    \"pushover\": {\n      \"enabled\": true,\n      \"token\": \"abcdefghijklmnopqrstuvwxyz1234\",\n      \"user\": \"abcdefghijklmnopqrstuvwxyz1234\",\n      \"message_template\": \"\",\n      \"device\": \"\",\n      \"title\": \"\",\n      \"priority\": 0,\n      \"html\": 1\n    }\n  }\n```\n\nThe `message_template` property supports [html](https://pushover.net/api#html) if the `html` parameter is `1`. If it is left empty a default message will be used.\nIf the `device` and `title` parameters are left empty, Pushover will choose defaults [see](https://pushover.net/api#messages). More details on the priority parameter\ncan be found on the Pushover [API description](https://pushover.net/api#priority).\n\n### Webhook\n\nWebhook is another feature that GoDNS provides to deliver notifications to other applications while the IP is changed. GoDNS delivers a notification to the target URL via an HTTP `GET` or `POST` request.\n\nThe configuration section `webhook` is used for customizing the webhook request. In general, there are 2 fields used for the webhook request:\n\n\u003e - `url`: The target URL for sending webhook requests.\n\u003e - `request_body`: The content for sending a `POST` request, if this field is empty, an HTTP GET request will be sent instead of the HTTP POST request.\n\nAvailable variables:\n\n\u003e - `Domain`: The current domain.\n\u003e - `IP`: The new IP address.\n\u003e - `IPType`: The type of the IP: `IPV4` or `IPV6`.\n\n#### Webhook with HTTP GET request\n\n```json\n\"webhook\": {\n  \"enabled\": true,\n  \"url\": \"http://localhost:5000/api/v1/send?domain={{.Domain}}\u0026ip={{.CurrentIP}}\u0026ip_type={{.IPType}}\",\n  \"request_body\": \"\"\n}\n```\n\nFor this example, a webhook with query string parameters will be sent to the target URL:\n\n```\nhttp://localhost:5000/api/v1/send?domain=ddns.example.com\u0026ip=192.168.1.1\u0026ip_type=IPV4\n```\n\n#### Webhook with HTTP POST request\n\n```json\n\"webhook\": {\n  \"enabled\": true,\n  \"url\": \"http://localhost:5000/api/v1/send\",\n  \"request_body\": \"{ \\\"domain\\\": \\\"{{.Domain}}\\\", \\\"ip\\\": \\\"{{.CurrentIP}}\\\", \\\"ip_type\\\": \\\"{{.IPType}}\\\" }\"\n}\n```\n\nFor this example, a webhook will be triggered when the IP changes, and the target URL `http://localhost:5000/api/v1/send` will receive an `HTTP POST` request with the request body:\n\n```json\n{ \"domain\": \"ddns.example.com\", \"ip\": \"192.168.1.1\", \"ip_type\": \"IPV4\" }\n```\n\n### Miscellaneous topics\n\n#### IPv6 support\n\nMost of the [providers](#supported-dns-providers) support IPv6.\n\nTo enable the `IPv6` support of GoDNS, there are two solutions to choose from:\n\n1. Use an online service to lookup the external IPv6\n\n   For that:\n\n   - Set the `ip_type` as `IPv6`, and make sure the `ipv6_urls` is configured\n   - Create an `AAAA` record instead of an `A` record in your DNS provider\n\n   \u003cdetails\u003e\n   \u003csummary\u003eConfiguration example\u003c/summary\u003e\n\n   ```json\n   {\n     \"domains\": [\n       {\n         \"domain_name\": \"example.com\",\n         \"sub_domains\": [\"ipv6\"]\n       }\n     ],\n     \"resolver\": \"2001:4860:4860::8888\",\n     \"ipv6_urls\": [\"https://api-ipv6.ip.sb/ip\"],\n     \"ip_type\": \"IPv6\"\n   }\n   ```\n\n   \u003c/details\u003e\n\n2. Let GoDNS find the IPv6 of the network interface of the machine it is running on (more on that [later](#network-interface-ip-address)).\n\n   For this to happen, just leave `ip_urls` and `ipv6_urls` empty.\n\n   Note that the network interface must be configured with an IPv6 for this to work.\n\n#### Network interface IP address\n\nFor some reasons, if you want to get the IP address associated with a network interface (instead of performing an online lookup), you can specify it in the configuration file this way:\n\n```json\n  \"ip_urls\": [\"\"],\n  \"ip_interface\": \"interface-name\",\n```\n\nWith `interface-name` replaced by the name of the network interface, e.g. `eth0` on Linux or `Local Area Connection` on Windows.\n\nNote: If `ip_urls` is also specified, it will be used to perform an online lookup first and the network interface IP will be used as a fallback in case of failure.\n\n#### SOCKS5 proxy support\n\nYou can make all remote calls go through a [SOCKS5 proxy](https://en.wikipedia.org/wiki/SOCKS#SOCKS5) by specifying it in the configuration file this way:\n\n```json\n\"socks5_proxy\": \"127.0.0.1:7070\"\n\"use_proxy\": true\n```\n\n#### Obtain IP from Router OS\n\nIf you want to get the public IP from a Mikrotik RouterOS device, you can use the following configuration:\n\n```json\n\"mikrotik\": {\n  \"enabled\": false,\n  \"server\": \"http://192.168.88.1\",\n  \"username\": \"admin\",\n  \"password\": \"password\",\n  \"interface\": \"pppoe-out\"\n}\n```\n\n#### Display debug info\n\nTo display debug info, set `debug_info` as `true` to enable this feature. By default, the debug info is disabled.\n\n```json\n  \"debug_info\": true,\n```\n\n#### Multiple API URLs\n\nGoDNS supports fetching the public IP from multiple URLs via a simple round-robin algorithm. If the first URL fails, it will try the next one until it succeeds. Here is an example of the configuration:\n\n```json\n  \"ip_urls\": [\n  \"https://api.ipify.org\",\n  \"https://myip.biturl.top\",\n  \"https://api-ipv4.ip.sb/ip\"\n  ],\n```\n\n#### Recommended APIs\n\n- \u003chttps://api.ipify.org\u003e\n- \u003chttps://myip.biturl.top\u003e\n- \u003chttps://ipecho.net/plain\u003e\n- \u003chttps://api-ipv4.ip.sb/ip\u003e\n\n## Web Panel\n\n\u003cimg src=\"https://github.com/TimothyYe/godns/blob/master/assets/snapshots/web-panel.jpg?raw=true\" /\u003e\n\nStarting from version 3.1.0, GoDNS provides a web panel to manage the configuration and monitor the status of the domains. The web UI is disabled by default. To enable it, just enable the `web_panel` in the configuration file.\n\n```json\n\"web_panel\": {\n  \"enabled\": true,\n  \"addr\": \"0.0.0.0:9000\",\n  \"username\": \"admin\",\n  \"password\": \"123456\"\n}\n```\n\nAfter enabling the web panel, you can visit `http://localhost:9000` to manage the configuration and monitor the status of the domains.\n## Running GoDNS\n\nThere are a few ways to run GoDNS.\n\n### Manually\n\nNote: make sure to set the `run_once` parameter in your config file so the program will quit after the first run (the default is `false`).\n\nIt can be added to `cron` or attached to other events on your system.\n\n```json\n{\n  \"...\": \"...\",\n  \"run_once\": true\n}\n```\n\nThen run\n\n```bash\n./godns\n```\n\n### As a manual daemon\n\n```bash\nnohup ./godns \u0026\n```\n\nNote: when the program stops, it will not be restarted.\n\n### As a managed daemon (with upstart)\n\n1. Install `upstart` first (if not available already)\n2. Copy `./config/upstart/godns.conf` to `/etc/init` (and tweak it to your needs)\n3. Start the service:\n\n   ```bash\n   sudo start godns\n   ```\n\n### As a managed daemon (with systemd)\n\n1. Install `systemd` first (it not available already)\n2. Copy `./config/systemd/godns.service` to `/lib/systemd/system` (and tweak it to your needs)\n3. Start the service:\n\n   ```bash\n   sudo systemctl enable godns\n   sudo systemctl start godns\n   ```\n\n### As a managed daemon (with procd)\n\n`procd` is the init system on OpenWRT. If you want to use godns as a service with OpenWRT and procd:\n1. Copy `./config/procd/godns` to `/etc/init.d` (and tweak it to your needs)\n2. Start the service (with root privilege):\n\n   ```bash\n   service godns enable\n   service godns start\n   ```\n\n### As a Docker container\n\nAvailable docker registries:\n\n- \u003chttps://hub.docker.com/r/timothyye/godns\u003e\n- \u003chttps://github.com/TimothyYe/godns/pkgs/container/godns\u003e\n\nVisit \u003chttps://hub.docker.com/r/timothyye/godns\u003e to fetch the latest docker image. The `-p 9000:9000` option exposes the web panel.\n\nWith `/path/to/config.json` as your local configuration file, run:\n\n```bash\ndocker run \\\n-d --name godns --restart=always \\\n-v /path/to/config.json:/config.json \\\n-p 9000:9000 \\\ntimothyye/godns:latest\n```\n\nTo run it with a `YAML` config file:\n\n```bash\ndocker run \\\n-d --name godns \\\n-e CONFIG=/config.yaml \\\n--restart=always \\\n-v /path/to/config.yaml:/config.yaml \\\n-p 9000:9000 \\\ntimothyye/godns:latest\n```\n\n### As a Windows service\n\n1. Download the latest version of [NSSM](https://nssm.cc/download)\n\n2. In an administrative prompt, from the folder where NSSM was downloaded, e.g. `C:\\Downloads\\nssm\\` **win64**, run:\n\n   ```\n   nssm install YOURSERVICENAME\n   ```\n\n3. Follow the interface to configure the service. In the \"Application\" tab just indicate where the `godns.exe` file is. Optionally you can also define a description on the \"Details\" tab and define a log file on the \"I/O\" tab. Finish by clicking on the \"Install service\" button.\n\n4. The service will now start along Windows.\n\nNote: you can uninstall the service by running:\n\n```\nnssm remove YOURSERVICENAME\n```\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n### Setup the frontend development environment\n\nRequirements:\n* Node.js `18.19.0` or higher\n* Go `1.17` or higher\n\nThe frontend project is built with [Next.js](https://nextjs.org/) and [daisyUI](https://daisyui.com/). To start the development environment, run:\n\n```bash\ncd web\nnpm ci\nnpm run dev\n```\n### Build the frontend\n\nTo build the frontend, run:\n\n```bash\ncd web\nnpm run build\n```\n\n### Run the frontend\n\nTo run the frontend, run:\n\n```bash\ncd web\nnpm run start\n```\n\n## Special Thanks\n\n\u003cimg src=\"https://i.imgur.com/xhe5RLZ.jpg\" width=\"80px\" align=\"right\" /\u003e\n\nThanks JetBrains for sponsoring this project with [free open source license](https://www.jetbrains.com/community/opensource/).\n\n\u003e I like GoLand, it is an amazing and productive tool.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftimothyye%2Fgodns","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftimothyye%2Fgodns","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftimothyye%2Fgodns/lists"}