// @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} target */ function ensureAbsolute(target) { return target.endsWith('.') ? target : target + '.' } /** * @param {string} name * @param {string} acmeTarget */ function acmeDelegate(name, acmeTarget) { return CNAME( name === '@' ? '_acme-challenge' : '_acme-challenge.' + name, ensureAbsolute(acmeTarget), TTL('15m'), ) } /** * @param {string} name * @param {string} [acmeTarget] */ function fly(name, acmeTarget) { var records = [ ALIAS(name, 'alanpearce-eu.fly.dev.'), HTTPS(name, 1, 'alanpearce-eu.fly.dev.', https({ alpn: ['h2'], })), ] if (acmeTarget != null) { records.push(acmeDelegate(name, acmeTarget)) } return records } /** * @description point name to target with an ALIAS or CNAME record * @param {string} name * @param {string} target * @param {RecordModifier[]} [modifiers] */ function link(name, target, modifiers) { if (modifiers == null || modifiers.length === 0) { modifiers = [] } var rec = name === '@' ? ALIAS : CNAME return rec.bind(null, name, ensureAbsolute(target)).apply(null, modifiers) } /** * @param {string} name */ function netlify(name) { return link(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 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, CAA_BUILDER({ iodef: 'mailto:alan@alanpearce.eu', issue: [ 'actalis.it', 'letsencrypt.org', // fly/netlify ], issuewild: ['none'], issuemail: ['none'], issuevmc: ['none'] }), link('@', 'homestead-homestead488.danubedata.run.', [TTL('1h')]), HTTPS('@', 10, 'homestead-homestead488.danubedata.run.', https({ alpn: ['h2'], }), TTL('1h')), acmeDelegate('@', '019dbafc-1535-723a-a7f4-1767cc565d5f._acme.danubedata.run.'), netlify('www'), // prettier-ignore bulkCNAME([ 'go', 'git', 'searchix', ], 'smrk.alin.ovh.'), CNAME('zola-bearblog', 'zola-bearblog.netlify.app.'), TXT('subdomain-owner-verification', '2da94817a704cfce6a6358d2062f52c9'), IGNORE('home', 'A,AAAA'), IGNORE('_acme-challenge', 'TXT'), IGNORE('_acme-challenge.**', 'TXT'), iCloudMail('alanpearce.eu', 'anzQe301nq7grixH', ['a:smrk.alin.ovh']), DMARC_BUILDER({ policy: 'reject', percent: 100, subdomainPolicy: 'reject', alignmentSPF: 'r', }) ) D( 'alin.ovh', RegistrarOVH, DnsProvider(PowerDNS), soa, nameservers, CAA_BUILDER({ iodef: 'mailto:alin@alin.ovh', issue: [ 'actalis.it', 'letsencrypt.org', // fly/netlify ], issuewild: ['none'], issuemail: ['none'], issuevmc: ['none'] }), link('@', 'homestead-homestead488.danubedata.run.', [TTL('1h')]), HTTPS('@', 1, 'homestead-homestead488.danubedata.run.', https({ alpn: ['h2'], }), TTL('1h')), acmeDelegate('@', '019dbafd-3673-705c-a3c8-177f3e1df556._acme.danubedata.run.'), netlify('www'), bulkCNAME([ 'binarycache', 'cal', 'files', 'git', 'go', 'id', 'iam', 'jf', 'ntfy', 'pdns', 'redis', 'searchix', 'stats', ], 'smrk'), IGNORE('home', 'A,AAAA'), IGNORE('_acme-challenge', 'TXT'), IGNORE('_acme-challenge.**', 'TXT'), bulkCNAME([ 'ci', ], 'smrk'), 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'), TXT("202603._domainkey", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArUoGjPPZIrgNU27iLOWqwFHI0WYQE2cnrfnfFxiNlJ0676yHyKTgiegGQpIUeWDrU4/yuwdMm+JHltBAa/8xmn5NBWosZB45W9Ddi0/q5o9pFq2+QbK/+a/TCU5U3MSh2MI5HehASOvNUsjX79aUjz0ni5U7J/vWNcaGwcrqKrfPNFRrXg4s2QoYjJVIwRyVSHzpaMszV0adaD5BmMaRBMnZBls1apQi1KhQsOWegBY65ghW9gw6itJj9OZ9YV5pdEH0m8Gv5RWG+kJVDeGhuvi933PsMmPffnJymwVAI7ndtVp1D1QHRi8gYGqUd46wmUm2wX+v67inS0q9NcY8dwIDAQAB"), TXT("202603._domainkey.smrk", "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArUoGjPPZIrgNU27iLOWqwFHI0WYQE2cnrfnfFxiNlJ0676yHyKTgiegGQpIUeWDrU4/yuwdMm+JHltBAa/8xmn5NBWosZB45W9Ddi0/q5o9pFq2+QbK/+a/TCU5U3MSh2MI5HehASOvNUsjX79aUjz0ni5U7J/vWNcaGwcrqKrfPNFRrXg4s2QoYjJVIwRyVSHzpaMszV0adaD5BmMaRBMnZBls1apQi1KhQsOWegBY65ghW9gw6itJj9OZ9YV5pdEH0m8Gv5RWG+kJVDeGhuvi933PsMmPffnJymwVAI7ndtVp1D1QHRi8gYGqUd46wmUm2wX+v67inS0q9NcY8dwIDAQAB"), AAAA('buk', '2a03:3b40:fe:87::1'), CNAME('zola-bearblog', 'zola-bearblog.netlify.app.'), iCloudMail('alin.ovh', 'VgiTkEni66SwcRxU', ['a:smrk.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), CAA_BUILDER({ iodef: 'mailto:alan@alanpearce.eu', issue: [ 'actalis.it', 'letsencrypt.org', // netlify ], issuewild: ['none'], issuemail: ['none'], issuevmc: ['none'] }), IGNORE('_acme-challenge', 'TXT'), IGNORE('_acme-challenge.**', 'TXT'), netlify('@'), // soft-disable these names HTTPS('@', 0, '.', ''), HTTPS('www', 0, '.', ''), 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), CAA_BUILDER({ iodef: 'mailto:alan@alanpearce.eu', issue: [ 'actalis.it', 'letsencrypt.org' // netlify ], issuewild: ['none'], issuemail: ['none'], issuevmc: ['none'] }), IGNORE('_acme-challenge', 'TXT'), IGNORE('_acme-challenge.**', 'TXT'), 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), CAA_BUILDER({ iodef: 'mailto:tls@alin.ovh', issue: [ 'actalis.it', 'letsencrypt.org', // bunny ], issuewild: ['none'], issuemail: ['none'], issuevmc: ['none'] }), IGNORE('_acme-challenge', 'TXT'), IGNORE('_acme-challenge.**', 'TXT'), SPF_BUILDER({ parts: ['v=spf1', '-all'], }), soa, nameservers, ALIAS('@', 'smrk.alin.ovh.'), HTTPS('@', 1, '.', 'alpn=h3,h2'), CNAME('stable', 'smrk.alin.ovh.'), CNAME('status', 'cname.status.phare.io.') )