{"id":46732023,"url":"https://github.com/rwunderer/external-dns-cloudns-webhook","last_synced_at":"2026-03-09T15:31:09.232Z","repository":{"id":275870988,"uuid":"924152111","full_name":"rwunderer/external-dns-cloudns-webhook","owner":"rwunderer","description":"External-DNS Plugin to manage ClouDNS Records","archived":false,"fork":false,"pushed_at":"2026-03-06T04:49:39.000Z","size":776,"stargazers_count":1,"open_issues_count":2,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-06T09:41:45.457Z","etag":null,"topics":["movable"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rwunderer.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-01-29T14:07:32.000Z","updated_at":"2026-03-06T04:49:42.000Z","dependencies_parsed_at":"2025-02-05T02:43:51.843Z","dependency_job_id":"88a10d6a-a853-4c67-ab4e-4a917d4cdbed","html_url":"https://github.com/rwunderer/external-dns-cloudns-webhook","commit_stats":null,"previous_names":["rwunderer/external-dns-cloudns-webhook"],"tags_count":57,"template":false,"template_full_name":null,"purl":"pkg:github/rwunderer/external-dns-cloudns-webhook","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rwunderer%2Fexternal-dns-cloudns-webhook","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rwunderer%2Fexternal-dns-cloudns-webhook/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rwunderer%2Fexternal-dns-cloudns-webhook/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rwunderer%2Fexternal-dns-cloudns-webhook/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rwunderer","download_url":"https://codeload.github.com/rwunderer/external-dns-cloudns-webhook/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rwunderer%2Fexternal-dns-cloudns-webhook/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30301109,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-09T14:33:48.460Z","status":"ssl_error","status_checked_at":"2026-03-09T14:33:48.027Z","response_time":61,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["movable"],"created_at":"2026-03-09T15:31:08.430Z","updated_at":"2026-03-09T15:31:09.167Z","avatar_url":"https://github.com/rwunderer.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ExternalDNS - ClouDNS Webhook\n\n⚠️ **This software is experimental.** ⚠️\n\n[ExternalDNS](https://github.com/kubernetes-sigs/external-dns) is a Kubernetes\nadd-on for automatically DNS records for Kubernetes services using different\nproviders. By default, Kubernetes manages DNS records internally, but\nExternalDNS takes this functionality a step further by delegating the management\nof DNS records to an external DNS provider such as this one. This webhook allows\nyou to manage your ClouDNS domains inside your kubernetes cluster.\n\n## Requirements\n\n[Auth-id and auth-password](https://www.cloudns.net/wiki/article/42/)\nfor the account managing your domains is required for this webhook to work\nproperly.\n\nThis webhook can be used in conjunction with **ExternalDNS v0.14.0 or higher**,\nconfigured for using the webhook interface. Some examples for a working\nconfiguration are shown in the next section.\n\n## Kubernetes Deployment\n\nThe ClouDNS webhook is provided as a regular Open Container Initiative (OCI)\nimage released in the\n[GitHub container registry](https://github.com/rwunderer/external-dns-cloudns-webhook/pkgs/container/external-dns-cloudns-webhook).\nThe deployment can be performed in every way Kubernetes supports.\n\nSee the example using the [External DNS chart](#using-the-externaldns-chart).\n\nIn any case, a secret that stores the CloudDNS auth info is required:\n\n```yaml\nkubectl create secret generic cloudns-config -n external-dns \\\n  --from-literal=CLOUDNS_AUTH_ID_TYPE=auth-id \\\n  --from-literal=CLOUDNS_AUTH_ID='\u003cEXAMPLE_PLEASE_REPLACE\u003e' \\\n  --from-literal=CLOUDNS_AUTH_PASSWORD='\u003cEXAMPLE_PLEASE_REPLACE\u003e'\n```\n\n### Using the ExternalDNS chart\n\nSkip this step if you already have the ExternalDNS repository added:\n\n```shell\nhelm repo add external-dns https://kubernetes-sigs.github.io/external-dns/\n```\n\nUpdate your helm chart repositories:\n\n```shell\nhelm repo update\n```\n\nYou can then create the helm values file, for example\n`external-dns-cloudns-values.yaml`:\n\n```yaml\nnamespace: external-dns\npolicy: sync\nprovider:\n  name: webhook\n  webhook:\n    image:\n      repository: ghcr.io/rwunderer/external-dns-cloudns-webhook\n      tag: v0.1.0\n    env:\n    - name: CLOUDNS_AUTH_ID_TYPE\n      valueFrom:\n        secretKeyRef:\n          name: cloudns-config\n          key: CLOUDNS_AUTH_ID_TYPE\n    - name: CLOUDNS_AUTH_ID\n      valueFrom:\n        secretKeyRef:\n          name: cloudns-config\n          key: CLOUDNS_AUTH_ID\n    - name: CLOUDNS_AUTH_PASSWORD\n      valueFrom:\n        secretKeyRef:\n          name: cloudns-config\n          key: CLOUDNS_AUTH_PASSWORD\n    securityContext:\n      allowPrivilegeEscalation: false\n      capabilities:\n        drop: [\"ALL\"]\n      readOnlyRootFilesystem: true\n      runAsNonRoot: true\n      seccompProfile:\n        type: RuntimeDefault\n    livenessProbe:\n      httpGet:\n        path: /health\n        port: http-webhook\n      initialDelaySeconds: 10\n      timeoutSeconds: 5\n    readinessProbe:\n      httpGet:\n        path: /ready\n        port: http-webhook\n      initialDelaySeconds: 10\n      timeoutSeconds: 5\n\nextraArgs:\n  - \"--txt-prefix=reg-%{record_type}-\"\n```\n\nAnd then:\n\n```shell\n# install external-dns with helm\nhelm install external-dns-cloudns external-dns/external-dns -f external-dns-cloudns-values.yaml --version 0.15.0 -n external-dns\n```\n\n## Environment variables\n\nThe following environment variables can be used for configuring the application.\n\n### ClouDNS API calls configuration\n\nThese variables control the behavior of the webhook when interacting with\nClouDNS API.\n\n| Variable              | Description                       | Notes                      |\n| --------------------- | ----------------------------------| -------------------------- |\n| CLOUDNS_AUTH_ID_TYPE  | either `auth-id` or `sub-auth-id` | Default: `auth-id`         |\n| CLOUDNS_AUTH_ID       | ClouDNS auth-id or sub-auth-id    | Mandatory                  |\n| CLOUDNS_AUTH_PASSWORD | ClouDNS auth-password             | Mandatory                  |\n| DEFAULT_TTL           | Default record TTL                | Default: `3600`            |\n\n### Test and debug\n\nThese environment variables are useful for testing and debugging purposes.\n\n| Variable        | Description                      | Notes            |\n| --------------- | -------------------------------- | ---------------- |\n| DRY_RUN         | If set, changes won't be applied | Default: `false` |\n| CLOUDNS_DEBUG   | Enables debugging messages       | Default: `false` |\n\n### Socket configuration\n\nThese variables control the sockets that this application listens to.\n\n| Variable        | Description                      | Notes                |\n| --------------- | -------------------------------- | -------------------- |\n| WEBHOOK_HOST    | Webhook hostname or IP address   | Default: `localhost` |\n| WEBHOOK_PORT    | Webhook port                     | Default: `8888`      |\n| METRICS_HOST    | Metrics hostname                 | Default: `0.0.0.0`   |\n| METRICS_PORT    | Metrics port                     | Default: `8080`      |\n| READ_TIMEOUT    | Sockets' read timeout in ms      | Default: `60000`     |\n| WRITE_TIMEOUT   | Sockets' write timeout in ms     | Default: `60000`     |\n\n\n### Domain filtering\n\nAdditional environment variables for domain filtering. When used, this webhook\nwill be able to work only on domains matching the filter.\n\n| Environment variable           | Description                        |\n| ------------------------------ | ---------------------------------- |\n| DOMAIN_FILTER                  | Filtered domains                   |\n| EXCLUDE_DOMAIN_FILTER          | Excluded domains                   |\n| REGEXP_DOMAIN_FILTER           | Regex for filtered domains         |\n| REGEXP_DOMAIN_FILTER_EXCLUSION | Regex for excluded domains         |\n\nIf the `REGEXP_DOMAIN_FILTER` is set, the following variables will be used to\nbuild the filter:\n\n - REGEXP_DOMAIN_FILTER\n - REGEXP_DOMAIN_FILTER_EXCLUSION\n\n otherwise, the filter will be built using:\n\n - DOMAIN_FILTER\n - EXCLUDE_DOMAIN_FILTER\n\n## Endpoints\n\nThis process exposes several endpoints, that will be available through these\nsockets:\n\n| Socket name | Socket address                |\n| ----------- | ----------------------------- |\n| Webhook     | `WEBHOOK_HOST`:`WEBHOOK_PORT` |\n| Metrics     | `METRICS_HOST`:`METRICS_PORT` |\n\nThe environment variables controlling the socket addresses are not meant to be\nchanged, under normal circumstances, for the reasons explained in\n[Tweaking the configuration](tweaking-the-configuration).\nThe endpoints\n[expected by ExternalDNS](https://github.com/kubernetes-sigs/external-dns/blob/master/docs/tutorials/webhook-provider.md)\nare marked with *.\n\n### Webhook socket\n\nAll these endpoints are\n[required by ExternalDNS](https://github.com/kubernetes-sigs/external-dns/blob/master/docs/tutorials/webhook-provider.md).\n\n| Endpoint           | Purpose                                        |\n| ------------------ | ---------------------------------------------- |\n| `/`                | Initialization and `DomainFilter` negotiations |\n| `/record`          | Get and apply records                          |\n| `/adjustendpoints` | Adjust endpoints before submission             |\n\n### Metrics socket\n\nExternalDNS doesn't have functional requirements for this endpoint, but some\nof them are\n[recommended](https://github.com/kubernetes-sigs/external-dns/blob/master/docs/tutorials/webhook-provider.md).\nIn this table those endpoints are marked with  __*__.\n\n| Endpoint           | * | Purpose                                            |\n| ------------------ | - | -------------------------------------------------- |\n| `/health`          |   | Implements the liveness probe                      |\n| `/ready`           |   | Implements the readiness probe                     |\n| `/healthz`         | * | Implements a combined liveness and readiness probe |\n| `/metrics`         | * | Exposes the available metrics                      |\n\nPlease check the [Exposed metrics](#exposed-metrics) section for more\ninformation.\n\n## Tweaking the configuration\n\nWhile tweaking the configuration, there are some points to take into\nconsideration:\n\n- if `WEBHOOK_HOST` and `METRICS_HOST` are set to the same address/hostname or\n  one of them is set to `0.0.0.0` remember to use different ports. Please note\n  that it **highly recommendend** for `WEBHOOK_HOST` to be `localhost`, as\n  any address reachable from outside the pod might be a **security issue**;\n  besides this, changing these would likely need more tweaks than just setting\n  the environment variables. The default settings are compatible with the\n  [ExternalDNS assumptions](https://github.com/kubernetes-sigs/external-dns/blob/master/docs/tutorials/webhook-provider.md);\n- if your records don't get deleted when applications are uninstalled, you\n  might want to verify the policy in use for ExternalDNS: if it's `upsert-only`\n  no deletion will occur. It must be set to `sync` for deletions to be\n  processed. Please check that `external-dns-cloudns-values.yaml` include:\n\n  ```yaml\n  policy: sync\n  ```\n- the `--txt-prefix` parameter should really include: `%{record_type}`, as any\n  other value will cause a weird duplication of database records. Change the\n  value provided in the sample configuration only if you really know what are\n  you doing.\n\n## Exposed metrics\n\nThe following metrics related to the API calls towards ClouDNS are available\nfor scraping.\n\n| Name                         | Type      | Labels   | Description                                              |\n| ---------------------------- | --------- | -------- | -------------------------------------------------------- |\n| `successful_api_calls_total` | Counter   | `action` | The number of successful  API calls                      |\n| `failed_api_calls_total`     | Counter   | `action` | The number of API calls that returned an error           |\n| `filtered_out_zones`         | Gauge     | _none_   | The number of zones excluded by the domain filter        |\n| `skipped_records`            | Gauge     | `zone`   | The number of skipped records per domain                 |\n| `api_delay_hist`             | Histogram | `action` | Histogram of the delay (ms) when calling the ClouDNS API |\n\nThe label `action` can assume one of the following values, depending on the\nClouDNS API endpoint called:\n\n- `get_zones`\n- `get_records`\n- `create_record`\n- `delete_record`\n- `update_record`\n\nThe label `zone` can assume one of the zone names as its value.\n\nPlease notice that in some cases an _update_ request from ExternalDNS will be\ntransformed into a `delete_record` and subsequent `create_record` calls by this\nwebhook.\n\n\n## Development\n\nThe basic development tasks are provided by make. Run `make help` to see the\navailable targets.\n\n## Credits\n\nThis Webhook was forked and modified from the [Hetzner Webhook](https://github.com/mconfalonieri/external-dns-hetzner-webhook)\nto work with CloudDNS. The actual ClouDNS provider was taken from work by [wmarchesi123](https://github.com/wmarchesi123/external-dns/tree/cloudns).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frwunderer%2Fexternal-dns-cloudns-webhook","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frwunderer%2Fexternal-dns-cloudns-webhook","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frwunderer%2Fexternal-dns-cloudns-webhook/lists"}