<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Commons Host</title>
    <description>The latest articles on DEV Community by Commons Host (@commonshost).</description>
    <link>https://dev.to/commonshost</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F204%2Fbd15e381-ae78-4012-aed1-98eeb26f2566.png</url>
      <title>DEV Community: Commons Host</title>
      <link>https://dev.to/commonshost</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/commonshost"/>
    <language>en</language>
    <item>
      <title>Gaufre, a Gopher browser in your Web browser</title>
      <dc:creator>Sebastiaan Deckers</dc:creator>
      <pubDate>Wed, 11 Mar 2020 00:35:14 +0000</pubDate>
      <link>https://dev.to/commonshost/gaufre-a-gopher-browser-in-your-web-browser-23oc</link>
      <guid>https://dev.to/commonshost/gaufre-a-gopher-browser-in-your-web-browser-23oc</guid>
      <description>&lt;p&gt;Introducing &lt;strong&gt;Gaufre&lt;/strong&gt;, a Gopher browser in your Web browser.&lt;/p&gt;

&lt;p&gt;Launch the Gaufre web client:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gopher.commons.host"&gt;https://gopher.commons.host&lt;/a&gt;&lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;
      &lt;div class="ltag__twitter-tweet__media ltag__twitter-tweet__media__video-wrapper"&gt;
        &lt;div class="ltag__twitter-tweet__media--video-preview"&gt;
          &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2vb0b4Xn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/ext_tw_video_thumb/1237140035423686656/pu/img/cdhIbdB3sOHdTCsv.jpg" alt="unknown tweet media content"&gt;
          &lt;img src="/assets/play-butt.svg" class="ltag__twitter-tweet__play-butt" alt="Play butt"&gt;
        &lt;/div&gt;
        &lt;div class="ltag__twitter-tweet__video"&gt;
          
            
          
        &lt;/div&gt;
      &lt;/div&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--QtEUkFQq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/985457573145985024/XGblD_kd_normal.jpg" alt="Commons Host profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Commons Host
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @commonshost
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P4t6ys1m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      🧇 Gaufre, the Gopher browser in your web browser, gets a big update:&lt;br&gt;- Themes&lt;br&gt;- Dark/light modes&lt;br&gt;- Page alignment&lt;br&gt;- Custom proxy settings&lt;br&gt;Try it out! &lt;a href="https://t.co/3rgtAzRs9y"&gt;gopher.commons.host&lt;/a&gt; 
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      22:20 PM - 09 Mar 2020
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1237141279248703489" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WwRENZp4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/twitter-reply-action-238fe0a37991706a6880ed13941c3efd6b371e4aefe288fe8e0db85250708bc4.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1237141279248703489" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PFD0MJBa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/twitter-retweet-action-632c83532a4e7de573c5c08dbb090ee18b348b13e2793175fea914827bc42046.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/like?tweet_id=1237141279248703489" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6wx1BHu3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/twitter-like-action-1ea89f4b87c7d37465b0eb78d51fcb7fe6c03a089805d7ea014ba71365be5171.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;p&gt;Most content types found in the Gopherverse are supported. Those includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;plain text&lt;/li&gt;
&lt;li&gt;menus&lt;/li&gt;
&lt;li&gt;input fields&lt;/li&gt;
&lt;li&gt;images&lt;/li&gt;
&lt;li&gt;audio&lt;/li&gt;
&lt;li&gt;video&lt;/li&gt;
&lt;li&gt;HTML (sandboxed, no external requests!)&lt;/li&gt;
&lt;li&gt;PDF&lt;/li&gt;
&lt;li&gt;Binary downloads&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For usability, it is designed with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Responsive text scaling for phone, tablet, and desktop.&lt;/li&gt;
&lt;li&gt;Themes with dark/light modes.&lt;/li&gt;
&lt;li&gt;Delegating basic controls to the web browser (back/forward, bookmarks, reload, etc)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This client is also a proof of concept of two new experimental transport protocols that require &lt;em&gt;no changes to the Gopher protocol&lt;/em&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gopher over HTTP (GoH)&lt;/strong&gt; - Lightweight proxy tunnelling of Gopher data over HTTP request/response.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gopher over TLS (GoT)&lt;/strong&gt; - Encrypted Gopher connections. Uses SNI to support virtual hosting by Gopher servers, and ALPN for forward compatibility.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  About Gopher
&lt;/h2&gt;

&lt;p&gt;The Gopher protocol &lt;a href="https://mncomputinghistory.com/gopher-protocol/"&gt;dates back to 1991&lt;/a&gt; when the Internet was mostly used to publish text based content. A competing service, the World Wide Web with its HTML and HTTP standards, soon took over this role and has kept growing ever since. Nevertheless, a small but passionate community keeps the Gopherverse alive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why?
&lt;/h2&gt;

&lt;p&gt;Retro-computing fans continue to publish hundreds of &lt;del&gt;blogs&lt;/del&gt; phlogs and other content on the Gopher network. Some see it as a fun way to experiment with network programming and server administration. To others Gopher is an &lt;a href="https://box.matto.nl/revivegopher.html"&gt;escape from the ails of complex, modern websites&lt;/a&gt;. Gopher is &lt;a href="https://gopher.floodgap.com/overbite/relevance.html"&gt;free from commercialism, advertising, and tracking&lt;/a&gt;. The Gopher protocol is &lt;em&gt;so simple&lt;/em&gt; that it does not support those &lt;em&gt;features&lt;/em&gt;. Gaufre aims to make the Gopherverse accessible to a new generation of burrowers.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/lUBhOgK5zQI"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Video: The Web Is Broken Beyond Repair. The Alternative? GOPHER! (by DistroTube on Youtube)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Experimental Protocols
&lt;/h2&gt;

&lt;p&gt;With Gaufre, two new protocol designs are introduced to help bring Gopher into the modern Web Platform, without disturbing its charming simplicity.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dU4o3bAD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/j77a8n86mastxgjij104.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dU4o3bAD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/j77a8n86mastxgjij104.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Gaufre client runs client-side in your browser, where it is sandboxed for security reasons and can not access Gopher's raw TCP/IP sockets on port 70. The solution: &lt;em&gt;Gopher over HTTP (GoH)&lt;/em&gt;. Gaufre makes an HTTP request to a very lightweight Gopher over HTTP proxy, which relays the request to the intended Gopher server. The Gopher server's response is returned as raw Gopher data through an HTTP response to Gaufre. Because a GoH proxy does not need to parse Gopher content, it is very CPU and RAM efficient compared to traditional Gopher to HTML proxies.&lt;/p&gt;

&lt;p&gt;Another limitation of the Gopher protocol is its lack of virtual hosting, meaning multiple domain names on the same IP address. This stems from an era where one server typically had one domain name or could receive multiple IPv4 addresses. Today IPv4 addresses are expensve and a server can have any number of domain names pointed at it, for example a CDN edge serving &lt;em&gt;lots&lt;/em&gt; of different websites. The HTTP/1.1 standard solved this problem by introducing a &lt;code&gt;Host: example.com&lt;/code&gt; header which allowed browsers to tell a web server &lt;em&gt;which domain&lt;/em&gt; they were accessing with a given URL path and querystring. Since Gopher protocol has no headers, there is no clear way to extend the protocol and the community has adopted workarounds like using subdirectories instead of domain names.&lt;/p&gt;

&lt;p&gt;Then there is the lack of encryption; normal in 1991 but unacceptable in today's world. This is a curiously similar situation to DNS, an even older protocol that has no built-in encryption. Recent innovations for DNS include &lt;a href=""&gt;DNS over HTTPS&lt;/a&gt; and &lt;a href=""&gt;DNS over TLS&lt;/a&gt;. The latter is what inspired &lt;em&gt;Gopher over TLS (GoT)&lt;/em&gt;: Accepting both plaintext and TLS-encrypted Gopher connections on the same port 70/TCP.&lt;/p&gt;

&lt;p&gt;Using the TLS SNI extension, a GoT client provides the server's domain name to the GoT server. This solves our problems and provides two key features: Virtual hosting and encrypted connections!&lt;/p&gt;

&lt;h3&gt;
  
  
  Gopher over HTTP (GoH)
&lt;/h3&gt;

&lt;p&gt;The &lt;em&gt;GoH protocol&lt;/em&gt; makes it possible for any device or platform with an HTTP client to access raw Gopher traffic through a very simple proxy. It is not limited only to Gopher browsers like Gaufre. This is different from existing Gopher to HTML proxies which transform Gopher content into human-friendly but machine-unfriendly rich markup.&lt;/p&gt;

&lt;p&gt;The Commons Host CDN project offers a public GoH proxy service, set as default in Gaufre. You can also run your own GoH proxy, on your own machine or network, for absolute performance and total control. With Node.js installed, run this to start a lightweight GoH proxy server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx goh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GoH specification and implementation: &lt;a href="https://gitlab.com/commonshost/goh"&gt;https://gitlab.com/commonshost/goh&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Gopher over TLS (GoT)
&lt;/h3&gt;

&lt;p&gt;The &lt;em&gt;GoT protocol&lt;/em&gt; allows hosting of multiple domains on a single IP address, something Gopher cannot do otherwise. I have used this ability to create a Gopher CDN and hosting service, available at gopher://commons.host. It should even be possible, though I have not yet attempted, to place a GoT socket forwarder on port 70 which routes traffic based on the SNI servername to any (unmodified) Gopher servers running on different ports. A similar design, though without SNI and ALPN, was &lt;a href="https://dataswamp.org/~solene/2019-03-07-gopher-server-tls.html"&gt;proposed last year by Solène using sslh_fork&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;GoT is supported by the GoH proxy (acting as a GoT client). The first Gopher server to support GoH is &lt;a href="//gopher://commons.host"&gt;gopher://commons.host&lt;/a&gt; and any static sites hosted on its CDN.&lt;/p&gt;

&lt;p&gt;Use OpenSSL's built-in &lt;code&gt;s_client&lt;/code&gt; tool to test GoT for yourself.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-ne&lt;/span&gt; &lt;span class="s2"&gt;"/&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | openssl s_client &lt;span class="nt"&gt;-ign_eof&lt;/span&gt; &lt;span class="nt"&gt;-servername&lt;/span&gt; commons.host &lt;span class="nt"&gt;-alpn&lt;/span&gt; gopher &lt;span class="nt"&gt;-connect&lt;/span&gt; commons.host:70
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GoT specification and implementation: &lt;a href="https://gitlab.com/commonshost/goth"&gt;https://gitlab.com/commonshost/goth&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Happy Burrowing!
&lt;/h2&gt;

