# ownDynDNS
Self-hosted dynamic DNS php script to update netcup DNS API from Router like AVM FRITZ!Box
## Authors
* Felix Kretschmer [@fernwerker](https://github.com/fernwerker)
* Philipp Tempel [@philipptempel](https://github.com/philipptempel)
* Branko Wilhelm [@b2un0](https://github.com/b2un0)
* Nils Blume [@niiwiicamo](https://github.com/niiwiicamo)
## Usage
### Installation
* Copy all files to your webspace
* If you want multiple endpoints that each can only update one domain look at the mydomain folder.
The update URL would be https://`url`/mydomain/update.php?(...)
* create a copy of `.env.dist` as `.env` and configure:
Parameter | Example | Explanation
---: | :--- | :---
`username` | dnsupdater | The username for your Router to authenticate (so not everyone can update your DNS)
`password` | secretpleasechange | password for your Router
`apiKey` | 18neqwd91e21onei1p23841 | API key which is generated in netcup CCP
`apiPassword` | 82jewqde9m30 | API password which is generated in netcup CCP
`customerId` | 12345 | your netcup Customer ID
`log` | `true` / false | enables logging
`logFile` | log.json | configures logfile location if enabled
`debug` | true / `false` | enables debug mode and generates more output from update.php (normal operation has no output). Needed to receive stack traces from errors.
`returnIp` | `true` / false | enables return of result if a record was changed
`allowCreate` | true/`false` | allows creation of entries if parameter `create=true` in URL
`restrictDomain` | true / `false` | allows admin to restrict the domain to update to a given value `domain` and/or `host`. See URL parameters for host parameter explanation
* alternatively you can use .configure.sh to create your .env file for you (if you are on a *NIX system)
* Create each host record in your netcup CCP (DNS settings) before using the script. The script does not create any missing records.
You can now set `allowCreate=true` in .env and pass `create=true` as URL parameter to create entries on the fly.
## URL possible uses:
### Required parameters in URL:
user, password and domain are always needed, as well as at least one of the following: ipv4, ipv6, txt
Parameter | Example | Explanation
---: | :--- | :---
user | dnsupdater | username to authenticate against this script as defined in .env file
password | secretpleasechange |password for that user as defined in .env file
domain | home.example.com | `case A)` If `host` is not specified: the FQDN for your host
domain | example.com | `case B)` If you want to update the @ or * record
domain | example.com | `case C)` If `host`is specified: only the domain part as registered at netcup "nas.home.example.com"
host | nas.home | `case C)` If your domain contains more than 3 levels "nas.home.example.com"
ipv4 | 1.2.3.4 | the ipv4 address to update an existing A record
ipv6 | fe80::12:34:56 | the ipv6 address to update an existing AAAA record
txt | acme-challenge-text | the content to update an existing TXT record
force | true | ignore checking if the record needs to be updated, just do it anyways. Default: `false`
mode | * | `case B)` If domain is your registered domain "example.com". Possible values: `*` or `both`. Default: `@`
create | true | create all entries if none exist. e.g. will not create A if AAAA exists. Needs `allowCreate=true` in .env
#### Example URL to update A record (IPv4) of home.example.com:
https://`dyndns.example.com`/update.php?user=`username`&password=`password`&domain=`home.example.com`&ipv4=`IPv4`
#### Example URL to force update AAAA record (IPv6) of example.com:
https://`dyndns.example.com`/update.php?user=`username`&password=`password`&domain=`example.com`&ipv6=`IPv6`&force=`true`
#### Example URL to update A and AAAA records of home.example.com:
https://`dyndns.example.com`/update.php?user=`username`&password=`password`&domain=`home.example.com`&ipv4=`IPv4`&ipv6=`IPv6`
#### Example URL to update TXT record _acme-challenge of home.example.com:
https://`dyndns.example.com`/update.php?user=`username`&password=`password`&domain=`_acme-challenge.example.com`&txt=`textcontent`
#### Example URL to update A record of nas.home.example.com:
https://`dyndns.example.com`/update.php?user=`username`&password=`password`&domain=`example.com`&host=`nas.home`&ipv4=`IPv4`
#### Example URL to update AAAA wildcard record of example.com:
https://`dyndns.example.com`/update.php?user=`username`&password=`password`&domain=`example.com`&mode=`*`
#### Example URL to create A and TXT records of new.example.com:
https://`dyndns.example.com`/update.php?user=`username`&password=`password`&domain=`new.example.com`&ipv4=`IPv4`&txt=`textcontent`&create=`true`
### AVM FRITZ!Box Settings
* Go to "Internet" -> "Freigaben" -> "DynDNS"
* Choose "Benutzerdefiniert"
* Update-URL: `https:///update.php?user=&password=&ipv4=&ipv6=&domain=`
* only the url needs to be adjusted, the rest is automatically filled by your AVM FRITZ!Box
* http or https is possible if valid SSL certificate (e.g. Let's Encrypt)
* Single Domain:
* Domainname: ``
* Multiple Domains:
* Domainname: `,,....`
* Username: ``
* Password: ``
### Synology DSM Settings
* Go to "Control Panel" -> "External Access" -> "DDNS"
* Click on "Customize Provider" to create a profile for your own DDNS server
* Service Provider: This is the display name of your custom provider
* Update-URL: `https:///update.php?user=__USERNAME__&password=__PASSWORD__&ipv4=__MYIP__&domain=__HOSTNAME__`
* Attention: The variables are delimited by two underscores
* Currently Synology custom DDNS does not support IPv6, for whatever reason.
* Save your custom provider
* Click on "Add" to create a DDNS job
* Select your custom provider. Notice that an asterisk [*] has appeared in front of the name to signify that this is a custom provider.
* Hostname: ``
* Username/Email: ``
* Password/Key: ``
* External Address (IPv4): probably "Auto", uses Synology service to find own external IP
* External Address (IPv6): doesn't matter, currently not supported by Synology
### pfSense Settings
* Go to "Services" -> "Dynamic DNS"
* Click on "Add" to create a DDNS profile
* Service Type: "Custom"
* Interface to monitor: `