// @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} target * @param {string} prefix */ function prefix(target, prefix) { return target === '@' ? prefix : prefix + '.' + 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 {RecordModifier[]} [modifiers] */ function fly(name, modifiers) { var ownershipValue = 'app-d8rdp9j'; var flyApp = 'd8rdp9j.flynet-butterfly-1123.fly.dev.' var rec = name === '@' ? ALIAS : CNAME var primary = rec.bind(null, name, flyApp) var records = [ primary.apply(null, modifiers), TXT.bind(null, prefix(name, '_fly-ownership'), ownershipValue).apply(null, modifiers), ] if (rec === ALIAS) { records.push( HTTPS.bind(null, name, 1, flyApp, https({ alpn: ['h2'], ipv4hint: ['auto'], ipv6hint: ['auto'], })).apply(null, modifiers), ) } return records } /** * @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) }) } var nameservers = [ 'ns-global.kjsl.com.', 'puck.nether.net.', ] var ns_records = nameservers.map(function (hostname) { return NAMESERVER(hostname) }) var soa = SOA('@', nameservers[0], 'hostmaster.alanpearce.eu.', 43200, 3600, 2419200, 120) // Providers: 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, ns_records, CAA_BUILDER({ iodef: 'mailto:alan@alanpearce.eu', issue: [ 'actalis.it', ], issuewild: ['none'], issuemail: ['none'], issuevmc: ['none'] }), fly('@', [TTL('1h')]), HTTPS( '@', 10, 'homestead-homestead488.danubedata.run.', https({ alpn: ['h2'], ipv4hint: ['auto'], ipv6hint: ['auto'], }), TTL('1h') ), // acmeDelegate('@', '019dbafc-1535-723a-a7f4-1767cc565d5f._acme.danubedata.run.'), fly('www'), acmeDelegate('www', 'www.alanpearce.eu.019dd44b._acme.danubedata.run.'), // prettier-ignore bulkCNAME([ 'go', 'git', 'searchix', ], 'hasel.alin.ovh.'), TXT('subdomain-owner-verification', '2da94817a704cfce6a6358d2062f52c9'), IGNORE('home', 'A,AAAA'), IGNORE('_acme-challenge', 'TXT'), IGNORE('_acme-challenge.**', 'TXT'), iCloudMail('alanpearce.eu', 'anzQe301nq7grixH', ['a:hasel.alin.ovh']), DMARC_BUILDER({ policy: 'reject', percent: 100, subdomainPolicy: 'reject', alignmentSPF: 'r', }) ) D( 'alin.ovh', RegistrarOVH, DnsProvider(PowerDNS), soa, ns_records, CAA_BUILDER({ iodef: 'mailto:alin@alin.ovh', issue: [ 'actalis.it', ], issuewild: ['none'], issuemail: ['none'], issuevmc: ['none'] }), fly('@', [TTL('1h')]), HTTPS( '@', 10, 'homestead-homestead488.danubedata.run.', https({ alpn: ['h2'], ipv4hint: ["auto"], ipv6hint: ['auto'], }), TTL('1h') ), acmeDelegate('@', 'alin.ovh.019dd3dc._acme.danubedata.run.'), fly('www'), acmeDelegate('www', 'www.alin.ovh.019dd449._acme.danubedata.run.'), fly('status'), fly('uptime'), bulkCNAME([ 'binarycache', 'cal', 'ci', 'files', 'git', 'go', 'iam', 'id', 'notify', 'pdns', 'redis', 'searchix', 'stats', '*.stats', ], 'hasel'), IGNORE('home', 'A,AAAA'), IGNORE('_acme-challenge', 'TXT'), IGNORE('_acme-challenge.**', 'TXT'), A('hasel', '185.55.243.110'), AAAA('hasel', '2a00:1913:682b::'), SSHFP('hasel', 1, 1, '4ab581a1f0d115678e6724e2d865208ab195ccd6'), SSHFP('hasel', 1, 2, 'f50a2082a18b4bcf96c3f94c9554312468e67c65ef44a936c8d12933dc2416a8'), SSHFP('hasel', 4, 1, '664e7f23544b9c758ee66d5f8164db7a6d5970e8'), SSHFP('hasel', 4, 2, '27a1dbd525c0efe21f56dba96dfcd7c7bdb07756e510ca15e2626e23ef2483b6'), AAAA('buk', '2a03:3b40:fe:87::1'), iCloudMail('alin.ovh', 'VgiTkEni66SwcRxU', ['a:hasel.alin.ovh']), DMARC_BUILDER({ policy: 'reject', percent: 100, subdomainPolicy: 'reject', rua: ['mailto:re+wloi96boexp@dmarc.postmarkapp.com'], alignmentSPF: 'r', }) ) D( 'searchix.ovh', RegistrarOVH, DnsProvider(PowerDNS), DefaultTTL(86400), NAMESERVER_TTL(86400), CAA_BUILDER({ iodef: 'mailto:tls@alin.ovh', issue: [ 'actalis.it', ], issuewild: ['none'], issuemail: ['none'], issuevmc: ['none'] }), IGNORE('_acme-challenge', 'TXT'), IGNORE('_acme-challenge.**', 'TXT'), SPF_BUILDER({ parts: ['v=spf1', '-all'], }), soa, ns_records, ALIAS('@', 'hasel.alin.ovh.'), HTTPS('@', 1, 'hasel.alin.ovh.', 'alpn=h3,h2 ipv4hint=auto ipv6hint=auto'), CNAME('stats', 'hasel.alin.ovh.'), CNAME('stable', 'hasel.alin.ovh.'), CNAME('stats.stable', 'hasel.alin.ovh.'), fly('status') )