&lt;p&gt;Please give Gaufre a try and enjoy exploring the Gopherverse.&lt;/p&gt;

&lt;p&gt;Launch Gaufre: &lt;a href="https://gopher.commons.host"&gt;https://gopher.commons.host&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cover photo: Gophers are known for their extensive tunneling activities. Their underground networks resemble the honeycomb-like pattern of waffles. Gaufre is the French word for waffle. Credit: &lt;a href="https://www.flickr.com/photos/24874528@N04/47336767931"&gt;Airwolfhound&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>gopher</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Dohnut 🍩 DNS to DoH proxy</title>
      <dc:creator>Sebastiaan Deckers</dc:creator>
      <pubDate>Wed, 20 Feb 2019 08:01:18 +0000</pubDate>
      <link>https://dev.to/commonshost/dohnut--dns-to-doh-proxy-42bg</link>
      <guid>https://dev.to/commonshost/dohnut--dns-to-doh-proxy-42bg</guid>
      <description>&lt;p&gt;&lt;em&gt;TL;DR &lt;a href="https://help.commons.host/dohnut/"&gt;Dohnut&lt;/a&gt; easily upgrades all your network clients by proxying plaintext DNS to encrypted DoH.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://commons.host"&gt;Commons Host&lt;/a&gt; CDN project &lt;a href="https://dev.to/commonshost/how-we-built-a-doh-cdn-with-20-global-edge-servers-in-10-days-1man"&gt;recently launched&lt;/a&gt; a public DNS-over-HTTPS (DoH) service. DoH now operates across all 30+ edge servers of the Commons Host network, offering low latency in many locations worldwide. Uniquely the Commons Host network is grown by contributors who &lt;a href="https://dev.to/commonshost/little-lamb-mk-i-5gf3"&gt;own and host low cost micro-servers&lt;/a&gt; using consumer-grade Internet connections at their homes or offices.&lt;/p&gt;

&lt;p&gt;The DoH Internet standard, &lt;a href="https://tools.ietf.org/html/rfc8484"&gt;RFC8484&lt;/a&gt;, promises improved privacy and security for DNS. DoH encrypts all queries, protecting users against snooping or DNS response tampering by ISPs and rogue Wi-Fi routers.&lt;/p&gt;

&lt;p&gt;Upgrading all of your network clients from plaintext DNS to encrypted DoH is not trivial. There is currently no operating system or router/hardware support. The only browser supporting DoH today is Firefox.&lt;/p&gt;

&lt;p&gt;This is why a DNS to DoH proxy is needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing: Dohnut 🍩
&lt;/h2&gt;

&lt;p&gt;Dohnut acts as a local DNS server, either for one machine or for an entire local network. It proxies all DNS queries to remote DoH services inside encrypted, long-lived HTTP/2 connections.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--m02GywoE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/00ba69tj4wfbu1uww7od.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--m02GywoE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/00ba69tj4wfbu1uww7od.png" alt="Dohnut overview diagram"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vJ70wriM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/commonshost"&gt;
        commonshost
      &lt;/a&gt; / &lt;a href="https://github.com/commonshost/dohnut"&gt;
        dohnut
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🍩 DNS to DNS-over-HTTPS (DoH) proxy server
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h1&gt;
Dohnut&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://hub.docker.com/r/commonshost/dohnut" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/e7997eaed1726eea74f7b3878aeaf4e23efa1f58/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f64796e616d69632f6a736f6e2e7376673f636f6c6f723d626c7565266c6162656c3d446f636b65722532304875622671756572793d70756c6c5f636f756e74267375666669783d25323070756c6c732675726c3d68747470732533412532462532466875622e646f636b65722e636f6d25324676322532467265706f7369746f72696573253246636f6d6d6f6e73686f7374253246646f686e7574253246" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Dohnut is a DNS to DNS-over-HTTPS (DoH) proxy server. Dohnut improves the performance, security, and privacy of your DNS traffic.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://help.commons.host/dohnut/" rel="nofollow"&gt;https://help.commons.host/dohnut/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Dohnut works with any open standard (&lt;a href="https://tools.ietf.org/html/rfc8484" rel="nofollow"&gt;RFC8484&lt;/a&gt;) compliant DoH provider, including the &lt;a href="https://commons.host" rel="nofollow"&gt;Commons Host&lt;/a&gt; DoH service and &lt;a href="http://dns-channel.github.io/#recsrv" rel="nofollow"&gt;many others&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://raw.githubusercontent.com/commonshost/dohnut/master/./dohnut-overview.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iEB7sDqM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/commonshost/dohnut/master/./dohnut-overview.png" alt="Dohnut overview diagram"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
Features&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;High Performance&lt;/strong&gt; Auto-select the fastest DoH resolver. Continuously adapts to network and service conditions by monitoring the round-trip-tip of the DoH connection using HTTP/2 PING frames.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;High Availability&lt;/strong&gt; Allows using multiple DoH resolvers at once to provide automatic failover in case a service is unavailable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Zero Overhead&lt;/strong&gt; - Network traffic does not go through Dohnut so there is no performance penalty. Only the DNS queries (very little bandwidth) are proxied.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lightweight&lt;/strong&gt; - Multi-threaded architecture for fast performance on low-power devices like single board computers. Designed for Raspberry Pi and Odroid but compatible with anything that can run Node.js.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Full Encryption&lt;/strong&gt; - DoH encrypts all DNS…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/commonshost/dohnut"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Easy to Deploy
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://help.commons.host/dohnut/"&gt;Deployment guides&lt;/a&gt; are currently available for Raspbian, Docker, Linux/systemd, and macOS/launchd.&lt;/p&gt;

&lt;p&gt;A desktop client and a web dashboard are in the works!&lt;/p&gt;

&lt;h2&gt;
  
  
  Lightweight
&lt;/h2&gt;

&lt;p&gt;Dohnut is built with Node.js to be cross-platform and fast. Running on just a $35 Raspberry Pi computer, Dohnut can easily handle a typical home or SME network with dozens of DNS clients.&lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;
    &lt;div class="ltag__twitter-tweet__media ltag__twitter-tweet__media__two-pics"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QUPK8NJy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/media/DyikV4GU8AEm3MH.jpg" alt="unknown tweet media content"&gt;
    &lt;/div&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--QtEUkFQq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/985457573145985024/XGblD_kd_normal.jpg" alt="Commons Host profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Commons Host
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @commonshost
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P4t6ys1m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      Lamb Pi edge server, anyone? Working on a new tier of servers for the &lt;a href="https://twitter.com/CommonsHost"&gt;@CommonsHost&lt;/a&gt; &lt;a href="https://twitter.com/hashtag/DoH"&gt;#DoH&lt;/a&gt; &lt;a href="https://twitter.com/hashtag/DNS"&gt;#DNS&lt;/a&gt; network. 
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      06:10 AM - 04 Feb 2019
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1092304430739771392" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-reply-action.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1092304430739771392" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-retweet-action.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      1
      &lt;a href="https://twitter.com/intent/like?tweet_id=1092304430739771392" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-like-action.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
      5
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;p&gt;Dohnut is also a great companion to the popular DNS ad-blocker Pi-hole. Dohnut acts as the Custom DNS Upstream server to Pi-hole. Pi-hole, as the DNS server to DNS clients on the network, does the ad-blocking, monitoring, and provides a local, low latency DNS cache.&lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;
    &lt;div class="ltag__twitter-tweet__media ltag__twitter-tweet__media__two-pics"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ARKnqgpR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/media/Dz1XEplV4AAWeBe.jpg" alt="unknown tweet media content"&gt;
    &lt;/div&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--QtEUkFQq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/985457573145985024/XGblD_kd_normal.jpg" alt="Commons Host profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Commons Host
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @commonshost
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P4t6ys1m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      🍩 Dohnut + &lt;a href="https://twitter.com/hashtag/Pihole"&gt;#Pihole&lt;/a&gt; securing and ad-blocking for home &amp;amp; SME networks. Tens of DNS clients using only a &lt;a href="https://twitter.com/hashtag/RaspberryPi"&gt;#RaspberryPi&lt;/a&gt; 1. 
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      07:59 AM - 20 Feb 2019
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1098130028787724289" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-reply-action.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1098130028787724289" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-retweet-action.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      0
      &lt;a href="https://twitter.com/intent/like?tweet_id=1098130028787724289" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-like-action.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
      0
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Auto-Optimising DNS Latency
&lt;/h2&gt;

&lt;p&gt;Multiple DoH services can be used by Dohnut at once. Dohnut load balances between DoH services using two configurable strategies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Best performance&lt;/strong&gt;: Always send DNS queries to the fastest DoH resolver. Continuously monitors the round-trip-time latency to each DoH resolver using HTTP/2 PING frames. Set and forget; this mode automatically discovers when one of the DoH resolvers improves their latency to your network (e.g. deploying a new server near you).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Best privacy&lt;/strong&gt;: Uniformly distributes DNS queries across all enabled DoH resolvers. This shards DNS queries so that a single DoH resolver only sees a slice of the total traffic.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Tip: Use &lt;a href="https://dev.to/commonshost/bulldohzer--dns--doh-performance-testing-50fm"&gt;Bulldohzer&lt;/a&gt; to measure lookup latency from your location to multiple DNS and DoH resolvers.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Experimental: Active Tracking Countermeasures
&lt;/h2&gt;

&lt;p&gt;Privacy policies of public DNS resolvers vary. But there is always the unavoidable fact that resolvers must see your DNS queries. This is an inherent privacy risk when using a &lt;a href="https://blog.powerdns.com/2019/02/07/the-big-dns-privacy-debate-at-fosdem/"&gt;DNS-over-Cloud provider&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To deter tracking by DoC providers, Dohnut can spoof DNS queries. It does this at random times and using a realistic sampling of popular real-world domains. This makes it very hard for any DoC provider to tell, if they wanted to, which queries are really yours and which are just spoofed noise.&lt;/p&gt;

&lt;p&gt;This does introduce additional traffic and load on public DNS services. This is intended as a privacy experiment.&lt;/p&gt;

&lt;p&gt;Another concern with DoH is the increased surface for tracking at the HTTP layer. By muxing queries from multiple clients into a single DoH connection, Dohnut acts as an passive privacy mechanism. Dohnut can also randomise the HTTP &lt;code&gt;User-Agent&lt;/code&gt; header based on real world browser usage data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Feedback
&lt;/h2&gt;

