e66dcf0240 feat(config): 支持远程配置文件 add remote HTTP(S) config loading support (#539)
* Initial plan

* feat(config): add remote HTTP(S) configuration loading support

- Add URL detection in load_config() function to support remote configuration files
- Leverage existing ddns.util.http module for HTTP requests with proxy, SSL, and auth support
- Support embedded authentication in URLs (https://user:pass@host/config.json)
- Maintain full backward compatibility with local file loading
- Skip file existence check for URLs in config path validation
- Add comprehensive test suite with 16 test cases covering various scenarios
- Support all existing configuration formats including v4.1 providers format
- Pass proxy and SSL settings from CLI/environment to HTTP requests

Co-authored-by: NewFuture <6290356+NewFuture@users.noreply.github.com>

* fix(config): address code review feedback for remote config loading

Co-authored-by: NewFuture <6290356+NewFuture@users.noreply.github.com>

* docs(config): add remote HTTP(S) configuration examples and update README

Co-authored-by: NewFuture <6290356+NewFuture@users.noreply.github.com>

* fix(config): Python 2 compatibility and code structure improvements

- Fix Python 2.7 compatibility in test_config_file_remote.py:
  - Remove encoding parameter from open() function
  - Add proper try/except import for URLError (Python 2/3 compatibility)
- Extract proxy and SSL parameter extraction outside function call in config/__init__.py
- Move remote config example from main README list to CLI usage examples section

Co-authored-by: NewFuture <6290356+NewFuture@users.noreply.github.com>

* fix(config,docs): address PR feedback and lint issues

- Remove remote config from README feature list, add as example code instead
- Fix proxy_settings fallback chain in config/__init__.py
- Add HTTP response body logging in config/file.py and fix line length
- Add real integration test for https://ddns.newfuture.cc/tests/config/debug.json
- Fix all flake8 lint issues: remove unused imports, clean whitespace

Co-authored-by: NewFuture <6290356+NewFuture@users.noreply.github.com>

* Update ddns/config/file.py

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix(docs,test,build): update README.en.md, add real remote tests, and improve test skipping logic

Co-authored-by: NewFuture <6290356+NewFuture@users.noreply.github.com>

* feat(http): add default user-agent and fix lint issues

Co-authored-by: NewFuture <6290356+NewFuture@users.noreply.github.com>

* feat(http): implement default user-agent handling and update related tests

* feat(http): add default User-Agent handling in request function and enhance related tests

* fix(tests): update proxy handling in multi-config tests and improve user agent type check

* fix(http): add retry logic to remote config loading and improve error messages

* chore(tests): update test structure for multi-config functionality

* fix(tests): remove unnecessary CLI argument mock in multi-config test

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: NewFuture <6290356+NewFuture@users.noreply.github.com>
Co-authored-by: New Future <NewFuture@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-22 01:46:01 +00:00
2025-06-02 15:46:40 +00:00
2025-07-15 00:48:45 +08:00
2018-07-22 16:42:58 +08:00
2025-06-03 13:33:05 +00:00
2019-05-01 22:55:09 +08:00
2016-11-07 21:44:26 +08:00
2025-07-15 11:13:24 +00:00
2025-06-18 16:53:10 +00:00
2020-12-17 18:59:12 +08:00
#27
2018-12-11 22:03:44 +08:00

DDNS

Automatically update DNS records to the current IP address, supporting IPv4 and IPv6, local (private) IP and public IP. Proxy mode supported, with automatic DNS record creation.

Github Release PyPI Docker Image Version Build Status Publish


Features

Usage

① Installation

Choose one of the following methods: binary version, pip version, source code execution, or Docker.

Docker version is recommended for best compatibility, small size, and optimized performance.

  • Docker (Requires Docker Installation)

    For detailed instructions and advanced usage, see Docker Usage Documentation

    Supports command line, configuration file, and environment variable parameters
    • Command line CLI

      docker run newfuture/ddns -h
      
    • Using configuration file (Docker working directory /ddns/, default config location /ddns/config.json):

      docker run -d -v /host/config/:/ddns/ --network host newfuture/ddns
      
    • Using environment variables:

      docker run -d \
        -e DDNS_DNS=dnspod \
        -e DDNS_ID=12345 \
        -e DDNS_TOKEN=mytokenkey \
        -e DDNS_IPV4=ddns.newfuture.cc \
        --network host \
        newfuture/ddns
      
  • pip Installation (Requires pip or easy_install)

    1. Install ddns: pip install ddns or easy_install ddns
    2. Run: ddns -h or python -m ddns
  • Binary Version (Single file, no Python required)

    Go to releases to download the corresponding version

  • Source Code Execution (No dependencies, requires Python environment)

    1. Clone or download this repository and extract
    2. Run python run.py or python -m ddns

② Quick Configuration

  1. Apply for API token, fill in the corresponding id and token fields:

  2. Modify the configuration file, ipv4 and ipv6 fields for domains to be updated, refer to configuration instructions for details

Detailed Configuration

All fields can be configured through three methods, with priority: Command Line Parameters > JSON Configuration File > Environment Variables

  1. Command Line Parameters ddns --key=value (use ddns -h for details), highest priority
  2. JSON Configuration File (null values are considered valid and will override environment variable settings; if no corresponding key exists, environment variables will be used)
  3. Environment Variables with DDNS_ prefix plus key in uppercase or lowercase, dots converted to underscores (${ddns_id} or ${DDNS_ID}, ${DDNS_LOG_LEVEL})

📖 Environment Variables Documentation: See Environment Variables Configuration for detailed usage and examples of all environment variables

config.json Configuration File
  • A template configuration file will be automatically generated on first run
  • Use -c to specify a configuration file (defaults to config.json in the current directory)
  • Recommended to use editors that support JsonSchema like VSCode for editing configuration files
  • See JSON Configuration File Documentation for complete configuration options and examples
ddns -c path/to/config.json
# Or run with Python
python -m ddns -c /path/to/config.json
# Remote configuration file
ddns -c https://ddns.newfuture.cc/tests/config/debug.json

Configuration Parameters Table

key type required default description tips
id string √ N/A API Access ID Cloudflare uses email (leave empty when using Token)
HE.net can be left empty
Huawei Cloud uses Access Key ID (AK)
token string √ N/A API Auth Token Some platforms call it secret key, remove when sharing feedback
dns string No "dnspod" DNS Provider Alibaba DNS: alidns, Alibaba ESA: aliesa, Cloudflare: cloudflare, DNS.COM: dnscom, DNSPOD China: dnspod, DNSPOD International: dnspod_com, HE.net: he, Huawei Cloud: huaweidns, NameSilo: namesilo, Tencent Cloud: tencentcloud, Tencent EdgeOne: edgeone, No-IP: noip, Custom Callback: callback. Some providers have detailed configuration docs
ipv4 array No [] IPv4 Domain List When [], IPv4 address will not be retrieved and updated
ipv6 array No [] IPv6 Domain List When [], IPv6 address will not be retrieved and updated
index4 string|int|array No "default" IPv4 Get Method Can set network interface, private, public, regex etc.
index6 string|int|array No "default" IPv6 Get Method Can set network interface, private, public, regex etc.
ttl number No null DNS Resolution TTL Uses DNS default policy when not set
proxy string|array No N/A HTTP Proxy Format: http://host:port Multiple proxies tried sequentially until success, DIRECT for direct connection
ssl string|boolean No "auto" SSL Certificate Verification true (force verify), false (disable verify), "auto" (auto downgrade) or custom CA certificate file path
debug bool No false Enable Debug Debug mode, only effective with command line parameter --debug
cache string|bool No true Cache Records Keep enabled normally to avoid frequent updates, default location is ddns.cache in temp directory, can also specify a specific path
log object No null Log Config (Optional) Log configuration object, supports level, file, format, datefmt parameters

index4 and index6 Parameter Description

  • Numbers (0, 1, 2, 3, etc.): The i-th network interface IP
  • String "default" (or no this field): System default IP for external access
  • String "public": Use public IP (query via public API, simplified URL mode)
  • String "url:xxx": Open URL xxx (e.g., "url:http://ip.sb"), extract IP address from returned data
  • String "regex:xxx" Regular expression (e.g., "regex:192.*"): Extract the first IP address matching from ifconfig/ipconfig, note JSON escaping (\ should be written as \\)
    • "192.*" matches all IPs starting with 192 (note: regex: cannot be omitted)
    • To match 10.00.xxxx, write as "regex:10\\.00\\..*" ("\\" JSON escapes to \)
  • String "cmd:xxxx": Execute command xxxx and use stdout output as target IP
  • String "shell:xxx": Use system shell to run xxx, and use stdout result as target IP
  • false: Force disable IPv4 or IPv6 DNS resolution updates
  • List: Execute index rules in the list sequentially, using the first successful result as target IP
    • For example, ["public", "regex:172\\..*"] will first query public API, then look for local IPs starting with 172 if no IP is obtained

Custom Callback Configuration

  • id field: Fill in callback URL starting with HTTP or HTTPS, HTTPS recommended, supports variable replacement
  • token field: POST request parameters (JSON object or JSON string), use GET request if this field is empty or missing. When JSON parameter values contain constants from the table below, they will be automatically replaced with actual content

For detailed configuration guide, see: Callback Provider Configuration

Constant Name Constant Content Description
__DOMAIN__ DDNS Domain
__IP__ Obtained corresponding type IP address
__RECORDTYPE__ DDNS Record Type
__TTL__ DDNS TTL
__TIMESTAMP__ Request timestamp With decimal

Configuration Example

{
  "$schema": "https://ddns.newfuture.cc/schema/v4.0.json",
  "id": "12345",
  "token": "mytokenkey",
  "dns": "dnspod or dnspod_com or alidns or aliesa or dnscom or cloudflare or he or huaweidns or namesilo or tencentcloud or noip or callback",
  "ipv4": ["ddns.newfuture.cc", "ipv4.ddns.newfuture.cc"],
  "ipv6": ["ddns.newfuture.cc", "ipv6.ddns.newfuture.cc"],
  "index4": 0,
  "index6": "public",
  "ttl": 600,
  "proxy": ["http://127.0.0.1:1080", "DIRECT"],
  "log": {
    "level": "DEBUG",
    "file": "dns.log",
    "datefmt": "%Y-%m-%dT%H:%M:%S"
  }
}

Configuration Priority and Field Override Relationship

If the same configuration item is set in multiple places, the following priority rules apply:

  • Command Line Parameters: Highest priority, overrides all other settings
  • JSON Configuration File: Between command line and environment variables, overrides environment variable settings
  • Environment Variables: Lowest priority, used when not set by other methods

Advanced Usage:

  • JSON configuration file can contain only partial fields, missing fields will use environment variables
  • Environment variables support both uppercase and lowercase formats
  • Support for nested configuration through dot notation converted to underscores

Scheduled Tasks

Set up scheduled tasks to run automatically

This tool itself does not include loop and scheduled execution functions (to reduce code complexity). You can use system scheduled tasks to run regularly.

Windows

  • [Recommended] Run as system identity, right-click "Run as administrator" on task.bat (or run in administrator command line)
  • Run scheduled task as current user, double-click or run task.bat (a black window will flash during execution)

Linux

  • Using init.d and crontab:

    sudo ./task.sh
    
  • Using systemd:

    Install:
    sudo ./systemd.sh install
    Uninstall:
    sudo ./systemd.sh uninstall
    

    Files installed by this script comply with Filesystem Hierarchy Standard (FHS): Executable files are located in /usr/share/DDNS Configuration files are located in /etc/DDNS

Docker

Docker images, without additional parameters, have a scheduled task enabled by default that runs every 5 minutes

FAQ

Windows Server [SSL: CERTIFICATE_VERIFY_FAILED]

Windows Server default security policy will prohibit any untrusted SSL certificates. You can manually add the corresponding certificates #56

Use the system's built-in IE browser to visit the corresponding API once:

Troubleshooting and Feedback
  1. First confirm whether it's a system/network environment issue
  2. Search for similar issues in issues
  3. If neither of the above can solve the problem or you're sure it's a bug, create a new issue here
    • Enable --debug
    • Include these contents: running version and method, system environment, error logs, configuration file with id/token removed
    • For source code execution, specify the Python environment used

Contributors

License

MIT

Star History

Star History Chart

S
Description
No description provided
Readme MIT
6.4 MiB
Languages
Python 88.6%
JavaScript 4.3%
CSS 3.1%
Shell 1.7%
HTML 1.6%
Other 0.7%