{"id":26232561,"url":"https://github.com/bulletmark/dyndns","last_synced_at":"2025-07-18T05:36:42.018Z","repository":{"id":137097674,"uuid":"105850641","full_name":"bulletmark/dyndns","owner":"bulletmark","description":"Small, simple, and generic dynamic DNS client","archived":false,"fork":false,"pushed_at":"2025-06-15T03:01:50.000Z","size":67,"stargazers_count":3,"open_issues_count":0,"forks_count":1,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-06-15T04:18:34.896Z","etag":null,"topics":["afraid","duckdns","dynamic-dns-client","dyndns"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bulletmark.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"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}},"created_at":"2017-10-05T04:51:41.000Z","updated_at":"2025-06-15T03:01:53.000Z","dependencies_parsed_at":"2024-10-25T02:31:48.219Z","dependency_job_id":"02e80264-4efc-4897-92fb-1bfb06bc00ff","html_url":"https://github.com/bulletmark/dyndns","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/bulletmark/dyndns","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bulletmark%2Fdyndns","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bulletmark%2Fdyndns/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bulletmark%2Fdyndns/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bulletmark%2Fdyndns/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bulletmark","download_url":"https://codeload.github.com/bulletmark/dyndns/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bulletmark%2Fdyndns/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265705617,"owners_count":23814488,"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":["afraid","duckdns","dynamic-dns-client","dyndns"],"created_at":"2025-03-13T00:37:30.100Z","updated_at":"2025-07-18T05:36:42.010Z","avatar_url":"https://github.com/bulletmark.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# DynDNS IPv4 and/or IPv6 Dynamic DNS Client\n\n[DynDNS](https://github.com/bulletmark/dyndns/) is a simple Linux client\nto update one or more of your dynamic DNS hosting services with the\nhosts public IPv4 and/or IPv6 addresses. Just configure your own update\nURLs in the configuration file and run it.\n\nDynDNS supports dynamic DNS services which use a simple http or https\nURL get update mechanism, such as:\n\n- [Dynu](https://dynu.com/)\n- [Dynv6](https://dynv6.com/)\n- [FreeDNS](https://freedns.afraid.org/)\n- [Duck DNS](https://www.duckdns.org/)\n\nThe above all offer free dynamic DNS services. There is example\nconfiguration for each of these services in the sample\n[`dyndns.toml`](https://github.com/bulletmark/dyndns/blob/master/dyndns.toml)\nconfiguration file but note that most (free or paid) dynamic DNS\nservices should be supported. Extensive configuration instructions are\nprovided in that file.\n\nWhy another dynamic DNS client? I wanted a simple, lightweight app\nmanaged by [systemd](https://systemd.io/), generic and flexible enough\nto use with any dynamic DNS service and IP address servers. It should\nwork with both IPv4 and IPv6 and allow multiple URLs to be set. I didn't\nfind anything I liked so wrote my own.\n\nEnsure you read the [latest\ndocumentation](http://github.com/bulletmark/dyndns) and the instructions\nin the example\n[`dyndns.toml`](https://github.com/bulletmark/dyndns/blob/master/dyndns.toml)\nfile but then ask a question on the DynDNS [discussion\nforum](https://github.com/bulletmark/dyndns/discussions) if you still\nneed clarification about usage or operation.\n\n## Operation\n\nThis client runs every `poll_period` (default 10 mins) and determines\nyour current public IPv4 and/or IPv6 address from a list of configured\npublic address servers. If any IP address differs from the last address\nthen an update is sent to the pertinent configured dynamic DNS URLs. You\ncan configure \"\u0026lt;ipv4\u0026gt;\" and/or \"\u0026lt;ipv6\u0026gt;\" placemarkers in your\nURLs to be substituted at runtime, and/or for those services that support\nit, rely on automatic IP detection. Every `force_period` (default 24\nhours), an update is sent regardless to each service. The last IP\naddresses determined are stored on change only and are always cached to\ndisk so they are preserved through reboots. The service URLs, their\nparameters to update, the time periods, and the list of IP address\nservers can be changed in the configuration file.\n\n## Configuration\n\nYou copy the sample\n[`dyndns.toml`](https://github.com/bulletmark/dyndns/blob/master/dyndns.toml)\nfile to your `~/.config/` and then edit it for your requirements. Follow\nthe examples and instructions in that file.\n\n## Installation\n\nRequires `python` 3.7 or later and a modern Linux `systemd` environment.\n\n1. Clone repository and create configuration:\n\n    ```shell\n    $ git clone https://github.com/bulletmark/dyndns.git\n    $ cd dyndns\n    $ mkdir -p ~/.config\n    $ cp dyndns.toml ~/.config\n    $ vim ~/.config/dyndns.toml # Add your [[urls]] entries\n    ```\n\n2. Create virtual environment (venv) and install service.\n\n    ```shell\n    $ python3 -m venv .venv\n    $ .venv/bin/pip install -r requirements.txt\n    $ sudo cp dyndns.service /etc/systemd/system\n    $ sudoedit /etc/systemd/system/dyndns.service # Edit #TEMPLATE# values.\n    ```\n\nNote: Alternatively, to create the venv, install the requirement\npackages, insert the template values, and enable + start the service you\ncan use my [pinstall](https://github.com/bulletmark/pinstall) tool. Just\ninstall it and do the following in the `dyndns` directory.\n\n```\n$ pinstall venv\n$ pinstall service\n```\n\n## Starting, Stopping, and Status\n\nTo enable starting at boot and also start immediately:\n\n```shell\n$ sudo systemctl enable dyndns\n$ sudo systemctl start dyndns\n```\n\nTo stop immediately and also disable starting at boot:\n\n```shell\n$ sudo systemctl stop dyndns\n$ sudo systemctl disable dyndns\n```\n\nShow status:\n\n```shell\n$ systemctl status dyndns\n```\n\nShow log:\n\n```shell\n$ journalctl -u dyndns\n```\n\n## Upgrade\n\n`cd` to source dir, as above. Then update the source:\n\n```shell\n$ git pull\n```\n\nUpdate `~/.config/dyndns.toml` and `/etc/systemd/system/dyndns.service` if\nnecessary. Then restart the service.\n\n```shell\n$ sudo systemctl restart dyndns\n```\n\n\n## Usage\n\nType `dyndns -h` to view the usage summary:\n\n```\nusage: dyndns [-h] [-v] [-i] [-c CONF]\n\nUpdate external IP v4 and/or v6 addresses to a dynamic DNS server.\n\noptions:\n  -h, --help            show this help message and exit\n  -v, --verbose         verbose output\n  -i, --ignore-cache    ignore cache for startup\n  -c CONF, --conf CONF  configuration file, default =\n                        ~/.config/dyndns.toml\n```\n\n## Summary of Version 2 Changes\n\n- Added the ability to cater for IPv6 addresses.\n\n- Added the ability to configure multiple dynamic DNS server URLs\n  instead of just one and also the ability to substitute \"\u0026lt;ipv4\u0026gt;\"\n  and \"\u0026lt;ipv6\u0026gt;\" placemarkers in the url string.\n\n- Cater for dynamic DNS servers which return one or more text strings\n  for success/failure instead of just looking at the HTML response\n  status code.\n\n- Changed from [YAML](https://yaml.org/) to [TOML](https://toml.io/en/)\n  configuration file format as that is the future for Python apps given\n  TOML is now included in the standard packages since Python v3.11. Note\n  that `tomli` package gets installed if you are running on \u003c 3.11. This\n  change mean any previous personal configuration file must be ported to\n  the new format.\n\n- Requires minimum Python version 3.7 instead of 3.6.\n\n## License\n\nCopyright (C) 2017 Mark Blakeney. This program is distributed under the\nterms of the GNU General Public License.\nThis program is free software: you can redistribute it and/or modify it\nunder the terms of the GNU General Public License as published by the\nFree Software Foundation, either version 3 of the License, or any later\nversion.\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\nPublic License at \u003chttp://www.gnu.org/licenses/\u003e for more details.\n\n\u003c!-- vim: se ai syn=markdown: --\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbulletmark%2Fdyndns","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbulletmark%2Fdyndns","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbulletmark%2Fdyndns/lists"}