Homepage μμ ― μ°λ μμ (μμ ― μ€μ μ μλ μ°Έκ³ )
- Homepage μμ ― μ€μ μμ (
services.yaml
):- My DDNS Status: # μλΉμ€ κ·Έλ£Ήλͺ (μνλ λλ‘ λ³κ²½) - DDNS Updater-py: icon: https://raw.githubusercontent.com/nerdnam/DDNS-Updater-Python-Ver/main/favicon/favicon.png # μ§μ μμ΄μ½ κ²½λ‘ μ§μ href: http://YOUR_SERVER_IP:30007 # μ€μ μ μ μ£Όμλ‘ λ³κ²½ description: DDNS Updater Status widget: type: customapi url: http://YOUR_SERVER_IP:30007/api?id=YOUR_RECORD_ID # μ€μ API μ£Όμ λ° λ μ½λ IDλ‘ λ³κ²½ refreshInterval: 3600000 # 1μκ° (λ°λ¦¬μ΄ λ¨μ, μ ν μ¬ν, κΈ°λ³Έκ° 10μ΄) method: GET # μ ν μ¬ν mappings: - field: domain label: Domain - field: provider label: Provider - field: current_ip label: IPv4 - field: status3 # UIμ "Up Status"μ ν΄λΉ (μ: "05-17 18:30") label: Last Update
YOUR_SERVER_IP
: DDNS Updaterκ° μ€ν μ€μΈ μλ²μ IP μ£Όμ λλ λλ©μΈμΌλ‘ λ³κ²½νμΈμ.YOUR_RECORD_ID
:ddns_config.ini
μ μ€μ ν νΉμ λ μ½λμ ID (μΉμ μ΄λ¦)λ‘ λ³κ²½νμΈμ.
μ΄ νλ‘μ νΈλ qdm12/ddns-updater νλ‘μ νΈλ₯Ό PythonμΌλ‘ ν¬ν ν λ²μ μ λλ€. μλ³Έ νλ‘μ νΈμ κ°λ ₯ν DDNS μ λ°μ΄νΈ κΈ°λ₯μ μ μ§νλ©΄μ, νμ¬ μνλ₯Ό μ‘°νν μ μλ HTTP API κΈ°λ₯μ μΆκ°νκ³ IPv4 μ μ©μΌλ‘ λ¨μννλ κ²μ λͺ©νλ‘ ν©λλ€.
PythonμΌλ‘ μμ±λ λμ DNS(DDNS) μ λ°μ΄νΈ ν΄λΌμ΄μΈνΈμ λλ€. νμ¬ IP μ£Όμλ₯Ό μ£ΌκΈ°μ μΌλ‘ νμΈνμ¬, λ³κ²½λμμ κ²½μ° μ€μ λ DNS νλ‘λ°μ΄λμ λ μ½λλ₯Ό μλμΌλ‘ μ λ°μ΄νΈν©λλ€. μΉ UIλ₯Ό ν΅ν΄ νμ¬ μν νμΈ λ° μλ μ λ°μ΄νΈκ° κ°λ₯νλ©°, μΆκ°λ APIλ₯Ό ν΅ν΄ μν μ 보λ₯Ό JSON νμμΌλ‘ μ‘°νν μ μμ΅λλ€.
νμ¬ λ²μ μ IPv4 μ£Όμ μ λ°μ΄νΈμλ§ μ§μ€λμ΄ μμΌλ©°, IPv6 μ§μμ μΆν κ³νλμ΄ μμ΅λλ€.
- λ€μν DDNS νλ‘λ°μ΄λ μ§μ: Cloudflare, GoDaddy, Namecheap λ± λ€μμ νλ‘λ°μ΄λ μ§μ (νλ¬κ·ΈμΈ λ°©μμΌλ‘ νμ₯ κ°λ₯).
- μλ IP λ³κ²½ κ°μ§ λ° μ λ°μ΄νΈ: μ£ΌκΈ°μ μΌλ‘ κ³΅μΈ IP μ£Όμλ₯Ό νμΈνκ³ λ³κ²½ μ DDNS λ μ½λ μ λ°μ΄νΈ.
- λ μ½λλ³ μμΈ μ€μ : κ° DDNS λ μ½λλ§λ€ μ λ°μ΄νΈ μ£ΌκΈ°, cooldown μκ°, νμμ‘΄, HTTP νμμμ λ±μ κ°λ³μ μΌλ‘ μ€μ κ°λ₯.
- μΉ UI μ 곡:
- μ€μ λ λͺ¨λ DDNS λ μ½λμ νμ¬ μν (μ λ°μ΄νΈ μ¬λΆ, νμ¬ IP, λ§μ§λ§ μ λ°μ΄νΈ μκ° λ±) νμ.
- κ°λ³ λ μ½λ μλ μ λ°μ΄νΈ κΈ°λ₯.
- λ μ½λλ³ λ‘κ·Έ μ‘°ν κΈ°λ₯.
- μν μ‘°ν API μ 곡 (μ£Όμ μΆκ° κΈ°λ₯): νμ¬ DDNS λ μ½λ μν μ 보λ₯Ό JSON νμμΌλ‘ μ‘°νν μ μλ HTTP API μλν¬μΈνΈ μ 곡.
- μμΈ λ‘κΉ : κ° λ μ½λλ³ μ λ°μ΄νΈ μλ λ° κ²°κ³Όλ₯Ό λ μ§λ³ λ‘κ·Έ νμΌλ‘ κΈ°λ‘.
- Docker μ§μ: Docker λ° Docker Composeλ₯Ό μ¬μ©νμ¬ μ½κ² λ°°ν¬ λ° μ€ν κ°λ₯ (GHCR μ΄λ―Έμ§ μ 곡).
- μ€μ νμΌ κΈ°λ° μ΄μ:
ddns_config.ini
νμΌμ ν΅ν΄ λͺ¨λ μ€μ κ΄λ¦¬. - λλ²κ·Έ λͺ¨λ: μ€μ νμΌμ ν΅ν΄ μ ν리μΌμ΄μ μ 체μ λλ²κ·Έ λ‘κΉ λ° Flask λλ²κ·Έ λͺ¨λ νμ±ν κ°λ₯.
ddns-updater-python-ver/
βββ ddns_updater/ # λ©μΈ μ ν리μΌμ΄μ
Python ν¨ν€μ§
β βββ __init__.py # ddns_updater ν¨ν€μ§ μ΄κΈ°ν νμΌ
β βββ app.py # Flask μΉ μ ν리μΌμ΄μ
λ‘μ§ (UI λ° API λΌμ°νΈ)
β βββ config.py # ddns_config.ini νμΌ νμ± λ° μ€μ κ΄λ¦¬ λ‘μ§
β βββ ip_fetcher.py # κ³΅μΈ IP μ£Όμ μ‘°ν λ‘μ§
β βββ state.py # ddns_state.json νμΌ κ΄λ¦¬ λ° μν μ
λ°μ΄νΈ λ‘μ§
β βββ updater.py # κ°λ³ DDNS λ μ½λ μ
λ°μ΄νΈ μ²λ¦¬ λ‘μ§
β βββ utils.py # κ³΅ν΅ μ νΈλ¦¬ν° ν¨μ (μ: μκ° νμ±)
β βββ providers/ # DDNS νλ‘λ°μ΄λλ³ λ‘μ§ κ΅¬ν λλ ν 리 (νλ¬κ·ΈμΈ λ°©μ)
β βββ __init__.py # νλ‘λ°μ΄λ λͺ¨λ λμ λ‘λ© λ° κ΄λ¦¬
β βββ base_provider.py # λͺ¨λ νλ‘λ°μ΄λ ν΄λμ€μ μΆμ κΈ°λ³Έ ν΄λμ€
β βββ cloudflare_provider.py # (μ: cloudflare_provider.py)
β ββ example_provider.py # (μμ) νΉμ νλ‘λ°μ΄λ ꡬν νμΌ
β βββ ... # (κΈ°ν λͺ¨λ νλ‘λ°μ΄λ νμΌ)
βββ logs/ # (μλ μμ±) λ‘κ·Έ νμΌ μ μ₯ λλ ν 리
β βββ <nick>/ # μ€μ νμΌμ 'nick' κ°μ λ°λ₯Έ νμ λλ ν 리
β βββ DDNS_Log_<section>_<date>.log # λ μ½λλ³, λ μ§λ³ λ‘κ·Έ νμΌ
βββ static/ # μΉ UIμ© μ μ νμΌ λλ ν 리 (favicon λ±)
β βββ styles.css # μΉ UI μ€νμΌμνΈ
βββ templates/ # μΉ UIμ© HTML ν
νλ¦Ώ λλ ν 리
β βββ index.html # λ©μΈ μΉ νμ΄μ§ ν
νλ¦Ώ
βββ .github/ # GitHub Actions μν¬νλ‘μ°
β βββ workflows/
β βββ ghcr-publish.yml # GHCR μ΄λ―Έμ§ λΉλ λ° νΈμ μλν
βββ .dockerignore # Docker μ΄λ―Έμ§ λΉλ μ μ μΈν νμΌ λͺ©λ‘
βββ ddns_config.ini # (μ¬μ©μ μμ±) μ€μ DDNS μ€μ νμΌ
βββ ddns_config.ini_total_providers # (μμ νμΌ) μ§μνλ λͺ¨λ νλ‘λ°μ΄λ μ€μ μμ ν¬ν¨
βββ ddns_state.json # (μλ μμ±) DDNS λ μ½λμ νμ¬ μν μ μ₯ νμΌ
βββ docker-compose.yml # Docker Compose μ€νμ μν μ€μ νμΌ
βββ Dockerfile # Docker μ΄λ―Έμ§ μμ±μ μν μ€μ νμΌ
βββ LICENSE # νλ‘μ νΈ λΌμ΄μ μ€ νμΌ
βββ README.md # μ΄ νμΌ
βββ requirements.txt # Python μμ‘΄μ± ν¨ν€μ§ λͺ©λ‘
βββ run.py # μ ν리μΌμ΄μ
μ€ν μ€ν¬λ¦½νΈ (μ€μΌμ€λ¬ λ° Flask μλ² μ€ν)
μ΄ μ ν리μΌμ΄μ μ Docker μ΄λ―Έμ§λ₯Ό ν΅ν΄ μ½κ² μ€νν μ μμ΅λλ€. λλ μμ€ μ½λλ₯Ό μ§μ μ€νν μλ μμ΅λλ€.
GitHub Container Registry (GHCR)μ 미리 λΉλλ Docker μ΄λ―Έμ§λ₯Ό μ¬μ©νμ¬ κ°νΈνκ² μ€νν μ μμ΅λλ€.
μ΄λ―Έμ§ Pull (μ ν μ¬ν, docker run
λλ docker-compose up
μ μλμΌλ‘ λ°μμ΄):
docker pull ghcr.io/nerdnam/ddns-updater-python-ver:latest
# νΉμ λ²μ μ μ¬μ©νλ €λ©΄ (μ: 0.0.1 λ²μ ):
# docker pull ghcr.io/nerdnam/ddns-updater-python-ver:0.0.1
# νΈμ€νΈμ μ€μ λ° λ°μ΄ν° μ μ₯μ μν λλ ν 리 μμ± (μ΅μ΄ 1ν)
# μ΄ μ€ν¬λ¦½νΈκ° μλ μμΉλ₯Ό κΈ°μ€μΌλ‘ ./config μ ./data λλ ν 리λ₯Ό μμ±ν©λλ€.
mkdir -p ./config
mkdir -p ./data
# μμ μ€μ νμΌμ ./config/ddns_config.ini λ‘ λ³΅μ¬ ν, λ΄μ©μ μμ μ νκ²½μ λ§κ² μμ ν©λλ€.
# cp ddns_config.ini_total_providers ./config/ddns_config.ini
# nano ./config/ddns_config.ini # λλ μ νΈνλ νΈμ§κΈ° μ¬μ©
docker run -d \
--name ddns-updater-py \
-p 30007:30007 \
-v "$(pwd)/config/ddns_config.ini:/app/ddns_config.ini:ro" \
-v "$(pwd)/data/ddns_state.json:/app/ddns_state.json" \
-v "$(pwd)/data/logs:/app/logs" \
-e PYTHONUNBUFFERED=1 \
-e TZ="Asia/Seoul" \
-e FLASK_RUN_HOST="0.0.0.0" \
-e FLASK_RUN_PORT="30007" \
-e FLASK_SECRET_KEY="your_very_strong_production_secret_key_!@#$%^&*()" \
ghcr.io/nerdnam/ddns-updater-python-ver:latest
-v "$(pwd)/config/ddns_config.ini..."
: νΈμ€νΈμ μ€μ νμΌμ 컨ν μ΄λλ‘ μ½κΈ° μ μ©(:ro
)μΌλ‘ λ§μ΄νΈν©λλ€. λ°λμ μ€μ κ²½λ‘λ‘ μμ νκ³ ,ddns_config.ini
νμΌμ μ€λΉν΄μΌ ν©λλ€.-v "$(pwd)/data/..."
: μν νμΌκ³Ό λ‘κ·Έλ₯Ό νΈμ€νΈμ μ μ₯νκΈ° μν΄ λ§μ΄νΈν©λλ€.-e FLASK_SECRET_KEY=...
: λ°λμ κ°λ ₯νκ³ μμΈ‘ λΆκ°λ₯ν κ°μΌλ‘ λ³κ²½νμΈμ. 보μμ λ§€μ° μ€μν©λλ€.ghcr.io/nerdnam/ddns-updater-python-ver:latest
: μ¬μ©ν Docker μ΄λ―Έμ§μ λλ€. νΉμ λ²μ μ μ¬μ©νλ €λ©΄ νκ·Έλ₯Ό λ³κ²½νμΈμ (μ::0.0.1
).
νλ‘μ νΈ λ£¨νΈ λλ μνλ μμΉμ λ€μ λ΄μ©μΌλ‘ docker-compose.yml
νμΌμ μμ±ν©λλ€.
# docker-compose.yml
version: '3.8'
services:
ddns-updater-py: # μλΉμ€ μ΄λ¦ (μνλ λλ‘ λ³κ²½ κ°λ₯)
image: ghcr.io/nerdnam/ddns-updater-python-ver:latest
# νΉμ λ²μ μ μ¬μ©νλ €λ©΄: image: ghcr.io/nerdnam/ddns-updater-python-ver:0.0.1
# --- λλ λ‘컬 Dockerfileμ μ¬μ©νμ¬ μ§μ λΉλν κ²½μ° (μ image λΌμΈ μ£Όμ μ²λ¦¬ λλ μμ ) ---
# build:
# context: . # Dockerfileμ΄ μλ νμ¬ λλ ν 리
# dockerfile: Dockerfile
# -----------------------------------------------------------------------------
container_name: ddns-updater-py # μ€νλ 컨ν
μ΄λμ μ΄λ¦
ports:
- "30007:30007" # <νΈμ€νΈ_ν¬νΈ>:<컨ν
μ΄λ_ν¬νΈ>
volumes:
# νΈμ€νΈμ config λλ ν 리λ₯Ό λ§λ€κ³ κ·Έ μμ ddns_config.ini νμΌμ μμΉμν€μΈμ.
# docker-compose.yml νμΌμ΄ μλ μμΉλ₯Ό κΈ°μ€μΌλ‘ μλ κ²½λ‘λ₯Ό μ¬μ©ν©λλ€.
- ./config/ddns_config.ini:/app/ddns_config.ini:ro
# νΈμ€νΈμ data λλ ν 리λ₯Ό λ§λ€κ³ μν νμΌκ³Ό λ‘κ·Έλ₯Ό μ μ₯ν©λλ€.
- ./data/ddns_state.json:/app/ddns_state.json # μ΄κΈ° μ€ν μ νμΌμ΄ μλ€λ©΄ λΉ νμΌλ‘ μμ±λ μ μμ
- ./data/logs:/app/logs
environment:
- PYTHONUNBUFFERED=1
- TZ=Asia/Seoul # 컨ν
μ΄λ νμμ‘΄ μ€μ (μ: Asia/Seoul, Etc/UTC)
- FLASK_RUN_HOST=0.0.0.0
- FLASK_RUN_PORT=30007 # Dockerfile λ° run.pyμ μΌμΉ
# μ€μ: μ€μ μ΄μ μμλ κ°λ ₯νκ³ μμΈ‘ λΆκ°λ₯ν μν¬λ¦Ώ ν€λ₯Ό μ¬μ©νκ³ ,
# .env νμΌμ ν΅ν΄ μ£Όμ
νκ±°λ Docker secrets κΈ°λ₯μ μ¬μ©νλ κ²μ΄ λ μμ ν©λλ€.
- FLASK_SECRET_KEY=your_very_strong_production_secret_key_!@#$%^&*()
# - DDNS_UPDATER_NO_UI=false # trueλ‘ μ€μ μ UI λΉνμ±ν (κΈ°λ³Έκ° false, μ¦ UI μ€ν)
restart: unless-stopped # 컨ν
μ΄λ λΉμ μ μ’
λ£ μ μλ μ¬μμ (μλ μ€μ§ μ μ μΈ)
μ€ν μ μ€λΉ (Docker Compose μ¬μ© μ):
docker-compose.yml
νμΌμ΄ μλ λλ ν 리 κΈ°μ€μΌλ‘./config/
λλ ν 리λ₯Ό λ§λ€κ³ , κ·Έ μμddns_config.ini
νμΌμ μ€λΉν©λλ€. (μμ :cp ddns_config.ini_total_providers ./config/ddns_config.ini
ν μμ )./data/
λλ ν 리λ₯Ό λ§λλλ€ (μν νμΌ λ° λ‘κ·Έ μ μ₯μ©).
Docker Compose μ€ν:
docker-compose up -d
# μ΄λ―Έμ§λ₯Ό λ€μ λΉλν΄μΌ νλ κ²½μ° (build μΉμ
μ¬μ© μ):
# docker-compose up -d --build
λ‘κ·Έ νμΈ:
docker-compose logs -f ddns-updater-py
# λλ docker logs -f ddns-updater-py (docker run μ¬μ© μ)
μ€μ§ λ° μ κ±°:
docker-compose down
# λλ docker stop ddns-updater-py && docker rm ddns-updater-py (docker run μ¬μ© μ)
- Python 3.9 μ΄μ κΆμ₯
pip
(Python ν¨ν€μ§ μ€μΉ λꡬ)
git clone https://github.com/nerdnam/DDNS-Updater-Python-Ver.git
cd DDNS-Updater-Python-Ver
python3 -m venv .venv
source .venv/bin/activate # Linux/macOS
# .venv\Scripts\activate.bat # Windows (cmd)
# .venv\Scripts\activate.ps1 # Windows (PowerShell) - μ€ν μ μ±
λ¬Έμ μ: Set-ExecutionPolicy RemoteSigned -Scope Process
pip install -r requirements.txt
νλ‘μ νΈ λ£¨νΈ λλ ν 리μ ddns_config.ini
νμΌμ μμ±νκ³ μ€μ μ μ
λ ₯ν©λλ€. (μμΈν μ€μ μμλ ddns_config.ini_total_providers
νμΌ μ°Έκ³ )
cp ddns_config.ini_total_providers ddns_config.ini
# nano ddns_config.ini # λλ μ νΈνλ νΈμ§κΈ°λ‘ μμ
κ°μ νκ²½μ΄ νμ±νλ μνμμ λ€μ λͺ λ Ήμ μ€νν©λλ€:
python run.py
μΉ UIλ κΈ°λ³Έμ μΌλ‘ http://0.0.0.0:30007
(λλ http://localhost:30007
)μμ μ κ·Ό κ°λ₯ν©λλ€.
μ ν리μΌμ΄μ
μ€ν ν, μΉ λΈλΌμ°μ μμ http://<μλ²_IP_λλ_localhost>:30007
λ‘ μ μνλ©΄ λ€μ κΈ°λ₯μ μ¬μ©ν μ μμ΅λλ€:
- μ€μ λ DDNS λ μ½λ λͺ©λ‘: κ° λ μ½λμ ID, λλ©μΈ, νΈμ€νΈ, νλ‘λ°μ΄λ, IP λ²μ , νμ¬ μν, λ§μ§λ§ μ λ°μ΄νΈ μκ°, νμ¬ IP, μ΄μ IP λͺ©λ‘μ 보μ¬μ€λλ€.
- μλ μ λ°μ΄νΈ: κ° λ μ½λ μμ "Update Now" λ²νΌμ ν΄λ¦νμ¬ μ¦μ μ λ°μ΄νΈλ₯Ό μλν μ μμ΅λλ€.
- λ‘κ·Έ μ‘°ν: λλ‘λ€μ΄ λ©λ΄μμ λ μ½λλ₯Ό μ ννκ³ "Fetch Log" λ²νΌμ ν΄λ¦νμ¬ ν΄λΉ λ μ½λμ μ΅μ λ‘κ·Έλ₯Ό νμΈν μ μμ΅λλ€.
- μ μ μ€μ νμ:
ddns_config.ini
μ[ddns]
μΉμ μ μ€μ λ κΈ°λ³Έκ°λ€μ 보μ¬μ€λλ€. - API μ¬μ© κ°μ΄λ: JSON νμμΌλ‘ μν μ 보λ₯Ό μ‘°νν μ μλ API μλν¬μΈνΈ μ¬μ©λ²μ μλ΄ν©λλ€.
- νμ¬ κ°μ§λ κ³΅μΈ IP: μΉ UIλ₯Ό λ‘λν λ μλ²κ° κ°μ§ν κ³΅μΈ IPv4 μ£Όμλ₯Ό νμν©λλ€.
νμ¬ DDNS μν μ 보λ₯Ό JSON νμμΌλ‘ μ‘°νν μ μμ΅λλ€.
- κΈ°λ³Έ μλν¬μΈνΈ:
http://<μλ²_IP_λλ_localhost>:30007/api
- HTTP λ©μλ:
GET
μ¬μ© κ°λ₯ν κ²½λ‘:
/api
: μ€μ λ λͺ¨λ DDNS λ μ½λμ μν μ 보λ₯Ό λμ λ리 ννλ‘ λ°νν©λλ€ (ν€: λ μ½λ ID)./api?id=<λ μ½λ_ID>
: νΉμ λ μ½λ IDμ ν΄λΉνλ μν μ 보λ₯Ό λ°νν©λλ€.- μ:
/api?id=home_server
- μ:
/api?domain=<λλ©μΈ_μ΄λ¦>
: νΉμ λλ©μΈ μ΄λ¦(FQDN λλ κΈ°λ³Έ λλ©μΈ)μ ν΄λΉνλ λ μ½λ(λ€)μ μν μ 보λ₯Ό λ°νν©λλ€.- μ:
/api?domain=example.com
λλ/api?domain=myhost.example.com
- μ:
μλ΅ JSON μμ (λ¨μΌ λ μ½λ):
{
"id": "home_server",
"domain": "example.com",
"owner": "@",
"provider": "cloudflare",
"ip_version": "ipv4",
"proxied": false,
"status1": "Updated",
"status2": "25-05-07 20:30",
"status3": "05-07 20:30",
"current_ip": "123.123.123.123",
"previous_ips": ["123.123.123.123", "123.123.123.122"],
"date1": "2025-05-07",
"date2": "25-05-07",
"time1": "20:30:00",
"time2": "20:30"
}
νμ¬ κ΅¬νλ νλ‘λ°μ΄λ λͺ©λ‘μ ddns_updater/providers/
λλ ν 리 λ° ddns_updater/providers/__init__.py
νμΌμ get_supported_providers()
ν¨μλ₯Ό ν΅ν΄ νμΈν μ μμ΅λλ€. μλ‘μ΄ νλ‘λ°μ΄λλ BaseProvider
λ₯Ό μμνμ¬ μ½κ² μΆκ°ν μ μμ΅λλ€.
(μλ λͺ©λ‘μ ddns_config.ini_total_providers
νμΌμ λͺ
μλ νλ‘λ°μ΄λλ₯Ό κΈ°μ€μΌλ‘ μμ±λμμΌλ©°, μ€μ ꡬν μ¬λΆλ μ½λ νμΈμ΄ νμν©λλ€.)
- Aliyun
- All-Inkl
- AWS Route 53
- ChangeIP
- Cloudflare
- Custom URL (HTTP API λ°©μ)
- DD24
- DDNSS.de
- deSEC.io
- DigitalOcean
- DNS-O-Matic
- Domeneshop
- DonDominio
- DreamHost
- DuckDNS
- Dyn.com
- Dynu
- DynV6
- EasyDNS
- FreeDNS (afraid.org)
- Gandi
- GCP (Google Cloud DNS)
- GoDaddy
- GoIP (νλμ¨μ΄ μ₯λΉ)
- HE.net (Hurricane Electric)
- Hetzner DNS
- Infomaniak
- INWX
- Ionos (1&1)
- Linode
- LuaDNS
- MyAddr.tools
- Name.com
- Namecheap
- NameSilo
- Netcup
- Njalla
- No-IP
- Now-DNS.com
- OpenDNS
- OVH (DynHost λ° ZoneDNS API λͺ¨λ)
- Porkbun
- Selfhost.de
- Servercow.de
- Spdyn
- Strato
- Variomedia.de
- Vultr
- ZoneEdit
- (Example Provider Template - κ°λ°μμ© μμ)
λ²κ·Έ 리ν¬νΈ, κΈ°λ₯ μ μ, μ½λ κΈ°μ¬ λͺ¨λ νμν©λλ€. GitHub μ μ₯μλ₯Ό ν΅ν΄ μ΄μλ₯Ό μμ±νκ±°λ ν 리νμ€νΈλ₯Ό 보λ΄μ£ΌμΈμ.