<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Homelab on </title>
    <link>https://albertogalvez.com/categories/homelab/</link>
    <description>Recent content in Homelab on </description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Fri, 30 Aug 2024 00:00:00 +0000</lastBuildDate><atom:link href="https://albertogalvez.com/categories/homelab/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>UPS monitoring with Grafana</title>
      <link>https://albertogalvez.com/posts/homelab/ups/</link>
      <pubDate>Fri, 30 Aug 2024 00:00:00 +0000</pubDate>
      
      <guid>https://albertogalvez.com/posts/homelab/ups/</guid>
      <description>Monitoring energy cost on your homelab</description>
      <content:encoded><![CDATA[<h1 id="ups-monitoring">UPS Monitoring</h1>
<p>First off, you have connected the UPS to a free USB port and it shows up using lsusb thus:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">$  lsusb
</span></span><span class="line"><span class="cl">Bus <span class="m">001</span> Device 004: ID 051d:0002 American Power Conversion Uninterruptible Power Supply
</span></span></code></pre></td></tr></table>
</div>
</div><p>Install the required APC UPS daemon and PHP packages with:</p>
<p><code>apt install apcupsd php -y</code></p>
<p>Once installed stop the apcupsd service if it started automatically with</p>
<p><code>systemctl stop apcupsd</code></p>
<p>You&rsquo;ll next need to edit the configuration file for the service which lives at <code>/etc/apcupsd/apcupsd.conf</code> . If you&rsquo;d like enter a <strong>UPSNAME</strong> that makes sense. Then the default version of this file on my system had a line that looked like DEVICE /tty/xxx0, comment out or delete this line and restart the service with:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">systemctl start apcupsd
</span></span><span class="line"><span class="cl">systemctl status apcupsd
</span></span></code></pre></td></tr></table>
</div>
</div><p>If everything looks good in status you should now be able to run:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">$  apcaccess
</span></span><span class="line"><span class="cl">APC      : 001,036,0866
</span></span><span class="line"><span class="cl">DATE     : 2024-08-24 18:46:26 +0200
</span></span><span class="line"><span class="cl">HOSTNAME : pinet
</span></span><span class="line"><span class="cl">VERSION  : 3.14.14 <span class="o">(</span><span class="m">31</span> May 2016<span class="o">)</span> debian
</span></span><span class="line"><span class="cl">UPSNAME  : APC
</span></span><span class="line"><span class="cl">...
</span></span></code></pre></td></tr></table>
</div>
</div><p>You&rsquo;ve completed the UPS / host setup.</p>
<h2 id="influxdb-setup">InfluxDB Setup</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">curl https://repos.influxdata.com/influxdata-archive.key <span class="p">|</span> gpg --dearmor <span class="p">|</span> sudo tee /usr/share/keyrings/influxdb-archive-keyring.gpg &gt;/dev/null
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;deb [signed-by=/usr/share/keyrings/influxdb-archive-keyring.gpg] https://repos.influxdata.com/debian stable main&#34;</span> <span class="p">|</span> sudo tee /etc/apt/sources.list.d/influxdb.list
</span></span><span class="line"><span class="cl">apt update
</span></span><span class="line"><span class="cl">apt install influxdb
</span></span><span class="line"><span class="cl">systemctl unmask influxdb
</span></span><span class="line"><span class="cl">systemctl <span class="nb">enable</span> influxdb
</span></span><span class="line"><span class="cl">systemctl start influxdb
</span></span><span class="line"><span class="cl">systemctl status influxdb
</span></span></code></pre></td></tr></table>
</div>
</div><p>I&rsquo;ll put all the data from your UPS into a separate database.</p>
<p>First, we&rsquo;ll need to create it and can do so using curl:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">curl -i -XPOST  <span class="s2">&#34;http://localhost:8086/query?q=CREATE+DATABASE+ups&#34;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>We can verify successful DB creation again using curl:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">curl -i -XPOST  <span class="s2">&#34;http://localhost:8086/query?q=SHOW+DATABASES&#34;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl"> ~  $  influx
</span></span><span class="line"><span class="cl">Connected to http://localhost:8086 version 1.8.10
</span></span><span class="line"><span class="cl">InfluxDB shell version: 1.8.10
</span></span><span class="line"><span class="cl">&gt; show databases
</span></span><span class="line"><span class="cl">name: databases
</span></span><span class="line"><span class="cl">name
</span></span><span class="line"><span class="cl">----
</span></span><span class="line"><span class="cl">_internal
</span></span><span class="line"><span class="cl">ups
</span></span><span class="line"><span class="cl">&gt; use ups
</span></span><span class="line"><span class="cl">Using database ups
</span></span><span class="line"><span class="cl">&gt; show measurements
</span></span><span class="line"><span class="cl">name: measurements
</span></span><span class="line"><span class="cl">name
</span></span><span class="line"><span class="cl">----
</span></span><span class="line"><span class="cl">APC
</span></span><span class="line"><span class="cl">&gt; <span class="k">select</span> * from APC where <span class="nb">time</span> &gt; now<span class="o">()</span> - 1h
</span></span><span class="line"><span class="cl">name: APC
</span></span><span class="line"><span class="cl"><span class="nb">time</span>                BATTV BCHARGE LOADPCT TIMELEFT host
</span></span><span class="line"><span class="cl">----                ----- ------- ------- -------- ----
</span></span><span class="line"><span class="cl"><span class="m">1724517094829361767</span>               <span class="m">5</span>                myups
</span></span><span class="line"><span class="cl"><span class="m">1724517094891750548</span> <span class="m">27</span>                             myups
</span></span><span class="line"><span class="cl"><span class="m">1724517094952570159</span>                       190.7    myups
</span></span><span class="line"><span class="cl"><span class="m">1724517095013039249</span>       <span class="m">100</span>                      myups
</span></span><span class="line"><span class="cl"><span class="m">1724517121518211456</span>               <span class="m">5</span>                myups
</span></span></code></pre></td></tr></table>
</div>
</div><p>Note that final entry is ups which is the database we just created. Now we have to move onto scraping the output the UPS generates and write it to the database.</p>
<h2 id="scraping-the-ups-output">Scraping the UPS output</h2>
<p>Note the section near the top tagsArray and compare the items in the array being scraped against the actual output of apcacess as shown above. Pick and choose the items you want and these are what will be written to the database. The name must match exactly else the scraping will fail.</p>
<p>You will also need to modify, near the bottom, your InfluxDB IP. You needed this above for the curl commands.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">vi /opt/scrape.php
</span></span><span class="line"><span class="cl">chmod +x /opt/scrape.php
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="c1">#!/usr/bin/php
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="o">&lt;?</span><span class="nx">php</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">$command</span> <span class="o">=</span> <span class="s2">&#34;apcaccess&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nv">$args</span> <span class="o">=</span> <span class="s2">&#34;status&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nv">$tagsArray</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"><span class="s2">&#34;LOADPCT&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="s2">&#34;BATTV&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="s2">&#34;TIMELEFT&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="s2">&#34;BCHARGE&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">//do system call
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="nv">$call</span> <span class="o">=</span> <span class="nv">$command</span><span class="o">.</span><span class="s2">&#34; &#34;</span><span class="o">.</span><span class="nv">$args</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nv">$output</span> <span class="o">=</span> <span class="nx">shell_exec</span><span class="p">(</span><span class="nv">$call</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">//parse output for tag and value
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="k">foreach</span> <span class="p">(</span><span class="nv">$tagsArray</span> <span class="k">as</span> <span class="nv">$tag</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">preg_match</span><span class="p">(</span><span class="s2">&#34;/&#34;</span><span class="o">.</span><span class="nv">$tag</span><span class="o">.</span><span class="s2">&#34;\s*:\s([\d|\.]+)/si&#34;</span><span class="p">,</span> <span class="nv">$output</span><span class="p">,</span> <span class="nv">$match</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">//send measurement, tag and value to influx
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="nx">sendDB</span><span class="p">(</span><span class="nv">$match</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="nv">$tag</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="c1">//end system call
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="c1">//send to influxdb
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="k">function</span> <span class="nf">sendDB</span><span class="p">(</span><span class="nv">$val</span><span class="p">,</span> <span class="nv">$tagname</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">$curl</span> <span class="o">=</span> <span class="s2">&#34;curl -i -XPOST &#39;http://localhost:8086/write?db=ups&#39; --data-binary &#39;APC,host=myups &#34;</span><span class="o">.</span><span class="nv">$tagname</span><span class="o">.</span><span class="s2">&#34;=&#34;</span><span class="o">.</span><span class="nv">$val</span><span class="o">.</span><span class="s2">&#34;&#39;&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nv">$execsr</span> <span class="o">=</span> <span class="nx">exec</span><span class="p">(</span><span class="nv">$curl</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cp">?&gt;</span><span class="err">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>You can do a test run with <code>/opt/scrape.php</code> and then verify your InfluxDB logs and look for some successful writes via curl (code 204 = good).</p>
<h3 id="automating-the-scraping">Automating the scraping</h3>
<p>We&rsquo;ll use cron for automating the running of the scraping script. Do not edit the crontab with <code>crontab -e</code> instead you must edit <code>/etc/crontab</code>  and specify a user in order for this work.</p>
<p>Add the following line to <code>/etc/crontab</code>, this will run the scraping script every minute.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">* * * * * root /usr/bin/php /opt/scrape.php &gt;/dev/null 2&gt;<span class="p">&amp;</span><span class="m">1</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Again verify the InfluxDB logs for 204 response codes to check everything went OK.</p>
<h2 id="grafana-dashboard">Grafana Dashboard</h2>
<p>The next step is to add a data source in Grafana. Under the configuration menu in Grafana click &ldquo;Add data source&rdquo;.
Modify the Name, <code>Type = InfluxDB, URL = http://influxdb:8086, Database = ups, User = root, Pass = root</code> . If you modified these values obviously modify to suit.</p>
<p>Then hit save &amp; test.</p>
<p>Next in Grafana click the + icon on the left and select &lsquo;import&rsquo;. We&rsquo;ll be importing this awesome dashboardby Marius Gilberg. The ID you need is 7197.</p>
<p>Select your Influx UPS data source as the new data source we just created above and hit import.</p>
<p><img loading="lazy" src="/posts/homelab/ups/assets/ups.png" type="" alt="ups"  /></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Hugo</title>
      <link>https://albertogalvez.com/posts/homelab/hugo/</link>
      <pubDate>Tue, 02 Jul 2024 00:00:00 +0000</pubDate>
      
      <guid>https://albertogalvez.com/posts/homelab/hugo/</guid>
      <description>Static site generators</description>
      <content:encoded><![CDATA[<h2 id="hugo-file-naming-convention">Hugo File Naming Convention</h2>
<p>Hugo gives us two options to name standard page files: as TITLE/index.md or TITLE.md where TITLE is your page name.</p>
<p>The page name should be lowercase and using hyphens (-) instead of spaces.</p>
<p>Both approaches result in the same output, so you can choose your preferred approach to naming and organizing files. A benefit to the folder-based approach is that all your page’s files (such as images) are self-contained within the page’s folder, so it’s more portable if you wish to share the original Markdown page with someone.</p>
<p>The homepage is a special case as Hugo requires the homepage and listing pages to be named _index.md.</p>
<h2 id="docs-navigation">Docs Navigation</h2>
<p>The docs navigation is automatically generated based on the content in the docs/ folder and is sorted alphabetically.</p>
<p>The order of pages can be changed by adding the weight parameter in the front matter of your Markdown files.</p>
<p>In the example below, the example.md page will appear before the test.md page as it has a lower weight:</p>
<p>Page example.md:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">---
</span></span><span class="line"><span class="cl">title: My Example
</span></span><span class="line"><span class="cl">weight: 1
</span></span><span class="line"><span class="cl">---
</span></span></code></pre></td></tr></table>
</div>
</div><p>Page test.md:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">---
</span></span><span class="line"><span class="cl">title: My Test
</span></span><span class="line"><span class="cl">weight: 2
</span></span><span class="line"><span class="cl">---
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="folder-structure">Folder Structure</h2>
<p>There are 4 main folders for Hugo-based sites:</p>
<ol>
<li>content/ for your Markdown-formatted content files (homepage, etc.)</li>
<li>_index.md the homepage (Hugo requires that the homepage and archive pages have an underscore prefix)</li>
</ol>
<p>The content folder contains all the content files for the website.</p>
<ul>
<li>New items</li>
</ul>
<p>It is convenient to use archetypes to generate new files easily.
By default, the URL of the new paper would be baseURL/papers/new_paper/. But the URL can be customized in the new_paper.md file with the url parameter. For instance, with url: /paperx/, the URL of the new paper is simplified to baseURL/paperx/.</p>
<ul>
<li>New categories</li>
</ul>
<p>It is also easy to add new categories to the website, for instance to list software, data, a blog, and so on. For instance to add a list of datasets, create a new data subfolder into the content folder. Then add a content file such as new_dataset.md into the data subfolder. That new category will be available at baseURL/data/.
You can for instance link to it with a button from the homepage. To do that, simply add the following snippet into the config.yml file, below profileMode:buttons:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl"><span class="k">-</span> name: Datasets
</span></span><span class="line"><span class="cl">  url: /data/
</span></span></code></pre></td></tr></table>
</div>
</div><p>You can also add a link to the new category in the menu bar. To do that, simply add the following snippet into the config.yml file, below menu:main:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl"><span class="k">-</span> name: Datasets
</span></span><span class="line"><span class="cl">  url: /data/
</span></span><span class="line"><span class="cl">  weight: 4
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="static-files">Static files</h2>
<p>The static folder contains all the static files (files not processed or rendered by Hugo) for the website. These include all the PDF files and images to which the website links.</p>
<h2 id="tags">Tags</h2>
<p>The tags are accessible from the menu bar. Tags can be added to any webpage with the tags parameter.
The tag page is generated by default, but it can be customized through the file _index.md placed in the content/tag/ folder. The file defines for instance the description of the page for search engines (description:) as well as the title of the page (title:).</p>
<h2 id="archetypes">Archetypes</h2>
<p>The template comes with archetypes, stored in the archetypes folder. In Hugo, an archetype is a predefined content template that serves as a blueprint for creating new pages. Archetypes help streamline content creation by providing a consistent starting point with predefined metadata and content structure. There is an archetype for paper pages (paper.md) and an archetype for course pages (course.md)</p>
<p>To create a new webpage from an archetype, simply use the hugo new command in the terminal from the website directory. For example, to create a page for a new course, you can run:</p>
<p><code>hugo new content/courses/my-new-teaching-material.md --kind course</code></p>
<p>Hugo will generate a new content file called my-new-teaching-material.md and place it the directory content/courses/, where all the courses are stored. Furthermore, Hugo will use the archetype course.md. Then, you can edit the content of the page by modifying the newly created file my-new-teaching-material.md.</p>
<h2 id="archive">Archive</h2>
<p>An archive can be added to the website. The archive displays a chronological list of all papers, courses, and design projects.</p>
<p>To add an archive page, move the archive.md file from the archetypes folder into the content folder. Then, add the following snippet below in the config.yml file to make the archive available from the menu:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl"><span class="k">-</span> name: Archive
</span></span><span class="line"><span class="cl">  url: /archive/
</span></span><span class="line"><span class="cl">  weight: 7
</span></span></code></pre></td></tr></table>
</div>
</div><p>The archive will be available at baseURL/archive/.</p>
<h2 id="search-page">Search page</h2>
<p>A search page can also be added to the website. To add a search page, move the search.md file from the archetypes folder into the content folder. Then, add the following snippet at the end of the config.yml file so that search works properly:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">outputs:
</span></span><span class="line"><span class="cl">     home:
</span></span><span class="line"><span class="cl">         <span class="k">-</span> HTML
</span></span><span class="line"><span class="cl">         <span class="k">-</span> RSS
</span></span><span class="line"><span class="cl">         <span class="k">-</span> JSON
</span></span></code></pre></td></tr></table>
</div>
</div><p>Finally, add the following snippet below in the config.yml file to make the search page available from the menu:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl"><span class="k">-</span> name: Search
</span></span><span class="line"><span class="cl">  url: /search/
</span></span><span class="line"><span class="cl">  weight: 6
</span></span></code></pre></td></tr></table>
</div>
</div><p>The search page will be available at baseURL/search/.</p>
<h2 id="footer">Footer</h2>
<p>The website does not have a footer, but it is possible to add one by setting <code>hideFooter: false</code> in the config.yml file. The footer contains a copyright notice and a “powered by” notice. The footer can be customized by modifying the file layouts/partials/footer.html.</p>
<h2 id="public-folder">Public folder</h2>
<p>The public folder contains the fully generated static website files that are ready to be deployed to GitHub Pages. When you run the hugo command, Hugo processes your content, templates, and other project files and generates a static website. The resulting output is placed in the public folder by default.</p>
<p>The public folder can always be safely deleted. A new version of the public folder will be created when you run the hugo command in the terminal.</p>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
