<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Orcada]]></title><description><![CDATA[A Cardano (ADA) Stake Pool, built for whales... of all sizes]]></description><link>https://orcada.io/</link><image><url>https://orcada.io/favicon.png</url><title>Orcada</title><link>https://orcada.io/</link></image><generator>Ghost 4.36</generator><lastBuildDate>Sat, 04 Apr 2026 18:47:17 GMT</lastBuildDate><atom:link href="https://orcada.io/blog/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Retiring the Orcada Stake Pool]]></title><description><![CDATA[<p>Dear community.</p><p>It brings us great sadness to announce that the Orcada Stake Pool (ORCA) will be retiring shortly, as we have made the strategic decision to focus on other parts of our business.</p><p>It&#x2019;s been an absolute pleasure to be part of the Cardano community since we</p>]]></description><link>https://orcada.io/blog/retiring-the-orcada-stake-pool/</link><guid isPermaLink="false">69c1b924985fea03f8da8c49</guid><dc:creator><![CDATA[Orcada website]]></dc:creator><pubDate>Mon, 23 Mar 2026 22:07:56 GMT</pubDate><content:encoded><![CDATA[<p>Dear community.</p><p>It brings us great sadness to announce that the Orcada Stake Pool (ORCA) will be retiring shortly, as we have made the strategic decision to focus on other parts of our business.</p><p>It&#x2019;s been an absolute pleasure to be part of the Cardano community since we started our stake pool journey in 2022. We still strongly believe in the principles and vision that drive the Cardano ecosystem and will remain active participants in the community.</p><p>Thank you for your support and loyalty over the years. Rest assured, if you are an ORCA delegator your ADA is completely safe and has always remained in your own wallet. We are aiming for epoch 622 to be our last epoch to mint blocks, so please redelegate to another stake pool as soon as possible in order to continue earning rewards.</p><p>With appreciation,<br>The Orcada Team</p>]]></content:encoded></item><item><title><![CDATA[A new home on X]]></title><description><![CDATA[<p>Dear Orcada Community,</p><p>We hope this message finds you well! <br><br>We have an exciting update to share with you all &#x2013; Orcada is moving to a new digital home on X. We&apos;re pleased to announce that Orcada&apos;s X account is now @orcada_io_.</p><p>Why the change?</p>]]></description><link>https://orcada.io/blog/a-new-home-on-x/</link><guid isPermaLink="false">65badc53985fea03f8da8c00</guid><category><![CDATA[X]]></category><category><![CDATA[Twitter]]></category><dc:creator><![CDATA[Orcada website]]></dc:creator><pubDate>Wed, 31 Jan 2024 23:51:10 GMT</pubDate><content:encoded><![CDATA[<p>Dear Orcada Community,</p><p>We hope this message finds you well! <br><br>We have an exciting update to share with you all &#x2013; Orcada is moving to a new digital home on X. We&apos;re pleased to announce that Orcada&apos;s X account is now @orcada_io_.</p><p>Why the change? With the transition from Twitter 1.0 to X, we wanted to streamline our online presence, and better connect with our incredible community.</p><p>Follow us on our social channels.<br>- X: @orcada_io_ (<a href="https://www.x.com/orcada_io_)" rel="noreferrer noopener">www.x.com/orcada_io</a>)<br>- Telegram: @Orcada (<a href="https://t.me/Orcada">https://t.me/Orcada</a>)<br>- Github: <a href="https://github.com/orcada-io" rel="noreferrer noopener">https://github.com/orcada-io</a></p><p>Thank you for being a part of the Orcada family. Your support means the world to us, and we can&apos;t wait to continue growing and innovating together.</p><p>Best regards,<br>The Orcada Team</p>]]></content:encoded></item><item><title><![CDATA[Twitter Account Update]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Dear Orcada Delegators and Cardano Community,</p>
<p>We were recently notified that our Twitter account (@Orcada_io) has been suspended.</p>
<p>We do not know why our account was suspended, however, we have submitted an appeal to the Twitter support team requesting that they reinstate our account.</p>
<p><strong>We are yet to receive</strong></p>]]></description><link>https://orcada.io/blog/twitter-account-update/</link><guid isPermaLink="false">6424aa00b3953403ec2b3afa</guid><category><![CDATA[Twitter]]></category><dc:creator><![CDATA[Orcada website]]></dc:creator><pubDate>Wed, 29 Mar 2023 21:15:46 GMT</pubDate><media:content url="https://orcada.io/content/images/2023/03/logo.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://orcada.io/content/images/2023/03/logo.png" alt="Twitter Account Update"><p>Dear Orcada Delegators and Cardano Community,</p>
<p>We were recently notified that our Twitter account (@Orcada_io) has been suspended.</p>
<p>We do not know why our account was suspended, however, we have submitted an appeal to the Twitter support team requesting that they reinstate our account.</p>
<p><strong>We are yet to receive a response.</strong></p>
<p>In the meantime, please join us on our Telegram <a href="https://t.me/Orcada">group</a> where we are available 24/7 to answer any questions you may have.</p>
<p>Many thanks,<br>
The Orcada Team</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[The HoneyComb LX2]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>The HoneyComb LX2 is an ARM SBC with 16 cores and support for up to 64GB of memory.</p>
<p>The HoneyComb LX2 is ARM <a href="https://developer.arm.com/Architectures/Arm%20SystemReady%20ES" target="_blank">SystemReady ES</a> certified, which means any off the shelf Linux distribution should boot and basic hardware functionality will &quot;just work&quot;.</p>
<h5 id="prerequisites">Prerequisites</h5>
<ul>
<li>1 @ HoneyComb LX2</li>
<li>1</li></ul>]]></description><link>https://orcada.io/blog/the-honeycomb-lx2/</link><guid isPermaLink="false">634474c2b3953403ec2b3826</guid><category><![CDATA[HoneyComb LX2]]></category><category><![CDATA[ARM]]></category><category><![CDATA[SBC]]></category><category><![CDATA[SystemsReady]]></category><category><![CDATA[Debian]]></category><dc:creator><![CDATA[Orcada website]]></dc:creator><pubDate>Tue, 11 Oct 2022 02:04:20 GMT</pubDate><media:content url="https://orcada.io/content/images/2022/10/honeycomb-lx2-1.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://orcada.io/content/images/2022/10/honeycomb-lx2-1.png" alt="The HoneyComb LX2"><p>The HoneyComb LX2 is an ARM SBC with 16 cores and support for up to 64GB of memory.</p>
<p>The HoneyComb LX2 is ARM <a href="https://developer.arm.com/Architectures/Arm%20SystemReady%20ES" target="_blank">SystemReady ES</a> certified, which means any off the shelf Linux distribution should boot and basic hardware functionality will &quot;just work&quot;.</p>
<h5 id="prerequisites">Prerequisites</h5>
<ul>
<li>1 @ HoneyComb LX2</li>
<li>1 @ Silicon Power 64GB (2 x 32GB) SO-DIMM DDR4 3200MHz (must be a matched pair)</li>
<li>1 @ Samsung 2TB 970 EVO Plus NVMe SSD</li>
<li>1 @ <a href="https://www.linksys.com/support-product?sku=USB3GIG" target="_blank">Linksys USB 3 Gigabit Ethernet Adapter</a></li>
<li>1 @ Cable Matters Micro USB to USB-C cable</li>
<li>1 @ SanDisk 32GB Micro SD card</li>
<li>1 @ SanDisk 32GB Flash Drive</li>
</ul>
<h3 id="getting-started">Getting Started</h3>
<h4 id="rackmount">Rackmount</h4>
<p>I wanted to rack mount the LX2, so I purchased a <a href="https://www.mini-itx.com/store/category?type=case&amp;rack=1&amp;volume=over-0&amp;drive-bays=over-0&amp;sortby=price&amp;page=1" target="_blank">1U Mini-ITX form factor rackmount case</a> from the Mini ITX Store:</p>
<p><img src="https://orcada.io/content/images/2022/10/1u-rackmount-chassis.png" alt="The HoneyComb LX2" loading="lazy"></p>
<p>I mounted the board and then installed the RAM and the NVMe SSD. I attached the dual 24/20 (sometimes called 20+4) power supply connector to the ATX 24-pin motherboard socket. The fan to the fan PWM socket and the front panel connector ribbon to the board&apos;s front panel connectors.</p>
<p><img src="https://orcada.io/content/images/2022/10/lx2-fixed-1.png" alt="The HoneyComb LX2" loading="lazy"></p>
<h4 id="firmware">Firmware</h4>
<p>I used the <a href="https://www.balena.io/etcher/" target="_blank">balenaEtcher</a> to flash a <a href="https://images.solid-run.com/LX2k/lx2160a_uefi" target="_blank">firmware image</a> (i.e., lx2160acex7_2000_700_3200_8_5_2_sd_ee5c233.img.xz) to the micro SD card.</p>
<p align="center">
  <img src="https://orcada.io/content/images/2022/10/sandisk_ultra_32gb_microsdhc_uhsi_a1_class_10_u1_memory_card_120mbs_ac41372.png" width="60px" alt="The HoneyComb LX2">
