// @ts-check /// // Helpers /** * @param {object} record * @param {string[]} [record.alpn] * @param {string[]} [record.ipv4hint] * @param {string[]} [record.ipv6hint] */ function https(record) { return Object.keys(record) .map(function (key) { return [key, record[key].join(',')].join('=') }) .join(' ') } /** * @param {string} name * @param {string} [acmeTarget] */ function fly(name, acmeTarget) { var records = [ ALIAS(name, 'alanpearce-eu.fly.dev.'), HTTPS(name, 1, '.', https({ alpn: ['h2'], })), ] if (acmeTarget != null) { records.push(CNAME(name === '@' ? '_acme-challenge' : '_acme-challenge.' + name, acmeTarget)) } return records } /** * @param {string} name */ function netlify(name) { var rec = name === '@' ? ALIAS : CNAME return [ rec(name, 'apex-loadbalancer.netlify.com.'), ] } /** * @param {string} domain * @param {string} verification * @param {string[]} [extras] */ function iCloudMail(domain, verification, extras) { if (extras == null) { extras = [] } return [ MX('@', 10, 'mx01.mail.icloud.com.'), MX('@', 10, 'mx02.mail.icloud.com.'), TXT('@', 'apple-domain=' + verification), SPF_BUILDER({ parts: ['v=spf1'].concat(extras).concat('include:icloud.com', '-all'), }), CNAME('sig1._domainkey', 'sig1.dkim.' + domain + '.at.icloudmailadmin.com.'), ] } /** * @param {string[]} sources * @param {string} target */ function bulkCNAME(sources, target) { return sources.map(function (source) { return CNAME(source, target) }) } /** * @param {string} subdomain * @param {string[]} targets */ function delegate(subdomain, targets) { return targets.map(function (target) { return NS(subdomain, target) }) } var heHosts = [ "ns1", "ns2", "ns3", "ns4", "ns5" ].map(function (hostname) { return hostname + '.he.net.' }) var nameserversHE = heHosts.map(function (hostname) { return NAMESERVER(hostname) }) var acmeLetsEncrypt = [ CAA_BUILDER({ iodef: 'mailto:alan@alanpearce.eu', issue: ['letsencrypt.org'], issuewild: ['letsencrypt.org'], issuemail: ['none'], issuevmc: ['none'] }), ] var soa = SOA('@', 'ns1.he.net.', 'hostmaster.alanpearce.eu.', 43200, 3600, 2419200, 120) // Providers: var RegistrarNone = NewRegistrar('none') var RegistrarOVH = NewRegistrar('ovh') var PowerDNS = NewDnsProvider('powerdns', { 'zone_kind': 'Master', }) // Domains: DEFAULTS(DefaultTTL('1d'), NAMESERVER_TTL('1d')) D( 'alanpearce.eu', RegistrarOVH, DnsProvider(PowerDNS), soa, nameserversHE, acmeLetsEncrypt, fly('@'), netlify('www'), // prettier-ignore bulkCNAME([ 'binarycache', 'ci', 'dns', 'files', 'git', 'glitch', 'go', 'iam', 'ntfy', 'redis', 'pdns', 'searchix', 'stats', 'test', ], 'linde'), CNAME('*.stats', 'linde'), CNAME('zola-bearblog', 'zola-bearblog.netlify.app.'), TXT('subdomain-owner-verification', '2da94817a704cfce6a6358d2062f52c9'), CNAME('nanopi', 'home'), CNAME('nano', 'home'), CNAME('home', 'alinnow.asuscomm.com.'), A('linde', '116.203.248.56'), AAAA('linde', '2a01:4f8:c012:23a4::1'), HTTPS('linde', 1, '.', 'alpn=h3,h2'), SSHFP('linde', 1, 1, 'ef6691558281a88b874ac41cf7c14d31209e64bc'), SSHFP('linde', 1, 2, '5d1b6ecff5dd5c624ee662eb1684c3c9e42f9a138aa938ba8d018fbc5cf628de'), SSHFP('linde', 4, 1, 'ec773b94dec19f70cb6df7c78df0229a6fbe9666'), SSHFP('linde', 4, 2, '72f576b32b5c2d16312574182b028671fa39c8bab03d802fae04eb7f649d2570'), CNAME('*.linde', 'linde'), iCloudMail('alanpearce.eu', 'anzQe301nq7grixH', ['a:linde.alanpearce.eu']), DMARC_BUILDER({ policy: 'reject', percent: 100, subdomainPolicy: 'reject', alignmentSPF: 'r', }) ) D( 'alin.ovh', RegistrarOVH, DnsProvider(PowerDNS), soa, nameserversHE, acmeLetsEncrypt, netlify('@'), netlify('www'), // prettier-ignore bulkCNAME([ 'binarycache', 'cal', 'ci', 'dns', 'files', 'git', 'glitch', 'go', 'id', 'iam', 'jf', 'ntfy', 'mx', 'read', 'redis', 'pdns', 'searchix', 'stats', 'test', 'users', ], 'linde'), CNAME('*.stats', 'linde'), CNAME('home', 'alinnow.asuscomm.com.'), A('linde', '116.203.248.56'), AAAA('linde', '2a01:4f8:c012:23a4::1'), HTTPS('linde', 1, '.', 'alpn=h3,h2'), SSHFP('linde', 1, 1, 'ef6691558281a88b874ac41cf7c14d31209e64bc'), SSHFP('linde', 1, 2, '5d1b6ecff5dd5c624ee662eb1684c3c9e42f9a138aa938ba8d018fbc5cf628de'), SSHFP('linde', 4, 1, 'ec773b94dec19f70cb6df7c78df0229a6fbe9666'), SSHFP('linde', 4, 2, '72f576b32b5c2d16312574182b028671fa39c8bab03d802fae04eb7f649d2570'), TXT('202511._domainkey', "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+wYyo6L9o1OkyBnTrNquYqoWwgSkaiXKb2kUy22pV3GAgmX75ntqYroKPdrx7yNr3eKjhYy4M8w4hTasasgjNlT/u4uHR3UNSfA6Rfg4xHfbWocquSD5Bpa7+ocADPFX7r57kJYuwTaGxfFQpA+n2EEdkMI1Z7nGDhUm0zn7WfwIDAQAB"), TXT('202511._domainkey.linde', "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+wYyo6L9o1OkyBnTrNquYqoWwgSkaiXKb2kUy22pV3GAgmX75ntqYroKPdrx7yNr3eKjhYy4M8w4hTasasgjNlT/u4uHR3UNSfA6Rfg4xHfbWocquSD5Bpa7+ocADPFX7r57kJYuwTaGxfFQpA+n2EEdkMI1Z7nGDhUm0zn7WfwIDAQAB"), CNAME('*.linde', 'linde'), AAAA('pr', '2a01:4f8:c012:23a4::2222'), HTTPS('pr', 1, '.', 'alpn=h3,h2'), CNAME('zola-bearblog', 'zola-bearblog.netlify.app.'), CNAME('status', 'cname.status.phare.io.'), iCloudMail('alin.ovh', 'VgiTkEni66SwcRxU', ['a:linde.alanpearce.eu']), DMARC_BUILDER({ policy: 'reject', percent: 100, subdomainPolicy: 'reject', rua: ['mailto:re+wloi96boexp@dmarc.postmarkapp.com'], alignmentSPF: 'r', }) ) D( 'alanpearce.uk', RegistrarOVH, DnsProvider(PowerDNS), acmeLetsEncrypt, netlify('@'), netlify('www'), iCloudMail('alanpearce.uk', 'BNdyqalwDX8kwF6k'), DMARC_BUILDER({ policy: 'reject', percent: 100, subdomainPolicy: 'reject', rua: ['mailto:re+kef20qlkynz@dmarc.postmarkapp.com'], alignmentSPF: 'r', }), soa, nameserversHE, ) D( 'aln.pe', RegistrarNone, DnsProvider(PowerDNS), DefaultTTL(86400), NAMESERVER_TTL(86400), acmeLetsEncrypt, netlify('@'), netlify('www'), SPF_BUILDER({ parts: ['v=spf1', '-all'], }), CNAME('*', 'alanpearce.eu.'), soa, nameserversHE ) D( 'searchix.ovh', RegistrarOVH, DnsProvider(PowerDNS), DefaultTTL(86400), NAMESERVER_TTL(86400), acmeLetsEncrypt, SPF_BUILDER({ parts: ['v=spf1', '-all'], }), soa, nameserversHE, ALIAS('@', 'linde.alanpearce.eu.'), HTTPS('@', 1, '.', 'alpn=h3,h2'), CNAME('stable', 'granatum.opia.ovh.'), CNAME('status', 'cname.status.phare.io.') )