Hetzner DNS Zone Manager
Project description
Hetzner DNS Manager
A command-line tool to interact with the Hetzner Cloud DNS API, allowing you to manage DNS records by editing a set of YAML files.
It is designed for small to medium installations with up to 100 zones. Function scope is limited to managing records within existing zones for now.
Features
- Import zones and records from the Hetzner Cloud DNS API
- Check DNS records against actual DNS entries
- Create missing and update mismatched DNS records
- Delete DNS records
- Stores zone data in YAML files for easy manual editing
Example Workflow
After initial import, add records to an RRSet in a zone YAML file:
Then run update to push the change to the API:
The same way you can update records and push those.
Installation
The script uses PEP 723 for dependency management, so it's self-contained. You'll need Python 3.10 or higher and a working installation of uv, installed via your OS's package manager or via pip.
# Clone the repository
git clone https://github.com/serpent213/hetzner-dns-manager.git
cd hetzner-dns-manager
or
# Download raw script directly
curl -LO https://github.com/serpent213/hetzner-dns-manager/raw/refs/heads/master/hdem
chmod +x hdem
Install from PyPI
Alternatively install from PyPI:
# Install using pip
pip install hetzner-dns-manager
# Or with pipx for isolated installation
pipx install hetzner-dns-manager
After installation, you'll have access to the hdem command in your terminal.
Configuration
Set your Hetzner Cloud API token as an environment variable:
export HCLOUD_TOKEN="your_api_token_here"
You may want to add this to your shell profile file (.bashrc, .zshrc, etc.) for persistence.
By default, hdem reads and writes zone files in ./zones. Use --zones-dir or HDEM_ZONES_DIR
to select a different inventory:
hdem --zones-dir ./live-zones check --all
export HDEM_ZONES_DIR="$HOME/infrastructure/dns"
Usage
The database consists of one YAML file per zone in the configured zones directory.
Import Zones and Records
Import a specific zone:
hdem import example.com
Import all zones:
hdem import --all
This will create YAML files in the configured zones directory.
Segmented TXT records (like "abc" "def") will be concatenated (to "abcdef") by default. This might be undesirable and can be disabled by passing --no-txt-concat.
Check DNS Records
Check a specific zone against actual DNS entries using one of the domain's authoritative servers:
hdem check --verbose example.com
Check all zones:
hdem check --all
SOA records will be ignored as they are updated automatically by Hetzner.
Update DNS Records
Check and update mismatched records for a specific zone:
hdem update example.com
Check and update mismatched records for all zones:
hdem update --all
To create new records, add them to the relevant RRSet in your zone YAML. To create a new name/type pair, add a new RRSet.
Delete DNS Records
Delete a specific record by name:
hdem delete example.com www
If there is more than one candidate, hdem will ask you which records to delete.
Migrate Local YAML Files
Rewrite a legacy flat records: file into the native RRSet format:
hdem migrate example.com
Rewrite all local zone files:
hdem migrate --all
Data Structure
The YAML files in the configured zones directory follow this RRSet-based structure:
version: 2
id: 123456
name: example.com
ttl: 86400
rrsets:
- name: www
type: A
records:
- value: 192.0.2.1
- name: '@'
type: MX
records:
- value: '10 mail.example.com.'
Older flat records: files are still accepted when reading. Normal writes preserve the file format that was read. Use hdem migrate example.com or hdem migrate --all to rewrite local files in the RRSet format.
Related Projects
Some other tools dealing with Hetzner DNS (that are not dynamic DNS updaters):
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file hetzner_dns_manager-0.3.0.tar.gz.
File metadata
- Download URL: hetzner_dns_manager-0.3.0.tar.gz
- Upload date:
- Size: 18.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.11 {"installer":{"name":"uv","version":"0.11.11","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f8d68bfbe72091ee4b7f6c1f974e2e13c5321b82d59d687c89883566278518e7
|
|
| MD5 |
eda84068daf7e3b5ed4d0400b10e5f55
|
|
| BLAKE2b-256 |
17857dba854031e21d831bebcc63100ddb57f4bf4be0a3cf240022ff77ca429f
|
File details
Details for the file hetzner_dns_manager-0.3.0-py3-none-any.whl.
File metadata
- Download URL: hetzner_dns_manager-0.3.0-py3-none-any.whl
- Upload date:
- Size: 21.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.11 {"installer":{"name":"uv","version":"0.11.11","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
74d7ee20984c2171d984fab2a48b5c03854c94b5be5ee7cad5b574584ac08adc
|
|
| MD5 |
a20baae162a2dd42ae7115c0e0b52321
|
|
| BLAKE2b-256 |
33b676f3d28d405a161203dd6570591b3b9efda110136a310c0a77de8d57304b
|