</p>
<p><strong>Note:</strong> You must use the firmware image that matches the clock speed (e.g., 3200 MHz) of your DDR4 RAM.</p>
<h4 id="linux-distribution">Linux distribution</h4>
<p>I used the <a href="https://www.balena.io/etcher/" target="_blank">balenaEtcher</a> to flash a Debian 11.5 <a href="https://cdimage.debian.org/debian-cd/current/arm64/iso-cd/" target="_blank">ISO image</a> (i.e., debian-11.5.0-arm64-netinst.iso) to the USB 3 flash drive.</p>
<p align="center">
  <img src="https://orcada.io/content/images/2022/10/usb-stick.png" width="200px" alt="The HoneyComb LX2">
</p>
<h4 id="first-boot">First boot</h4>
<p>Connect the USB 3 ethernet adapter to your switch (or router). Insert the Micro SD card and the USB 3 flash drive.</p>
<h5 id="serial-connection">Serial connection</h5>
<p>Connect the micro USB to the LX2 and the USB-C cable to your workstation.</p>
<p>Look for the device:</p>
<pre><code>ls -l /dev/*usbserial*
</code></pre>
<p>You should see something like:</p>
<pre><code>crw-rw-rw-  1 root  wheel  0x9000005 15 Oct 18:06 /dev/cu.usbserial-DK0D18XC
crw-rw-rw-  1 root  wheel  0x9000004 15 Oct 18:06 /dev/tty.usbserial-DK0D18XC
</code></pre>
<p>Use screen to open a connection:</p>
<pre><code>screen /dev/tty.usbserial-DK0D18XC 115200
</code></pre>
<p><img src="https://orcada.io/content/images/2022/10/screen.png" alt="The HoneyComb LX2" loading="lazy"></p>
<p>Power on the server.</p>
<p>Press the <code>esc</code> key when prompted by the UEFI firmware:</p>
<p><img src="https://orcada.io/content/images/2022/10/uefi-firmware-1.png" alt="The HoneyComb LX2" loading="lazy"></p>
<p><img src="https://orcada.io/content/images/2022/10/press-escape.png" alt="The HoneyComb LX2" loading="lazy"></p>
<p>Navigate to the Device Manager -&gt; Console Preference Selection and set the <strong>Preferred console</strong> to <code>Serial</code>:</p>
<p><img src="https://orcada.io/content/images/2022/10/preferred-console.png" alt="The HoneyComb LX2" loading="lazy"></p>
<p>Navigate to the Boot Manager and choose <code>USB SanDisk</code>:</p>
<p><img src="https://orcada.io/content/images/2022/10/usb-boot-device.png" alt="The HoneyComb LX2" loading="lazy"></p>
<p>Hit <code>esc</code> to launch GRUB:</p>
<p><img src="https://orcada.io/content/images/2022/10/grud.png" alt="The HoneyComb LX2" loading="lazy"></p>
<p>Press <code>e</code> to edit the <strong>Install</strong> command:</p>
<p>And update it as follows:</p>
<pre><code>arm-smmu.disable_bypass=0 \
iommu.passthrough=1 \
console=ttyAMA0,115200n8 ---
</code></pre>
<p><img src="https://orcada.io/content/images/2022/10/edit-install-command.png" alt="The HoneyComb LX2" loading="lazy"></p>
<p>Press <code>Ctrl-x</code> to launch the Debian installer.</p>
<p>After the installation is complete power off the server, remove the USB Flash Drive and then power on the server.</p>
<p>Login:</p>
<p><img src="https://orcada.io/content/images/2022/10/login.png" alt="The HoneyComb LX2" loading="lazy"></p>
<h3 id="how-to-upgrade-the-linux-kernel">How to upgrade the Linux kernel</h3>
<p>The easiest way to upgrade the kernel is to use the backports repository.</p>
<p>Create a sources list for DebianBackports:</p>
<pre><code>sudo nano /etc/apt/sources.list.d/backports.list
</code></pre>
<p>And update it as follows:</p>
<pre><code>deb http://deb.debian.org/debian bullseye-backports main
</code></pre>
<p>Then save (Ctrl+O) and exit (Ctrl+X) nano.</p>
<p>Download the package index from the backports repository:</p>
<pre><code>sudo apt update
</code></pre>
<p>Install the kernel package from the backports repository:</p>
<pre><code>sudo apt install linux-image-arm64/bullseye-backports
</code></pre>
<p>Check the version:</p>
<pre><code>uname -s -v
</code></pre>
<p>You should see something like:</p>
<pre><code>Linux #1 SMP Debian 5.18.16-1~bpo11+1 (2022-08-12)
</code></pre>
<p>The updated kernel has driver support for the LX2&apos;s gigabit ethernet adapter.</p>
<h3 id="afterword">Afterword</h3>
<p>Unfortunately, there are some known issues with the ASIX chip drivers (generally used by USB 3 gigabit ethernet adapters) included in off the shelf (mainline) Linux distributions.</p>
<ul>
<li>Kernel.org Bugzilla &#x2013; Bug 212731: <a href="https://bugzilla.kernel.org/show_bug.cgi?id=212731">USB 3 gigabit ethernet adapter ASIX AX88179</a></li>
</ul>
<h5 id="resources">Resources:</h5>
<ul>
<li>SolidRun wiki: <a href="https://solidrun.atlassian.net/wiki/spaces/developer/pages/287801409/Serial+Connection">Serial Connection Guide</a></li>
<li>Discord: <a href="https://discord.com/channels/620838168794497044/665456384971767818">SolidRun channel</a></li>
<li>Debian GNU/Linux Installation Guide: <a href="https://www.debian.org/releases/stable/arm64/ch05s01.en.html#arm64-console-setup">Console configuration</a></li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[The Tailwind CSS framework]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>The Tailwind CSS framework is a utility-first CSS framework designed to help you rapidly build modern websites.</p>
<h5 id="prerequisites">Prerequisites</h5>
<ul>
<li>Node.js</li>
</ul>
<h3 id="getting-started">Getting Started</h3>
<h4 id="step-1-install-the-command-line-interface">Step 1: Install the Command Line Interface</h4>
<p>I installed the Tailwind CSS CLI globally using npm:</p>
<pre><code>npm install -g tailwindcss
</code></pre>
<p>You can check your installation by running the</p>]]></description><link>https://orcada.io/blog/the-tailwind-css-framework/</link><guid isPermaLink="false">633c8edfb3953403ec2b36d8</guid><category><![CDATA[Tailwind CSS]]></category><category><![CDATA[Node.js]]></category><category><![CDATA[Flowbite]]></category><dc:creator><![CDATA[Orcada website]]></dc:creator><pubDate>Tue, 04 Oct 2022 21:31:54 GMT</pubDate><media:content url="https://orcada.io/content/images/2022/10/home-1.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://orcada.io/content/images/2022/10/home-1.png" alt="The Tailwind CSS framework"><p>The Tailwind CSS framework is a utility-first CSS framework designed to help you rapidly build modern websites.</p>
<h5 id="prerequisites">Prerequisites</h5>
<ul>
<li>Node.js</li>
</ul>
<h3 id="getting-started">Getting Started</h3>
<h4 id="step-1-install-the-command-line-interface">Step 1: Install the Command Line Interface</h4>
<p>I installed the Tailwind CSS CLI globally using npm:</p>
<pre><code>npm install -g tailwindcss
</code></pre>
<p>You can check your installation by running the following command:</p>
<pre><code>tailwindcss -h
</code></pre>
<p>You should see something like:</p>
<pre><code>tailwindcss v3.1.8

Usage:
   tailwindcss [--input input.css] [--output output.css] [--watch] [options...]
   tailwindcss init [--full] [--postcss] [options...]

Commands:
   init [options]

Options:
   -i, --input              Input file
   -o, --output             Output file
   -w, --watch              Watch for changes and rebuild as needed
   -p, --poll               Use polling instead of filesystem events when watching
       --content            Content paths to use for removing unused classes
       --postcss            Load custom PostCSS configuration
   -m, --minify             Minify the output
   -c, --config             Path to a custom config file
       --no-autoprefixer    Disable autoprefixer
   -h, --help               Display usage information
</code></pre>
<h4 id="step-2-create-a-workspace">Step 2: Create a workspace</h4>
<p>To create a new workspace:</p>
<pre><code>mkdir tailwind-css
cd tailwind-css
</code></pre>
<h4 id="step-3-create-a-project-folder">Step 3: Create a project folder</h4>
<p>To create a project folder:</p>
<pre><code>mkdir website
cd website
</code></pre>
<p>Use <code>npm init</code> to initialise the project:</p>
<pre><code>npm init
</code></pre>
<h4 id="step-3-install-the-tailwind-css-framework">Step 3: Install the Tailwind CSS framework</h4>
<p>To install the Tailwind CSS framework:</p>
<pre><code>npm install --save-dev tailwindcss
</code></pre>
<p>Create the <code>tailwind.config.js</code> file:</p>
<pre><code>tailwindcss init
</code></pre>
<h4 id="step-4-create-an-indexhtml-file">Step 4: Create an index.html file</h4>
<p>Create an <code>index.html</code> file:</p>
<pre><code>mkdir public
cd public
nano index.html
</code></pre>
<p>And update it as follows:</p>
<pre><code>&lt;!DOCTYPE HTML&gt;
&lt;html lang=&quot;en&quot;&gt;

  &lt;head&gt;

    &lt;meta charset=&quot;utf-8&quot; /&gt;

    &lt;link href=&quot;./assets/images/favicon.ico&quot; rel=&quot;icon&quot; type=&quot;image/x-icon&quot; /&gt;

    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0, user-scalable=no&quot; /&gt;

    &lt;title&gt;Tailwind CSS | Starter Project&lt;/title&gt;
    &lt;meta name=&quot;description&quot; content=&quot;A Tailwind CSS Starter Project.&quot; /&gt;
    &lt;meta name=&quot;keywords&quot; content=&quot;Tailwind CSS&quot;/&gt;

    &lt;link href=&quot;./styles.css&quot; rel=&quot;stylesheet&quot; /&gt;

  &lt;/head&gt;

  &lt;body&gt;
  
    &lt;!-- Place content (blocks) here --&gt;

  &lt;/body&gt;

&lt;/html&gt;

</code></pre>
<h4 id="step-5-create-a-stylescss-file">Step 5: Create a styles.css file</h4>
<p>Create an <code>styles.css</code> file:</p>
<pre><code>mkdir src
cd src
nano styles.css
</code></pre>
<p>Add the <code>@tailwind</code> directives to the <code>styles.css</code> file:</p>
<pre><code>@tailwind base;
@tailwind components;
@tailwind utilities;
</code></pre>
<h4 id="step-6-update-the-tailwindconfigjs-file">Step 6: Update the tailwind.config.js file</h4>
<p>Update the <code>tailwind.config.js</code> file:</p>
<pre><code>const colors = require(&apos;tailwindcss/colors&apos;)

module.exports = {
  content: [
    &quot;./public/*.html&quot;
  ],
  theme: {
    colors: {
      primary: colors.blue
    }
  },
  plugins: []
}
</code></pre>
<p>Your project should now look something like:</p>
<pre><code>.
&#x2514;&#x2500;&#x2500; website
    &#x251C;&#x2500;&#x2500; package.json
    &#x251C;&#x2500;&#x2500; public
    &#x2502;&#xA0;&#xA0; &#x251C;&#x2500;&#x2500; assets
    &#x2502;&#xA0;&#xA0; &#x2502;&#xA0;&#xA0; &#x251C;&#x2500;&#x2500; images
    &#x2502;&#xA0;&#xA0; &#x2502;&#xA0;&#xA0; &#x2502;&#xA0;&#xA0; &#x251C;&#x2500;&#x2500; favicon.ico
    &#x2502;&#xA0;&#xA0; &#x2502;&#xA0;&#xA0; &#x2502;&#xA0;&#xA0; &#x2514;&#x2500;&#x2500; orcada-logo.png
    &#x2502;&#xA0;&#xA0; &#x2502;&#xA0;&#xA0; &#x2514;&#x2500;&#x2500; js
    &#x2502;&#xA0;&#xA0; &#x2502;&#xA0;&#xA0;     &#x2514;&#x2500;&#x2500; flowbite.js
    &#x2502;&#xA0;&#xA0; &#x251C;&#x2500;&#x2500; index.html
    &#x2502;&#xA0;&#xA0; &#x2514;&#x2500;&#x2500; styles.css
    &#x251C;&#x2500;&#x2500; src
    &#x2502;&#xA0;&#xA0; &#x2514;&#x2500;&#x2500; styles.css
    &#x2514;&#x2500;&#x2500; tailwind.config.js
</code></pre>
<h4 id="step-7-start-the-tailwind-cli-build-process">Step 7: Start the Tailwind CLI build process</h4>
<pre><code>tailwindcss -i ./src/styles.css -o ./public/styles.css --watch
</code></pre>
<p>Preview your website:</p>
<p><img src="https://orcada.io/content/images/2022/10/home.png" alt="The Tailwind CSS framework" loading="lazy"></p>
<h3 id="flowbite">Flowbite</h3>
<p>If you are looking for inspiration then you take a look at <a href="https://flowbite.com/docs/getting-started/introduction/" target="_blank">Flowbite</a>.</p>
<p>It is designed to make building Tailwind CSS websites even faster.</p>
<p>To install Flowbite:</p>
<pre><code>npm install --save-prod flowbite
npm install --save-dev flowbite-typography
</code></pre>
<p>Update the <code>tailwind.config.js</code> file:</p>
<pre><code>const colors = require(&apos;tailwindcss/colors&apos;)

module.exports = {
  content: [
    &quot;./public/*.html&quot;,
    &quot;./assets/js/*.js&quot;
  ],
  darkMode: &apos;class&apos;,
  theme: {
    colors: {
      primary: colors.blue,
      secondary: colors.gray,
      &apos;brand&apos;: {
        blue: &apos;#00aeef&apos;,
        DEFAULT: &apos;#00aeef&apos;,
        lightblue: &apos;#8ed1fc&apos;,
      },
    }
  },
  plugins: [
    require(&apos;flowbite/plugin&apos;),
    require(&apos;flowbite-typography&apos;)
  ]
}
</code></pre>
<p>And update the <code>index.html</code> file to include <code>flowbite.js</code>:</p>
<pre><code>&lt;!DOCTYPE HTML&gt;
&lt;html lang=&quot;en&quot;&gt;

  &lt;head&gt;

    ...

  &lt;/head&gt;

  &lt;body&gt;
  
    &lt;!-- Place content (blocks) here --&gt;
 
    &lt;script src=&quot;./assets/js/flowbite.js&quot;&gt;&lt;/script&gt;

  &lt;/body&gt;

&lt;/html&gt;

</code></pre>
<h5 id="resources">Resources:</h5>
<ul>
<li>GitHub: <a href="https://github.com/orcada-io/tailwind-css">Tailwind CCS Starter Project</a></li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[How To: PXE Boot your RPi]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>In this post, we&apos;ll configure a Raspberry Pi (RPi) 4 Model B to PXE Boot from a Synology Diskstation DS720+.</p>
<h4 id="what-is-pxe-boot">What is PXE Boot?</h4>
<blockquote>
<p>The Preboot eXecution Environment (PXE) specification describes a standardised client&#x2013;server environment that boots a software assembly, retrieved from a network, on PXE-enabled</p></blockquote>]]></description><link>https://orcada.io/blog/how-to-pxe-boot-your-rpi/</link><guid isPermaLink="false">626c6bba1ffdca03f8dd7a60</guid><category><![CDATA[Raspberry Pi]]></category><category><![CDATA[PXE Boot]]></category><category><![CDATA[Synology]]></category><category><![CDATA[DHCP]]></category><category><![CDATA[TFTP]]></category><category><![CDATA[NFS]]></category><category><![CDATA[eeprom]]></category><dc:creator><![CDATA[Orcada website]]></dc:creator><pubDate>Fri, 15 Apr 2022 10:34:00 GMT</pubDate><media:content url="https://orcada.io/content/images/2022/04/pxe-boot.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://orcada.io/content/images/2022/04/pxe-boot.jpg" alt="How To: PXE Boot your RPi"><p>In this post, we&apos;ll configure a Raspberry Pi (RPi) 4 Model B to PXE Boot from a Synology Diskstation DS720+.</p>
<h4 id="what-is-pxe-boot">What is PXE Boot?</h4>
<blockquote>
<p>The Preboot eXecution Environment (PXE) specification describes a standardised client&#x2013;server environment that boots a software assembly, retrieved from a network, on PXE-enabled clients. - Wikipedia</p>
</blockquote>
<p>Clients require a network interface controller (NIC) and utilise DHCP and TFTP.</p>
<p>In data centres, PXE is the most popular choice for operating system booting, installation and deployment.</p>
<h4 id="synology-nas">Synology NAS</h4>
<p>The Synology Diskstation DS720+ is running DSM 7.0.1 (DSM 7.0.1-42218 Update 3).</p>
<p><img src="https://orcada.io/content/images/2022/04/ds-720-.png" alt="How To: PXE Boot your RPi" loading="lazy"></p>
<p>What we need to do:</p>
<ul>
<li>Configure a Static IP</li>
<li>Enable NFS</li>
<li>Create some Shared Folders</li>
<li>Edit the Shared Folders NFS permissions</li>
<li>Enable TFTP</li>
<li>Install and configure a DHCP Server</li>
<li>Enable PXE Boot</li>
</ul>
<p><strong>Note:</strong> The Synology Disk Station Manager (DSM) screenshots included in this guide were produced using DSM version 7.0.1 (DSM 7.0.1-42218 Update 3).</p>
<h5 id="configure-a-static-ip">Configure a Static IP</h5>
<p>In the DSM&apos;s Control Panel, click on Network and then select the Network Interface tab:</p>
<p><img src="https://orcada.io/content/images/2022/04/network-interface.png" alt="How To: PXE Boot your RPi" loading="lazy"></p>
<p>Manual configuration:</p>
<p><img src="https://orcada.io/content/images/2022/04/network-interface-manual-config.png" alt="How To: PXE Boot your RPi" loading="lazy"></p>
<h5 id="enable-nfs">Enable NFS</h5>
<p>In the Control Panel, click on File Services and then select the NFS tab:</p>
<p><img src="https://orcada.io/content/images/2022/04/enable-nfs.png" alt="How To: PXE Boot your RPi" loading="lazy"></p>
<h5 id="create-shared-folders">Create Shared Folders</h5>
<p>We need to create some shared folders for the RPi&apos;s Boot and OS files:</p>
<ul>
<li>rpi-pxe (used for the RPi&apos;s OS files)</li>
<li>rpi-tftpboot (used for the RPi&apos;s Boot files)</li>
</ul>
<p>In the Control Panel, click on Shared Folder:</p>
<p><img src="https://orcada.io/content/images/2022/04/shared-folder.png" alt="How To: PXE Boot your RPi" loading="lazy"></p>
<p>General configuration, rpi-pxe:</p>
<p><img src="https://orcada.io/content/images/2022/04/shared-folder-general-config.png" alt="How To: PXE Boot your RPi" loading="lazy"></p>
<p>General configuration, rpi-tftpboot:</p>
<p><img src="https://orcada.io/content/images/2022/04/shared-folder-general-config-2.png" alt="How To: PXE Boot your RPi" loading="lazy"></p>
<p>And then for each folder (rpi-pxe and rpi-tftpboot) edit the NFS permissions:</p>
<p><img src="https://orcada.io/content/images/2022/04/nfs-permissions.png" alt="How To: PXE Boot your RPi" loading="lazy"></p>
<h5 id="enable-tftp">Enable TFTP</h5>
<p>In the Control Panel, click on File Services and then select the Advanced tab:</p>
<p><img src="https://orcada.io/content/images/2022/04/enable-tftp.png" alt="How To: PXE Boot your RPi" loading="lazy"></p>
<h5 id="dhcp-server">DHCP Server</h5>
<p>Use the DSM&apos;s Package Center to install a DHCP Server. In the DSM&apos;s Main Menu click on DHCP Server.</p>
<p><img src="https://orcada.io/content/images/2022/04/dhcp-network-interface.png" alt="How To: PXE Boot your RPi" loading="lazy"></p>
<p>And then for each Network Interface (LAN 1 and LAN 2) enable the DHCP server:</p>
<p><img src="https://orcada.io/content/images/2022/04/enable-dhcp-server.png" alt="How To: PXE Boot your RPi" loading="lazy"></p>
<p>We also need to configure the Subnet list:</p>
<p><img src="https://orcada.io/content/images/2022/04/create-subnet-1.png" alt="How To: PXE Boot your RPi" loading="lazy"></p>
<p>And the Vendor Settings:</p>
<p><img src="https://orcada.io/content/images/2022/04/dhcp-vendor-settings.png" alt="How To: PXE Boot your RPi" loading="lazy"></p>
<p>There is one more configuration step we need to complete on the DHCP Server, however, we can&apos;t do that until we have setup our RPi.</p>
<h4 id="raspberry-pi">Raspberry Pi</h4>
<p align="center">
  <img src="https://orcada.io/content/images/2022/04//rpi-4-model-b.jpg" alt="How To: PXE Boot your RPi">
</p>
<h5 id="raspberry-pi-imager">Raspberry Pi Imager</h5>
<p>Download and launch the <a href="https://www.raspberrypi.com/software/" target="_blank">Raspberry Pi Imager</a>.</p>
<p>Use the Imager to create a fresh install of Raspberry Pi OS Lite 64 bit (a port of Debian Bullseye with no Desktop environment). Use the Advanced options to: set a hostname (<code>relay-node-1</code>); enable SSH (public key only), set a username and password; set the locale settings and to skip the first-run wizard.</p>
<p><strong>Note:</strong> You can use a fully qualified domain name (FQDN), for example: <code>relay-node-1.stake-pool.orcada.io</code></p>
<p>Insert the Micro SD Card into the Raspberry Pi and power on the device. Use the DHCP Server&apos;s DCHP Clients tab to find the RPi&apos;s (dynamic) IP address.</p>
<p>You can also use <a href="https://nmap.org/" target="_blank">nmap</a>, for example:</p>
<pre><code>sudo nmap -sn 192.168.101.0/24
</code></pre>
<p>Use SSH to connect to the device and update the operating system:</p>
<pre><code>sudo apt update
sudo apt full-upgrade -y
sudo apt-get autoremove
sudo apt-get autoclean
</code></pre>
<h5 id="configure-a-static-ip">Configure a Static IP</h5>
<p>The Raspberry Pi OS uses <a href="https://www.raspberrypi.com/documentation/computers/configuration.html" target="_blank">dhcpcd</a> to configure TCP/IP across all of its network interfaces. We want to assign a static IP to our RPi.</p>
<p>Edit the <code>/etc/dhcpcd.conf</code>file:</p>
<pre><code>sudo nano /etc/dhcpcd.conf
</code></pre>
<p>And add the following lines to the bottom of the file:</p>
<pre><code>...

# relay-node-1
interface eth0
static ip_address=192.168.101.3/24
static routers=192.168.101.1
static domain_name_servers=192.168.101.1
</code></pre>
<p>To restart dhcpcd:</p>
<pre><code>sudo systemctl daemon-reload &amp;&amp; sudo systemctl restart dhcpcd
</code></pre>
<p>Let&apos;s check the Domain Name System (DNS) resolver:</p>
<pre><code>cat /etc/resolv.conf
</code></pre>
<p>You should see something like:</p>
<pre><code># Generated by resolvconf
nameserver 192.168.101.1
</code></pre>
<h5 id="configure-the-hostname">Configure the hostname</h5>
<p>To configure a fully qualified domain name (FQDN) we need to edit the <code>/etc/hostname</code> file:</p>
<pre><code>sudo nano /etc/hostname
</code></pre>
<p>And update it as follows:</p>
<pre><code>relay-node-1.stake-pool.orcada.io
</code></pre>
<p>We also need to edit the <code>/etc/hosts</code> file:</p>
<pre><code>sudo nano /etc/hosts
</code></pre>
<p>And update it as follows:</p>
<pre><code>127.0.0.1       localhost
192.168.101.3   relay-node-1.stake-pool.orcada.io relay-node-1

# IPv6
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters
</code></pre>
<p>Reboot the RPi:</p>
<pre><code>sudo reboot
</code></pre>
<p>Reconnect to the device using SSH.</p>
<h5 id="copy-the-os-files-to-the-rpi-pxe-shared-folder">Copy the OS files to the rpi-pxe Shared Folder</h5>
<h6 id="create-the-remote-mount-point">Create the remote mount point</h6>
<p>Connect (SSH) to the Synology NAS, you should see something like:</p>
<pre><code>admin@nas-1:~$
</code></pre>
<p>Create a directory in the <code>rpi-pxe</code> shared folder, that matches the RPi&apos;s hostname:</p>
<pre><code>cd /volume1/rpi-pxe
sudo mkdir relay-node-1
</code></pre>
<p>And update the permissions:</p>
<pre><code>sudo chmod 777 relay-node-1
</code></pre>
<p><strong>Note:</strong> You can check your RPi&apos;s hostname using the following command:</p>
<pre><code>hostname
</code></pre>
<h6 id="create-the-local-mount-point">Create the local mount point</h6>
<p>Create a local mount point (directory) that matches the RPi&apos;s hostname:</p>
<pre><code>sudo mkdir -p /nfs/relay-node-1
</code></pre>
<p>Mount the <code>rpi-pxe</code> shared folder (the remote mount point) with NFS:</p>
<pre><code>sudo mount -t nfs -O proto=tcp,port=2049,rw,all_squash,anonuid=1001,anongid=1001 192.168.101.2:/volume1/rpi-pxe/relay-node-1 /nfs/relay-node-1 -vvv
</code></pre>
<p>Copy the OS files (it will take a few minutes):</p>
<pre><code>sudo rsync -xa --progress --exclude /nfs / /nfs/relay-node-1/
</code></pre>
<h5 id="copy-the-boot-files-to-the-rpi-tftpboot-shared-folder">Copy the Boot files to the rpi-tftpboot Shared Folder</h5>
<h6 id="create-the-local-mount-point">Create the local mount point</h6>
<p>Create a local mount point (directory):</p>
<pre><code>sudo mkdir -p /nfs/rpi-tftpboot
</code></pre>
<p>Mount the <code>rpi-tftpboot</code> shared folder (the remote mount point) with NFS:</p>
<pre><code>sudo mount -t nfs -O proto=tcp,port=2049,rw,all_squash,anonuid=1001,anongid=1001 192.168.101.2:/volume1/rpi-tftpboot /nfs/rpi-tftpboot -vvv
</code></pre>
<p>After mounting the <code>rpi-tftpboot</code> shared folder, the next step is to copy the universal RPi <a href="https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#raspberry-pi-4-boot-eeprom" target="_blank">bootcode.bin</a> file to the root of the <code>rpi-tftpboot</code> shared folder. The <a href="https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#raspberry-pi-4-boot-eeprom" target="_blank">bootcode.bin</a><br>
file is used by all RPi models and must be in the root of this shared folder for PXE Boot to succeed:</p>
<pre><code>sudo cp /boot/bootcode.bin /nfs/rpi-tftpboot/
</code></pre>
<p>Get the RPi&apos;s serial number:</p>
<pre><code>vcgencmd otp_dump | grep 28: | sed s/.*://g
</code></pre>
<p>You should see something like:</p>
<pre><code>d7cde1e3
</code></pre>
<p>Create a directory for the boot files, that matches the RPi&apos;s serial number:</p>
<pre><code>sudo mkdir -p /nfs/rpi-tftpboot/d7cde1e3
</code></pre>
<p>Copy the boot files:</p>
<pre><code>sudo cp -r /boot/* /nfs/rpi-tftpboot/d7cde1e3/
</code></pre>
<h6 id="configure-the-boot-options">Configure the Boot options</h6>
<p>Edit <code>/etc/fstab</code> (the filesystem table) so that it mounts the RPi&apos;s tftpboot directory when it starts up:</p>
<pre><code>sudo nano /nfs/relay-node-1/etc/fstab
</code></pre>
<p>Update it as follows:</p>
<pre><code>proc            /proc           proc    defaults          0       0
192.168.101.2:/volume1/rpi-tftpboot/d7cde1e3 /boot nfs defaults,vers=3,proto=tcp 0 0
</code></pre>
<p>Edit the kernel options in <code>cmdline.txt</code>:</p>
<pre><code>sudo nano /nfs/rpi-tftpboot/d7cde1e3/cmdline.txt
</code></pre>
<p>Update it as follows:</p>
<pre><code>console=serial0,115200 console=tty1 root=/dev/nfs nfsroot=192.168.101.2:/volume1/rpi-pxe/relay-node-1,vers=3 rw ip=dhcp elevator=deadline rootwait
</code></pre>
<h6 id="configure-the-eeprom-firmware">Configure the EEPROM firmware</h6>
<p>We need to configure the RPi&apos;s eeprom firmware to include the PXE boot options.</p>
<p>Use the following command to identify the latest version of the firmware:</p>
<pre><code>ls -al /lib/firmware/raspberrypi/bootloader/stable/
</code></pre>
<p>Copy the latest version of the firmware to a temporary directory in your home directory:</p>
<pre><code>sudo cp /lib/firmware/raspberrypi/bootloader/stable/pieeprom-2022-03-10.bin pieeprom.bin
</code></pre>
<p>Create a boot configuration file:</p>
<pre><code>sudo nano bootconf.txt
</code></pre>
<p>Update it as follows:</p>
<pre><code>[all]
BOOT_UART=0
WAKE_ON_GPIO=1
POWER_OFF_ON_HALT=0
DHCP_TIMEOUT=45000
DHCP_REQ_TIMEOUT=4000
TFTP_FILE_TIMEOUT=30000
TFTP_IP=192.168.101.2
TFTP_PREFIX=0
ENABLE_SELF_UPDATE=1
DISABLE_HDMI=0
BOOT_ORDER=0x241
SD_CARD_MAX_RETRIES=3
NET_BOOT_MAX_RETRIES=5
</code></pre>
<p>The RPi will try to boot from a microSD card, then the network, then from any attached USB storage.</p>
<p>Now we can create a new EEPROM binary:</p>
<pre><code>sudo rpi-eeprom-config --out pieeprom-new.bin --config bootconf.txt pieeprom.bin
</code></pre>
<p>And write it to the EEPROM:</p>
<pre><code>sudo rpi-eeprom-update -d -f ./pieeprom-new.bin
</code></pre>
<p>Reboot (leave the microSD card inserted):</p>
<pre><code>sudo reboot
</code></pre>
<p>Check the new boot configuration values using the following command:</p>
<pre><code>vcgencmd bootloader_config
</code></pre>
<h4 id="synology-nas">Synology NAS</h4>
<h6 id="enable-pxe-boot">Enable PXE Boot</h6>
<p>There is one more configuration step we need to complete on the DHCP Server, and that is to enable PXE Boot:</p>
<p><img src="https://orcada.io/content/images/2022/04/enable-pxe.png" alt="How To: PXE Boot your RPi" loading="lazy"></p>
<h4 id="raspberry-pi">Raspberry Pi</h4>
<h4 id="pxe-boot">PXE Boot</h4>
<p>Shutdown the RPi:</p>
<pre><code>sudo shutdown -h now
</code></pre>
<p>Turn off the power, remove the microSD card, turn the power back on. The RPi should now PXE boot.</p>
<p>Connect (SSH) to the RPi and check the mounted filesytems:</p>
<pre><code>findmnt
</code></pre>
<p>You should see something like:</p>
<p align="center">
  <img src="https://orcada.io/content/images/2022/04/mount-points.jpg" alt="How To: PXE Boot your RPi">
</p>
<h5 id="troubleshooting">Troubleshooting</h5>
<p>If you run into any issues try plugging in a monitor:</p>
<p><img src="https://orcada.io/content/images/2022/04/output-1.jpg" alt="How To: PXE Boot your RPi" loading="lazy"></p>
<p>A coloured splash screen (actually it&apos;s just four pixels &quot;blown up&quot; by the GPU to full screen) is displayed after the GPU firmware (start.elf) is loaded:</p>
<p><img src="https://orcada.io/content/images/2022/04/output-2.jpg" alt="How To: PXE Boot your RPi" loading="lazy"></p>
<p>This should be replaced by the linux console a few seconds later:</p>
<p><img src="https://orcada.io/content/images/2022/04/output-3.jpg" alt="How To: PXE Boot your RPi" loading="lazy"></p>
<h5 id="resources">Resources:</h5>
<ul>
<li>Raspberry Pi forum: <a href="https://forums.raspberrypi.com/viewforum.php?f=28&amp;sid=27026f8cbf6eeac4634dc456f70c7fab">Troubleshooting</a></li>
<li>eLinux wiki: <a href="https://elinux.org/R-Pi_Troubleshooting">Troubleshooting</a></li>
</ul>
<h5 id="references">References:</h5>
<ul>
<li>Mike McFarlane&apos;s blog: <a href="https://mikejmcfarlane.github.io/blog/2020/09/12/PXE-boot-raspberry-pi-4-from-synology-diskstation#setup-manual-ip-for-the-synology">PXE boot a Raspberry Pi 4 from a Synology Diskstation</a></li>
<li>John Nicpon&apos;s (Warmest Robot) blog: <a href="https://warmestrobot.com/blog/2021/6/21/raspberry-pi-network-boot-guide">Raspberry Pi Network Boot Guide</a></li>
<li>Raspberry Pi docs: <a href="https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#configuration-properties">Configuration properties</a></li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Getting started with Cardano GraphQL]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h3 id="cardano-graphql">Cardano GraphQL</h3>
<p>As its name suggests the Cardano GraphQL project adds support for the GraphQL query language to the Cardano ecosystem.</p>
<h4 id="services">Services</h4>
<p align="center">
  <img src="https://orcada.io/content/images/2022/04/cardano-graphql-architecture.png">
</p>
<p>The Cardano GraphQL project includes the following services:</p>
<ul>
<li>PostgreSQL</li>
<li>Cardano Node Ogmios</li>
<li>Cardano DB Sync Extended</li>
<li>Hasura</li>
<li>Cardano GraphQL</li>
</ul>
<h4 id="getting-started">Getting Started</h4>
<p>The project includes an example <a href="https://github.com/input-output-hk/cardano-graphql/blob/master/docker-compose.yml">docker-compose.yml</a></p>]]></description><link>https://orcada.io/blog/getting-started-with-cardano-graphql/</link><guid isPermaLink="false">626c68761ffdca03f8dd7a27</guid><category><![CDATA[Cardano]]></category><category><![CDATA[GraphQL]]></category><category><![CDATA[Docker Compose]]></category><dc:creator><![CDATA[Orcada website]]></dc:creator><pubDate>Sat, 19 Feb 2022 04:57:00 GMT</pubDate><media:content url="https://orcada.io/content/images/2022/04/cardano-graphql-architecture-1.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h3 id="cardano-graphql">Cardano GraphQL</h3>
<img src="https://orcada.io/content/images/2022/04/cardano-graphql-architecture-1.png" alt="Getting started with Cardano GraphQL"><p>As its name suggests the Cardano GraphQL project adds support for the GraphQL query language to the Cardano ecosystem.</p>
<h4 id="services">Services</h4>
<p align="center">
  <img src="https://orcada.io/content/images/2022/04/cardano-graphql-architecture.png" alt="Getting started with Cardano GraphQL">
</p>
<p>The Cardano GraphQL project includes the following services:</p>
<ul>
<li>PostgreSQL</li>
<li>Cardano Node Ogmios</li>
<li>Cardano DB Sync Extended</li>
<li>Hasura</li>
<li>Cardano GraphQL</li>
</ul>
<h4 id="getting-started">Getting Started</h4>
<p>The project includes an example <a href="https://github.com/input-output-hk/cardano-graphql/blob/master/docker-compose.yml">docker-compose.yml</a>. However, before you start it is important that you understand the interdependencies between each of the project&apos;s services.</p>
<p>For example, you need to sync the Cardano Node with the blockchain before you use Cardano DB Sync Extended to restore a snapshot (see: <a href="https://github.com/input-output-hk/cardano-db-sync/issues/1061">Cardano DB Sync rolling back to genesis</a>).</p>
<p>docker-compose-cardano-node.yml:</p>
<pre><code>version: &quot;3.8&quot;

services:
  cardano-node-ogmios:
    image: cardanosolutions/cardano-node-ogmios:${CARDANO_NODE_OGMIOS_VERSION:-v5.1.0}-${NETWORK:-mainnet}
    restart: on-failure
    container_name: cardano-node-ogmios
    ports:
      - ${OGMIOS_PORT:-1337}:1337
    volumes:
      - node-db:/db
      - node-ipc:/ipc
    logging:
      driver: &quot;json-file&quot;
      options:
        max-size: &quot;400k&quot;
        max-file: &quot;20&quot;

volumes:
  node-db:
  node-ipc:
</code></pre>
<p>Pull and run Cardano Node Ogmios:</p>
<pre><code>export NETWORK=mainnet &amp;&amp; \
docker-compose -f docker-compose-cardano-node.yml up -d
</code></pre>
<p>After 24 hours or so you can bring down the service:</p>
<pre><code>docker-compose down
</code></pre>
<p><strong>Tip:</strong> Cardano Node does not need to be at the tip of the blockchain it just needs to be past the last block in the snapshot (e.g., db-sync-snapshot-schema-12-block-<strong>6451499</strong>-x86_64.tgz) you want to restore.  So keep an eye on the logs:</p>
<pre><code>docker container logs -f --tail 10 cardano-node-ogmios
</code></pre>
<p>Now you are ready to pull and run all the Cardano GraphQL services and restore a snapshot:</p>
<pre><code>export NETWORK=mainnet &amp;&amp; \
export RESTORE_SNAPSHOT=/snapshots/db-sync-snapshot-schema-12-block-6451499-x86_64.tgz &amp;&amp; \
docker-compose up -d
</code></pre>
<p align="center">
  <img src="https://orcada.io/content/images/2022/04/docker-desktop-orcada-graphql.png" alt="Getting started with Cardano GraphQL">
</p>
<p>docker-compose.yml:</p>
<pre><code>version: &quot;3.8&quot;

services:
  postgres:
    image: postgres:${POSTGRES_VERSION:-11.5-alpine}
    restart: on-failure
    container_name: postgres
    environment:
      - POSTGRES_LOGGING=true
      - POSTGRES_DB_FILE=/run/secrets/postgres_db
      - POSTGRES_PASSWORD_FILE=/run/secrets/postgres_password
      - POSTGRES_USER_FILE=/run/secrets/postgres_user
    ports:
      - ${POSTGRES_PORT:-5432}:5432
    secrets:
      - postgres_db
      - postgres_password
      - postgres_user
    shm_size: &apos;2gb&apos;
    volumes:
      - postgres-data:/var/lib/postgresql/data
    logging:
      driver: &quot;json-file&quot;
      options:
        max-size: &quot;200k&quot;
        max-file: &quot;10&quot;
        
  cardano-node-ogmios:
    image: cardanosolutions/cardano-node-ogmios:${CARDANO_NODE_OGMIOS_VERSION:-v5.1.0}-${NETWORK:-mainnet}
    restart: on-failure
    container_name: cardano-node-ogmios
    ports:
      - ${OGMIOS_PORT:-1337}:1337
    volumes:
      - node-db:/db
      - node-ipc:/ipc
    logging:
      driver: &quot;json-file&quot;
      options:
        max-size: &quot;400k&quot;
        max-file: &quot;20&quot;

  cardano-db-sync-extended:
    working_dir: /var/lib/cdbsync
    image: inputoutput/cardano-db-sync:${CARDANO_DB_SYNC_VERSION:-12.0.0}
    command: [
      &quot;--config&quot;, &quot;/config/cardano-db-sync/config.json&quot;,
      &quot;--socket-path&quot;, &quot;/node-ipc/node.socket&quot;
    ]
    restart: on-failure
    container_name: cardano-db-sync-extended
    environment:
      - EXTENDED=true
      - POSTGRES_HOST=postgres
      - POSTGRES_PORT=5432
      - RESTORE_SNAPSHOT=${RESTORE_SNAPSHOT:-}
      - RESTORE_RECREATE_DB=N
    secrets:
      - postgres_password
      - postgres_user
      - postgres_db
    volumes:
      - ./config/network/${NETWORK:-mainnet}:/config
      - db-sync-data:/var/lib/cdbsync
      - db-sync-tmp:/tmp
      - node-ipc:/node-ipc
      - ./snapshots:/snapshots
    logging:
      driver: &quot;json-file&quot;
      options:
        max-size: &quot;200k&quot;
        max-file: &quot;10&quot;
    depends_on:
      - cardano-node-ogmios
      - postgres

  hasura:
    image: inputoutput/cardano-graphql-hasura:${CARDANO_GRAPHQL_VERSION:-6.2.0}
    restart: on-failure
    container_name: hasura
    ports:
      - ${HASURA_PORT:-8090}:8080
    environment:
      - HASURA_GRAPHQL_ENABLE_CONSOLE=true
      - HASURA_GRAPHQL_CORS_DOMAIN=http://localhost:9695
    secrets:
      - postgres_db
      - postgres_password
      - postgres_user
    logging:
      driver: &quot;json-file&quot;
      options:
        max-size: &quot;200k&quot;
        max-file: &quot;10&quot;
    depends_on:
      - postgres

  cardano-graphql:
    build:
      context: ./services/cardano-graphql
      dockerfile: Dockerfile
    restart: on-failure
    container_name: cardano-graphql
    environment:
      - SLEEP=${SLEEP:-3600}
      - ALLOW_INTROSPECTION=true
      - CACHE_ENABLED=true
      - LOGGER_MIN_SEVERITY=${LOGGER_MIN_SEVERITY:-info}
      - PROMETHEUS_METRICS=true
      - TRACING=true
    expose:
      - ${API_PORT:-3100}
    ports:
      - ${API_PORT:-3100}:3100
    secrets:
      - postgres_db
      - postgres_password
      - postgres_user
    logging:
      driver: &quot;json-file&quot;
      options:
        max-size: &quot;200k&quot;
        max-file: &quot;10&quot;
    depends_on:
      - postgres

  prometheus:
    image: prom/prometheus:latest
    command:
      - &apos;--config.file=/etc/prometheus/prometheus.yml&apos;
      - &apos;--web.enable-lifecycle&apos;
    container_name: prometheus
    ports:
      - ${PROMETHEUS_PORT:-9090}:9090
    volumes:
      - ./prometheus:/etc/prometheus
      - prometheus-data:/var/lib/prometheus/data
    depends_on:
      - cardano-graphql

  grafana:
    image: grafana/grafana-oss:latest
    container_name: grafana
    ports:
      - ${GRAFANA_PORT:-3000}:3000
    volumes:
      - ./grafana/provisioning:/etc/grafana/provisioning
    depends_on:
      - prometheus

secrets:
  postgres_db:
    file: ./placeholder-secrets/postgres_db
  postgres_password:
    file: ./placeholder-secrets/postgres_password
  postgres_user:
    file: ./placeholder-secrets/postgres_user

volumes:
  db-sync-data:
  db-sync-tmp:
  node-db:
  node-ipc:
  postgres-data:
  prometheus-data:
</code></pre>
<p>Navigate to the GraphQL Playground: <a href="http://localhost:3100/graphql">http://localhost:3100/graphql</a></p>
<p>Query the epoch dataset:</p>
<pre><code>{ cardanoDbMeta { initialized syncPercentage }}
</code></pre>
<p>Wait for initialized to be true to ensure the epoch dataset is complete.</p>
<p align="center">
  <img src="https://orcada.io/content/images/2022/04/playground.png" alt="Getting started with Cardano GraphQL">
</p>
<p>Query the full dataset:</p>
<pre><code>{ cardano { tip { number slotNo epoch { number } } } }
</code></pre>
<h4 id="cardano-graphql">Cardano GraphQL</h4>
<p>I added an ENTRYPOINT to the cardano-graphql build so that it would wait (it might need to sleep for a hour or more depending on the size of the snapshot) for the snapshot to be restored before it tries to add any new (Hasura) views to PostgreSQL.</p>
<p>docker-entrypoint.sh</p>
<pre><code>#!/bin/sh

# Abort on any error
set -e

sleep &quot;$SLEEP&quot;

# Run the main container command
exec &quot;$@&quot;
</code></pre>
<p>Dockerfile</p>
<pre><code>FROM inputoutput/cardano-graphql:6.2.0-mainnet

COPY docker-entrypoint.sh docker-entrypoint.sh
RUN chmod +x ./docker-entrypoint.sh

ENTRYPOINT [&quot;./docker-entrypoint.sh&quot;]
CMD [&quot;node&quot;, &quot;index.js&quot;]
</code></pre>
<h3 id="docker-desktop-for-mac">Docker Desktop for Mac</h3>
<p>When I first tried to restore a snapshot I paid close attention to the logs:</p>
<pre><code>docker container logs -f --tail 10 cardano-db-sync-extended
</code></pre>
<p>I encountered the following issue:</p>
<pre><code>psql:/tmp/db-sync-snapshot-hc6bN9lE7U/db-sync-snapshot-schema-12-block-6451499-x86_64.sql:238416086: ERROR:  could not extend file &quot;base/16384/214298&quot;: No space left on device
HINT:  Check free disk space.

psql:/tmp/db-sync-snapshot-hc6bN9lE7U/db-sync-snapshot-schema-12-block-6451499-x86_64.sql:238416150: ERROR:  could not write block 35045 of temporary file: No space left on device
CONTEXT:  parallel worker
</code></pre>
<p>To address this issue I had to remove all containers, networks, images and volumes:</p>
<pre><code>docker system prune --all
</code></pre>
<p>Remove the Docker.raw (see: <a href="https://stackoverflow.com/a/58924477">ERROR: No space left on device</a>) file:</p>
<pre><code>sudo rm /Users/&lt;user&gt;/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw
</code></pre>
<p>And increase the default Disk image size:</p>
<p align="center">
  <img src="https://orcada.io/content/images/2022/04/docker-desktop-resources.png" alt="Getting started with Cardano GraphQL">
</p>
<h5 id="references">References:</h5>
<ul>
<li>Cardano GraphQL GitHub Issues: <a href="https://github.com/input-output-hk/cardano-graphql/issues/640">Can&apos;t perform query while syncing</a></li>
<li>Cardano DB Sync GitHub Issues: <a href="https://github.com/input-output-hk/cardano-db-sync/issues/784">db-sync makes a rollback after using RESTORE_SNAPSHOT</a></li>
<li>Cardano DB Sync GitHub Issues: <a href="https://github.com/input-output-hk/cardano-db-sync/issues/1061">cardano-db-sync rolling back to genesis</a></li>
<li>Cardano Ouroboros Network GitHub Issues: <a href="https://github.com/input-output-hk/ouroboros-network/issues/3538">Introduce a blocking version of MsgFindIntersection for a specific blockNo</a></li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item></channel></rss>