<?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: Sylvain Lesage</title>
    <description>The latest articles on DEV Community by Sylvain Lesage (@severo).</description>
    <link>https://dev.to/severo</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%2Fuser%2Fprofile_image%2F97537%2F226660d2-ec6d-4789-82f6-7eb8297acf3f.jpeg</url>
      <title>DEV Community: Sylvain Lesage</title>
      <link>https://dev.to/severo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/severo"/>
    <language>en</language>
    <item>
      <title>Using webhooks to update a self-hosted Jekyll blog</title>
      <dc:creator>Sylvain Lesage</dc:creator>
      <pubDate>Mon, 26 Aug 2019 14:38:16 +0000</pubDate>
      <link>https://dev.to/severo/using-webhooks-to-update-a-self-hosted-jekyll-blog-59al</link>
      <guid>https://dev.to/severo/using-webhooks-to-update-a-self-hosted-jekyll-blog-59al</guid>
      <description>&lt;p&gt;I host the &lt;a href="https://atlas.tecnologia.bo/"&gt;blog of a community project&lt;/a&gt; on my personal server. It's a static website generated with &lt;a href="https://jekyllrb.com/"&gt;Jekyll&lt;/a&gt;, and the contents are versionned in a &lt;a href="https://github.com/RipeAtlasBolivia/atlas.tecnologia.bo"&gt;git repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In this blog post, I explain how I made the blog automatically update on every new commit. It's the same idea as &lt;a href="https://pages.github.com/"&gt;Github Pages&lt;/a&gt;, but for self-hosting.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;create a script to clone the git repository, then build and deploy the website&lt;/li&gt;
&lt;li&gt;publish a webhooks endpoint on the server&lt;/li&gt;
&lt;li&gt;configure the GitHub repository to send a webhook on every new commit&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Deploy script
&lt;/h2&gt;

&lt;p&gt;The website is hosted on a Debian server, and the files are served from the &lt;code&gt;/var/www/atlas.tecnologia.bo/&lt;/code&gt; directory. To update it from command line, first install the &lt;a href="https://jekyllrb.com/docs/installation/ubuntu/"&gt;Jekyll requirements&lt;/a&gt;, then create and launch the bash script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ /opt/deploy_atlas.tecnologia.bo.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;that contains:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;

&lt;span class="c"&gt;# Clone git repository&lt;/span&gt;
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /tmp/atlas.tecnologia.bo
git clone https://github.com/RipeAtlasBolivia/atlas.tecnologia.bo.git /tmp/atlas.tecnologia.bo

&lt;span class="c"&gt;# Generate blog&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; /tmp/atlas.tecnologia.bo
bundle &lt;span class="nb"&gt;install
&lt;/span&gt;bundle &lt;span class="nb"&gt;exec &lt;/span&gt;jekyll build &lt;span class="nt"&gt;--source&lt;/span&gt; /tmp/atlas.tecnologia.bo/ &lt;span class="nt"&gt;--destination&lt;/span&gt; /var/www/atlas.tecnologia.bo/

&lt;span class="c"&gt;# Clean&lt;/span&gt;
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /tmp/atlas.tecnologia.bo
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Webhook daemon
&lt;/h2&gt;

&lt;p&gt;Instead of manually launching the script, let a webhook daemon do the job every time it receives an HTTP request on an endpoint.&lt;/p&gt;

&lt;p&gt;First install the &lt;a href="https://packages.debian.org/buster/webhook"&gt;webhook package&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;webhook
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Verify the service is running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;service webhook status
● webhook.service - Small server &lt;span class="k"&gt;for &lt;/span&gt;creating HTTP endpoints &lt;span class="o"&gt;(&lt;/span&gt;hooks&lt;span class="o"&gt;)&lt;/span&gt;
   Loaded: loaded &lt;span class="o"&gt;(&lt;/span&gt;/etc/systemd/system/webhook.service&lt;span class="p"&gt;;&lt;/span&gt; enabled&lt;span class="p"&gt;;&lt;/span&gt; vendor preset: enabled&lt;span class="o"&gt;)&lt;/span&gt;
   Active: active &lt;span class="o"&gt;(&lt;/span&gt;running&lt;span class="o"&gt;)&lt;/span&gt; since Mon 2019-08-12 08:25:24 UTC&lt;span class="p"&gt;;&lt;/span&gt; 2 weeks 0 days ago
     Docs: https://github.com/adnanh/webhook/
 Main PID: 419 &lt;span class="o"&gt;(&lt;/span&gt;webhook&lt;span class="o"&gt;)&lt;/span&gt;
    Tasks: 6 &lt;span class="o"&gt;(&lt;/span&gt;limit: 4697&lt;span class="o"&gt;)&lt;/span&gt;
   Memory: 4.8M
   CGroup: /system.slice/webhook.service
           └─419 /usr/bin/webhook &lt;span class="nt"&gt;-verbose&lt;/span&gt; &lt;span class="nt"&gt;-hooks&lt;/span&gt; /etc/webhook.conf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;We configure the webhook daemon, creating the file &lt;code&gt;/etc/webhook.conf&lt;/code&gt; with the following content (see the &lt;a href="https://github.com/adnanh/webhook/wiki/"&gt;webhook documentation&lt;/a&gt; for more details):&lt;br&gt;
