OVH DynDNS Client logo

OVH DynDNS Client

Your IP changes. Your domains shouldn't.

Point your OVH domains to a dynamic IP and forget about it — one container, no external dependencies, your server, your rules.

Python 3.14 FastAPI SQLite Docker multi-arch
Install in 5 minutes →
OVH DynDNS Client dashboard — status page with current IP and host status

How it works

Three beats from setup to set-and-forget.

  1. 1

    Add a host

    Hostname plus OVH DynHost username and password. Stored encrypted at rest with Fernet — the data volume is the only thing you back up.

  2. 2

    The agent watches your IP

    Polls a public IP service on a configurable interval, persists state to SQLite, and retries failed hosts on the next cycle.

  3. 3

    DNS gets updated

    When the IP changes, OVH receives a DynHost update for every host in parallel. Failures surface in the dashboard with the upstream error.

Built right, runs anywhere

No managed SaaS. No vendor lock-in. Your Docker, your DNS.

Web UI

Manage hosts, view status and history from a browser. No CLI required.

REST API + JWT auth

Full-featured API protected by JWT bearer tokens. Use it from your own scripts.

Encrypted credentials

OVH host passwords are encrypted at rest with Fernet. The data volume is the only thing you back up.

Rate-limited auth

5 logins/min and 10 password-changes/min per IP. Brute-force attempts return 429.

Idempotent migration

Boot-time auto-migration encrypts legacy plaintext passwords on first start. Zero-touch upgrade from 4.x.

Docker multi-arch

Pre-built images for amd64, arm64 and arm/v7. Runs on a Synology, a Pi, or a cheap VPS.

Self-host in 5 minutes

One docker-compose.yaml, one docker compose up. Full reference in the README.

# 1. Create docker-compose.yaml
cat > docker-compose.yaml <<'YAML'
services:
  ovh-dyndns-client:
    image: cibrandocampo/ovh-dyndns-client:stable
    container_name: ovh-dyndns-client
    init: true
    restart: unless-stopped
    ports:
      - "8000:8000"
    volumes:
      - ./data:/app/data
    healthcheck:
      test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:8000/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s
YAML

# 2. Start it
mkdir -p data
docker compose up -d

# 3. Open http://localhost:8000 (default admin/admin, change required on first login)

Full configuration reference: docs/CONFIGURATION.md