// @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 * @param {RecordModifier[]} recordModifiers */ function bulkCNAME(sources, target, recordModifiers) { return sources.map(function (source) { return CNAME.bind(CNAME, source, target).apply(CNAME, recordModifiers) }) } /** * @param {string} subdomain * @param {string[]} targets */ function delegate(subdomain, targets) { return targets.map(function (target) { return NS(subdomain, target) }) } var nsHosts = [ "ns3", "ns4", ].map(function (hostname) { return hostname + '.vpsfree.cz.' }) var nameservers = nsHosts.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('@', 'ns3.vpsfree.cz.', '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, nameservers, acmeLetsEncrypt, fly('@'), netlify('www'), // prettier-ignore bulkCNAME([ 'binarycache', 'ci', 'dns', 'files', 'git', 'glitch', 'iam', 'ntfy', 'redis', 'pdns', 'stats', 'test', ], 'linde', [TTL('1h')]), CNAME('*.stats', 'linde'), bulkCNAME([ 'go', 'searchix', ], 'smrk.alin.ovh.', [TTL('1h')]), 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'), TXT("202602._domainkey", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAty4iZSj78RDjNg5XLxZ1/UiPKatt9pQMaF8DPJlr7BNCO3XTDnm5AxU6Wo5iKLb+7+DtUqevRhB/pnPmecIVsnEO0XvCtBIrvlH6DZQAL5nAncTQ/npeXxoRiYLCrwdUTiw2Xvtc4izkqLrdM28KlHy3E3zlmQWLBjU2VD5J56de/UTmOtZWpxopL0jg+MCDt+37vJ0rRrtcXKkBirMsFXEuh9W/QECJdaeqbRJpYa2KB8KlUFEQKE3mE39BfrBHBTnaKv7rFBgCcryAmOTX1NqCfABWEuQXOcfyf5gpXYgHSe31q4RVCOu62bMu1q78fk4+1Rg0Q1p0Szuhf/njxwIDAQAB"), TXT("202602._domainkey.linde", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAty4iZSj78RDjNg5XLxZ1/UiPKatt9pQMaF8DPJlr7BNCO3XTDnm5AxU6Wo5iKLb+7+DtUqevRhB/pnPmecIVsnEO0XvCtBIrvlH6DZQAL5nAncTQ/npeXxoRiYLCrwdUTiw2Xvtc4izkqLrdM28KlHy3E3zlmQWLBjU2VD5J56de/UTmOtZWpxopL0jg+MCDt+37vJ0rRrtcXKkBirMsFXEuh9W/QECJdaeqbRJpYa2KB8KlUFEQKE3mE39BfrBHBTnaKv7rFBgCcryAmOTX1NqCfABWEuQXOcfyf5gpXYgHSe31q4RVCOu62bMu1q78fk4+1Rg0Q1p0Szuhf/njxwIDAQAB"), 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, nameservers, acmeLetsEncrypt, netlify('@'), netlify('www'), // prettier-ignore bulkCNAME([ 'binarycache', 'cal', 'dns', 'files', 'git', 'glitch', 'id', 'iam', 'jf', 'ntfy', 'mx', 'read', 'redis', 'searchix', 'stats', 'test', 'users', ], 'linde', [TTL('1h')]), bulkCNAME([ 'go', 'pdns', ], 'smrk', [TTL('1h')]), 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"), TXT('202602._domainkey', "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwtAyjNnMzYxpL0Kfdpato+DnEoT4dILf9Jc7kBrHBe/YItYwh/tEsvN1kr0djkXgQ8kh0jvKXn6OPmKPKv2t3MeuybOAZLVXQVaM6ZxUVlj+sVRZNqWYX/DT1QTmHeXWpSfEhNsA+WmuhZxd1OSM04rLTPzKvZXwgZhQBAGUiViRQyvwstDyRTPJbTxQ2uJamN6SGI7GmVVof3Bc9SgVtgpHKN1f8ur0nsnZ+2P1yavSUa6v/m2/hWa2ySq2+6ihSa8A8NGs0WyjpPg05OHVn0yJo2M628hUtn0BG8wAvcRCt073QpXK7yFd1IeGJkiWTg1NdQRgBSghF4dwyHIDmwIDAQAB"), TXT('202602._domainkey.linde', "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwtAyjNnMzYxpL0Kfdpato+DnEoT4dILf9Jc7kBrHBe/YItYwh/tEsvN1kr0djkXgQ8kh0jvKXn6OPmKPKv2t3MeuybOAZLVXQVaM6ZxUVlj+sVRZNqWYX/DT1QTmHeXWpSfEhNsA+WmuhZxd1OSM04rLTPzKvZXwgZhQBAGUiViRQyvwstDyRTPJbTxQ2uJamN6SGI7GmVVof3Bc9SgVtgpHKN1f8ur0nsnZ+2P1yavSUa6v/m2/hWa2ySq2+6ihSa8A8NGs0WyjpPg05OHVn0yJo2M628hUtn0BG8wAvcRCt073QpXK7yFd1IeGJkiWTg1NdQRgBSghF4dwyHIDmwIDAQAB"), CNAME('*.linde', 'linde'), bulkCNAME([ 'ci', ], 'smrk', [TTL('1h')]), A('smrk', '37.205.15.148'), AAAA('smrk', '2a03:3b40:fe:7f7::1'), HTTPS('smrk', 1, '.', 'alpn=h3,h2'), SSHFP('smrk', 1, 1, '901839aaf5005948346da47a27f37363f4ddb864'), SSHFP('smrk', 1, 2, 'ef5f7b3cdf0343d63b3c339a4b81095bcaa26be769dc1e06c84c8098277d58ab'), SSHFP('smrk', 4, 1, '20f81f713c0969b5955987fc518f84afd1a3558a'), SSHFP('smrk', 4, 2, '9271f35f41edfab59dde88f640928b86ddc19b0fa5dc640c37e87f572d770b99'), CNAME('zola-bearblog', 'zola-bearblog.netlify.app.'), CNAME('status', 'cname.status.phare.io.'), iCloudMail('alin.ovh', 'VgiTkEni66SwcRxU', ['a:linde.alin.ovh']), 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, nameservers, ) 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, nameservers ) D( 'searchix.ovh', RegistrarOVH, DnsProvider(PowerDNS), DefaultTTL(86400), NAMESERVER_TTL(86400), acmeLetsEncrypt, SPF_BUILDER({ parts: ['v=spf1', '-all'], }), soa, nameservers, ALIAS('@', 'linde.alin.ovh.'), HTTPS('@', 1, '.', 'alpn=h3,h2'), CNAME('stable', 'granatum.opia.ovh.'), CNAME('status', 'cname.status.phare.io.') )