&lt;p&gt;Feedback on these ideas and their implementation is greatly appreciated. ❤️ Blog comments, GitHub Issues, Twitter, etc.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cover photo by &lt;a href="https://www.flickr.com/photos/65991505@N08/8222939536/"&gt;Ferry Sitompul&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>opensource</category>
      <category>dns</category>
    </item>
    <item>
      <title>Bulldohzer 🚜 DNS &amp; DoH performance testing</title>
      <dc:creator>Sebastiaan Deckers</dc:creator>
      <pubDate>Sun, 03 Feb 2019 11:52:05 +0000</pubDate>
      <link>https://dev.to/commonshost/bulldohzer--dns--doh-performance-testing-50fm</link>
      <guid>https://dev.to/commonshost/bulldohzer--dns--doh-performance-testing-50fm</guid>
      <description>&lt;p&gt;A few months ago &lt;a href="https://commons.host"&gt;Commons Host&lt;/a&gt; built and launched its DNS over HTTPS service &lt;a href="https://dev.to/commonshost/how-we-built-a-doh-cdn-with-20-global-edge-servers-in-10-days-1man"&gt;in just 10 days&lt;/a&gt;. The service has proved reliable and performant, with users enjoying secure and private DNS service.&lt;/p&gt;

&lt;p&gt;One challenge users face is finding the best DoH or DNS service. Public DoH &amp;amp; DNS performance reports are of questionable value. This is because performance for a test server in a big datacentre or at an Internet Exchange is not the same as on your own device on your own network.&lt;/p&gt;

&lt;p&gt;So run your own performance tests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing: Bulldohzer 🚜
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/bulldohzer"&gt;Bulldohzer&lt;/a&gt; is an easy to use DNS and DoH performance test. You can run Bulldohzer yourself to find the best resolver &lt;em&gt;for you&lt;/em&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub &lt;a href="https://github.com/commonshost/bulldohzer"&gt;https://github.com/commonshost/bulldohzer&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;NPM &lt;a href="https://www.npmjs.com/package/bulldohzer"&gt;https://www.npmjs.com/package/bulldohzer&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bulldohzer does not require any installation. Test runs take just a few seconds. Reports are designed to offer a lot of detail yet be easy to understand at a glance. Output of raw JSON data is also supported.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ npx bulldohzer
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Note: The &lt;code&gt;npx&lt;/code&gt; command is provided by Node.js which is the only dependency. You will need Node.js v11.4.0 or later.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--f3xOhrRr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/43laskohmhbntnezg43d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--f3xOhrRr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/43laskohmhbntnezg43d.png" alt="Screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  If you can not measure it, you can not improve it.
&lt;/h2&gt;

&lt;p&gt;Traditional DNS is heavily optimised due to decades of widespread use. Unfortunately it is susceptible to tampering and monitoring. DoH is a new and secure DNS protocol. DoH transports DNS over long-lived HTTP/2 connections. Because DoH is so new, some implementations are not yet optimised nor widely deployed.&lt;/p&gt;

&lt;p&gt;Please try out Bulldohzer and share your results with DoH providers.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cover photo by &lt;a href="https://www.flickr.com/photos/khaosproductions/4870139498/"&gt;khaosproductions&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>opensource</category>
      <category>dns</category>
      <category>webperf</category>
    </item>
    <item>
      <title>Build your own URL shortener in 15 minutes</title>
      <dc:creator>Sebastiaan Deckers</dc:creator>
      <pubDate>Sun, 20 Jan 2019 07:40:37 +0000</pubDate>
      <link>https://dev.to/commonshost/build-your-own-url-shortener-in-15-minutes-279n</link>
      <guid>https://dev.to/commonshost/build-your-own-url-shortener-in-15-minutes-279n</guid>
      <description>&lt;p&gt;The &lt;a href="https://commons.host"&gt;Commons Host&lt;/a&gt; CDN platform recently introduced support for custom HTTP response headers and redirect rules. Let's use these features to build our own private URL shortener, with support for a custom domain name and Google Analytics tracking. Did I mention this is all free of charge and 100% open source?&lt;/p&gt;

&lt;p&gt;Let's get started.&lt;/p&gt;

&lt;p&gt;You could use an existing Commons Host site but this tutorial shows how to get started from scratch. These instructions are intended for Mac OS or Linux.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Directory
&lt;/h2&gt;

&lt;p&gt;Start by creating the following project directory structure, then locally installing the Commons Host CLI and &lt;code&gt;short&lt;/code&gt; tools with NPM.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;short/                 // Project directory
| CNAME                // File
| commonshost.json     // File
| package.json         // File
\ public/              // Directory
  \ redirect/          // Directory
    \ index.html       // File
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The project directory is self contained and does not make any global changes to your system. Create it anywhere you prefer, for example in your home directory (&lt;code&gt;~&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Run these commands from a terminal to create the project directory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ mkdir -p short/public/redirect
$ cd short
$ touch CNAME commonshost.json public/redirect/index.html
$ npm init -y
$ npm install -D @commonshost/cli @commonshost/short
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Domain Name and DNS
&lt;/h2&gt;

&lt;p&gt;Set up your domain name.&lt;/p&gt;

&lt;p&gt;Use either a free Commons Host subdomain, or your own registered custom domain name.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option A) Free &lt;code&gt;*.commons.host&lt;/code&gt; subdomain
&lt;/h3&gt;

&lt;p&gt;Edit the &lt;code&gt;CNAME&lt;/code&gt; file with your free Commons Host subdomain.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ echo "your-sub-domain.commons.host" &amp;gt;| CNAME
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;your-sub-domain.commons.host&lt;/code&gt; with any subdomain you like. This tutorial uses &lt;code&gt;short.commons.host&lt;/code&gt;, so choose a unique name for your own URL shortening service.&lt;/p&gt;

&lt;p&gt;No additional DNS configuration is required with a Commons Host subdomain. The DNS setup for all &lt;code&gt;*.commons.host&lt;/code&gt; subdomains already has a wildcard &lt;code&gt;CNAME&lt;/code&gt; record pointing to &lt;code&gt;commons.host&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option B) Custom Domain Name
&lt;/h3&gt;

&lt;p&gt;Edit the &lt;code&gt;CNAME&lt;/code&gt; file with your registered custom domain name.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ echo "your-name.example" &amp;gt;| CNAME
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;your-name.example&lt;/code&gt; with your actual registered custom domain name.&lt;/p&gt;

&lt;p&gt;You must also create a &lt;code&gt;CNAME&lt;/code&gt; record pointing from &lt;code&gt;your-name.example&lt;/code&gt; to &lt;code&gt;commons.host&lt;/code&gt; at your DNS provider's dashboard. That &lt;code&gt;CNAME&lt;/code&gt; record will direct users to their nearest Commons Host edge server.&lt;/p&gt;

&lt;p&gt;Note: With Cloudflare DNS you may encounter a redirect loop when using &lt;em&gt;Flexible SSL&lt;/em&gt; (the default setting). Commons Host enforces full TLS and never serves unencrypted content. To solve this you can either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Disable the Cloudflare CDN for your CNAME record by setting: &lt;strong&gt;DNS &amp;gt; DNS Records &amp;gt; Status &amp;gt; DNS Only&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Or, leave the Cloudflare CDN enabled but configure the setting: &lt;strong&gt;Crypto &amp;gt; SSL &amp;gt; Full SSL&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Configuration File
&lt;/h2&gt;

&lt;p&gt;Save this JSON boilerplate as: &lt;code&gt;commonshost.json&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This contains the necessary custom header rule and a placeholder for the URL redirects.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hosts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"uri"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/redirect/{?url,}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"fields"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"Refresh"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2; {url}"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"redirects"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Redirect Page
&lt;/h2&gt;

&lt;p&gt;Save this HTML boilerplate as: &lt;code&gt;public/redirect/index.html&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;To set up Google Analytics replace &lt;code&gt;GA_TRACKING_ID&lt;/code&gt; in the code below with your Google Analytics tracking ID (e.g. &lt;code&gt;UA-12345678-1&lt;/code&gt;). See the &lt;a href="https://support.google.com/analytics/answer/1008080?hl=en"&gt;Google Analytics documentation&lt;/a&gt; for details.&lt;/p&gt;

&lt;p&gt;Feel free to customise or remove any Commons Host branding. You have full control over your website.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;async&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://www.googletagmanager.com/gtag/js?id=GA_TRACKING_ID"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
      &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataLayer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataLayer&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
      &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;gtag&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;&lt;span class="nx"&gt;dataLayer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
      &lt;span class="nx"&gt;gtag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
      &lt;span class="nx"&gt;gtag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;config&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GA_TRACKING_ID&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Redirecting&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;main&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Redirecting&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"location"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;footer&amp;gt;&lt;/span&gt;
      Powered by 🐑 &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://commons.host"&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"noopener"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Commons Host&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;.
    &lt;span class="nt"&gt;&amp;lt;/footer&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;URLSearchParams&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;URLSearchParams&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;url&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;url&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;
          &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;
          &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#location&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Sign Up to Commons Host
&lt;/h2&gt;

&lt;p&gt;Create a Commons Host account via the CLI tool. This saves a token in &lt;code&gt;~/.commonshost&lt;/code&gt; that keeps you authenticated on this machine.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ npx commonshost signup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enter an email address, username, and password to create your account.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;? Email address: sebdeckers83@gmail.com
? Username: seb
? Password: [hidden]
  ✔ Registering account
  ✔ Creating new authentication token
  ✔ Saving credentials
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Shorten a URL
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;short&lt;/code&gt; command creates a new redirect rule and prints the resulting short URL.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ npx short https://en.wikipedia.org/wiki/Longest_words
🔗 https://short.commons.host/1302
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;redirects&lt;/code&gt; section of your &lt;code&gt;commonshost.json&lt;/code&gt; configuration file should now contain something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"redirects"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"from"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/1302"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/redirect/?url=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FLongest_words"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tip: Run &lt;code&gt;npx short --help&lt;/code&gt; to see more advanced options. For example the &lt;code&gt;--emoji&lt;/code&gt; option will generate random emoji for shortened URLs. 🤨&lt;/p&gt;

&lt;h2&gt;
  
  
  Deploy to Commons Host
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ npx commonshost deploy
To cancel, press Ctrl+C.

Detected options file: commonshost.json
To override, use: --options "path"

