<?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: Jae Beojkkoch</title>
    <description>The latest articles on DEV Community by Jae Beojkkoch (@jae).</description>
    <link>https://dev.to/jae</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%2F584343%2F619a96d0-9dd7-44be-be7f-5598039cbb31.png</url>
      <title>DEV Community: Jae Beojkkoch</title>
      <link>https://dev.to/jae</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jae"/>
    <language>en</language>
    <item>
      <title>Easy dark theme with CSS only</title>
      <dc:creator>Jae Beojkkoch</dc:creator>
      <pubDate>Sat, 27 Feb 2021 07:56:03 +0000</pubDate>
      <link>https://dev.to/jae/easy-dark-theme-with-css-only-1ed6</link>
      <guid>https://dev.to/jae/easy-dark-theme-with-css-only-1ed6</guid>
      <description>&lt;p&gt;Today, I'm going to show you how to add a simple dark theme do your website.&lt;/p&gt;

&lt;p&gt;First, we have something like this, light theme by default.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Oy5gVkNH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4beyplfpnwcwzkluzfum.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Oy5gVkNH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4beyplfpnwcwzkluzfum.png" alt="Light theme of the website"&gt;&lt;/a&gt;&lt;br&gt;
The light theme corresponds to this in CSS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#FFF&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="m"&gt;#212121&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, let's make a dark theme by default!&lt;br&gt;
It is fairly simple to do, just change your &lt;code&gt;background-color&lt;/code&gt; and &lt;code&gt;color&lt;/code&gt; to the values you need for your dark theme (don't forget links as well if you already don't have theming for those).&lt;/p&gt;

&lt;p&gt;For instance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#212121&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="m"&gt;#FFF&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="m"&gt;#F57C00&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which will give this by default.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Sgqr4LHC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mmxerrh3rhwr0j75tzry.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Sgqr4LHC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mmxerrh3rhwr0j75tzry.png" alt="Default dark theme"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sweet, but now we want people to still be able to see the light them if they selected it.&lt;br&gt;
To achieve that, just add &lt;code&gt;@media screen and (prefers-color-scheme: light)&lt;/code&gt; around your light theme CSS.&lt;br&gt;
For instance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="n"&gt;screen&lt;/span&gt; &lt;span class="n"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prefers-color-scheme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;light&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&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;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#FFF&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="m"&gt;#212121&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="m"&gt;#7E57C2&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And voilà, you have now a website that supports light and dark themes 🎉&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VVgDc_O---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8e5z1zyljl55cl2yf3j8.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VVgDc_O---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8e5z1zyljl55cl2yf3j8.gif" alt="Dark Theme loop"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Obtaining A+ SSL w/ Caddy</title>
      <dc:creator>Jae Beojkkoch</dc:creator>
      <pubDate>Fri, 26 Feb 2021 19:29:58 +0000</pubDate>
      <link>https://dev.to/jae/obtaining-a-ssl-w-caddy-mog</link>
      <guid>https://dev.to/jae/obtaining-a-ssl-w-caddy-mog</guid>
      <description>&lt;p&gt;Hi there, today I'm going to show you how to get an A+ on &lt;a href="https://www.ssllabs.com/" rel="noopener noreferrer"&gt;SSL Labs&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: This tutorial is only usable with &lt;a href="https://caddyserver.com/" rel="noopener noreferrer"&gt;Caddy Server&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  The DNS CAA
&lt;/h3&gt;

&lt;p&gt;The DNS CAA (or DNS Certification Authority Authorization) is a security mechanism that allows you to mark certain certificate authorities as trusted.&lt;/p&gt;

&lt;p&gt;For instance, if you are using &lt;a href="https://letsencrypt.org/" rel="noopener noreferrer"&gt;Let's Encrypt&lt;/a&gt; certificates, you would have to allow &lt;code&gt;letsencrypt.org&lt;/code&gt; to make valid certificates for your domains.&lt;/p&gt;

&lt;p&gt;To add this verification level, you must add a CAA record to your domain's DNS.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4fgrjn95q1bbt6b7chg5.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4fgrjn95q1bbt6b7chg5.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In text only, the record looks like: &lt;code&gt;your.domain. CAA 0 issue "letsencrypt.org"&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Headers
&lt;/h3&gt;

