]> git.openstreetmap.org Git - dns.git/blob - dnsconfig.js
Switch osm.org to Fastly. Initial short experiment
[dns.git] / dnsconfig.js
1 var REG_NONE = NewRegistrar("none");
2 var REG_GANDI = NewRegistrar("gandi_v5");
3 var PROVIDER = NewDnsProvider("cloudflare");
4
5 var DOMAIN;
6 var REGISTRAR;
7 var DYNAMIC_RECORDS;
8
9 var QUALIFY = function (name) {
10   return name + "." + DOMAIN + ".";
11 };
12
13 function loadTemplate(template) {
14   return function (domain, registrar) {
15     DOMAIN = domain;
16     REGISTRAR = registrar;
17
18     require("src/" + template + ".js");
19   };
20 }
21
22 /**
23  * Create A, optional AAAA, and optional HTTPS (SVCB) records for an OSM web service,
24  * with optional Cloudflare proxy support.
25  *
26  * @param {string} name                - Hostname (e.g. "www").
27  * @param {string[]} servers           - Required array of servers.
28  * @param {Object} [options]           - Optional settings for HTTPS and Cloudflare.
29  * @param {boolean} [options.h1=false]  - If true, sets HTTPS apn=http1.1
30  * @param {boolean} [options.h2=true]  - If true, sets HTTPS apn=h2
31  * @param {boolean} [options.h3=false]  - If true, sets HTTPS apn=h3
32  * @param {boolean} [options.cfproxy=false] - If true, enables Cloudflare proxy on A/AAAA.
33  *
34  */
35 function osm_web_service(
36   name,
37   servers,
38   options
39 ) {
40
41   // If servers is a string, convert to a single-element array
42   if (typeof servers === "string") {
43     servers = [servers];
44   }
45
46   if (options === undefined) {
47     options = {};
48   }
49
50   // Set default values for options.h1, options.h2, and options.h3
51   options.h1 = options.h1 !== undefined ? options.h1 : false;
52   options.h2 = options.h2 !== undefined ? options.h2 : true;
53   options.h3 = options.h3 !== undefined ? options.h3 : false;
54
55   var records = [];
56   var ipv4s = [];
57   var ipv6s = [];
58
59   servers.forEach(function(serverName) {
60     if (IPV4[serverName]) {
61       ipv4s.push(IPV4[serverName]);
62       if (!options.cfproxy) {
63         records.push(A(name, IPV4[serverName]));
64       } else {
65         records.push(A(name, IPV4[serverName], CF_PROXY_ON));
66       }
67     }
68     if (IPV6[serverName]) {
69       ipv6s.push(IPV6[serverName]);
70       if (!options.cfproxy) {
71         records.push(AAAA(name, IPV6[serverName]));
72       } else {
73         records.push(AAAA(name, IPV6[serverName], CF_PROXY_ON));
74       }
75     }
76   });
77
78   if (ipv4s.length === 0 && ipv6s.length === 0) {
79     throw new Error("An IPv4 or IPv6 address is required for " + name + " service");
80   }
81
82   //
83   // Build a parameter string for DNSControl HTTPS() syntax.
84   // Example: "ipv4hint=1.2.3.4,1.2.3.5 ipv6hint=2001:db8::1,2001:db8::2 alpn=h2"
85   //
86   var paramParts = [];
87   if (ipv4s.length > 0) {
88     // Join IPv4 addresses with comma+space
89     paramParts.push("ipv4hint=" + ipv4s.join(","));
90   }
91   if (ipv6s.length > 0) {
92     // Join IPv6 addresses with comma+space
93     paramParts.push("ipv6hint=" + ipv6s.join(","));
94   }
95
96   if (options.h1 || options.h2 || options.h3) {
97     var paramPartsALPN = [];
98     if (options.h3) {
99       paramPartsALPN.push("h3");
100     }
101     if (options.h2) {
102       paramPartsALPN.push("h2");
103     }
104     if (options.h1) {
105       paramPartsALPN.push("http/1.1");
106     }
107     paramParts.push("alpn=" + paramPartsALPN.join(","));
108   }
109
110   // Join the parts with a space
111   var paramString = paramParts.join(" ");
112
113   // Create the HTTPS record with 4 arguments
114   records.push(HTTPS(name, 1, ".", paramString));
115
116
117   return records;
118 }
119
120 // Ensure that the reverse DNS records are in RFC 4183 notation
121 REVCOMPAT("rfc4183");
122
123 var IPV4 = require("src/ipv4.json");
124 var IPV6 = require("src/ipv6.json");
125
126 var HOST_RECORDS = [];
127
128 for (var name in IPV4) {
129   HOST_RECORDS.push(A(name, IPV4[name]));
130 }
131
132 for (var name in IPV6) {
133   HOST_RECORDS.push(AAAA(name, IPV6[name]));
134 }
135
136 var OPENSTREETMAP = loadTemplate("openstreetmap");
137 var OPENSTREETMAP_MINIMAL = loadTemplate("openstreetmap-minimal");
138
139 require("include/sshfp.js");
140 require("include/nominatim.js");
141
142 try {
143   require("include/geo.js");
144 } catch (e) {
145   var GEO_NS_RECORDS = [];
146 }
147
148 // Publish CAA records indicating that only letsencrypt and globalsign (Fastly) should issue certificates
149 var OSM_CAA = [
150   CAA_BUILDER({
151     label: "@",
152     ttl: "1h",
153     iodef: "mailto:hostmaster@openstreetmap.org",
154     issue: [
155       "letsencrypt.org",
156       "globalsign.com",   // Used by Fastly for CDN certificates
157     ],
158     issuewild: [
159       "letsencrypt.org",
160       "globalsign.com",   // Used by Fastly for CDN certificates
161     ],
162   }),
163 ];
164
165 OPENSTREETMAP("openstreetmap.org", REG_GANDI);
166 OPENSTREETMAP("openstreetmap.com", REG_GANDI);
167 OPENSTREETMAP("openstreetmap.net", REG_GANDI);
168 OPENSTREETMAP_MINIMAL("openstreetmap.ca", REG_GANDI); // Richard Weait managed the registration
169 OPENSTREETMAP("openstreetmap.eu", REG_NONE); // fossgis.de manages the registration
170 OPENSTREETMAP("openstreetmap.pro", REG_GANDI);
171 OPENSTREETMAP_MINIMAL("openstreetmap.gay", REG_GANDI);
172 OPENSTREETMAP("openstreetmaps.org", REG_GANDI);
173 OPENSTREETMAP("osm.org", REG_GANDI);
174 OPENSTREETMAP("openmaps.org", REG_GANDI);
175 OPENSTREETMAP("openstreetmap.io", REG_GANDI);
176 OPENSTREETMAP("osm.io", REG_GANDI);
177 OPENSTREETMAP_MINIMAL("openstreetmap.li", REG_GANDI);
178 OPENSTREETMAP("openworldmap.org", REG_GANDI);
179 OPENSTREETMAP("freeosm.org", REG_GANDI);
180 OPENSTREETMAP("open-maps.org", REG_GANDI);
181 OPENSTREETMAP("open-maps.com", REG_GANDI);
182 OPENSTREETMAP("osmbugs.org", REG_GANDI);
183 OPENSTREETMAP_MINIMAL("openstreetmap.ai", REG_GANDI);
184 OPENSTREETMAP_MINIMAL("openstreetmap.am", REG_GANDI);
185 OPENSTREETMAP_MINIMAL("openstreetmap.fi", REG_GANDI);
186 OPENSTREETMAP_MINIMAL("openstreetmap.gr", REG_GANDI);
187 OPENSTREETMAP_MINIMAL("openstreetmap.me", REG_GANDI);
188 OPENSTREETMAP_MINIMAL("openstreetmap.mx", REG_GANDI);
189 OPENSTREETMAP_MINIMAL("openstreetmap.pe", REG_GANDI);
190 OPENSTREETMAP_MINIMAL("openstreetmap.ph", REG_GANDI);
191 OPENSTREETMAP_MINIMAL("openstreetmap.se", REG_GANDI); // Transfer to OSMF care 23 Sept 2025
192 OPENSTREETMAP_MINIMAL("openstreetmap.sg", REG_GANDI);
193 OPENSTREETMAP_MINIMAL("openstreetmap.tv", REG_GANDI);
194 OPENSTREETMAP_MINIMAL("openstreetmap.wales", REG_GANDI);
195 OPENSTREETMAP("openstreetmapdata.org", REG_GANDI);
196
197 // Disable due to registration issue
198 // OPENSTREETMAP("openstreetmap.al", REG_NONE);
199
200 D_EXTEND("openstreetmap.org",
201   CNAME("_acme-challenge.tile", "bxve5ryiwwv7woiraq.fastly-validations.com.", TTL("10m")),
202   CNAME("_acme-challenge.www", "hv7ku2116ruaoctsdy.fastly-validations.com.", TTL("10m")),
203   CNAME("_acme-challenge", "ubtonkdwf7q3za34m7.fastly-validations.com.", TTL("10m")),
204   CNAME("_acme-challenge.maps", "2leu29v9afqhemef1q.fastly-validations.com.", TTL("10m")),
205   CNAME("_acme-challenge.mapz", "rmoim12atygshmupwo.fastly-validations.com.", TTL("10m")),
206   CNAME("_acme-challenge.api", "8tehoklqvtfwibarur.fastly-validations.com.", TTL("10m")),
207   CNAME("_acme-challenge.nominatim", "awgahoan90pug3ahwe.fastly-validations.com.", TTL("10m")),
208
209   // Uptime site at StatusCake
210   CNAME("uptime", "uptimessl-new.statuscake.com."),
211
212   HOST_RECORDS,
213   SSHFP_RECORDS,
214   GEO_NS_RECORDS,
215   NOMINATIM_RECORDS,
216 );
217
218 D_EXTEND("osm.org",
219   CNAME("_acme-challenge.tile", "21gvdfyyxjoc4lmsem.fastly-validations.com.", TTL("10m")),
220   CNAME("_acme-challenge.www", "qs9mizzvj2ahu30lf8.fastly-validations.com.", TTL("10m")),
221   CNAME("_acme-challenge", "k0jpswighq5jhf18ft.fastly-validations.com.", TTL("10m")),
222   CNAME("_acme-challenge.maps", "do483jonhr62v692b3.fastly-validations.com.", TTL("10m")),
223   CNAME("_acme-challenge.mapz", "bqwrbkn9ro4bk6qst0.fastly-validations.com.", TTL("10m")),
224   CNAME("_acme-challenge.api", "io2kxc7zwh7qhv8ils.fastly-validations.com.", TTL("10m")),
225   CNAME("_acme-challenge.nominatim", "92s4lnmzw5u38t7h0h.fastly-validations.com.", TTL("10m")),
226
227   HOST_RECORDS,
228   SSHFP_RECORDS,
229 );
230
231 // Add TXT records for Fastly domain verification
232 D_EXTEND("openstreetmap.com",
233     TXT("@", "fastly-domain-delegation-fddelt00562353-11-27-25"),
234     CNAME("_acme-challenge.www", "ca8edx6j0j9bajvnsg.fastly-validations.com.", TTL("10m")),
235     CNAME("_acme-challenge", "ainebd3sbkqlnd7xov.fastly-validations.com.", TTL("10m")),
236     CNAME("_acme-challenge.nominatim", "sdbt50u2ph4qtyed64.fastly-validations.com.", TTL("10m")),
237 );
238
239 // Add TXT records for Fastly domain verification
240 D_EXTEND("openstreetmaps.org",
241     TXT("@", "fastly-domain-delegation-fddelt00562353-11-27-25"),
242     CNAME("_acme-challenge.nominatim", "h11ge5fz27wesj7ed7.fastly-validations.com.", TTL("10m")),
243 );
244
245 // Add TXT records for Fastly domain verification
246 D_EXTEND("openstreetmap.net",
247     CNAME("_acme-challenge.nominatim", "2gt66frz9mw2vyxeet.fastly-validations.com.", TTL("10m")),
248 );
249
250 // Add TXT records for Fastly domain verification
251 D_EXTEND("openmaps.org",
252     CNAME("_acme-challenge.nominatim", "so1z8p2v65qhhll8ke.fastly-validations.com.", TTL("10m")),
253 );
254
255 // qgis.org is an external domain
256 // CNAME _acme-challenge.nominatim.qgis.org to swkbam5e9pajdkw4zn.fastly-validations.com.
257
258 // Mastodon redirects to en.osm.town
259 var OPENSTREETMAP_TOWN = loadTemplate("openstreetmap-town");
260 OPENSTREETMAP_TOWN("openstreetmap.town", REG_GANDI);
261
262 // Domain owned by Amanda McCann
263 // osm.town
264
265 // Managed independently by Guillaume Rischard
266 // openstreetmap.lu
267 // osm.lu
268
269 var OSM_LI = loadTemplate("osm-li");
270
271 OSM_LI("osm.li", REG_GANDI);
272
273 var OPENSTREETMAP_NZ = loadTemplate("openstreetmap-nz");
274
275 OPENSTREETMAP_NZ("openstreetmap.nz", REG_GANDI);
276 OPENSTREETMAP_NZ("openstreetmap.org.nz", REG_GANDI);
277
278 var OPENSTREETMAP_UK = loadTemplate("openstreetmap-uk");
279
280 OPENSTREETMAP_UK("openstreetmap.uk", REG_GANDI);
281 OPENSTREETMAP_UK("openstreetmap.org.uk", REG_GANDI);
282 OPENSTREETMAP_UK("openstreetmap.co.uk", REG_GANDI);
283
284 var OPENSTREETMAP_ZA = loadTemplate("openstreetmap-za");
285
286 OPENSTREETMAP_ZA("openstreetmap.org.za", REG_NONE); // Registration managed by Grant Slater via https://www.vweb.co.za/
287 OPENSTREETMAP_ZA("osm.org.za", REG_NONE); // Registration managed by Grant Slater via https://www.vweb.co.za/
288
289 var OSMFOUNDATION = loadTemplate("osmfoundation");
290
291 OSMFOUNDATION("osmfoundation.org", REG_GANDI);
292
293 var STATEOFTHEMAP = loadTemplate("stateofthemap");
294
295 STATEOFTHEMAP("stateofthemap.org", REG_GANDI);
296 STATEOFTHEMAP("stateofthemap.com", REG_GANDI);
297 STATEOFTHEMAP("sotm.org", REG_GANDI);
298
299 // The domain is registation is managed by FOSSGIS.de
300 var STATEOFTHEMAP_EU = loadTemplate("stateofthemap-eu");
301 STATEOFTHEMAP_EU("stateofthemap.eu", REG_NONE);
302
303 // State of the Map Madagascar
304 var OPENSTREETMAP_MG = loadTemplate("openstreetmap-mg");
305 OPENSTREETMAP_MG("openstreetmap.mg", REG_GANDI);
306
307 var OPENGEODATA = loadTemplate("opengeodata");
308 OPENGEODATA("opengeodata.org", REG_GANDI);
309
310 var SWITCH2OSM = loadTemplate("switch2osm");
311
312 SWITCH2OSM("switch2osm.org", REG_GANDI);
313 SWITCH2OSM("switch2osm.com", REG_GANDI);
314
315 var OSM2PGSQL = loadTemplate("osm2pgsql");
316
317 OSM2PGSQL("osm2pgsql.org", REG_GANDI);
318 OSM2PGSQL("osm2pgsql.com", REG_GANDI);
319
320 var IDEDITOR = loadTemplate("ideditor");
321
322 IDEDITOR("ideditor.com", REG_GANDI);
323
324 var OSMWIKI = loadTemplate("osm-wiki");
325 OSMWIKI("osm.wiki", REG_GANDI);
326
327 var PTR_HE_AMS_IPV4 = loadTemplate("ptr_he_ams_ipv4");
328
329 PTR_HE_AMS_IPV4(REV("184.104.179.128/27"), REG_NONE);
330
331 var PTR_HE_AMS_IPV6 = loadTemplate("ptr_he_ams_ipv6");
332
333 PTR_HE_AMS_IPV6(REV("2001:470:1:fa1::/64"), REG_NONE);
334
335 var PTR_HE_DUB_IPV4 = loadTemplate("ptr_he_dub_ipv4");
336
337 PTR_HE_DUB_IPV4(REV("184.104.226.96/27"), REG_NONE);
338
339 var PTR_HE_DUB_IPV6 = loadTemplate("ptr_he_dub_ipv6");
340
341 PTR_HE_DUB_IPV6(REV("2001:470:1:b3b::/64"), REG_NONE);
342
343 var PTR_EQUINIX_AMS_IPV4 = loadTemplate("ptr_equinix_ams_ipv4");
344
345 PTR_EQUINIX_AMS_IPV4(REV("82.199.86.96/27"), REG_NONE);
346
347 var PTR_EQUINIX_AMS_IPV6 = loadTemplate("ptr_equinix_ams_ipv6");
348
349 PTR_EQUINIX_AMS_IPV6(REV("2001:4d78:500:5e3::/64"), REG_NONE);
350
351 var PTR_EQUINIX_DUB_IPV4 = loadTemplate("ptr_equinix_dub_ipv4");
352
353 PTR_EQUINIX_DUB_IPV4(REV("87.252.214.96/27"), REG_NONE);
354
355 var PTR_EQUINIX_DUB_IPV6 = loadTemplate("ptr_equinix_dub_ipv6");
356
357 PTR_EQUINIX_DUB_IPV6(REV("2001:4d78:fe03:1c::/64"), REG_NONE);
358
359 // No immediate plans
360 // External DNS and hosting still up
361 // freethepostcode.org
362
363 // External DNS and hosting
364 // openstreetmap.cymru