Deploying:

  Directory:    ~/short
  File count:   1
  Total size:   1.84 kB
  URL:      https://short.commons.host
  Options:  ~/short/commonshost.json

  ✔ Uploading
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finished! Enjoy your personal URL shortener powered by Commons Host.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;To shorten another URL, just repeat the final two commands from within the project directory:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;npx short https://some.really.long.url.example/foo/bar.html&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;npx commonshost deploy --confirm&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Check the &lt;a href="https://help.commons.host/server/configuration/host/"&gt;server documentation&lt;/a&gt; to learn how to customise your Commons Host site further, like setting up a &lt;code&gt;404&lt;/code&gt; fallback HTML page.&lt;/p&gt;

&lt;p&gt;Thanks to &lt;a href="https://twitter.com/donavon"&gt;@donavon&lt;/a&gt; for the feedback on this tutorial.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>opensource</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>HTTP/2 Server Push Diary</title>
      <dc:creator>Sebastiaan Deckers</dc:creator>
      <pubDate>Mon, 07 Jan 2019 07:50:41 +0000</pubDate>
      <link>https://dev.to/commonshost/http2-server-push-diary-17dd</link>
      <guid>https://dev.to/commonshost/http2-server-push-diary-17dd</guid>
      <description>&lt;p&gt;TL;DR &lt;a href="https://commons.host"&gt;Commons Host&lt;/a&gt; now implements an &lt;strong&gt;HTTP/2 Server Push Diary&lt;/strong&gt; to solve the &lt;strong&gt;over push problem&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The server push diary is a &lt;strong&gt;Cuckoo Filter&lt;/strong&gt; that tracks any assets which were pushed previously by the server on each connection. Subsequent attempts to push the same resource are checked against the diary and skipped by the server to avoid redundant data transfer.&lt;/p&gt;

&lt;p&gt;Here is an example website with two pages sharing the same image and stylesheet dependencies.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qOOKFJIF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/bwbfsdpixxd8tjv3v4k8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qOOKFJIF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/bwbfsdpixxd8tjv3v4k8.png" alt="Example website dependency graph"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A user (👨🏻‍💻) first visits one page and then another. The server (🤖) uses a Cuckoo Filter (🐦) as server push diary to prevent over-push.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OxjEKH5o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/9ubt2s9rygm5089cjjhb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OxjEKH5o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/9ubt2s9rygm5089cjjhb.png" alt="User flow visiting two pages and server preventing over-push using a diary"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Cuckoo Filters
&lt;/h2&gt;

&lt;p&gt;The diary uses a Cuckoo Filter: An extremely space efficient and high performance data structure that makes it possible to track thousands of individually pushed resources, say an entire &lt;code&gt;node_modules&lt;/code&gt; folder or set of database records.&lt;/p&gt;

&lt;p&gt;The diary is a probabilistic data structure. Data stored can not be retrieved in its original form. Instead the diary can answer whether the same data was previously stored. This is a convenient test when the cost of a repeated operation (e.g. network transfer) far exceeds the cost of the filter (i.e. tiny amount of RAM and CPU).&lt;/p&gt;

&lt;p&gt;The server can tune the probability of false negatives. The optimal values are a matter of speculation, so I'd like to see how far people decide to push (pun &lt;em&gt;so&lt;/em&gt; intended) this feature. Currently the diary is set to a size of ~1000 entries at ~12 bits per record. This allows for hundreds of pushed resources with very few false negatives.&lt;/p&gt;

&lt;p&gt;If this concept sounds familiar, you may have heard of &lt;a href="https://en.wikipedia.org/wiki/Bloom_filter"&gt;Bloom Filters&lt;/a&gt;. The Cuckoo Filter offers efficiency improvements and most importantly allows removal of items. This is useful in the web context when cached items expire and become stale. A high performance implementation of the 2014 &lt;a href="http://www.cs.cmu.edu/~binfan/papers/conext14_cuckoofilter.pdf"&gt;Cuckoo Filter research paper&lt;/a&gt; exists and has been ported to Node.js by &lt;a href="https://twitter.com/matteocollina"&gt;Matteo Collina&lt;/a&gt; as &lt;a href="https://www.npmjs.com/package/cuckoofilter-native"&gt;cuckoofilter-native&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What About Cache Digests?
&lt;/h2&gt;

&lt;p&gt;The Cache Digest HTTP/2 extension specification appears to be on hold, as far as I can tell.&lt;/p&gt;

&lt;p&gt;Commons Host always supported Cache Digests using the &lt;code&gt;Cache-Digest&lt;/code&gt; header or cookie. Browsers could send a Bloom or Cuckoo Filter representing their cache to the server. The server used this as a diary to avoid over-pushing. Sadly browser developers have yet to implement native support. Experimental implementations using Service Workers and the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Cache"&gt;Cache API&lt;/a&gt; are technically viable but come with a fair set of developer considerations that have so far not proven popular.&lt;/p&gt;

&lt;p&gt;Hopefully diaries, being automatically enabled and requiring zero developer effort, can help prove the merit of Server Push and Cache Digests. I believe they are elegant ideas, with solvable problems. We may yet see their success.&lt;/p&gt;

