64 lines
1.9 KiB
Markdown
64 lines
1.9 KiB
Markdown
## `docker-compose.yml`
|
|
|
|
```yml
|
|
services:
|
|
ddns:
|
|
environment:
|
|
- API_TOKEN=
|
|
- ZONE_ID=
|
|
- RECORD_ID=
|
|
- DOMAIN_NAME=
|
|
image: python:slim
|
|
restart: unless-stopped
|
|
stop_grace_period: 0s
|
|
container_name: ddns
|
|
entrypoint: python -c
|
|
command:
|
|
- |
|
|
import os; os.system('pip install -q requests 2>/dev/null')
|
|
import json, time, requests
|
|
|
|
def get_current_ip():
|
|
return requests.get('https://api64.ipify.org').text
|
|
|
|
def update_dns(ip):
|
|
zone_id = os.environ['ZONE_ID']
|
|
record_id = os.environ['RECORD_ID']
|
|
api_token = os.environ['API_TOKEN']
|
|
domain_name = os.environ['DOMAIN_NAME']
|
|
|
|
url = f"https://api.cloudflare.com/client/v4/zones/{zone_id}/dns_records/{record_id}"
|
|
headers = {
|
|
'Authorization': f'Bearer {api_token}'
|
|
}
|
|
|
|
data = {
|
|
'type': 'A',
|
|
'name': domain_name,
|
|
'content': ip,
|
|
'ttl': 1,
|
|
'proxied': False
|
|
}
|
|
|
|
response = requests.put(url, headers=headers, json=data)
|
|
|
|
if response.status_code == 200:
|
|
print(f"DNS 레코드가 성공적으로 업데이트되었습니다. 새 IP: {ip}", flush=True)
|
|
else:
|
|
print("DNS 레코드 업데이트에 실패했습니다.", flush=True)
|
|
print(response.text, flush=True)
|
|
|
|
last_ip = None
|
|
check_interval = 6 * 3600 # 6시간
|
|
|
|
while True:
|
|
current_ip = get_current_ip()
|
|
if current_ip != last_ip:
|
|
print(f"IP 변경 감지: {last_ip} -> {current_ip}", flush=True)
|
|
update_dns(current_ip)
|
|
last_ip = current_ip
|
|
else:
|
|
print(f"IP 변경 없음: {current_ip}", flush=True)
|
|
|
|
time.sleep(check_interval)
|
|
``` |