&lt;p&gt;To get the A+ score, you need to set up some headers as shown below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;header {
    X-Frame-Options "Deny"
    Content-Security-Policy "
        default-src 'none';
        style-src 'self';
        script-src 'self';
        font-src 'self';
        img-src data: 'self';
        form-action 'self';
        connect-src 'self';
        frame-ancestors 'none';
        base-uri 'self';
        report-uri {$CSP_REPORT_URI}
    "
    X-Content-Type-Options "nosniff"
    Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's see what all of this stuff does shall we?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;X-Frame-Options "Deny"&lt;/code&gt;  disallows other pages or websites to add embeds, frames, iframes and objects referencing your domain. Alternatively of &lt;code&gt;Deny&lt;/code&gt;, you can set it to &lt;code&gt;SAMEORIGIN&lt;/code&gt; so you can use it on your website.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;X-Content-Type-Options "nosniff"&lt;/code&gt; is used to prevent &lt;a href="https://www.keycdn.com/support/what-is-mime-sniffing" rel="noopener noreferrer"&gt;MIME Sniffing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"&lt;/code&gt; is forcing your domain to have a valid HTTPS certificate for the time period specified by the &lt;code&gt;max-age&lt;/code&gt; parameter (one year in our case). If the HTTPS certificate is not present, the browser will display an error. The &lt;code&gt;includeSubDomains&lt;/code&gt; directive is used so the STS is applied to all subdomains as well.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Content-Security-Policy&lt;/code&gt; is a wide range of policies to allow or not distant domains to load resources (such as CSS or JavaScript files). The provided configuration only allows for the current domain to load files which can be problematic in some use cases. To allow a domain to load resources, just add it after the &lt;code&gt;self&lt;/code&gt;. E.G: &lt;code&gt;style-src 'self' CDN.domain.TLD;&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Word of the end
&lt;/h3&gt;

&lt;p&gt;Congrats!&lt;br&gt;
&lt;a href="https://media.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%2F8jb5xfdb2w24jztm3je8.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8jb5xfdb2w24jztm3je8.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
You should be ready now. The only thing to do left is to test  your settings using a tool like &lt;a href="https://www.ssllabs.com/" rel="noopener noreferrer"&gt;SSL Labs&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>caddy</category>
      <category>web</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Accelerating PrestaShop 1.6</title>
      <dc:creator>Jae Beojkkoch</dc:creator>
      <pubDate>Fri, 26 Feb 2021 14:11:31 +0000</pubDate>
      <link>https://dev.to/jae/accelerating-prestashop-1-6-2gc9</link>
      <guid>https://dev.to/jae/accelerating-prestashop-1-6-2gc9</guid>
      <description>&lt;p&gt;Greetings everyone, today I'm going to show you how to speed up PrestaShop's back office.&lt;br&gt;
When clicking on the '&lt;em&gt;Modules and Services&lt;/em&gt;' button, PrestaShop sends a request to get the latest add-ons available in the store.&lt;br&gt;
Since PrestaShop is made by incompetent people, the API server is &lt;em&gt;of course&lt;/em&gt; very slow.&lt;/p&gt;

&lt;p&gt;To incapacitate that request, nothing more simple.&lt;br&gt;
For this, navigate to &lt;code&gt;classes&lt;/code&gt; and find the &lt;code&gt;Tools.php&lt;/code&gt; file.&lt;br&gt;
Now, go to approximately line 3353 (when the function &lt;code&gt;addonsRequest&lt;/code&gt; starts) and add this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;addonsRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It should now prevent PrestaShop to load indefinitely for nothing.&lt;/p&gt;

</description>
      <category>prestashop</category>
      <category>tutorial</category>
      <category>php</category>
    </item>
    <item>
      <title>Prestashop: the good, the bad and the ugly</title>
      <dc:creator>Jae Beojkkoch</dc:creator>
      <pubDate>Thu, 25 Feb 2021 11:42:11 +0000</pubDate>
      <link>https://dev.to/jae/prestashop-the-good-the-bad-and-the-ugly-4mhp</link>
      <guid>https://dev.to/jae/prestashop-the-good-the-bad-and-the-ugly-4mhp</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3dIymlyX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://news.jae.moe/IMG/arton8.png%3F1614247659" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3dIymlyX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://news.jae.moe/IMG/arton8.png%3F1614247659" alt="Prestashop logo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I recently got a job opportunity where I had to maintain a PrestaShop website &amp;amp; additional modules, how bad could it be?&lt;br&gt;&lt;br&gt;
Well, even worse than you may think.&lt;/p&gt;

&lt;p&gt;At first, PrestaShop seemed like an &lt;em&gt;okay&lt;/em&gt; CMS, not good, not bad, just &lt;em&gt;meh&lt;/em&gt;.&lt;br&gt;&lt;br&gt;
The pages were loading in a reasonable time for a PHP application this big and there were no major issues.&lt;/p&gt;

&lt;p&gt;And then a week passed.&lt;br&gt;&lt;br&gt;
I immediately noticed the "&lt;em&gt;Modules and Services&lt;/em&gt;" tab took at least a minute to load in the first place, more than ten in the worst cases, this is due to PrestaShop trying to load the distant module shop, which is frankly hosted by people that don't know how to run a server.&lt;br&gt;&lt;br&gt;
Did I also mention that there is &lt;strong&gt;no way&lt;/strong&gt; for a regular user to disable that? I had to modify PrestaShop's core to get rid of this "feature" because modules that previously blocked this loading were not working any more.&lt;/p&gt;

&lt;p&gt;Currently, the shop runs on the 1.6 of PrestaShop which is riddled with thousands, if not millions of bugs.&lt;br&gt;&lt;br&gt;
PrestaShop themselves, in their incompetence, decided to &lt;strong&gt;not&lt;/strong&gt; fix the bugs of the 1.6 and release the 1.7, without prior notice, changing everything and rendering thousands of modules unusable on newer versions.&lt;br&gt;&lt;br&gt;
As of now, updating PrestaShop adds way more bugs than it fixes, this is why updating is &lt;strong&gt;not even remotely recommended for anyone in their right minds&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;Also, when we're at it, let's talk a bit about modules and support.&lt;br&gt;&lt;br&gt;
PrestaShop is managed by &lt;strong&gt;idiots&lt;/strong&gt;; some modules can cost up to &lt;a href="https://addons.prestashop.com/en/third-party-data-integrations-crm-erp/39985-atoo-sync-gescom-sage-100c.html"&gt;a fucking thousand Euros&lt;/a&gt; but the support is as good as talking to a bot.&lt;br&gt;&lt;br&gt;
In the best case, you pay more and only get three months of support and one update for a module that will &lt;em&gt;maybe&lt;/em&gt; work.&lt;br&gt;&lt;br&gt;
Nothing on their shop is tested before being sold, and it wouldn't surprise me if there would be malicious content on there, sold for real money.&lt;br&gt;&lt;br&gt;
When having a problem with a module, the person charged with your support request will most likely say "it's your server, not our module" and close your support ticket (for both unofficial &lt;strong&gt;and&lt;/strong&gt; official modules).&lt;/p&gt;

&lt;p&gt;Given the countless bugs, incompetent people and shitty support, please, please do not use PrestaShop.&lt;br&gt;&lt;br&gt;
A good alternative would be &lt;a href="https://woocommerce.com/"&gt;WooCommerce&lt;/a&gt;; if you really want to use PrestaShop, please use the fork &lt;a href="https://thirtybees.com/"&gt;ThirtyBees&lt;/a&gt; whose goal is to offer a stable experience, without any bugs.&lt;/p&gt;

</description>
      <category>prestashop</category>
      <category>rant</category>
    </item>
    <item>
      <title>How to install Spip with Docker</title>
      <dc:creator>Jae Beojkkoch</dc:creator>
      <pubDate>Wed, 24 Feb 2021 19:29:56 +0000</pubDate>
      <link>https://dev.to/jae/the-answer-to-life-death-and-everything-else-14h2</link>
      <guid>https://dev.to/jae/the-answer-to-life-death-and-everything-else-14h2</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pWOGSmW4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://news.jae.moe/IMG/arton5.png%3F1613557567" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pWOGSmW4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://news.jae.moe/IMG/arton5.png%3F1613557567" alt="Spip Logo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this small tutorial, I'm assuming you are using Debian Buster as your server OS.&lt;/p&gt;

&lt;h3&gt;
  
  
  First step: install Docker
&lt;/h3&gt;

&lt;p&gt;Installing Docker is pretty straightforward, and all the instructions are available on the &lt;a href="https://docs.docker.com/engine/install/debian/"&gt;official Docker website&lt;/a&gt;.&lt;br&gt;&lt;br&gt;
This can be summed up as (to execute as root):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apt remove docker docker-engine docker.io containerd runc apt update apt &lt;span class="nb"&gt;install &lt;/span&gt;apt-transport-https ca-certificates curl gnupg-agent software-properties-common curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://download.docker.com/linux/debian/gpg | apt-key add -

add-apt-repository &lt;span class="se"&gt;\ &lt;/span&gt;&lt;span class="s2"&gt;"deb [arch=amd64] https://download.docker.com/linux/debian &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;lsb_release &lt;span class="nt"&gt;-cs&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
stable"&lt;/span&gt;

apt update apt &lt;span class="nb"&gt;install &lt;/span&gt;docker-ce docker-ce-cli containerd.io

systemctl start docker systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also, do not forget to install docker-compose as these tools make easier the deployment of services:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/docker/compose/releases/download/1.28.2/docker-compose-&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /usr/local/bin/docker-compose

&lt;span class="nb"&gt;chmod&lt;/span&gt; +x /usr/local/bin/docker-compose
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And you're all set-up for the rest!&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating the Docker Compose file
&lt;/h3&gt;

&lt;p&gt;Creating the &lt;code&gt;docker-compose.yml&lt;/code&gt; is fairly easy:&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="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3'&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
   &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mariadb:10&lt;/span&gt;
   &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
   &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
     &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;MYSQL_RANDOM_ROOT_PASSWORD=1&lt;/span&gt;
     &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;MYSQL_DATABASE=spip&lt;/span&gt;
     &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;MYSQL_USER=spip&lt;/span&gt;
     &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;MYSQL_PASSWORD=verysecret&lt;/span&gt;
   &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
     &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;./spip-db:/var/lib/mysql'&lt;/span&gt;
  &lt;span class="na"&gt;spip&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ashledombos/spip-web&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;php&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;db&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;./spip-core:/var/www/html/core'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;./spip-data:/var/www/html/data'&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;SPIP_DB_SERVER=db&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;SPIP_DB_LOGIN=spip&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;SPIP_DB_PASS=verysecret&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;SPIP_DB_NAME=spip&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;8031:80'&lt;/span&gt;
  &lt;span class="na"&gt;php&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ashledombos/spip-fpm:3.2'&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;db&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;./spip-core:/var/www/html/core'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;./spip-data:/var/www/html/data'&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;SPIP_DB_SERVER=mysql&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;SPIP_DB_HOST=db&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;SPIP_DB_LOGIN=spip&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;SPIP_DB_PASS=verysecret&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;SPIP_DB_PREFIX=spip&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;SPIP_ADMIN_NAME=admin&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;SPIP_ADMIN_LOGIN=administrator&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;SPIP_ADMIN_EMAIL=me@domain.tld&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;SPIP_ADMIN_PASS=imverysecret&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;PHP_MAX_EXECUTION_TIME=60&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;PHP_MEMORY_LIMIT=256M&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;PHP_POST_MAX_SIZE=40M&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;PHP_UPLOAD_MAX_FILESIZE=32M&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;PHP_TIMEZONE=Europe/Paris&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Of course, replace the passwords and ports with whatever fits you.&lt;br&gt;&lt;br&gt;
You can also use an environment file to store the passwords (which is recommended if you share your config in a public repo).&lt;/p&gt;

&lt;p&gt;Now, all you have to do to start the services is &lt;code&gt;docker-compose up -d&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
All the basics of the &lt;code&gt;docker-compose&lt;/code&gt; command can be seen on their &lt;a href="https://docs.docker.com/compose/"&gt;official website&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting up the reverse proxy
&lt;/h3&gt;

&lt;p&gt;As a reverse proxy, I am currently using the &lt;a href="https://caddyserver.com/"&gt;Caddy&lt;/a&gt; server as it is really easy to use and maintain.&lt;br&gt;&lt;br&gt;
It also has automatic SSL certificates (with auto-renew) which I find very practical.&lt;br&gt;&lt;br&gt;
In order to serve Spip to users, you need to add this to your Caddyfile:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://domain.tld { encode zstd gzip reverse_proxy 127.0.0.1:8031 }&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Note: the &lt;code&gt;encode zstd gzip&lt;/code&gt; is only used to compress pages which can improve loading times in certain browsers.&lt;/p&gt;

&lt;p&gt;And you should be all set-up, all is left to do is the regular Spip first startup configuration!&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>howto</category>
      <category>docker</category>
      <category>spip</category>
    </item>
    <item>
      <title>NextDNS, a good companion for everyday internet usage</title>
      <dc:creator>Jae Beojkkoch</dc:creator>
      <pubDate>Wed, 24 Feb 2021 11:02:34 +0000</pubDate>
      <link>https://dev.to/jae/nextdns-a-good-companion-for-everyday-internet-usage-ci4</link>
      <guid>https://dev.to/jae/nextdns-a-good-companion-for-everyday-internet-usage-ci4</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tTpXYY-t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://news.jae.moe/IMG/arton6.png%3F1613569319" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tTpXYY-t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://news.jae.moe/IMG/arton6.png%3F1613569319" alt="NextDNS Logo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I have been using &lt;a href="https://nextdns.io"&gt;NextDNS&lt;/a&gt; for well over a week now and here is what I have to say about it.&lt;/p&gt;

&lt;p&gt;First, what is NextDNS?&lt;br&gt;&lt;br&gt;
Well, it is a DNS firewall that can be used to block tracking and annoying domains.&lt;br&gt;&lt;br&gt;
It is especially useful for mobile devices, on which ad-blockers such as uBlock Origin aren't available.&lt;br&gt;&lt;br&gt;
As a bonus, NextDNS can also be configured to block telemetry from the major OSes such as Microsoft Windows, Apple macOS or Google's Android.&lt;br&gt;&lt;br&gt;
 &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GdtqDfdS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://news.jae.moe/IMG/png/screenshot_2021-02-17_at_14.49.02.png%3F1613569759" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GdtqDfdS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://news.jae.moe/IMG/png/screenshot_2021-02-17_at_14.49.02.png%3F1613569759" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The service itself is free to use up to 300k requests per month, which is more than enough for a regular user.&lt;br&gt;&lt;br&gt;
The next plan costs 2.- per month for unlimited requests and that's about all that is added.&lt;br&gt;&lt;br&gt;
All features of NextDNS are free by default (except for the unlimited requests).&lt;/p&gt;

&lt;p&gt;Setting up NextDNS itself is really easy, they do have an Open-Source client available on all major desktop OSes such as Linux, Windows, macOS, iOS, Android and even FreeBSD (even tho it is the same as the Linux client).&lt;br&gt;&lt;br&gt;
 &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PQnJz_zo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://news.jae.moe/IMG/png/screenshot_2021-02-17_at_14.46.52.png%3F1613569623" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PQnJz_zo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://news.jae.moe/IMG/png/screenshot_2021-02-17_at_14.46.52.png%3F1613569623" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is also noted that NextDNS can protect you from &lt;a href="https://medium.com/nextdns/cname-cloaking-the-dangerous-disguise-of-third-party-trackers-195205dc522a"&gt;CNAME Cloaking&lt;/a&gt; and that the service offers hundreds of blocklists to choose from.&lt;/p&gt;

&lt;p&gt;My favourite part of the service must be the 'analytics' tab which offers you an insight into your requests.&lt;br&gt;&lt;br&gt;
 &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--R7-GDN6v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://news.jae.moe/IMG/png/screenshot_2021-02-17_at_14.54.04.png%3F1613570053" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--R7-GDN6v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://news.jae.moe/IMG/png/screenshot_2021-02-17_at_14.54.04.png%3F1613570053" alt=""&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
There, you can see your total number of queries, your top resolved and blocked domains, the devices that have sent the most requests, a map of where your requests are going and something called "GAFAM dominance" which is a graph of all requests made to the &lt;a href="https://en.wikipedia.org/wiki/Big_Tech"&gt;GAFAM&lt;/a&gt;s.&lt;/p&gt;

&lt;p&gt;In the end, NextDNS is a good service which I recommend using if you want to avoid being tracked on your mobile devices and have a rather clean web experience.&lt;/p&gt;

</description>
      <category>nextdns</category>
      <category>dns</category>
      <category>tool</category>
    </item>
    <item>
      <title>Installing a Gemini pod</title>
      <dc:creator>Jae Beojkkoch</dc:creator>
      <pubDate>Wed, 24 Feb 2021 10:28:50 +0000</pubDate>
      <link>https://dev.to/jae/installing-a-gemini-pod-15pl</link>
      <guid>https://dev.to/jae/installing-a-gemini-pod-15pl</guid>
      <description>&lt;p&gt;Greetings everyone, this is my first post on there and today, I'll tell you how to install a Gemini pod.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://gemini.circumlunar.space/"&gt;Gemini&lt;/a&gt; is a lightweight protocol made to be private and to be light.&lt;br&gt;
Today, I'll teach you how to deploy your own server, named "pod" so you can brag about it online.&lt;/p&gt;
&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A brain&lt;/li&gt;
&lt;li&gt;Some time (20 minutes maximum)&lt;/li&gt;
&lt;li&gt;A server (dedicated, VPS, magical potato)&lt;/li&gt;
&lt;li&gt;A domain pointed to that server&lt;/li&gt;
&lt;li&gt;Basics in Docker&lt;/li&gt;
&lt;li&gt;Something that tastes good to drink as a reward after&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Starting up
&lt;/h2&gt;

&lt;p&gt;For simplicity reasons, we will use &lt;a href="https://docs.docker.com/compose/"&gt;docker-compose&lt;/a&gt;.&lt;br&gt;
As for the server image, we will use &lt;a href="https://github.com/a-h/gemini"&gt;adrianhesketh/gemini&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Create a &lt;code&gt;docker-compose.yml&lt;/code&gt; file containing:&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="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;2.1'&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;gemini&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;adrianhesketh/gemini:latest&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;1965:1965&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;PORT=1965&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DOMAIN&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./certs:/certs&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./content:/content&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In order to contain the domain, create a &lt;code&gt;.env&lt;/code&gt; file containing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DOMAIN=my-domain.tld
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, let's create the required directories by doing &lt;code&gt;mkdir {certs,content}&lt;/code&gt; and move on by generating the certificates.&lt;br&gt;
Navigate in the 'certs' directory using &lt;code&gt;cd certs&lt;/code&gt; and generate the SSL certificates using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openssl ecparam &lt;span class="nt"&gt;-genkey&lt;/span&gt; &lt;span class="nt"&gt;-name&lt;/span&gt; secp384r1 &lt;span class="nt"&gt;-out&lt;/span&gt; server.key
openssl req &lt;span class="nt"&gt;-new&lt;/span&gt; &lt;span class="nt"&gt;-x509&lt;/span&gt; &lt;span class="nt"&gt;-sha256&lt;/span&gt; &lt;span class="nt"&gt;-key&lt;/span&gt; server.key &lt;span class="nt"&gt;-out&lt;/span&gt; server.crt &lt;span class="nt"&gt;-days&lt;/span&gt; 3650
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Note: you can use SSL certificates from Let's Encrypt, Zerossl or any other source if you wish.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now, return to the root (where the docker-compose.yml is) and edit the file &lt;code&gt;content/index.gmi&lt;/code&gt;.&lt;br&gt;
Put inside:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Hello world!
## This is my Gemini Pod~
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, all you have to do left is to execute &lt;code&gt;docker-compose up -d&lt;/code&gt; to start your server.&lt;br&gt;
After booting it up, navigate to your domain using a &lt;a href="https://github.com/kr1sp1n/awesome-gemini"&gt;Gemini browser&lt;/a&gt; and you should see a nice page saying "Hello world!".&lt;/p&gt;

&lt;p&gt;Congratulations, you have now your own Gemini pod, you can now drink whatever you prepared earlier!&lt;br&gt;
You can learn more about the page syntax of Gemini by going on their &lt;a href="https://gemini.circumlunar.space/docs/gemtext.gmi"&gt;official website&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://news.jae.moe/Installing-your-own-Gemini-pod.html"&gt;Original article on my blog!&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>firstpost</category>
      <category>gemini</category>
      <category>docker</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