</description>
      <category>webperf</category>
      <category>showdev</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Amaravati, India 🇮🇳</title>
      <dc:creator>Sebastiaan Deckers</dc:creator>
      <pubDate>Mon, 03 Dec 2018 15:21:29 +0000</pubDate>
      <link>https://dev.to/commonshost/amaravati-india--352k</link>
      <guid>https://dev.to/commonshost/amaravati-india--352k</guid>
      <description>&lt;p&gt;A new edge server has joined &lt;a href="https://commons.host" rel="noopener noreferrer"&gt;Commons Host&lt;/a&gt; in &lt;a href="https://en.wikipedia.org/wiki/Amaravati" rel="noopener noreferrer"&gt;Amaravati&lt;/a&gt;, &lt;a href="https://en.wikipedia.org/wiki/Andhra_Pradesh_Capital_Region" rel="noopener noreferrer"&gt;Andhra Pradesh Capital Region&lt;/a&gt;, India. The hardware is contributed by &lt;a href="https://sairam.xyz" rel="noopener noreferrer"&gt;Sai Ram Kunala&lt;/a&gt; (&lt;a href="https://twitter.com/sairam" rel="noopener noreferrer"&gt;@sairam&lt;/a&gt;) and deployed on commodity fibre-to-the-home (FTTH), which is &lt;a href="https://www.google.com/maps/d/viewer?mid=z6U1ilWPGIps.kbUaXWBZjvGg&amp;amp;hl=en_US" rel="noopener noreferrer"&gt;available in most Indian cities&lt;/a&gt;. For users in India this brings higher bandwidth and lower latency to the Commons Host static site CDN and DNS-over-HTTPS (DoH) service.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Photo: Panorama of Vijayawada, the most populous city within the Andhra Pradesh Capital Region (Source: &lt;a href="https://en.wikipedia.org/wiki/Vijayawada#/media/File:Vijayawada_landscape.jpg" rel="noopener noreferrer"&gt;Yedla70&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &amp;gt;2x Better DNS Latency in India
&lt;/h2&gt;

&lt;p&gt;The performance improvement is especially noticeable with DNS-over-HTTPS vs unencrypted DNS.&lt;/p&gt;

&lt;p&gt;Commons Host uses Geo DNS based routing to ensure traffic from users in India stays within India, resulting in optimal round-trip-times. Other providers, using Anycast IP addresses for their public DNS resolvers, appear to suffer from traffic routing to far-away Singapore.&lt;/p&gt;

&lt;p&gt;These are latency measurements by &lt;a href="https://www.site24x7.com/ping-test.html" rel="noopener noreferrer"&gt;Site24x7&lt;/a&gt;, a third-party ping service present in Chennai, India.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Address&lt;/th&gt;
&lt;th&gt;Routed To&lt;/th&gt;
&lt;th&gt;Latency&lt;/th&gt;
&lt;th&gt;Distance&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Commons Host DoH&lt;/td&gt;
&lt;td&gt;&lt;code&gt;commons.host&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Vijayawada&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.site24x7.com/public/t/results-1543807238932.html" rel="noopener noreferrer"&gt;14 ms&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;400 km&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google DNS&lt;/td&gt;
&lt;td&gt;&lt;code&gt;8.8.8.8&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Singapore&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.site24x7.com/public/t/results-1543809332730.html" rel="noopener noreferrer"&gt;34 ms&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2900 km&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare DNS&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1.1.1.1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Singapore&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.site24x7.com/public/t/results-1543816016949.html" rel="noopener noreferrer"&gt;34 ms&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2900 km&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quad9 DNS&lt;/td&gt;
&lt;td&gt;&lt;code&gt;9.9.9.9&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Singapore&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.site24x7.com/public/t/results-1543816937859.html" rel="noopener noreferrer"&gt;36 ms&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2900 km&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Note: These numbers show the baseline network latency. Cache hit ratios also affect actual DNS lookup times and vary by provider.&lt;/p&gt;

&lt;h2&gt;
  
  
  Freedom to Contribute
&lt;/h2&gt;

&lt;p&gt;Many thanks to Sai Ram for his remarkable initiative. The deployment is the first with 100% independently sourced hardware. It is a symbolic milestone. Sai Ram simply found the Commons Host project website, watched the videos and read the blog, and purchased his own components based on the &lt;a href="https://dev.to/commonshost/little-lamb-mk-i-5gf3"&gt;Little Lamb Mk I&lt;/a&gt; open hardware specs. Then he reached out to help grow the network.&lt;/p&gt;

&lt;p&gt;This bypassed a bottleneck: centralised assembly and shipping of edge servers.&lt;/p&gt;

&lt;p&gt;Taking ownership of the hardware acquisition means contributors like Sai Ram require neither permission nor resources from any centralised leadership. Simply deploy an edge server and make it available for activation on the Commons Host CDN.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fundamentally Decentralised
&lt;/h2&gt;

&lt;p&gt;Every country is a unique environment with different challenges and opportunities. Deploying servers around the world is an overwhelming endeavour when viewed from a centralised perspective. Even well funded and expertly staffed teams at large companies struggle to deploy hardware in many places that need it most. That means much of Asia, Africa, LatAm, and MENA is underserved.&lt;/p&gt;

&lt;p&gt;The Commons Host approach is different.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Infrastructure&lt;/strong&gt;: Physical ownership, funding, and hosting of edge servers by worldwide contributors. No single company owns the hardware. This strategy absorbs differences in local infrastructure, economies, laws &amp;amp; regulations, logistics, language barriers, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tools&lt;/strong&gt;: All code for the service is developed as free &amp;amp; open source software (FOSS) by independent collaborators. Anyone can review it and contribute patches.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Management&lt;/strong&gt;: Secure, remote configuration is handled through automation tools. Since local unauthorised hardware access is assumed, the software is designed for a more hostile environment than a typical data centre.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Decentralised physical ownership directs more human energy at solving the hard problems of infrastructure and logistics at a hyper-local level. Yet by pooling their effort, a better global service is provided to all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Network Effect
&lt;/h2&gt;

&lt;p&gt;In theory any of the edge server owners, alone or in partnership, can fork the code and manage their own network using the exact same FOSS tools. The project leadership is kept from becoming complacent by the threat of abandonment.&lt;/p&gt;

&lt;p&gt;In practice, however, there is a shared incentive to maintain and grow a combined, global service. A splintered network would not offer the geographical reach of the cohesive Commons Host service.&lt;/p&gt;

&lt;p&gt;What keeps Commons Host together is &lt;a href="https://en.wikipedia.org/wiki/Metcalfe's_law" rel="noopener noreferrer"&gt;Metcalfe's law&lt;/a&gt;. Roughly speaking, the value of a network is the square of its size. The more nodes in the network, the more advantageous it is for new nodes to join the same network.&lt;/p&gt;

&lt;p&gt;Similar mechanisms work for other collaborative projects like the Linux Kernel or Wikipedia. They started as a small and scrappy group of idealists but eventually bested large incumbents.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>cdn</category>
      <category>india</category>
    </item>
    <item>
      <title>Udon Thani, Thailand 🇹🇭</title>
      <dc:creator>Sebastiaan Deckers</dc:creator>
      <pubDate>Mon, 15 Oct 2018 03:26:44 +0000</pubDate>
      <link>https://dev.to/commonshost/udon-thani-thailand--39jn</link>
      <guid>https://dev.to/commonshost/udon-thani-thailand--39jn</guid>
      <description>&lt;p&gt;&lt;a href="https://commons.host" rel="noopener noreferrer"&gt;Commons Host&lt;/a&gt; expands in Thailand with a new edge location to serve low-latency web and DNS traffic.&lt;/p&gt;

&lt;p&gt;Thailand is the second largest economy in South East Asia. It has a population of over 68 million people, slightly more than France or the United Kingdom.&lt;/p&gt;

&lt;p&gt;The new edge server is located in the north-eastern city of Udon Thani. Routing is conservatively configured to receive only traffic from within Thailand.&lt;/p&gt;

&lt;p&gt;The server hardware and hosting are sponsored by &lt;a href="https://twitter.com/agouaillard" rel="noopener noreferrer"&gt;Dr Alex&lt;/a&gt;, founder of Singapore based WebRTC specialists &lt;a href="http://www.cosmosoftware.io/" rel="noopener noreferrer"&gt;CoSMo Software&lt;/a&gt;. He is a long-time supporter of Commons Host who previously sponsored the &lt;a href="https://dev.to/commonshost/los-angeles-united-states-of-america--ok7"&gt;Los Angeles edge server&lt;/a&gt; as well as my first in-person attendance to an &lt;a href="https://www.ietf.org/how/meetings/100/" rel="noopener noreferrer"&gt;IETF conference&lt;/a&gt;. Huge thanks for his support and mentorship.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8qk7nzuw4deay0qkjbz3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8qk7nzuw4deay0qkjbz3.jpg" alt="Street view in Udon Thani, Thailand" width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Photo: Street view Udon Thani, Thailand (Source: &lt;a href="https://www.flickr.com/photos/insightsunspoken/30698563151" rel="noopener noreferrer"&gt;Insights Unspoken&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Regional Peering Surprises
&lt;/h2&gt;

&lt;p&gt;From Udon Thani the Laotian capital Vientiane is geographically closer than Thai capital Bangkok, respectively 60 km and 460 km. However network latency tells a different story.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Route&lt;/th&gt;
&lt;th&gt;Distance&lt;/th&gt;
&lt;th&gt;Round Trip Time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Udon Thani to Bangkok&lt;/td&gt;
&lt;td&gt;460 km&lt;/td&gt;
&lt;td&gt;12 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Udon Thani to Vientiane&lt;/td&gt;
&lt;td&gt;60 km&lt;/td&gt;
&lt;td&gt;25 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fetm0lgbibosw0pqedrke.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fetm0lgbibosw0pqedrke.jpg" alt="Map of traffic flow from Udon Thani to Vientiane via Bangkok" width="800" height="723"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Map: Geographical distance (green) vs Network distance (red)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;As another example let's look at the edge server in Udon Thani and two different ISPs in Singapore. One has direct peering, at an IX in Singapore, while the other does not. Without peering they must fall back to a carrier in Palo Alto, California; literally an ocean away.&lt;/p&gt;

&lt;p&gt;Before this new edge server was deployed, traffic from users on this ISP in Thailand to the Singapore edge servers would sometimes travel halfway around the world.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ISP&lt;/th&gt;
&lt;th&gt;ISP&lt;/th&gt;
&lt;th&gt;Round Trip Time&lt;/th&gt;
&lt;th&gt;Internet Exchange&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Commons Host @ Udon Thani (Thailand)&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://www.peeringdb.com/org/1064" rel="noopener noreferrer"&gt;StarHub&lt;/a&gt; (Singapore)&lt;/td&gt;
&lt;td&gt;42 ms&lt;/td&gt;
&lt;td&gt;Singapore&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Commons Host @ Udon Thani (Thailand)&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://www.peeringdb.com/net/4855" rel="noopener noreferrer"&gt;MyRepublic&lt;/a&gt; (Singapore)&lt;/td&gt;
&lt;td&gt;218 ms&lt;/td&gt;
&lt;td&gt;California, USA&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj1dqev6ncos6vyf6vz3u.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj1dqev6ncos6vyf6vz3u.jpg" alt="Map of traffic flow from Udon Thani to Singapore via California" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Map: Network distance from Udon Thani to Singapore with peering (1,800 km in green) or via long-haul transit (26,000 km in orange)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Bypassing Internet Exchanges
&lt;/h2&gt;

&lt;p&gt;Network providers physically interconnect at Internet Exchanges (IX). In this case the IX is located in Bangkok, so all traffic between Udon Thani and Vientiane does an additional ~900 km round trip.&lt;/p&gt;

&lt;p&gt;The problem is even worse between smaller ISPs. Since there may not be much traffic flowing between them, direct peering agreements are sometimes not in place. In those cases traffic can only be exchanged via a mutual peering partner.&lt;/p&gt;

&lt;p&gt;Simply by deploying more servers in many locations worldwide we can side-step the lack of peering between ISPs. Deploying smaller servers in larger numbers is the brute force way to achieve ultra-low latency. It eliminates expensive &amp;amp; slow transit traffic.&lt;/p&gt;

&lt;p&gt;Being able to deploy small-scale edge servers is a key advantage of the Commons Host CDN model.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CDN Provider&lt;/th&gt;
&lt;th&gt;Nearest edge to Udon Thani&lt;/th&gt;
&lt;th&gt;Round Trip Time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Commons Host&lt;/td&gt;
&lt;td&gt;Udon Thani&lt;/td&gt;
&lt;td&gt;&amp;lt;1 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare&lt;/td&gt;
&lt;td&gt;Bangkok&lt;/td&gt;
&lt;td&gt;~12 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS Cloudfront&lt;/td&gt;
&lt;td&gt;Singapore&lt;/td&gt;
&lt;td&gt;&amp;gt;40 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The ability to achieve lower latency is inversely proportional to the minimum size of an edge server deployment. Micro-servers &amp;lt; server racks &amp;lt; data centres.&lt;/p&gt;

&lt;h2&gt;
  
  
  Consumer ISP Port Blocking, Not So Bad After All?
&lt;/h2&gt;

&lt;p&gt;When Commons Host first started one of the fears was that ISPs would never allow it. Fortunately that has been mostly overcome by simply purchasing a static IP and having a friendly chat with the ISP support desk.&lt;/p&gt;

&lt;p&gt;To deploy the Udon Thani edge server on a consumer fibre connection required obtaining a static IP address. In theory a dynamic IP address would suffice, but in reality those tend to be private addresses (10.x.x.x or 192.168.x.x) behind an ISP-wide Network Address Translator (NAT) and therefore inaccessible to the rest of the Internet.&lt;/p&gt;

&lt;p&gt;Once the static, public IP address was activated, the next obstacle was a mysterious blocking of ports 80 and 443, for HTTP and HTTPS respectively. A simple call to the ISP by Dr Alex resolved the issue. Turns out all we had to do was ask and they happily opened the ports, allowing the edge server to go live in Thailand.&lt;/p&gt;

&lt;p&gt;People are mostly good; this is a victory of the commons.&lt;/p&gt;

</description>
      <category>cdn</category>
      <category>edge</category>
      <category>pop</category>
    </item>
    <item>
      <title>How we built a DOH CDN with 20+ global edge servers in 10 days.</title>
      <dc:creator>Sebastiaan Deckers</dc:creator>
      <pubDate>Wed, 10 Oct 2018 13:13:36 +0000</pubDate>
      <link>https://dev.to/commonshost/how-we-built-a-doh-cdn-with-20-global-edge-servers-in-10-days-1man</link>
      <guid>https://dev.to/commonshost/how-we-built-a-doh-cdn-with-20-global-edge-servers-in-10-days-1man</guid>
      <description>&lt;p&gt;Just months ago the &lt;a href="https://commons.host" rel="noopener noreferrer"&gt;Commons Host static hosting CDN&lt;/a&gt; launched with a single edge server. Today there are over 20 edge servers around the world. The majority are inexpensive ARM-based micro servers hosted by volunteer contributors on commodity Internet connections, often Gigabit fibre. Others are virtual machines in cloud data centres which offers similar performance.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fm18r6n1l7aeh4u90u6qx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fm18r6n1l7aeh4u90u6qx.png" alt="Map of Commons Host CDN edge servers"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Illustration: Map of Commons Host CDN edge servers (live &amp;amp; WIP)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Because We Can
&lt;/h2&gt;

&lt;p&gt;Kenny and I worked diligently on deployment automation. This allowed scaling the edge server count from single to double digits.&lt;/p&gt;

&lt;p&gt;With these tools in place, we decided to build and deploy a completely new service in parallel on the same edge server network.&lt;/p&gt;

&lt;p&gt;We chose to implement &lt;a href="https://datatracker.ietf.org/doc/draft-ietf-doh-dns-over-https/" rel="noopener noreferrer"&gt;DNS over HTTPS&lt;/a&gt;, or DOH for short. DNS resolving is perfectly suited to the advantages and constraints of the Commons Host server network. Low latency due to global coverage, and minimal hardware requirements.&lt;/p&gt;

&lt;h2&gt;
  
  
  DNS, meet HTTP. HTTP, meet DNS.
&lt;/h2&gt;

&lt;p&gt;Building an HTTP CDN requires learning about the Domain Name System (DNS). DNS is ancient by Internet norms; many years older than the World Wide Web or HTTP.&lt;/p&gt;

&lt;p&gt;Standards like HTTP or DNS are the work of the &lt;a href="https://www.ietf.org" rel="noopener noreferrer"&gt;Internet Engineering Task Force&lt;/a&gt;. This organisation provides an open, vendor-neutral discussion platform through public mailing lists. IETF also runs conferences, held 3 times yearly, rotating through the Americas, Europe, and Asia.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.ietf.org%2Fmedia%2Fimages%2Fdownload.original.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.ietf.org%2Fmedia%2Fimages%2Fdownload.original.jpg" alt="IETF 100 session"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Photo: A session at the IETF 100 conference&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;At the 100th IETF conference, in Singapore where we live, a draft called DNS-over-HTTPS was &lt;a href="https://www.youtube.com/watch?v=1_s1ND_D92I&amp;amp;list=PLC86T-6ZTP5g_hEODKiZDeZTpr2Vxd2B3" rel="noopener noreferrer"&gt;presented and intensely debated&lt;/a&gt;. Attendees packed the conference hall. This was a meeting of worlds between DNS and HTTP experts. Even DOH's authors are respected leaders from both DNS (&lt;a href="https://www.icann.org/profiles/28869" rel="noopener noreferrer"&gt;Paul Hoffman&lt;/a&gt;, &lt;a href="https://www.icann.org" rel="noopener noreferrer"&gt;ICANN&lt;/a&gt;) and HTTP (&lt;a href="https://twitter.com/mcmanusducksong" rel="noopener noreferrer"&gt;Patrick McManus&lt;/a&gt;, then &lt;a href="https://www.mozilla.org" rel="noopener noreferrer"&gt;Mozilla&lt;/a&gt; now &lt;a href="https://www.fastly.com" rel="noopener noreferrer"&gt;Fastly&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;I was fortunate to attend IETF 100 last year. The humbling experience left a deep impression. Implementing DOH would also be a personal tribute to this community.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Hard Can DOH Be?
&lt;/h2&gt;

&lt;p&gt;HTTP servers exist. DNS servers exist. So we just duct tape the two together? Well, basically, yes.&lt;/p&gt;

&lt;p&gt;Driven by curiosity, Kenny wrote the first DOH implementation while brushing up on Node.js and reading the DOH draft specification, tabula rasa.&lt;/p&gt;

&lt;p&gt;Over the next few days we rewrote and refactored the code. In the end we built a middleware called for Node.js web servers called &lt;a href="https://github.com/qoelet/playdoh" rel="noopener noreferrer"&gt;Playdoh&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fsx388h6aqfgfoe8hws38.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fsx388h6aqfgfoe8hws38.png" alt="Playdoh GitHub repository"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Screenshot: &lt;a href="https://github.com/qoelet/playdoh" rel="noopener noreferrer"&gt;Playdoh GitHub repository&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Playdoh relays raw UDP messages between a DOH client like Firefox and a traditional DNS server. Playdoh is 150 lines of DOH duct tape, with 300 lines of tests to make sure it sticks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deploying a DNS Resolver
&lt;/h2&gt;

&lt;p&gt;To offer a global DOH service, each edge server needs to run its own caching DNS resolver. A resolver processes the DNS query and caches responses so that users benefit from faster future lookups.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fq9bhz969n7iv929caqe5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fq9bhz969n7iv929caqe5.png" alt="Knot Resolver logo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We learned of &lt;a href="https://www.knot-resolver.cz" rel="noopener noreferrer"&gt;Knot Resolver&lt;/a&gt; by talking to friends in the CDN industry. Knot Resolver is open source software developed by the Czech Republic DNS registry (&lt;a href="https://www.nic.cz" rel="noopener noreferrer"&gt;CZ.NIC&lt;/a&gt;). Fun fact, Knot Resolver also powers the &lt;a href="https://1.1.1.1" rel="noopener noreferrer"&gt;Cloudflare 1.1.1.1&lt;/a&gt; public DNS service. Others recommended &lt;a href="https://nlnetlabs.nl/projects/unbound/about/" rel="noopener noreferrer"&gt;Unbound&lt;/a&gt; or &lt;a href="https://www.isc.org/downloads/bind/" rel="noopener noreferrer"&gt;BIND&lt;/a&gt; as resolvers. We may yet run those in a mixed network for heterogenous resilience.&lt;/p&gt;

&lt;p&gt;It took a few days to tune the Knot Resolver configuration and automate its deployment. This involved remotely upgrading the operating system across all edge servers. A risky proposition involving custom vendor kernels for the ARM servers. With overseas unattended physical machines there is no option to press a reset button or flip a power switch. The only solution was to perform tireless careful testing in staging environments, using Vagrant/Virtualbox or on spare hardware. Eventually we ironed out subtle differences between the various server configurations.&lt;/p&gt;

&lt;p&gt;This was much more time consuming and technically challenging than coding Playdoh. Our knowledge and experience continues to grow, as documented in the &lt;a href="https://gitlab.com/commonshost/ansible/merge_requests/33" rel="noopener noreferrer"&gt;merge request description&lt;/a&gt;. Next time this will be easy.&lt;/p&gt;

&lt;p&gt;So how is DNS traffic served by a DOH CDN?&lt;/p&gt;

&lt;h2&gt;
  
  
  Bootstrapping DOH CDN: Anycast IP vs Geo DNS
&lt;/h2&gt;

&lt;p&gt;Users need to be able to easily configure their DNS settings and connect to a nearby DNS server for low-latency lookups.&lt;/p&gt;

&lt;p&gt;Traditional public DNS services make use of an expensive Anycast IP network. Users are routed to one of many edge servers worldwide. They share the same IP address but announce different routes using BGP at Internet Exchanges. ISPs will route users via the shortest path. Sadly this is not easily accessible due to cost and administrative overhead.&lt;/p&gt;

&lt;p&gt;They also opt for memorable IP addresses. Google owns 8.8.8.8, Cloudflare owns 1.1.1.1, Quad9 (IBM) owns 9.9.9.9, and so on. Their IPv6 addresses are less human friendly but the principle is the same.&lt;/p&gt;

&lt;p&gt;With DOH the DNS resolver address is a familiar URL instead of an IP address. This URL contains a domain name so that the connection may be secured using a signed TLS certificate. E.g.: &lt;a href="https://commons.host" rel="noopener noreferrer"&gt;https://commons.host&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So &lt;em&gt;DNS itself&lt;/em&gt; is used to direct traffic to a DNS over HTTPS service. Chicken or egg? Not quite.&lt;/p&gt;

&lt;p&gt;DOH works by bootstrapping the initial DNS lookup of the resolver's hostname. This DNS lookup is still handled by traditional DNS servers like those of an ISP or a local server. The HTTPS connection is then secured with a signed TLS certificate for that domain. Any tampering by a malicious (or faulty) DNS server at the ISP would simply result in a failed connection attempt. So there is no risk of exposing to the DOH client to tampered responses.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fjnm5fzak7l5xi7w4sgd3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fjnm5fzak7l5xi7w4sgd3.png" alt="DOH bootstrap sequence diagram"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Diagram: DOH bootstrap sequence&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Bootstrap procedure:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Browser performs DNS lookup for the Commons Host DOH server hostname using a standard, potentially untrusted, DNS server.&lt;/li&gt;
&lt;li&gt;DNS server responds with the IP address of the nearest Commons Host edge server.&lt;/li&gt;
&lt;li&gt;Browser establishes a HTTP/2 connection with the edge server. TLS certificates ensure an encrypted and authenticated connection.&lt;/li&gt;
&lt;li&gt;Subsequent DNS lookups are tunnelled inside the HTTP/2 connection to keep them safe from snooping or tampering by third parties.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;* Shown IP address is an example. Actual address is based on location and other performance metrics to determine the optimal edge server for a particular user.&lt;/p&gt;

&lt;h2&gt;
  
  
  What About Security?
&lt;/h2&gt;

&lt;p&gt;Running a public DNS service is typically fraught with security problems. An open resolver, one that accepts DNS queries from anyone on the Internet, is a convenient traffic-amplifier for DDoS botnets and other malicious actors.&lt;/p&gt;

&lt;p&gt;Amplification attacks work by spoofing the source address on a small DNS query, so that the large DNS response gets delivered to an unfortunate target. Attackers use public DNS servers to generate a multiple of their own bandwidth and aim it at a target while hiding themselves as originators. Most people would never want to run such a service, and in fact many ISPs block inbound UDP traffic on port 53 for this reason.&lt;/p&gt;

&lt;p&gt;DOH eliminates the spoofing problem. The HTTPS connection requires a secure handshake so traffic can not be spoofed or misdirected. Any responses are always delivered to the correct source, making DOH safe from amplification attacks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Living on the Edge
&lt;/h2&gt;

&lt;p&gt;Running a public DOH service is much easier than a traditional DNS open resolver. Expect many organisations to offer such services.&lt;/p&gt;

&lt;p&gt;One benefit of the Commons Host network is that anyone can sponsor and host an edge server. This brings the CDN edge on-premises, and a great way to run a sub-millisecond latency (i.e. LAN) DOH server. Doing so improves your DNS lookup speed while serving your local community. &lt;a href="https://twitter.com/commonshost" rel="noopener noreferrer"&gt;Get in touch&lt;/a&gt; if you are interested.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using Commons Host DOH
&lt;/h2&gt;

&lt;p&gt;Currently Firefox is the easiest way to use DOH.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F6aqdoym2i14w2zsekwio.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F6aqdoym2i14w2zsekwio.png" alt="Firefox Network Settings for DOH"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Screenshot: Firefox Network Settings for DOH&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In the &lt;strong&gt;Preferences&lt;/strong&gt; screen, open the &lt;strong&gt;Connection Settings&lt;/strong&gt; dialog.&lt;/li&gt;
&lt;li&gt;Turn on the checkbox: &lt;strong&gt;Enable DNS over HTTPS&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Enter the URL: &lt;code&gt;https://commons.host&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;More DOH browser/OS support and bridging solutions will hopefully follow soon. Chrome seems to have &lt;a href="https://bugs.chromium.org/p/chromium/issues/detail?id=799753" rel="noopener noreferrer"&gt;a DOH implementation on the way&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  One Last Thing: Custom Domain DOH Resolver
&lt;/h2&gt;

&lt;p&gt;Commons Host supports DOH service on custom domains!&lt;/p&gt;

&lt;p&gt;Deploying a custom domain on Commons Host is as easy as pointing a CNAME DNS record to &lt;code&gt;commons.host&lt;/code&gt; using your domain name management provider.&lt;/p&gt;

&lt;p&gt;Commons Host uses Geo DNS to point the domain &lt;code&gt;commons.host&lt;/code&gt; to the edge server best suited for any user worldwide. Every edge server has its own public IP address. The edge web servers run the Playdoh middleware which processes DOH requests based on HTTP headers, while regular web requests pass through. The same domain and the same edge server can serve both web and DOH traffic.&lt;/p&gt;

&lt;p&gt;Simply deploy a website with a custom domain and use your personal URL as the DOH resolver endpoint. For example: &lt;code&gt;https://www.$yourdomain.com&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The same goes for choosing a specific Commons Host edge server as your DOH endpoint. Each one is directly addressable by country code, airport code, and incrementing counter. For example: &lt;code&gt;https://us-lax-1.commons.host&lt;/code&gt; connects directly to the Los Angeles edge server.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>node</category>
      <category>devops</category>
      <category>opensource</category>
    </item>
    <item>
      <title>8 new CDN edge locations</title>
      <dc:creator>Sebastiaan Deckers</dc:creator>
      <pubDate>Fri, 28 Sep 2018 07:36:10 +0000</pubDate>
      <link>https://dev.to/commonshost/8-new-cdn-edge-locations-1ifj</link>
      <guid>https://dev.to/commonshost/8-new-cdn-edge-locations-1ifj</guid>
      <description>&lt;p&gt;The &lt;a href="https://commons.host" rel="noopener noreferrer"&gt;Commons Host&lt;/a&gt; content delivery network just grew by 8 locations.&lt;/p&gt;

&lt;h3&gt;
  
  
  🌎 America
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🇺🇸 Atlanta, Georgia, USA&lt;/li&gt;
&lt;li&gt;🇺🇸 Dallas, Texas, USA&lt;/li&gt;
&lt;li&gt;🇺🇸 Newark, New Jersey, USA&lt;/li&gt;
&lt;li&gt;🇺🇸 San Jose, California, USA&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🌏 Asia
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🇸🇬 Singapore&lt;/li&gt;
&lt;li&gt;🇯🇵 Tokyo, Japan&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🌍 Europe
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🇩🇪 Frankfurt, Germany&lt;/li&gt;
&lt;li&gt;🇬🇧 London, United Kingdom&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Supported by UIlicious, powered by Linode
&lt;/h2&gt;

&lt;p&gt;This big bump in network reach is thanks to a generous in-kind contribution by &lt;a href="https://uilicious.com" rel="noopener noreferrer"&gt;UIlicious&lt;/a&gt; cofounder Eugene Cheah (&lt;a href="https://twitter.com/picocreator" rel="noopener noreferrer"&gt;@picocreator&lt;/a&gt;). UIlicious is a modern web development tool to automate user journey testing.&lt;/p&gt;

&lt;p&gt;Eugene offered his support at the very first announcement of the Commons Host project. After fully automating deployment, and several re-designs of the GeoDNS-based global server load balancing (GSLB), these edge nodes were seamlessly added to the Commons Host network.&lt;/p&gt;

&lt;p&gt;The new servers are virtual machines. They are located in all datacentres operated by cloud hosting company &lt;a href="https://www.linode.com" rel="noopener noreferrer"&gt;Linode&lt;/a&gt;. Top-tier datacentres are well connected to Internet exchanges where many ISPs and carriers meet, offering afforable connectivity and scalable performance. High bandwidth and low latency. Perfect, right?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uilicious.com" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fxt3ynbnu47jw6b2wd27w.png" alt="UIlicious logo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linode.com" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fspuxdeb8vktzgnj1cnk0.png" alt="Linode logo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  First World Problems
&lt;/h2&gt;

&lt;p&gt;Therein lies the first world problem. These datacentres are located in highly developed countries generating 37.8% of the global economy (2018 nominal GDP, IMF).&lt;/p&gt;

&lt;p&gt;Bandwidth consumption in these markets is high. &lt;em&gt;Very high.&lt;/em&gt; Fastly reports &lt;a href="https://www.fastly.com/blog/altitude-sf-2018-recap" rel="noopener noreferrer"&gt;peak traffic of 5.2 Tb/s&lt;/a&gt; during the 2018 SuperBowl. They claim typical sustained rates over 3 Tb/s. Other big, mostly American, CDNs claim similar figures or more.&lt;/p&gt;

&lt;p&gt;Even if cloud servers like Linode's could reach sustained bandwidth of the claimed 1 Gbps, &lt;a href="https://www.vpsbenchmarks.com/trials/linode_performance_trial_10Jun2018/network_transfers" rel="noopener noreferrer"&gt;which they really don't&lt;/a&gt;, it would take thousands to handle peak loads.&lt;/p&gt;

&lt;p&gt;In reality it would also take dozens to hundreds of locations to directly peer (aka physically connect via fibre cables) with as many ISPs as possible. Cloud vendors simply do not offer this service today. Still too often negotiations between CDNs, carriers, and ISPs take place at &lt;a href="https://www.peeringforum.com" rel="noopener noreferrer"&gt;peering conferences&lt;/a&gt;, an expensive and slow process only afforded the largest companies.&lt;/p&gt;

&lt;p&gt;This has led to enormous concentration of the Internet between a handful of giant tech companies. The consequences are &lt;a href="https://ssd.eff.org" rel="noopener noreferrer"&gt;being dealt with&lt;/a&gt; across the world, as people consider the inherent threats to their privacy, freedom of speech, and democracy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Third World Solutions
&lt;/h2&gt;

&lt;p&gt;Centralisation of another kind lies at the heart of the &lt;a href="http://www.speedtest.net/global-index" rel="noopener noreferrer"&gt;lagging Internet hosting infrastructure&lt;/a&gt; in developing economies. The cause is often political and regulatory, caused by limited market competition, the result of lingering telecom monopolies.&lt;/p&gt;

&lt;p&gt;Created in South East Asia to solve regional problems, the approach Commons Host takes is to side-step the centralised bottlenecks. &lt;a href="https://sg.carousell.com/p/little-lamb-mk-i-commons-host-cdn-pop-edge-server-166149743/" rel="noopener noreferrer"&gt;Small, affordable ARM-based micro-servers&lt;/a&gt; are deployed at business or consumer fibre connections around the world. Commodity fibre network speeds, at least within the same ISP or state/country, are often better than cheap VPSes like Linode's. And the variety of edge locations is practically any home or office in the world.&lt;/p&gt;

&lt;p&gt;This means latency is lower while bandwidth-per-server does not need to be as high as centralised CDNs. And peering is a natural consequence of being housed on an actual ISP, rather than bureaucratic negotiations at internet exchanges.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hybrid CDN: Best of Both Worlds?
&lt;/h2&gt;

&lt;p&gt;The unique strength of Commons Host is the ability to combine datacentres across Europe, America, and other regions, with a vast network of micro-servers deployed worldwide.&lt;/p&gt;

&lt;p&gt;Designed for this scale, everything in deployment and management must be fully automated and made as easy to use as possible.&lt;/p&gt;

&lt;p&gt;Based on these principles, Commons Host offers a great hosting platform for truly global static web hosting, with more to come very soon.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>opensource</category>
      <category>startup</category>
      <category>webperf</category>
    </item>
    <item>
      <title>Los Angeles, United States of America 🇺🇸</title>
      <dc:creator>Sebastiaan Deckers</dc:creator>
      <pubDate>Fri, 07 Sep 2018 12:09:38 +0000</pubDate>
      <link>https://dev.to/commonshost/los-angeles-united-states-of-america--ok7</link>
      <guid>https://dev.to/commonshost/los-angeles-united-states-of-america--ok7</guid>
      <description>&lt;h2&gt;
  
  
  Go West, young CDN.
&lt;/h2&gt;

&lt;p&gt;America, birth place of the Internet, joins the &lt;a href="https://commons.host" rel="noopener noreferrer"&gt;Commons Host CDN&lt;/a&gt; with an edge server deployed in Los Angeles, California. As the largest city in the most populous state, this is a great location for low latency static site hosting.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F6rub4ejpq7ue9m54ejeu.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F6rub4ejpq7ue9m54ejeu.jpg" alt="Scenic view of Los Angeles daytime skyline"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Photo: Los Angeles, by &lt;a href="https://www.flickr.com/photos/jellebleyenbergh/43603169272/in/photolist-26qHNY1-256qawg-29WjWjz-2aHYmME-26HYWYR-23BGjAu-27dxzmL-26x4nJ7-LGutDh-E3VZck-23hh2VQ-MMhtm9-23SnPka-23BGkzy-E1tby4-23d3mx7-25UaXmY-23v3E35-269p1ZE-29v9uRa-F4HBrC-24A3bhu-227PisY-23d3n4h-25G1a8U-29r4D7y-KckgH2-22gUxKT-26WxvgM-M4RoxM/" rel="noopener noreferrer"&gt;Jelle Bleyenbergh (Flickr)&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Millicast WebRTC CDN
&lt;/h2&gt;

&lt;p&gt;This edge server is sponsored by WebRTC specialists &lt;a href="http://www.cosmosoftware.io" rel="noopener noreferrer"&gt;CoSMo Software&lt;/a&gt;. Its polymath founder &lt;a href="https://twitter.com/agouaillard" rel="noopener noreferrer"&gt;Dr Alex&lt;/a&gt; is a &lt;a href="http://webrtcbydralex.com" rel="noopener noreferrer"&gt;WebRTC industry insider&lt;/a&gt; and long time supporter of the Commons Host project. WebRTC enables open-standards based media streaming in browsers and devices. &lt;em&gt;(More exciting news to follow!)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Hosting of the server in LA is provided by &lt;a href="https://millicast.com" rel="noopener noreferrer"&gt;Millicast&lt;/a&gt;, a WebRTC-powered live streaming CDN offering incredible sub-500 milliseconds latency for large scale broadcasts. Millicast is a collaboration between CoSMo and &lt;a href="https://xirsys.com" rel="noopener noreferrer"&gt;Xirsys&lt;/a&gt; as provider of TURN cloud services.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fatny1t6x8fowa10es753.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fatny1t6x8fowa10es753.jpg" alt="Cofounder of Millicast with traditional Southern California greeting hand gesture"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Photo: Selfie by &lt;a href="https://twitter.com/RichardBlakely" rel="noopener noreferrer"&gt;Richard Blakely&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/richard-blakely-960796/" rel="noopener noreferrer"&gt;CEO of Xirsys&lt;/a&gt; and cofounder of Millicast, with Commons Host µPoP server. 🤙🏻 for scale.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Together we serve, divided we scale.
&lt;/h2&gt;

&lt;p&gt;This deployment is a small start, literally and figuratively, into the American CDN market. Obviously, many established American tech companies already provide competitive hosting and edge delivery services.&lt;/p&gt;

&lt;p&gt;But what Commons Host offers is seamless extensibility into any location around the world. This offers better performance, cost savings, and unique operational capabilities.&lt;/p&gt;

&lt;p&gt;The ability to extend the Commons Host CDN by deploying your own edge servers on-premises is made affordable and effortless thanks to open source software and hardware.&lt;/p&gt;

&lt;p&gt;Join the Commons, deploy today!&lt;/p&gt;

</description>
      <category>cdn</category>
      <category>edge</category>
      <category>pop</category>
    </item>
    <item>
      <title>Vilnius, Lithuania 🇱🇹</title>
      <dc:creator>Sebastiaan Deckers</dc:creator>
      <pubDate>Fri, 20 Jul 2018 09:33:23 +0000</pubDate>
      <link>https://dev.to/commonshost/vilnius-lithuania--4ph0</link>
      <guid>https://dev.to/commonshost/vilnius-lithuania--4ph0</guid>
      <description>&lt;p&gt;The Commons Host CDN has placed its first footprint in Europe with a point-of-presence (PoP) in Vilnius, Lithuania. This takes the network beyond its South East Asian roots.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nzoDNrjX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/18tss8zq1c420eeq5roi.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nzoDNrjX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/18tss8zq1c420eeq5roi.jpg" alt="Vilnius city view"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Photo: &lt;a href="https://www.flickr.com/photos/sergeigussev/37018865605"&gt;Sergei Gussev (Flickr)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The PoP, a &lt;a href=""&gt;Little Lamb Mk I&lt;/a&gt; micro-server, is sponsored and hosted by &lt;a href="http://zx23.net"&gt;Zygis&lt;/a&gt;, an early days supporter of the Commons Host project. His expert advice over the past months has been very encouraging and significantly accelerated the rollout.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JyhnXJwT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/aoj5o9itwllnpqickqci.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JyhnXJwT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/aoj5o9itwllnpqickqci.jpg" alt="Zygis in Vilnius wearing Commons Host swag tshirt"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Photo: &lt;a href="http://zx23.net"&gt;Zygis&lt;/a&gt; showing off sheep swag in Vilnius (selfie)&lt;/p&gt;

&lt;h2&gt;
  
  
  Automation with Ansible
&lt;/h2&gt;

&lt;p&gt;The main challenge with this deployment was the physical inaccessibility of the server. The initial PoPs in Singapore and Kuala Lumpur were deployed by hand: visiting on-site to install and configure the system. However it would not have been cost effictive to travel from Singapore to Lithuania to deploy a single server.&lt;/p&gt;

&lt;p&gt;This was a job for Ansible, a Configuration Management (CM) automation tool. Over the past two months &lt;a href="https://machinesung.com"&gt;Kenny Shen&lt;/a&gt; and I collaborated on the complete automation of Commons Host PoP deployments.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Upupzyoy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/lm5d2gcdz125f9fdsp3t.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Upupzyoy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/lm5d2gcdz125f9fdsp3t.JPG" alt="Kenny and his custom keyboards"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Photo: &lt;a href="https://machinesung.com"&gt;Kenny Shen&lt;/a&gt; operating next-level hacker keyboard&lt;/p&gt;

&lt;p&gt;We now have the ability to set up, secure, and monitor the servers remotely. All code is available in the &lt;a href="https://gitlab.com/commonshost/ansible"&gt;commonshost/ansible&lt;/a&gt; GitLab repository. Contributions welcome!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6Ol1voTB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/8f3idwsj1crug1t20j7q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6Ol1voTB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/8f3idwsj1crug1t20j7q.png" alt="Code contributors graph"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  More to Come
&lt;/h2&gt;

&lt;p&gt;This newly created tooling will be the foundation for many more deployments, both physical machines as well as cloud servers.&lt;/p&gt;

&lt;p&gt;The Vilnius PoP serves currently all Commons Host traffic for Europe, as directed by the Geo DNS load balancer. This is really not as much as it sounds like, yet.&lt;/p&gt;

&lt;p&gt;Over the coming months more effort will be made to promote the service to developers. To support the growing demand, additional PoPs will be deployed. As more servers are added to the network, the global traffic load will be better dispersed and optimised for low latency. Exciting times.&lt;/p&gt;

</description>
      <category>cdn</category>
      <category>edge</category>
      <category>pop</category>
    </item>
    <item>
      <title>Cần Thơ, Vietnam 🇻🇳</title>
      <dc:creator>Sebastiaan Deckers</dc:creator>
      <pubDate>Fri, 20 Jul 2018 07:28:45 +0000</pubDate>
      <link>https://dev.to/commonshost/cn-th-vietnam--359j</link>
      <guid>https://dev.to/commonshost/cn-th-vietnam--359j</guid>
      <description>&lt;p&gt;The &lt;a href="https://commons.host"&gt;Commons Host&lt;/a&gt; CDN expands with a point-of-presense (PoP) in Cần Thơ, Vietnam. This is the largest city in the Mekong River Delta region of 17 million people. Just 150 km away is Ho Chi Minh City (HCMC), a metropolitan area of another 13 million people.&lt;/p&gt;

&lt;p&gt;This massive population is drastically under-served by conventional CDNs, many of whom lack local infrastructure or peering agreements with incumbent ISPs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oQyQrdjn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/st1dgng83kpzktc9h4ba.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oQyQrdjn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/st1dgng83kpzktc9h4ba.jpeg" alt="Can Tho panorama"&gt;&lt;/a&gt;&lt;br&gt;
Photo: Panorama of Cần Thơ by &lt;a href="https://twitter.com/cweitat"&gt;Chung Wei Tat&lt;/a&gt; at &lt;a href="http://hotelxoai.com"&gt;Hotel XOAI&lt;/a&gt; the &lt;a href="https://fossasia.org"&gt;FOSSASIA&lt;/a&gt; HQ&lt;/p&gt;

&lt;h2&gt;
  
  
  A Different Market
&lt;/h2&gt;

&lt;p&gt;There is limited bandwidth going in-and-out of the country. While local datacentres do exist, they typically come at a hefty premium over similar infrastructure in more saturated markets like the United States. Commons Host is still just a tiny, free &amp;amp; open source service, so expensive datacentre co-location is out of the question.&lt;/p&gt;

&lt;p&gt;That is where Commons Host takes a novel approach using open hardware and commodity fibre internet connections.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Hardware
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://dev.to/commonshost/little-lamb-mk-i-5gf3"&gt;Little Lamb Mk I&lt;/a&gt; micro-servers, based on the &lt;a href="http://magazine.odroid.com"&gt;Odroid HC-1&lt;/a&gt; platform and running open source &lt;a href="https://nodejs.org/en/"&gt;Node.js&lt;/a&gt; software, are ideal for hyper-local deployments.&lt;/p&gt;

&lt;p&gt;Critical financial assistance came from &lt;a href="https://twitter.com/viettienn"&gt;Tien Nguyen&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/viettienn/"&gt;CTO&lt;/a&gt; at &lt;a href="https://www.wego.com"&gt;Wego&lt;/a&gt;, who purchased the server to support the CDN effort.&lt;/p&gt;

&lt;h2&gt;
  
  
  Commodity Fibre
&lt;/h2&gt;

&lt;p&gt;Consumer fibre internet access is widely available in most Asian cities, including Vietnam. So the Commons Host PoP is connected via commodity broadband. The tiny power consumption means that a basic UPS has been enough to deal with intermittent electricity grid outages, resulting in 100% uptime over the first 3+ weeks of operation.&lt;/p&gt;

&lt;p&gt;The physical hosting is generously provided by &lt;a href="http://hotelxoai.com"&gt;Hotel XOAI&lt;/a&gt;, also known as the &lt;a href="https://fossasia.org"&gt;FOSSASIA&lt;/a&gt; HQ. Several kind members from the FOSSASIA community stepped up to help. Firstly, &lt;a href="https://twitter.com/cweitat"&gt;Chung Wei Tat&lt;/a&gt; handled the logistics, i.e. packing the small server in his carry-on luggage. Then, &lt;a href="https://www.linkedin.com/in/danielblueman/"&gt;Daniel J Blueman&lt;/a&gt; remotely handled testing and configuration of the network. &lt;em&gt;Protip: Stay at Hotel XOAI for what is probably the best hotel wifi in Vietnam.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Changing the Game
&lt;/h2&gt;

&lt;p&gt;Being able to affordably deploy many PoPs, across ISPs and cities, is ideal for CDNs in these markets. And for the local ISPs having a PoP on their network keeps traffic local which helps them avoid expensive transit fees. As the Commons Host CDN service gains traction, more and/or larger PoPs can be easily deployed to scale capacity.&lt;/p&gt;

&lt;p&gt;Work has started to translate all the Commons Host website content and developer documentation. Part of deploying PoPs in new regions is helping local developers learn how to adopt it to better serve their users.&lt;/p&gt;

&lt;p&gt;Many thanks to &lt;a href="https://twitter.com/viettienn"&gt;Tien Nguyen&lt;/a&gt; and the &lt;a href="https://fossasia.org"&gt;FOSSASIA&lt;/a&gt; community. Team work makes the dream work.&lt;/p&gt;

</description>
      <category>cdn</category>
      <category>edge</category>
      <category>pop</category>
    </item>
  </channel>
</rss>
