{"id":20992708,"url":"https://github.com/jesseklm/hetzner-dyndns","last_synced_at":"2026-02-13T20:01:54.503Z","repository":{"id":62740929,"uuid":"561765697","full_name":"jesseklm/hetzner-dyndns","owner":"jesseklm","description":"API to update a specific Hetzner DNS entry","archived":false,"fork":false,"pushed_at":"2024-11-30T17:20:34.000Z","size":42,"stargazers_count":2,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-05-14T20:43:08.804Z","etag":null,"topics":["ddclient","dns","dyndns","dyndns2","fritzbox","hetzner","hetznerdns","opnsense"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jesseklm.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}},"created_at":"2022-11-04T12:50:28.000Z","updated_at":"2024-07-09T08:27:50.000Z","dependencies_parsed_at":"2025-05-14T20:49:42.212Z","dependency_job_id":null,"html_url":"https://github.com/jesseklm/hetzner-dyndns","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/jesseklm/hetzner-dyndns","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jesseklm%2Fhetzner-dyndns","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jesseklm%2Fhetzner-dyndns/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jesseklm%2Fhetzner-dyndns/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jesseklm%2Fhetzner-dyndns/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jesseklm","download_url":"https://codeload.github.com/jesseklm/hetzner-dyndns/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jesseklm%2Fhetzner-dyndns/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29416040,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-13T06:24:03.484Z","status":"ssl_error","status_checked_at":"2026-02-13T06:23:12.830Z","response_time":78,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: 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":["ddclient","dns","dyndns","dyndns2","fritzbox","hetzner","hetznerdns","opnsense"],"created_at":"2024-11-19T07:12:13.119Z","updated_at":"2026-02-13T20:01:54.469Z","avatar_url":"https://github.com/jesseklm.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# hetzner-dyndns service\n\nService providing an API to update a specific DNS entry.\n\n## API\n\ngenerate config entry:\n\n```ruby\nhttps://YOUR_HOST/dns/generate/HETZNER_API_TOKEN/ZONE_NAME/RECORD_TYPE/RECORD_NAME\n```\n\nupdate record:\n\n```ruby\nhttps://YOUR_HOST/dns/update/KEY/NEW_IP\n```\n\nupdate multiple records (set `MAX_UPDATES_PER_GET` env variable, default=2):\n\n```ruby\nhttps://YOUR_HOST/dns/update/KEY/NEW_IP[/KEY2/VALUE2]\n```\n\n## create `config.yaml` entry\n\n- generate config entry\n- append output to `hetzner-dyndns/config.yaml`\n- set `DISABLE_GENERATE=1` env variable in docker compose file\n- restart service\n\n## fritzbox configuration\n\n- go to `Internet / Permit Access / DynDNS`\n- check `Use DynDNS`\n- select `User-defined`\n- set `Update URL` to `https://YOUR_HOST/dns/update/\u003cpass\u003e/\u003cipaddr\u003e` (`\u003cip6addr\u003e for AAAA record`)\n- set `Domain name` to `RECORD_NAME.ZONE_NAME`\n- set `Username` to `ZONE_NAME`\n- set `Password` to `KEY` (first line of generate output without `:`)\n\n## opnsense ddclient configuration\n\n- select `Custom` as `Service`\n- select `DynDns2` as `Protocol`\n- set `Server` to `YOUR_HOST`\n- set `Username` to `ZONE_NAME`\n- set `Password` to `KEY` (first line of generate output without `:`)\n- untick `Wildcard`\n- set `Hostname(s)` to `RECORD_NAME.ZONE_NAME`\n- tick `Force SSL`\n\n## additional configuration files\n\nnginx config example (`site.conf` file in `nginx/config` folder), replace `YOUR_CERTPATH` and `YOUR_HOST`:\n\n```nginx\nssl_certificate /YOUR_CERTPATH/fullchain.pem;\nssl_certificate_key /YOUR_CERTPATH/privkey.pem;\n\nserver {\n    server_name YOUR_HOST;\n    listen 443 ssl http2;\n    listen [::]:443 ssl http2;\n\n    location /dns/ {\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_pass http://hetzner-dyndns:8888/;\n    }\n\n    location /nic/ {\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_pass http://hetzner-dyndns:8888;\n    }\n}\n\n## CATCH ALL: REDIRECT\nserver {\n    server_name _;\n    listen 80 default_server;\n    listen [::]:80 default_server;\n    listen 443 ssl http2 default_server;\n    listen [::]:443 ssl http2 default_server;\n\n    location / {\n        return 301 https://YOUR_HOST$request_uri;\n    }\n}\n```\n\ndocker compose example:\n\n```yaml\nservices:\n  nginx:\n    container_name: nginx\n    depends_on:\n      - hetzner-dyndns\n    image: nginx:mainline-alpine\n    networks:\n      - nginx\n    ports:\n      - 80:80\n      - 443:443\n    restart: unless-stopped\n    volumes:\n      - ./nginx/config:/etc/nginx/conf.d:ro\n\n  hetzner-dyndns:\n    container_name: hetzner-dyndns\n    environment:\n      - DISABLE_GENERATE=1 # set after config creation\n      # - MAX_UPDATES_PER_GET=3 # default=2\n    image: ghcr.io/jesseklm/hetzner-dyndns:master\n    networks:\n      - nginx\n    restart: unless-stopped\n    volumes:\n      - ./hetzner-dyndns/config.yaml:/usr/src/app/config.yaml:ro\n\nnetworks:\n  nginx:\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjesseklm%2Fhetzner-dyndns","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjesseklm%2Fhetzner-dyndns","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjesseklm%2Fhetzner-dyndns/lists"}