&lt;/p&gt;

&lt;div class="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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"atlas"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"execute-command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/opt/deploy_atlas.tecnologia.bo.sh"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"command-working-directory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/tmp/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"trigger-rule"&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;"match"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"payload-hash-sha1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"secret"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"xxxxxxxxx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"parameter"&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;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"header"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"X-Hub-Signature"&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;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;This creates a new hook called &lt;code&gt;atlas&lt;/code&gt;, that will be triggered when a GET or POST request is received on &lt;code&gt;http://localhost:9000/hooks/atlas&lt;/code&gt;. When triggered, it will check that a valid &lt;code&gt;X-Hub-Signature&lt;/code&gt; HTTP header has been provided, and then launch the &lt;code&gt;/opt/deploy_atlas.tecnologia.bo.sh&lt;/code&gt; script from the &lt;code&gt;/tmp&lt;/code&gt; working directory.&lt;/p&gt;

&lt;p&gt;Try it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;compute the &lt;code&gt;X-Hub-Signature&lt;/code&gt; corresponding to the &lt;code&gt;xxxxxxxxx&lt;/code&gt; secret
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ echo -n "" | openssl sha1 -hmac "xxxxxxxxx"
(stdin)= d46d87941e6f285be78ff0f1c8ea32620577b9ef
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;request the endpoint:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ curl -X POST -H "X-Hub-Signature: sha1=d46d87941e6f285be78ff0f1c8ea32620577b9ef" -v http://localhost:9000/hooks/atlas
...
&amp;gt; POST /hooks/atlas HTTP/1.1
&amp;gt; Host: localhost:9000
&amp;gt; User-Agent: curl/7.64.0
&amp;gt; Accept: */*
&amp;gt; X-Hub-Signature: sha1=d46d87941e6f285be78ff0f1c8ea32620577b9ef
&amp;gt;
&amp;lt; HTTP/1.1 200 OK
&amp;lt; Date: Mon, 26 Aug 2019 13:45:09 GMT
&amp;lt; Content-Length: 0
&amp;lt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;check the logs:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ grep webhook /var/log/syslog
Aug 26 14:06:40 webhook[10552]: [webhook] 2019/08/26 14:06:40 Started POST /hooks/atlas
Aug 26 14:06:40 webhook[10552]: [webhook] 2019/08/26 14:06:40 [d2ae30] incoming HTTP request from [::1]:58800
Aug 26 14:06:40 webhook[10552]: [webhook] 2019/08/26 14:06:40 [d2ae30] atlas got matched
Aug 26 14:06:40 webhook[10552]: [webhook] 2019/08/26 14:06:40 [d2ae30] atlas hook triggered successfully
Aug 26 14:06:40 webhook[10552]: [webhook] 2019/08/26 14:06:40 Completed 200 OK in 670.302µs
Aug 26 14:06:40 webhook[10552]: [webhook] 2019/08/26 14:06:40 [d2ae30] executing /opt/deploy_atlas.tecnologia.bo.sh (/opt/deploy_atlas.tecnologia.bo.sh) with arguments ["/opt/deploy_atlas.tecnologia.bo.sh"] and environment [] using /tmp/ as cwd
Aug 26 14:06:46 webhook[10552]: [webhook] 2019/08/26 14:06:46 [d2ae30] command output: Cloning into '/tmp/atlas.tecnologia.bo'...
...
Aug 26 14:06:46 webhook[10552]: Bundle complete! 4 Gemfile dependencies, 24 gems now installed.
Aug 26 14:06:46 webhook[10552]: Use `bundle info [gemname]` to see where a bundled gem is installed.
Aug 26 14:06:46 webhook[10552]: Configuration file: /tmp/atlas.tecnologia.bo/_config.yml
Aug 26 14:06:46 webhook[10552]:             Source: /tmp/atlas.tecnologia.bo/
Aug 26 14:06:46 webhook[10552]:        Destination: /var/www/atlas.tecnologia.bo/
Aug 26 14:06:46 webhook[10552]:  Incremental build: disabled. Enable with --incremental
Aug 26 14:06:46 webhook[10552]:       Generating...
Aug 26 14:06:46 webhook[10552]:        Jekyll Feed: Generating feed for posts
Aug 26 14:06:46 webhook[10552]:                     done in 0.45 seconds.
Aug 26 14:06:46 webhook[10552]:  Auto-regeneration: disabled. Use --watch to enable.
Aug 26 14:06:46 webhook[10552]: [webhook] 2019/08/26 14:06:46 [d2ae30] finished handling atlas
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Note: the 200 HTTP code only means the hook has been found for the &lt;code&gt;atlas&lt;/code&gt; identifier and the X-Hub-Signature is valid. It says nothing about the deploy script success or failure.&lt;/p&gt;

&lt;p&gt;In order to publish the endpoint from a Apache webserver, configure a reverse proxy in your Apache configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ProxyPass /webhook/ http://localhost:9000/hooks/
ProxyPassReverse /webhook/ http://localhost:9000/hooks/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  GitHub configuration
&lt;/h2&gt;

&lt;p&gt;Finally, in order to trigger a webhook on every new push, go to the GitHub project settings, then "Webhooks", and create  a new webhook with the following parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Payload URL: &lt;code&gt;https://mydomain/webhook/atlas&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Content type: &lt;code&gt;application/json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Secret: &lt;code&gt;xxxxxxxxx&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Which events would you like to trigger this webhook?: &lt;code&gt;Just the push event.&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Alternative configuration with GitLab
&lt;/h2&gt;

&lt;p&gt;If your git repository is hosted on a GitLab instance, you must change the headers check in the &lt;code&gt;/etc/webhook.conf&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"atlas"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"execute-command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/opt/deploy_atlas.tecnologia.bo.sh"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"command-working-directory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/tmp/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"trigger-rule"&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;"match"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"xxxxxxxxx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"parameter"&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;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"header"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"X-Gitlab-Token"&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;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;Note: the &lt;code&gt;X-Gitlab-Token&lt;/code&gt; header provided in the request will contain the value &lt;code&gt;xxxxxxxxx&lt;/code&gt;, not its HMAC as it occurs with GitHub. So, to simulate the request, adapt the curl command to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ curl -X POST -H "X-Gitlab-Token: xxxxxxxxx" -v http://localhost:9000/hooks/atlas
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Then, the GitLab project configuration is similar to GitHub: go to the project "Settings", "Integrations", and add a webhook with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;URL: &lt;code&gt;https://mydomain/webhook/atlas&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Secret Token: &lt;code&gt;xxxxxxxxx&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Trigger: [x] Push events&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.rasmuslarsson.se/post/hugo.html"&gt;https://www.rasmuslarsson.se/post/hugo.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/adnanh/webhook/"&gt;https://github.com/adnanh/webhook/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jekyllrb.com/"&gt;https://jekyllrb.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webhook</category>
      <category>github</category>
      <category>jekyll</category>
      <category>selfhosted</category>
    </item>
    <item>
      <title>Administrar un dominio con EU.org y Knot</title>
      <dc:creator>Sylvain Lesage</dc:creator>
      <pubDate>Sun, 02 Sep 2018 22:34:00 +0000</pubDate>
      <link>https://dev.to/severo/administrar-un-dominio-con-euorg-y-knot-3nh9</link>
      <guid>https://dev.to/severo/administrar-un-dominio-con-euorg-y-knot-3nh9</guid>
      <description>&lt;p&gt;&lt;em&gt;Este artículo es una traducción de &lt;a href="https://chezmanu.eu.org/DNS-knot-eu-org.htm" rel="noopener noreferrer"&gt;Obtenir et gérer un nom de domaine (gratuit)&lt;br&gt;
avec Knot et EU.org&lt;/a&gt;, de &lt;a href="https://chezmanu.eu.org/apropos.htm" rel="noopener noreferrer"&gt;Emmanuel Bourguin&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Nombre de dominio, DNS, zona, ¿de qué hablamos?
&lt;/h2&gt;

&lt;p&gt;Para proveer servicios en Internet, es generalmente necesario poseer un nombre de dominio.&lt;/p&gt;

&lt;p&gt;En efecto, si las maquinas comunican entre ellas identificándose por sus direcciones IP, nosotrxs, humanxs, nos acordamos más fácilmente de un nombre que de una sucesión de cifras. Además, un nombre de dominio que sirve como identificador, que se traduce en una dirección IP, da más flexibilidad. Cuando se cambia la dirección IP de la maquina que alberga un servicio, el nombre de dominio puede seguir siendo el mismo, así el cambio es transparente para lxs usuarixs del servicio.&lt;/p&gt;

&lt;p&gt;Hay que establecer un mecanismo para realizar la correspondencia entre un nombre y una dirección IP (u otros tipos de valores). La operación se llama « resolución de un nombre de dominio ». Una correspondencia entre una entrada y un valor, es el rol de una base de datos. En nuestro caso, esta base de datos es mundial, repartida y sin centro. La tarea de llenar esta base de datos es de cada uno de los dueños de nombres de dominio: cada unx es responsable de sus « zonas ». Lo han entendido: esta base de datos mundial se llama el DNS, y funciona gracias a los servidores DNS.&lt;/p&gt;

&lt;p&gt;El papel de los servidores es simplemente responder a consultas, y existen dos tipos de servidores DNS, que se diferencian por la forma que tienen de obtener la información de resolución:&lt;/p&gt;

&lt;p&gt;1 − Los servidores puestos a disposición por tu proveedor de acceso a Internet, que van a resolver las consultas DNS para ti, son llamados comúnmente « resolvers ». Si el servidor no conocer la respuesta, entonces la va a solicitar a otros servidores que la conocen, a veces en varias etapas por lo que los llamamos servidores « recursivos ». También se los llama servidores de « caché », porque no conocen las respuestas, pero una vez que las obtienen, las guardan un cierto tiempo en su memoria. Si estos servidores mienten en la respuesta que proveen, los llamamos « DNS mentirosos », lo que es el caso ahora para los servidores de resolución de los grandes proveedores de acceso a Internet en Francia, principalmente por razones políticas.&lt;/p&gt;

&lt;p&gt;2 − Si el servidor conoce la respuesta sin tener que preguntar a otro, es porque es el servidor encargado de proveer las respuestas para este dominio en particular. En este caso, se dice que el servidor « hace autoridad » sobre la zona DNS que provee. Entonces, para asegurar la administración de tu nombre de dominio, habrá que implementar uno (o varios) servidor DNS que haga autoridad.&lt;/p&gt;

&lt;p&gt;Para eso, nada difícil, &lt;a href="https://www.knot-dns.cz/" rel="noopener noreferrer"&gt;Knot DNS&lt;/a&gt;, software originario de República Checa, que vamos a utilizar, está disponible con Unix, y un Raspberry Pi es ampliamente suficiente en términos de recursos para hacerlo funcionar.&lt;/p&gt;
&lt;h2&gt;
  
  
  Consideraciones sobre el hecho de pagar para un nombre de dominio
&lt;/h2&gt;

&lt;p&gt;Se sobreentiende desde años que hay que pagar para obtener un nombre de dominio, para un tiempo limitado. Así que nunca somos dueñxs del nombre de dominio, más bien somos inquilinxs. Aunque esta idea de pagar para un nombre de dominio es ampliamente difundida, no es correcta. Para ser más precisxs, es muy común tener que pagar para nombres de dominio de dos componentes, como &lt;a href="//algo.com"&gt;algo.com&lt;/a&gt;, &lt;a href="//otracosa.net"&gt;otracosa.net&lt;/a&gt;, &lt;a href="//lutte-ouvriere.org"&gt;lutte-ouvriere.org&lt;/a&gt; o &lt;a href="//potamoch%C3%A8re.fr"&gt;potamochère.fr&lt;/a&gt;. Pero un nombre de dominio también puede contener más de dos componentes, por ejemplo &lt;a href="//edgard.fdn.fr"&gt;edgard.fdn.fr&lt;/a&gt; es un nombre de dominio tanto como &lt;a href="//google.be"&gt;google.be&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Así que la asociación &lt;a href="https://fdn.fr/" rel="noopener noreferrer"&gt;French Data Network&lt;/a&gt; provee a sus suscriptores un nombre de dominio en &lt;a href="//fdn.fr"&gt;.fdn.fr&lt;/a&gt;, dos de mis hijos gozan de uno de estos dominios, sin haber pagado nada, solamente tuve que llamar al camarada-presidente.&lt;/p&gt;

&lt;p&gt;Cuando estaba suscrito al proveedor de acceso Nerim, tenía a mi disposición el nombre de dominio &lt;a href="//emmanuel.bourguin.pck.nerim.net"&gt;emmanuel.bourguin.pck.nerim.net&lt;/a&gt; que apuntaba&lt;br&gt;
a mi IP pública, sin costos adicional. &lt;a href="http://netlib.re/" rel="noopener noreferrer"&gt;Netlib.re&lt;/a&gt; que está alojado en la infraestructura del proveedor de acceso a Internet asociativo &lt;a href="https://www.arn-fai.net/" rel="noopener noreferrer"&gt;Alsace Réseau Neutre&lt;/a&gt; también te permite tener un nombre de dominio gratuito.&lt;/p&gt;

&lt;p&gt;OjO. El servicio &lt;a href="http://www.freenom.com/fr/index.html" rel="noopener noreferrer"&gt;FreeNom&lt;/a&gt; que pretende de manera errónea ser el primero y único proveedor de nombres de dominio gratuitos, no te considera como titular de los dominios que te proveen, sino como simple usuarix, como se puede leer en sus &lt;a href="http://www.freenom.com/fr/index.html" rel="noopener noreferrer"&gt;CGU&lt;/a&gt;, con la ausencia de garantías que implica.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://eu.org/" rel="noopener noreferrer"&gt;EU.org&lt;/a&gt; también provee nombres de dominio gratuitos. Esta iniciativa fue tomada en reacción a la política de precios exorbitantes instaurada en un momento de la Historia donde se volvía vital adquirir nombres de dominio. Si en 2016 los precios han bajado para llegar a ser razonables, algunos siguen siendo vergonzosos (en el momento de la primera redacción de este artículo: 40 euros por año para un .black, o un .lgbt, ¡3.000 euros! para un .auto). Además, la idea de pagar para poder nombrarse es... curiosa. Al&lt;br&gt;
contrario de un &lt;em&gt;registrar&lt;/em&gt; clásico/comercial, EU.org no administrará la zona DNS asociada al nombre de dominio proveído. De eso se encargarán los servidores que vamos a instalar.&lt;/p&gt;
&lt;h2&gt;
  
  
  Instalación de Knot DNS
&lt;/h2&gt;

&lt;p&gt;En una consola, bajo Debian:&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;sudo &lt;/span&gt;apt-get &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nb"&gt;install &lt;/span&gt;knot 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Configuración de Knot DNS
&lt;/h2&gt;

&lt;p&gt;Empezamos por la edición del archivo de configuración principal de Knot:&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;sudo &lt;/span&gt;nano /etc/knot/knot.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En la sección « zone » definimos una nueva zona, que corresponde a nuestro nombre de dominio, aquí « exemple.eu.org ». El archivo de configuración correspondiente será llamado « exemple.eu.org.zone ».&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;domain&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;exemple.eu.org&lt;/span&gt;
    &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;exemple.eu.org.zone"&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&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%2Fyd6jh069i1tzbamure9a.png" 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%2Fyd6jh069i1tzbamure9a.png" alt="Configuración de Knot" width="675" height="702"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ahora vamos a crear y editar el archivo de zona, en &lt;code&gt;/var/lib/knot/&lt;/code&gt;:&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;sudo touch&lt;/span&gt; /var/lib/knot/exemple.eu.org.zone
&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /var/lib/knot/exemple.eu.org.zone
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Colocaremos el contenido siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@                          10800   IN  SOA     exemple.eu.org. e.fdn.fr.  (
                             2018040301    ;  Numero
                             28800        ;  Refresh
                             14400        ;  Retry
                             3600000      ;  Expire
                             86400 )      ;  Minimum

                             IN 3600   NS  ns.exemple.eu.org.
exemple.eu.org.     IN 3600   A    93.184.216.34
exemple.eu.org.     IN 3600   AAAA    2606:2800:220:1:248:1893:25c8:1946
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ten cuidado en adaptar tu archivo de zona a tu propio nombre de dominio. También tomar en cuenta que los "punto y coma" finales son obligatorios.&lt;/p&gt;

&lt;p&gt;En la primera línea, luego de tu nombre de dominio, tienes que colocar tu dirección de correo electrónico, remplazando el &lt;code&gt;@&lt;/code&gt; por un punto. Por convención, se considera que el primer punto corresponde a &lt;code&gt;@&lt;/code&gt;, por eso si tu dirección es algo como &lt;code&gt;juan.carlos@exemple.eu.org&lt;/code&gt;, tienes que colocar &lt;code&gt;juan\.carlos&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Los diferentes valores numéricos son tiempos expresados en segundos. La explicación en detalle sale del marco de este artículo. Los más importantes son el número de serie, « 2016121300 » en el ejemplo, que tendrás que incrementar cada vez que actualizas tu archivo de zona. Una astucia clásica consiste en colocar la fecha del día, de esta forma evitas que el número se decremente, lo que tendría consecuencias complicadas.&lt;/p&gt;

&lt;p&gt;El otro valor importante es el TTL, que se ve en las dos últimas líneas. Es una indicación de la duración de validez de la información enviada por tu servidor. Aquí es de 3.600 segundos, o sea una hora. Significa que los servidores de resolución DNS de los proveedores de acceso a Internet considerarán que la respuesta « 92.93.169.42 » a la pregunta « ¿cuál es la dirección IP asociada al nombre de dominio exemple.eu.org? » es valida una hora, y luego volverán a preguntar. Si algún día tienes que cambiar la IP asociada a tu nombre de dominio, piensa en bajar primero este TTL para que el corte de servicio sea el menor posible. Luego vuelve a subir el valor para evitar que tu servidor reciba demasiadas consultas inútiles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reinicio y verificación
&lt;/h2&gt;

&lt;p&gt;Una vez realizada la configuración, reiniciamos Knot con el comando:&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;sudo &lt;/span&gt;service knot restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego podemos verificar en los logs que todo funciona como esperado:&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;sudo &lt;/span&gt;service knot status
&lt;/code&gt;&lt;/pre&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%2F044uwxsjn37waqqf8ib4.png" 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%2F044uwxsjn37waqqf8ib4.png" alt="Estatus del servidor Knot" width="675" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tenemos la confirmación que la sintaxis del archivo de configuración era correcta. Una vez eso hecho, piensa en abrir el puerto 53 en TCP y UDP en las opciones NAT de tu router, y a redirigirlo hacia la maquina sobra la cual Knot está corriendo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inscripción en EU.org
&lt;/h2&gt;

&lt;p&gt;Primero, asegúrate de haber leído atentamente las &lt;a href="https://nic.eu.org/fr/policy.html" rel="noopener noreferrer"&gt;condiciones generales de EU.org&lt;/a&gt; así que las &lt;a href="https://nic.eu.org/fr/top-policy.html" rel="noopener noreferrer"&gt;reglas adicionales&lt;/a&gt; para los subdominios directos.&lt;/p&gt;

&lt;p&gt;Luego, puedes ir a la &lt;a href="https://nic.eu.org/arf/fr/contact/create/" rel="noopener noreferrer"&gt;página de registro&lt;/a&gt;, llenar el formulario de creación de cuenta y validar tu correo electrónico para activarla.&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%2Fjasckph0ot23wwsx5l8a.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%2Fjasckph0ot23wwsx5l8a.jpg" alt="Creación de la cuenta en EU.org" width="800" height="767"&gt;&lt;/a&gt;&lt;br&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%2F0jbnyy9r8nnder16f7i2.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%2F0jbnyy9r8nnder16f7i2.jpg" alt="Cuenta creada" width="800" height="226"&gt;&lt;/a&gt;&lt;br&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%2F2a7z5x3ic0qk48sqqyq7.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%2F2a7z5x3ic0qk48sqqyq7.jpg" alt="Correo de confirmación" width="557" height="419"&gt;&lt;/a&gt;&lt;br&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%2Faoz6js4sm9lpq3r456tk.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%2Faoz6js4sm9lpq3r456tk.jpg" alt="Cuenta activada" width="800" height="337"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Creación de un nombre de dominio
&lt;/h2&gt;

&lt;p&gt;Ahora, solo te queda &lt;a href="https://nic.eu.org/arf/fr/domain/new/" rel="noopener noreferrer"&gt;crear tu nombre de dominio&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Coloca el nombre completo del dominio en el primer campo, en este caso &lt;code&gt;exemple.eu.org&lt;/code&gt;. Los siguientes campos, para la identificación en el registro &lt;em&gt;whois&lt;/em&gt; están pre-llenados. Puedes elegir de conservarlos privados, en este caso solamente EU.org tendrá acceso a ellos.&lt;/p&gt;

&lt;p&gt;En el campo « Name1 » colocar ns.TUDOMINIO.eu.org, en este caso « ns.exemple.eu.org ». Y luego en el campo « IP1» la dirección IP de la maquina dónde funciona Knot (es el momento de asegurarte que abriste el puerto 53 en tu router).&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%2F0i0o540yb0qifqpld3k3.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%2F0i0o540yb0qifqpld3k3.jpg" alt="Creación del nombre de dominio en EU.org" width="800" height="1527"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Una vez hecho, el sistema de EU.org procederá a las verificaciones y si todo está correcto, tu solicitud será enviada a las personas que administran EU.org.&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%2Frs14vd6fmuetly3uodeg.png" 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%2Frs14vd6fmuetly3uodeg.png" alt="Solicitud enviada" width="650" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En este momento, todavía el nombre de dominio no ha sido creado. Se puede verificar con el comando siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;host exemple.eu.org
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;que devuelve el error « NXDOMAIN » (Non-eXistent Domain).&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%2F99puofuz571y1g065ntf.png" 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%2F99puofuz571y1g065ntf.png" alt="Dominio inexistente" width="675" height="162"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Luego de que EU.org haya aceptado tu solicitud, recibirás un correo de notificación:&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%2Fy5ocxkmzyg2zlwjkg8mo.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%2Fy5ocxkmzyg2zlwjkg8mo.jpg" alt="Correo de confirmación del nombre de dominio" width="618" height="554"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ahora sí, luego de algunos minutos, o hasta algunas horas, el nombre de dominio llega a existir.&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%2Fnwgd6nz115ppq24mm8kw.png" 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%2Fnwgd6nz115ppq24mm8kw.png" alt="Dominio creado" width="675" height="117"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Epilogo (temporal)
&lt;/h2&gt;

&lt;p&gt;Listo, ya tienes tu nombre de dominio gracias a Knot y EU.org. Nota que si bien el servicio es gratuito para ti, no deja de tener un costo. Así que si tienes la posibilidad, considera realizar una pequeña donación a EU.org.&lt;/p&gt;

&lt;p&gt;Este tutorial ha sido escrito en la óptica de « auto-alojamiento ». Según las buenas prácticas, deberías tener por lo menos dos servidores que hagan autoridad sobre tu nombre de dominio, si fuera posible lo más lejos posible a nivel geográfico, y alojados en dos sistemas autónomos diferentes, con el fin de minimizar los riesgos de interrupción de servicio si una de las maquinas dejará de estar disponible.&lt;/p&gt;

&lt;p&gt;En el marco del auto-alojamiento donde tu sitio y tu servidor de correo personal están en tu casa, detrás de una línea ADSL o de fibra, esta precaución es exagerada. Si tu conexión se corta, no sirve de nada que el servidor de nombres de dominio siga funcionando, ya que de todas formas tu sitio será inaccesible.&lt;/p&gt;

&lt;p&gt;Entonces, toma este tutorial como lo que es: un ejemplo &lt;em&gt;quick &amp;amp; dirty&lt;/em&gt; para una persona particular que se auto-aloja y quiere disponer de un nombre de dominio sin mayores costos, no como un artículo de referencia sobre DNS.&lt;/p&gt;

&lt;p&gt;Este artículo será seguido por una segunda parte, que explicará que tener redundancia sí puede ser útil en algunos casos, y cómo añadir esta redundancia.&lt;/p&gt;

</description>
      <category>dns</category>
      <category>knot</category>
      <category>alojamiento</category>
      <category>raspberrypi</category>
    </item>
  </channel>
</rss>
