From 91c9a0b2f58d90aea0313a63b655df9eac54f77d Mon Sep 17 00:00:00 2001
From: Copilot <198982749+Copilot@users.noreply.github.com>
Date: Thu, 23 Oct 2025 09:01:02 +0000
Subject: [PATCH] feat(docker): add DDNS_CRON environment variable for
customizable cron schedule (#574)
* Initial plan
* feat(docker): add DDNS_CRON environment variable for customizable cron schedule
Co-authored-by: NewFuture <6290356+NewFuture@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: NewFuture <6290356+NewFuture@users.noreply.github.com>
---
doc/config/env.en.md | 51 +++++++++++++++++++++++++
doc/config/env.md | 51 +++++++++++++++++++++++++
doc/docker.en.md | 88 +++++++++++++++++++++++++++++++++++++++++++
doc/docker.md | 89 ++++++++++++++++++++++++++++++++++++++++++++
docker/entrypoint.sh | 6 ++-
5 files changed, 283 insertions(+), 2 deletions(-)
diff --git a/doc/config/env.en.md b/doc/config/env.en.md
index cb2ab53..efa584b 100644
--- a/doc/config/env.en.md
+++ b/doc/config/env.en.md
@@ -27,6 +27,7 @@ All environment variables use the `DDNS_` prefix followed by the parameter name
| `DDNS_PROXY` | `http://host:port` or `DIRECT`, multiple values separated by semicolons | HTTP proxy settings | `DDNS_PROXY="http://127.0.0.1:1080;DIRECT"` |
| `DDNS_CACHE` | `true`, `false`, or file path | Enable or specify cache file | `DDNS_CACHE="/tmp/cache"` |
| `DDNS_SSL` | `true`, `false`, `auto`, or file path | SSL verification mode or certificate path | `DDNS_SSL=false`
`DDNS_SSL=/path/ca.crt` |
+| `DDNS_CRON` | Cron expression format string (Docker only) | Cron schedule for Docker container | `DDNS_CRON="*/10 * * * *"` |
| `DDNS_LOG_LEVEL` | `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL` | Logging level | `DDNS_LOG_LEVEL="DEBUG"` |
| `DDNS_LOG_FILE` | File path | Output log file (default: stdout) | `DDNS_LOG_FILE="/tmp/ddns.log"` |
| `DDNS_LOG_FORMAT` | Python logging format string | Log format template | `DDNS_LOG_FORMAT="%(message)s"` |
@@ -381,6 +382,56 @@ export DDNS_TOKEN='{"api_key": "your_key", "domain": "__DOMAIN__", "ip": "__IP__
export DDNS_CACHE="/tmp/ddns.cache"
```
+### Docker Cron Schedule Configuration
+
+#### DDNS_CRON
+
+- **Type**: String
+- **Required**: No
+- **Default**: `*/5 * * * *` (every 5 minutes)
+- **Description**: Cron schedule for scheduled tasks in Docker containers. Only effective in Docker environments. Uses standard cron expression format
+- **Format**: `minute hour day month weekday`
+- **Examples**:
+
+ ```bash
+ # Run every 10 minutes
+ export DDNS_CRON="*/10 * * * *"
+
+ # Run every hour
+ export DDNS_CRON="0 * * * *"
+
+ # Run once daily at 2 AM
+ export DDNS_CRON="0 2 * * *"
+
+ # Run every 15 minutes
+ export DDNS_CRON="*/15 * * * *"
+
+ # Run every 2 hours
+ export DDNS_CRON="0 */2 * * *"
+ ```
+
+**Cron Expression Reference**:
+
+| Field | Allowed Values | Allowed Special Characters |
+|----------|----------------|----------------------------|
+| Minute | 0-59 | * , - / |
+| Hour | 0-23 | * , - / |
+| Day | 1-31 | * , - / |
+| Month | 1-12 | * , - / |
+| Weekday | 0-7 | * , - / |
+
+**Common Expressions**:
+- `*/5 * * * *` - Every 5 minutes (default)
+- `*/10 * * * *` - Every 10 minutes
+- `*/15 * * * *` - Every 15 minutes
+- `0 * * * *` - Every hour
+- `0 */2 * * *` - Every 2 hours
+- `0 0 * * *` - Daily at midnight
+- `0 2 * * *` - Daily at 2 AM
+- `0 0 * * 0` - Weekly on Sunday at midnight
+
+**Note**: This environment variable only works in Docker containers and does not affect DDNS programs running through other methods.
+
## Logging Configuration
### Log Level
diff --git a/doc/config/env.md b/doc/config/env.md
index 6fca6ba..7b12252 100644
--- a/doc/config/env.md
+++ b/doc/config/env.md
@@ -27,6 +27,7 @@ DDNS 支持通过环境变量进行配置,环境变量的优先级为:**[命
| `DDNS_PROXY` | `http://host:port` 或 DIRECT,支持多代理数组或分号分隔 | HTTP 代理设置 | `DDNS_PROXY="http://127.0.0.1:1080;DIRECT"` |
| `DDNS_CACHE` | true、false 或文件路径 | 启用缓存或指定缓存文件路径 | `DDNS_CACHE="/tmp/cache"` |
| `DDNS_SSL` | true、false、auto 或文件路径 | 设置 SSL 验证方式或指定证书路径 | `DDNS_SSL=false`
`DDNS_SSL=/path/ca.crt` |
+| `DDNS_CRON` | Cron 表达式格式字符串(仅 Docker 环境有效) | Docker 容器内定时任务周期 | `DDNS_CRON="*/10 * * * *"` |
| `DDNS_LOG_LEVEL` | DEBUG、INFO、WARNING、ERROR、CRITICAL | 设置日志等级 | `DDNS_LOG_LEVEL="DEBUG"` |
| `DDNS_LOG_FILE` | 文件路径 | 设置日志输出文件(默认输出到终端)| `DDNS_LOG_FILE="/tmp/ddns.log"` |
| `DDNS_LOG_FORMAT` | Python logging 格式模板 | 设置日志格式 | `DDNS_LOG_FORMAT="%(message)s"` |
@@ -247,6 +248,56 @@ DDNS 支持通过环境变量进行配置,环境变量的优先级为:**[命
export DDNS_SSL="/etc/ssl/certs/ca-certificates.crt" # 自定义CA证书
```
+### Docker 定时任务配置
+
+#### DDNS_CRON
+
+- **类型**: 字符串
+- **必需**: 否
+- **默认值**: `*/5 * * * *` (每 5 分钟)
+- **说明**: Docker 容器中定时任务的执行周期,仅在 Docker 环境中有效。使用标准的 cron 表达式格式
+- **格式**: `分钟 小时 日 月 星期`
+- **示例**:
+
+ ```bash
+ # 每 10 分钟执行一次
+ export DDNS_CRON="*/10 * * * *"
+
+ # 每小时执行一次
+ export DDNS_CRON="0 * * * *"
+
+ # 每天凌晨 2 点执行一次
+ export DDNS_CRON="0 2 * * *"
+
+ # 每 15 分钟执行一次
+ export DDNS_CRON="*/15 * * * *"
+
+ # 每 2 小时执行一次
+ export DDNS_CRON="0 */2 * * *"
+ ```
+
+**Cron 表达式说明**:
+
+| 字段 | 允许值 | 允许的特殊字符 |
+|------|--------|----------------|
+| 分钟 | 0-59 | * , - / |
+| 小时 | 0-23 | * , - / |
+| 日 | 1-31 | * , - / |
+| 月 | 1-12 | * , - / |
+| 星期 | 0-7 | * , - / |
+
+**常用表达式**:
+- `*/5 * * * *` - 每 5 分钟(默认)
+- `*/10 * * * *` - 每 10 分钟
+- `*/15 * * * *` - 每 15 分钟
+- `0 * * * *` - 每小时
+- `0 */2 * * *` - 每 2 小时
+- `0 0 * * *` - 每天午夜
+- `0 2 * * *` - 每天凌晨 2 点
+- `0 0 * * 0` - 每周日午夜
+
+**注意**: 此环境变量仅在 Docker 容器中生效,不影响通过其他方式运行的 DDNS 程序。
+
### 日志配置
#### DDNS_LOG_LEVEL
diff --git a/doc/docker.en.md b/doc/docker.en.md
index a6dc9c0..5d6c468 100644
--- a/doc/docker.en.md
+++ b/doc/docker.en.md
@@ -135,6 +135,94 @@ docker run -d \
## Advanced Configuration
+### Custom Cron Schedule
+
+By default, the DDNS container automatically updates DNS records every 5 minutes. You can customize the scheduled task execution interval using the `DDNS_CRON` environment variable.
+
+The `DDNS_CRON` environment variable uses standard cron expression format: `minute hour day month weekday`
+
+**Examples**:
+
+```bash
+# Run every 10 minutes
+docker run -d \
+ -e DDNS_CRON="*/10 * * * *" \
+ -e DDNS_DNS=dnspod \
+ -e DDNS_ID=12345 \
+ -e DDNS_TOKEN=mytokenkey \
+ -e DDNS_IPV4=example.com \
+ --network host \
+ newfuture/ddns
+
+# Run every hour
+docker run -d \
+ -e DDNS_CRON="0 * * * *" \
+ -e DDNS_DNS=dnspod \
+ -e DDNS_ID=12345 \
+ -e DDNS_TOKEN=mytokenkey \
+ -e DDNS_IPV4=example.com \
+ --network host \
+ newfuture/ddns
+
+# Run once daily at 2 AM
+docker run -d \
+ -e DDNS_CRON="0 2 * * *" \
+ -e DDNS_DNS=dnspod \
+ -e DDNS_ID=12345 \
+ -e DDNS_TOKEN=mytokenkey \
+ -e DDNS_IPV4=example.com \
+ --network host \
+ newfuture/ddns
+
+# Run every minute (most frequent for cron)
+docker run -d \
+ -e DDNS_CRON="* * * * *" \
+ -e DDNS_DNS=dnspod \
+ -e DDNS_ID=12345 \
+ -e DDNS_TOKEN=mytokenkey \
+ -e DDNS_IPV4=example.com \
+ --network host \
+ newfuture/ddns
+```
+
+**Cron Expression Reference**:
+
+| Field | Allowed Values | Allowed Special Characters |
+|----------|----------------|----------------------------|
+| Minute | 0-59 | * , - / |
+| Hour | 0-23 | * , - / |
+| Day | 1-31 | * , - / |
+| Month | 1-12 | * , - / |
+| Weekday | 0-7 | * , - / |
+
+**Common Expression Examples**:
+
+- `*/5 * * * *` - Every 5 minutes (default)
+- `*/10 * * * *` - Every 10 minutes
+- `*/15 * * * *` - Every 15 minutes
+- `0 * * * *` - Every hour
+- `0 */2 * * *` - Every 2 hours
+- `0 0 * * *` - Daily at midnight
+- `0 2 * * *` - Daily at 2 AM
+- `0 0 * * 0` - Weekly on Sunday at midnight
+
+**Docker Compose Example**:
+
+```yaml
+version: "3"
+services:
+ ddns:
+ image: newfuture/ddns:latest
+ restart: always
+ network_mode: host
+ environment:
+ - DDNS_CRON=*/10 * * * * # Run every 10 minutes
+ - DDNS_DNS=dnspod
+ - DDNS_ID=12345
+ - DDNS_TOKEN=mytokenkey
+ - DDNS_IPV4=example.com
+```
+
### Multi-Domain Configuration
Environment variable method for configuring multiple domains:
diff --git a/doc/docker.md b/doc/docker.md
index d2b999b..4c02e09 100644
--- a/doc/docker.md
+++ b/doc/docker.md
@@ -135,6 +135,95 @@ docker run -d \
## 高级配置
+### 自定义定时任务周期
+
+默认情况下,DDNS 容器会每 5 分钟自动更新一次 DNS 记录。您可以通过 `DDNS_CRON` 环境变量自定义定时任务的执行周期。
+
+`DDNS_CRON` 环境变量使用标准的 cron 表达式格式:`分钟 小时 日 月 星期`
+
+**示例**:
+
+```bash
+# 每 10 分钟执行一次
+docker run -d \
+ -e DDNS_CRON="*/10 * * * *" \
+ -e DDNS_DNS=dnspod \
+ -e DDNS_ID=12345 \
+ -e DDNS_TOKEN=mytokenkey \
+ -e DDNS_IPV4=example.com \
+ --network host \
+ newfuture/ddns
+
+# 每小时执行一次
+docker run -d \
+ -e DDNS_CRON="0 * * * *" \
+ -e DDNS_DNS=dnspod \
+ -e DDNS_ID=12345 \
+ -e DDNS_TOKEN=mytokenkey \
+ -e DDNS_IPV4=example.com \
+ --network host \
+ newfuture/ddns
+
+# 每天凌晨 2 点执行一次
+docker run -d \
+ -e DDNS_CRON="0 2 * * *" \
+ -e DDNS_DNS=dnspod \
+ -e DDNS_ID=12345 \
+ -e DDNS_TOKEN=mytokenkey \
+ -e DDNS_IPV4=example.com \
+ --network host \
+ newfuture/ddns
+
+# 每 30 秒执行一次(使用两个 cron 任务)
+# 注意:cron 最小单位是分钟,如需更频繁的更新,可以使用多个任务
+docker run -d \
+ -e DDNS_CRON="* * * * *" \
+ -e DDNS_DNS=dnspod \
+ -e DDNS_ID=12345 \
+ -e DDNS_TOKEN=mytokenkey \
+ -e DDNS_IPV4=example.com \
+ --network host \
+ newfuture/ddns
+```
+
+**Cron 表达式说明**:
+
+| 字段 | 允许值 | 允许的特殊字符 |
+|------|--------|----------------|
+| 分钟 | 0-59 | * , - / |
+| 小时 | 0-23 | * , - / |
+| 日 | 1-31 | * , - / |
+| 月 | 1-12 | * , - / |
+| 星期 | 0-7 | * , - / |
+
+**常用表达式示例**:
+
+- `*/5 * * * *` - 每 5 分钟(默认值)
+- `*/10 * * * *` - 每 10 分钟
+- `*/15 * * * *` - 每 15 分钟
+- `0 * * * *` - 每小时
+- `0 */2 * * *` - 每 2 小时
+- `0 0 * * *` - 每天午夜
+- `0 2 * * *` - 每天凌晨 2 点
+- `0 0 * * 0` - 每周日午夜
+
+**Docker Compose 示例**:
+
+```yaml
+version: "3"
+services:
+ ddns:
+ image: newfuture/ddns:latest
+ restart: always
+ network_mode: host
+ environment:
+ - DDNS_CRON=*/10 * * * * # 每 10 分钟执行一次
+ - DDNS_DNS=dnspod
+ - DDNS_ID=12345
+ - DDNS_TOKEN=mytokenkey
+ - DDNS_IPV4=example.com
+```
+
### 多域名配置
环境变量方式配置多域名:
diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh
index 0861c13..4892ce2 100755
--- a/docker/entrypoint.sh
+++ b/docker/entrypoint.sh
@@ -14,8 +14,10 @@ if [ $# -eq 0 ]; then
echo "[new] -v /host/folder/:/ddns/"
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
fi
- echo "*/5 * * * * cd /ddns && /bin/ddns" > /etc/crontabs/root
- /bin/ddns && echo "Cron daemon will run every 5 minutes..." && exec crond -f
+ # Use DDNS_CRON environment variable for cron schedule, default to every 5 minutes
+ CRON_SCHEDULE="${DDNS_CRON:-*/5 * * * *}"
+ echo "${CRON_SCHEDULE} cd /ddns && /bin/ddns" > /etc/crontabs/root
+ /bin/ddns && echo "Cron daemon will run with schedule: ${CRON_SCHEDULE}" && exec crond -f
else
first=`echo $1 | cut -c1`
if [ "$first" = "-" ]; then