kruno 255321e773 Add gibdns/draft-02 with atomic rrset.batch.
A batch commits in one bulk PATCH to /domains/{zone}/rrsets/, which deSEC
applies atomically, so it costs one rate-limited write and one DNSSEC signing
instead of one per RRset. A rate limit is waited out only when the delay fits
the request deadline and 30 seconds; otherwise the provider returns rate_limited
with retry_after_seconds instead of sleeping through hours-long windows.

Requires gibdns-go v0.3.0. gibdns/draft-01 behavior is unchanged.
2026-10-27 20:11:42 +01:00
2026-09-13 00:58:57 +02:00
2026-09-13 00:58:57 +02:00
2026-09-13 00:58:57 +02:00
2026-09-13 15:40:43 +02:00

gibdns-desec

gibdns provider for deSEC. Hosts such as gibcert execute this binary to publish ACME DNS-01 TXT records and DANE TLSA records.

Protocol TXT TLSA Zone discovery
gibdns/draft-01 yes yes yes
gibdns/draft-02 yes yes yes

Install

Download the archive or .deb for your OS from the releases page.

Debian package (installs to /usr/libexec/gibdns):

sudo dpkg -i gibdns-desec_*_linux_amd64.deb

Tarball:

sudo install -D -m 0755 gibdns-desec /usr/local/libexec/gibdns/gibdns-desec

From source:

make install PREFIX=/usr/local

The binary is not an interactive CLI and is intentionally not installed on PATH. Confirm the installation, then let the host invoke it:

# Debian package:
test -x /usr/libexec/gibdns/gibdns-desec
# Source or tarball install:
test -x /usr/local/libexec/gibdns/gibdns-desec

Use /usr/libexec/gibdns/gibdns-desec for a Debian package or /usr/local/libexec/gibdns/gibdns-desec for a source or tarball install in host configuration. See Using gibdns for the host and provider split.

Use with gibcert

Store a deSEC token at /etc/gibcert/desec-token with mode 0600. The token must not have token-management permission. Then:

provider desec {
  type dns
  driver exec
  command /usr/libexec/gibdns/gibdns-desec
  zone example.com.

  secret token {
    file /etc/gibcert/desec-token
  }
}

certificate wildcard-example.com {
  account letsencrypt
  names example.com *.example.com

  challenge dns-01 {
    provider desec
    propagation-timeout 120s
  }
}

zone is optional because this provider advertises zone discovery. Set it when you want an exact zone selector. If installed from source or a tarball, use /usr/local/libexec/gibdns/gibdns-desec instead.

gibcert binding details are in External DNS Providers.

Secrets

  • token (required): a deSEC token without token-management permission

Config

  • api_url (optional)

deSEC RRsets have a default minimum TTL of 3600 seconds. The provider advertises that constraint and honors ttl_policy. Patch is implemented as GET then PUT of the complete RRset, so concurrent_safe_patch is false. Clients such as gibcert should use if_revision.

Batching

rrset.batch (gibdns/draft-02 only) is atomic here: features.batch.atomic is true, so atomic: true and atomic: false are both accepted. All changes of a batch are sent to deSEC as one bulk PATCH of /domains/{zone}/rrsets/, which deSEC documents as all-or-nothing. A deletion is an RRset with records: []. RRsets that need no change are not sent. When every operation is a no-op, no write request is made. The provider sets no maximum_batch_ops; it does not limit the number of operations itself.

Before writing, the provider reads each addressed RRset with one GET per RRset. When deSEC rejects the bulk request with a per-RRset error list, the first rejected RRset is reported with its op_index and the rejected request applies nothing. With atomic: false the operations before the failing one are then applied in a second bulk request, as the batch semantics require.

deSEC rate-limits writes per domain. When it answers 429, the provider waits for Retry-After only if the wait fits the request deadline and a total of 30 seconds for the invocation. Otherwise it returns rate_limited with retry_after_seconds immediately.

In gibdns/draft-02 the if_revision and if_absent preconditions are advertised as check_then_write: the provider evaluates the precondition against freshly read state and then writes. The deSEC API has no conditional write, so a concurrent writer between the read and the write can be overwritten. A client that cannot tolerate that window must not rely on this provider for it.

Development

make test
make build
make snapshot

Publish a tagged release with make release. That target runs GoReleaser via go run; a GITEA_TOKEN with package/release access is required.

S
Description
deSEC DNS provider for gibdns
Readme 0BSD
68 KiB
0 Stars 1 Watchers 0 Forks
2026-10-27 20:01:51 +00:00
Languages
Go 93.3%
Makefile 6.7%