main
Tyler Hampton 2023-09-08 22:30:42 -07:00
parent a3766e3e24
commit 603b8a0b54
65 changed files with 5142 additions and 7 deletions

4
Dockerfile Normal file
View File

@ -0,0 +1,4 @@
FROM klakegg/hugo:0.111.3-ext-onbuild AS hugo
FROM nginx
COPY --from=hugo /target /usr/share/nginx/html

24
_docker/expires.inc Normal file
View File

@ -0,0 +1,24 @@
# cache.appcache, your document html and data
location ~* \.(?:manifest|appcache|html?|xml|json)$ {
expires -1;
}
# Feed
location ~* \.(?:rss|atom)$ {
expires 1h;
add_header Cache-Control "public";
}
# Media: images, icons, video, audio, HTC
location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ {
expires 1M;
access_log off;
add_header Cache-Control "public";
}
# CSS and Javascript
location ~* \.(?:css|js)$ {
expires 1y;
access_log off;
add_header Cache-Control "public";
}

2
build.sh Executable file
View File

@ -0,0 +1,2 @@
docker build . -t git.howdoicomputer.lol/howdoicomputer/blog:4
docker push git.howdoicomputer.lol/howdoicomputer/blog:4

15
ci/go.mod Normal file
View File

@ -0,0 +1,15 @@
module main
go 1.20
require (
dagger.io/dagger v0.8.4 // indirect
github.com/99designs/gqlgen v0.17.31 // indirect
github.com/Khan/genqlient v0.6.0 // indirect
github.com/adrg/xdg v0.4.0 // indirect
github.com/iancoleman/strcase v0.3.0 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/vektah/gqlparser/v2 v2.5.6 // indirect
golang.org/x/sync v0.3.0 // indirect
golang.org/x/sys v0.10.0 // indirect
)

38
ci/go.sum Normal file
View File

@ -0,0 +1,38 @@
dagger.io/dagger v0.8.4 h1:2zNu40cBvPZc/CSgMnLRfayfQj5VtbJlDtWJyWGwGSQ=
dagger.io/dagger v0.8.4/go.mod h1:Nwl7WI8YETaZhGjPJvkiOZnKLJXBaJOkSarp5m4+FxA=
github.com/99designs/gqlgen v0.17.31 h1:VncSQ82VxieHkea8tz11p7h/zSbvHSxSDZfywqWt158=
github.com/99designs/gqlgen v0.17.31/go.mod h1:i4rEatMrzzu6RXaHydq1nmEPZkb3bKQsnxNRHS4DQB4=
github.com/Khan/genqlient v0.6.0 h1:Bwb1170ekuNIVIwTJEqvO8y7RxBxXu639VJOkKSrwAk=
github.com/Khan/genqlient v0.6.0/go.mod h1:rvChwWVTqXhiapdhLDV4bp9tz/Xvtewwkon4DpWWCRM=
github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls=
github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E=
github.com/agnivade/levenshtein v1.1.1/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo=
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA=
github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI=
github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/vektah/gqlparser/v2 v2.5.6 h1:Ou14T0N1s191eRMZ1gARVqohcbe1e8FrcONScsq8cRU=
github.com/vektah/gqlparser/v2 v2.5.6/go.mod h1:z8xXUff237NntSuH8mLFijZ+1tjV1swDbpDqjJmk6ME=
golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA=
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

33
ci/main.go Normal file
View File

@ -0,0 +1,33 @@
package main
import (
"context"
"fmt"
"os"
"dagger.io/dagger"
)
func main() {
ctx := context.Background()
// initialize Dagger client
client, err := dagger.Connect(ctx, dagger.WithLogOutput(os.Stdout))
if err != nil {
panic(err)
}
defer client.Close()
// use a golang:1.19 container
// get version
// execute
golang := client.Container().From("golang:1.19").WithExec([]string{"go", "version"})
version, err := golang.Stdout(ctx)
if err != nil {
panic(err)
}
// print output
fmt.Println("Hello from Dagger and " + version)
}

18
content/about.md Normal file
View File

@ -0,0 +1,18 @@
---
title: "About"
draft: false
layout: "about"
description: "me"
---
# the man behind the books
I'm a thirty-something who has been working as some flavor of SRE/DevOps/systems engineer for a little over a decade.
# books?
Yeah, I love em.
# but what else
I enjoy biking, board games, table-top RPGs, 3D printing, video games, guitar, and bad jokes.

167
content/posts/homelab-1.md Normal file
View File

@ -0,0 +1,167 @@
---
title: "Homelab 1: Genesis"
date: 2023-08-27T18:36:47-07:00
draft: false
summary: First part of a multi-part series about my current homelab
tags:
- Nomad
- Consul
- Homelab
- Nix
---
This blog. The one that you are currently reading right now. Is running on a metal box that is just barely large enough to fit the average house cat. It cost ~$800 USD to build and has been christened Megamind. The HTTP request that you initiated when you visited https://howdoicomputer.lol has returned digital bits from hardware that is more than likely a couple feet from where I'm sitting. Welcome!
### yeah, but why
I like solving problems and these were mine:
* I have a plethora of software projects that I've written that need a home. Discord bots, daemons, websites, etc.
* I needed a place to host a blog. Hi!
* I want to replace the myriad online software services that I'm subscribed to. Spotify, Netflix, etc.
* I want an experimentation platform that I could use to learn new technologies or try new ideas.
I wanted to build a self-hosted platform with logging, metric collection, service discovery, orchestration, etc; [fly.io](https://fly.io/) in a box, if you will.
Also, I love making things. Making things is fun.
### okay, but how
![homelab](/homelab.jpg)
If you go on the /r/homelab subreddit and sort by the most popular posts then you'll see setups that involve quite a bit more hardware than what my homelab currently sports. I don't have a full metal rack with multiple blades and switches. There are no neatly braided corridors of ethernet cabling. My homelab is a box that is filled with consumer grade hardware that sprouts a single cable that snakes to my off-the-shelf, eight year old consumer router.
Currently, that box is outfitted with:
* Ryzen 5600X
* 64 GB of non-ECC memory
* Intel Arc GPU
* Two WD Red 12TB drives
The hardware isn't the interesting part, however. The interesting part is what runs *inside* the computer. It's essentially a Platform as a Service (PaaS) solution in a box and I love it.
### nomad and nix and zfs oh my
Here are some features of my homelab:
* Nomad is the container orchestrator
* A ZFS mirrored pool for data redundancy
* Consul exists as a service mesh
* Vault exists for secret storage
* Traefik is for ingress
* Prometheus for monitoring and Grafana for dashboards
* The operating system is NixOS and I use my laptop to do flake based deployments to the underlying OS
A secret that I've withheld from you so far is that Megamind isn't my first homelab. A previous homelab that I built was a k3s cluster running on top of Raspbery Pis. It was quaint but got decommissioned when I moved apartments. I never set it up again and it currently lies in pieces in a drawer somewhere.
So why Nomad? Mostly because, at the time, I was leading an infrastructure initiative at my day job to use Nomad to orchestrate applications that are deployed to heterogenous IoT devices spread across distinct geographic regions. I wanted to dog food my own proposal. Also, Nomad is *a lot* simpler to use than Kubernetes. Nomad starts as *just* an orchestrator but gives you the option to introduce complexity later on through Vault and Consul. Every concept is almost immediately grokable and it has just been a pleasure to work with.
### what's runnin
Here is what is running so far:
* Jellyfin (movies, TV shows, etc)
* Gitea (Git server and Docker registry)
* Factorio server
* FoundryVTT
* Dufs (a UI for uploading files to the server)
* Calibre Web (my library of ebooks)
* Navidrome (music server)
* Grafana and Prometheus
* A Discord bot for looking up books
* An Elixir/Phoenix application that I'm working on
### internal paas
I write code. I like writing code. Sometimes that code becomes semi-functional pieces of software that I need to deploy. Previously, I used [fly.io](fly.io) to host applications but have now moved those applications to my homelab.
Here is how they are developed and deployed:
* Each application has a `ci/` directory that contains a [Dagger](https://dagger.io/) pipeline for testing the application and building a docker image. This is local for now.
* The docker image is uploaded to `git.howdoicomputer.lol`. What is behind that domain is a Gitea instance that serves as a git host and a docker registry.
* That application also has a `deploy/` directory that contains a `job.nomad` file. That Nomad job definition specifies the docker image that exists in Gitea and is used for the job allocation.
* If the application has a `/metrics` endpoint, then Prometheus will be updated to scrape that endpoint and collect those metrics. This is powered by Consul.
* If the application needs secrets then they are fetched from Vault.
* Traefik and Consul Registry tags are used to define the ingress for the application. Most services are behind a subdomain on the `howdoicomputer.lol` domain and Traefik is what maps those subdomains to running services. If the service is not ready for production, then an IP whitelist is used to make sure that only ingress from my Tailscale VPN is allowed to access the site.
* Logs are displayed through the Nomad web dashboard.
* Traefik manages Let's Encrypt SSL certs through the DNS challenge method.
This blog is developed similarily. It's [Hugo](https://gohugo.io/) based so posts are markdown files that get converted into HTML files. A Dagger pipeline executes Hugo to get those files and then builds the container image - which runs Nginx - and then uploads that image to Gitea. There is a job definition in the blog's repo that deploys that application to Nomad.
![blog_nomad_job](/blog_nomad_job.png)
Here is the job file for the blog:
```hcl
job "blog" {
type = "service"
datacenters = ["dc1"]
group "blog" {
network {
mode = "bridge"
port "http" {
to = 80
}
}
service {
name = "blog"
port = "http"
tags = [
"traefik.enable=true",
"traefik.http.routers.blog-https.tls=true",
"traefik.http.routers.blog-https.rule=Host(`howdoicomputer.lol`)",
"traefik.http.routers.blog-https.tls.certresolver=resolver",
"traefik.http.routers.blog-https.tls.domains[0].main=howdoicomputer.lol",
"traefik.http.routers.blog-https.entrypoints=websecure",
"traefik.http.routers.blog-http.entrypoints=web",
"traefik.http.routers.blog-http.rule=Host(`howdoicomputer.lol`)",
"traefik.http.routers.blog-http.middlewares=redirecthttps",
"traefik.http.middlewares.redirecthttps.redirectscheme.scheme=https"
]
}
task "blog" {
driver = "docker"
config {
image = "git.howdoicomputer.lol/howdoicomputer/blog:2"
ports = ["http"]
}
resources {
cpu = 500
memory = 200
}
}
}
}
```
### nix
The OS is configured remotely using [deploy-rs](https://github.com/serokell/deploy-rs) - a Rust based CLI that allows you to apply a Nix flake to a specific host. This is what I've replaced Ansible with. Nix is... okay. I'll review Nix later but one cool feature to note here is that deploy-rs will apply a Nix configuration and if the SSH connection is broken then the previous Nix state would be rolled back to on the host.
What Nix currently owns:
* The installation of Nomad, Consul, Vault and other packages on the host.
* The creation of the HashiStack configuration files.
* The ZFS pool.
* Firewall rules.
* User creation.
* Kernel parameters.
I do really like the immutability of Nix. Something I want to explore down the line is either [impermanence](https://nixos.wiki/wiki/Impermanence) or baking an OS image and continuously reimagining the homelab server through PXE.
### the future
The future is bright! It has been incredibly fluid to roll out new services to the server. There are two additional features that I want: a CI/CD solution and an auth model for friends who want to use services.
For CI/CD, I'll most likely go with [Drone](https://www.drone.io/). Really, I just want a UI for Dagger pipelines. For an auth model, eh, I am not sure. LDAP? There is also the possiblity of using Oauth2 and whitelisting accounts.
I also want to do a thorough lockdown of Gitea so that I can expose my code to the world.
Till next time.

View File

@ -0,0 +1,43 @@
---
title: "Homelab 2: Monitoring"
date: 2023-09-01T21:15:40-07:00
draft: true
summary: How metrics and logs work for my homelab
tags:
- Prometheus
- Nomad
- Grafana
- Monitoring
- Consul
---
Every good production environment needs robust monitoring in-place before it could be considered production and I feel like my homelab shouldn't be an exception.
With that in mind, I created a monitoring stack that I've used professionally at companies that I've worked at and I'm pretty happy with it.
## stackem
The different components of the system are thus:
* Prometheus
* Grafana
* Prometheus's node_exporter
* Consul
Here is what I want to collect metrics for, from most critical to least:
1. The base host resources. This includes available memory, CPU, disk space, network traffic, etc. Also includes the ZFS pool.
2. Nomad.
4. The services that run on the host via Nomad.
In essence, monitoring starts for the platform used to deliver my applications and then moves upward to the end services I expose to myself and my friends.
## base system monitoring
Starting from the base, the Prometheus project supports the collection of metrics for Linux based hosts through their [node_exporter](https://github.com/prometheus/node_exporter) project. It's a Golang binary that exposes an absolute treasure trove of data including ZFS stats! It covers my first two monitoring needs.
While I could run the `node_exporter` via systemd, I instead opted to use the `exec` driver for Nomad. There is a Nix package for installing the exporter so the job definition just relies on executing the binary itself. Doing it this way means I get visibility into the exporter process and logs via the Nomad dashboard.
## everything else
Nomad and Consul both expose their own metrics and so it's easy enough to add a Prometheus stat

View File

@ -1,6 +0,0 @@
---
title: "Homelab"
date: 2023-08-27T18:36:47-07:00
draft: true
---

3
deploy/.envrc Normal file
View File

@ -0,0 +1,3 @@
export VAULT_ADDR="http://megamind:8200"
export NOMAD_ADDR="http://megamind:4646"
export VAULT_TOKEN="hvs.vYkHHcWub5i6xsJWifKSKrbD"

46
deploy/job.nomad Normal file
View File

@ -0,0 +1,46 @@
job "blog" {
type = "service"
datacenters = ["dc1"]
group "blog" {
network {
mode = "bridge"
port "http" {
to = 80
}
}
service {
name = "blog"
port = "http"
tags = [
"traefik.enable=true",
"traefik.http.routers.blog-https.tls=true",
"traefik.http.routers.blog-https.rule=Host(`howdoicomputer.lol`)",
"traefik.http.routers.blog-https.tls.certresolver=resolver",
"traefik.http.routers.blog-https.tls.domains[0].main=howdoicomputer.lol",
"traefik.http.routers.blog-https.entrypoints=websecure",
"traefik.http.routers.blog-http.entrypoints=web",
"traefik.http.routers.blog-http.rule=Host(`howdoicomputer.lol`)",
"traefik.http.routers.blog-http.middlewares=redirecthttps",
"traefik.http.middlewares.redirecthttps.redirectscheme.scheme=https"
]
}
task "blog" {
driver = "docker"
config {
image = "git.howdoicomputer.lol/howdoicomputer/blog:4"
ports = ["http"]
}
resources {
cpu = 500
memory = 200
}
}
}
}

View File

@ -1,4 +1,25 @@
baseURL = 'https://blog.howdoicomputer.lol/'
baseURL = 'https://howdoicomputer.lol/'
languageCode = 'en-us'
title = 'howdoicomputer'
theme = "risotto"
sectionPagesMenu = "main"
[params.theme]
palette = "tokyo-night-dark"
[params.about]
title = "howdoicomputer's blog"
description = "A dumping ground for ideas related to making, tomfoolery, and tomfoolery related to making"
[menu]
[[menu.main]]
identifier = "about"
name = "About"
url = "/about"
weight = 10
[markup]
[markup.tableOfContents]
startLevel = 2
endLevel = 3
ordered = true

11
layouts/index.html Normal file
View File

@ -0,0 +1,11 @@
{{ define "main" }}
<ul class="contents">
{{ range (where .Site.RegularPages "Section" "posts") }}
<li><a href="{{ .Permalink }}">{{ .Title }}</a>
<div>
{{ .Summary }}
</div>
</li>
{{ end }}
</ul>
{{ end }}

103
public/about/index.html Normal file
View File

@ -0,0 +1,103 @@
<!DOCTYPE html>
<html lang="en">
<head><title>About &ndash; howdoicomputer</title>
<meta name="description" content="A dumping ground for ideas related to making, tomfoolery, and tomfoolery related to making">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="UTF-8"/>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.2/css/all.min.css" integrity="sha512-1sCRPdkRXhBV2PBLUdRb4tMg1w2YPf37qatUFeS7zlBy7jJI8Lf4VHwWfZZfpXtYSLy85pkm9GaYVYMfw5BC1A==" crossorigin="anonymous" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/academicons/1.9.1/css/academicons.min.css" integrity="sha512-b1ASx0WHgVFL5ZQhTgiPWX+68KjS38Jk87jg7pe+qC7q9YkEtFq0z7xCglv7qGIs/68d3mAp+StfC8WKC5SSAg==" crossorigin="anonymous" />
<link rel="stylesheet" href="https://howdoicomputer.lol/css/palettes/tokyo-night-dark.css">
<link rel="stylesheet" href="https://howdoicomputer.lol/css/risotto.css">
<link rel="stylesheet" href="https://howdoicomputer.lol/css/custom.css">
</head>
<body>
<div class="page">
<header class="page__header"><nav class="page__nav main-nav">
<ul>
<h1 class="page__logo"><a href="https://howdoicomputer.lol/" class="page__logo-inner">howdoicomputer</a></h1>
<li class="main-nav__item"><a class="nav-main-item" href="https://howdoicomputer.lol/about" title="">About</a></li>
<li class="main-nav__item"><a class="nav-main-item" href="https://howdoicomputer.lol/posts/" title="Posts">Posts</a></li>
</ul>
</nav>
</header>
<section class="page__body">
<header class="content__header">
<h1>About</h1>
</header>
<div class="content__body">
<h1 id="the-man-behind-the-books">the man behind the books</h1>
<p>I&rsquo;m a thirty-something who has been working as some flavor of SRE/DevOps/systems engineer for a little over a decade.</p>
<h1 id="books">books?</h1>
<p>Yeah, I love em.</p>
<h1 id="but-what-else">but what else</h1>
<p>I enjoy biking, board games, table-top RPGs, 3D printing, video games, guitar, and bad jokes.</p>
</div>
<footer class="content__footer"></footer>
</section>
<section class="page__aside">
<div class="aside__about">
<div class="aside__about">
<h1 class="about__title">howdoicomputer&#39;s blog</h1>
<p class="about__description">A dumping ground for ideas related to making, tomfoolery, and tomfoolery related to making</p>
</div>
<ul class="aside__social-links">
</ul>
</div>
<hr>
<div class="aside__content">
<p>me</p>
</div>
</section>
<footer class="page__footer"><p>
</p>
<br /><br />
<p class="copyright"></p>
<p class="advertisement">Powered by <a href="https://gohugo.io/">hugo</a> and <a href="https://github.com/joeroe/risotto">risotto</a>.</p>
</footer>
</div>
</body>
</html>

BIN
public/blog_nomad_job.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

View File

@ -0,0 +1,92 @@
<!DOCTYPE html>
<html lang="en">
<head><title>Categories &ndash; howdoicomputer</title>
<meta name="description" content="A dumping ground for ideas related to making, tomfoolery, and tomfoolery related to making">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="UTF-8"/>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.2/css/all.min.css" integrity="sha512-1sCRPdkRXhBV2PBLUdRb4tMg1w2YPf37qatUFeS7zlBy7jJI8Lf4VHwWfZZfpXtYSLy85pkm9GaYVYMfw5BC1A==" crossorigin="anonymous" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/academicons/1.9.1/css/academicons.min.css" integrity="sha512-b1ASx0WHgVFL5ZQhTgiPWX+68KjS38Jk87jg7pe+qC7q9YkEtFq0z7xCglv7qGIs/68d3mAp+StfC8WKC5SSAg==" crossorigin="anonymous" />
<link rel="stylesheet" href="https://howdoicomputer.lol/css/palettes/tokyo-night-dark.css">
<link rel="stylesheet" href="https://howdoicomputer.lol/css/risotto.css">
<link rel="stylesheet" href="https://howdoicomputer.lol/css/custom.css">
</head>
<body>
<div class="page">
<header class="page__header"><nav class="page__nav main-nav">
<ul>
<h1 class="page__logo"><a href="https://howdoicomputer.lol/" class="page__logo-inner">howdoicomputer</a></h1>
<li class="main-nav__item"><a class="nav-main-item" href="https://howdoicomputer.lol/about" title="">About</a></li>
<li class="main-nav__item"><a class="nav-main-item" href="https://howdoicomputer.lol/posts/" title="Posts">Posts</a></li>
</ul>
</nav>
</header>
<section class="page__body">
<h1 id="categories">Categories</h1>
<ul>
</ul>
</section>
<section class="page__aside">
<div class="aside__about">
<div class="aside__about">
<h1 class="about__title">howdoicomputer&#39;s blog</h1>
<p class="about__description">A dumping ground for ideas related to making, tomfoolery, and tomfoolery related to making</p>
</div>
<ul class="aside__social-links">
</ul>
</div>
<hr>
<div class="aside__content">
</div>
</section>
<footer class="page__footer"><p>
</p>
<br /><br />
<p class="copyright"></p>
<p class="advertisement">Powered by <a href="https://gohugo.io/">hugo</a> and <a href="https://github.com/joeroe/risotto">risotto</a>.</p>
</footer>
</div>
</body>
</html>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Categories on howdoicomputer</title>
<link>https://howdoicomputer.lol/categories/</link>
<description>Recent content in Categories on howdoicomputer</description>
<generator>Hugo -- gohugo.io</generator>
<language>en-us</language><atom:link href="https://howdoicomputer.lol/categories/index.xml" rel="self" type="application/rss+xml" />
</channel>
</rss>

26
public/css/about.css Normal file
View File

@ -0,0 +1,26 @@
/* About/bio section */
.about__logo {
height: 1.5rem;
}
.about__title {
display: inline;
vertical-align: top;
}
.about__title::before {
content: none;
}
/* Social media links */
.aside__social-links {
padding: 0;
}
.aside__social-links li {
display: inline-block;
}
.aside__social-links li::marker {
content: none;
}

17
public/css/colours.css Normal file
View File

@ -0,0 +1,17 @@
:root {
/* Background */
--bg: var(--base00);
--off-bg: var(--base01);
--inner-bg: var(--base02);
/* Text */
--fg: var(--base05);
--off-fg: var(--base04);
--muted: var(--base03);
--link: var(--base0D);
--hover: var(--base0C);
--highlight: var(--base0A);
/* Logo */
--logo: var(--base0B);
}

1
public/css/custom.css Normal file
View File

@ -0,0 +1 @@
/* Override this file to customise the theme's CSS for your site */

7
public/css/footer.css Normal file
View File

@ -0,0 +1,7 @@
.page__footer {
color: var(--off-fg);
}
.page__footer p {
margin: 0;
}

20
public/css/header.css Normal file
View File

@ -0,0 +1,20 @@
/* Main menu */
.main-nav ul {
display: flex;
flex-flow: row wrap;
justify-content: flex-start;
margin: 0;
padding: 0 0 0.25rem 0;
gap: 0rem 1.5rem;
}
.main-nav li {
padding-top: 0.25rem;
margin-left: 1rem;
text-transform: lowercase;
}
.main-nav li::marker {
content: "./";
}

57
public/css/layout.css Normal file
View File

@ -0,0 +1,57 @@
/* 1rem = 16px by default */
.page {
max-width: 64rem;
margin: 1rem auto;
display: grid;
grid-template-areas:
"header"
"body"
"aside"
"footer";
grid-template-columns: minmax(0, 1fr); /* https://css-tricks.com/preventing-a-grid-blowout/ */
grid-row-gap: 2rem;
}
@media (min-width: 45rem) {
.page {
grid-template-areas:
"header header"
"body aside"
"footer footer";
grid-template-columns: minmax(0, 1fr) 15rem;
grid-column-gap: 2rem;
}
}
/* Header */
.page__header {
grid-area: header;
display: flex;
}
.page__logo {
flex-shrink: 0;
}
.page__nav {
flex-grow: 1;
}
/* Body + aside */
.page__body {
grid-area: body;
background-color: var(--off-bg);
box-shadow: 0 0 0 1rem var(--off-bg);
overflow-wrap: break-word;
}
.page__aside {
grid-area: aside;
color: var(--off-fg);
}
/* Footer */
.page__footer {
grid-area: footer;
}

37
public/css/logo.css Normal file
View File

@ -0,0 +1,37 @@
.page__logo {
padding: 0;
margin: 0;
font-weight: inherit;
color: var(--bg);
}
.page__logo:before {
content: none;
}
.page__logo-inner {
display: block;
background: var(--logo);
opacity: 0.90;
padding: 0.25rem;
}
a.page__logo-inner:link, a.page__logo-inner:visited {
color: inherit;
text-decoration: inherit;
}
a.page__logo-inner:hover,
a.page__logo-inner:active {
opacity: 1;
}
.page__logo-inner:before {
content: "[";
color: var(--bg);
}
.page__logo-inner:after {
content: "] $";
color: var(--bg);
}

View File

@ -0,0 +1,20 @@
/* Apprentice by romainl */
:root {
--base00: #262626;
--base01: #AF5F5F;
--base02: #5F875F;
--base03: #87875F;
--base04: #5F87AF;
--base05: #5F5F87;
--base06: #5F8787;
--base07: #6C6C6C;
--base08: #444444;
--base09: #FF8700;
--base0A: #87AF87;
--base0B: #FFFFAF;
--base0C: #87AFD7;
--base0D: #8787AF;
--base0E: #5FAFAF;
--base0F: #BCBCBC;
}

View File

@ -0,0 +1,22 @@
/* base16 default dark
* https://github.com/chriskempson/base16-default-schemes
*/
:root {
--base00: #181818;
--base01: #282828;
--base02: #383838;
--base03: #585858;
--base04: #b8b8b8;
--base05: #d8d8d8;
--base06: #e8e8e8;
--base07: #f8f8f8;
--base08: #ab4642;
--base09: #dc9656;
--base0A: #f7ca88;
--base0B: #a1b56c;
--base0C: #86c1b9;
--base0D: #7cafc2;
--base0E: #ba8baf;
--base0F: #a16946;
}

View File

@ -0,0 +1,22 @@
/* base16 default light
* https://github.com/chriskempson/base16-default-schemes
*/
:root {
--base00: #f8f8f8;
--base01: #e8e8e8;
--base02: #d8d8d8;
--base03: #b8b8b8;
--base04: #585858;
--base05: #383838;
--base06: #282828;
--base07: #181818;
--base08: #ab4642;
--base09: #dc9656;
--base0A: #f7ca88;
--base0B: #a1b56c;
--base0C: #86c1b9;
--base0D: #7cafc2;
--base0E: #ba8baf;
--base0F: #a16946;
}

View File

@ -0,0 +1,20 @@
/* Dracula by Mike Barkmin (http://github.com/mikebarkmin) based on Dracula Theme (http://github.com/dracula) */
:root {
--base00: #282936;
--base01: #3a3c4e;
--base02: #4d4f68;
--base03: #626483;
--base04: #62d6e8;
--base05: #e9e9f4;
--base06: #f1f2f8;
--base07: #f7f7fb;
--base08: #ea51b2;
--base09: #b45bcf;
--base0A: #00f769;
--base0B: #ebff87;
--base0C: #a1efe4;
--base0D: #62d6e8;
--base0E: #b45bcf;
--base0F: #00f769;
}

View File

@ -0,0 +1,23 @@
/* gruvbox dark
* https://github.com/morhetz/gruvbox
* base16: https://github.com/dawikur/base16-gruvbox-scheme
*/
:root {
--base00: #282828;
--base01: #3c3836;
--base02: #504945;
--base03: #665c54;
--base04: #bdae93;
--base05: #d5c4a1;
--base06: #ebdbb2;
--base07: #fbf1c7;
--base08: #fb4934;
--base09: #fe8019;
--base0A: #fabd2f;
--base0B: #b8bb26;
--base0C: #8ec07c;
--base0D: #83a598;
--base0E: #d3869b;
--base0F: #d65d0e;
}

View File

@ -0,0 +1,23 @@
/* gruvbox light
* https://github.com/morhetz/gruvbox
* base16: https://github.com/dawikur/base16-gruvbox-scheme
*/
:root {
--base00: #fbf1c7;
--base01: #ebdbb2;
--base02: #d5c4a1;
--base03: #bdae93;
--base04: #665c54;
--base05: #504945;
--base06: #3c3836;
--base07: #282828;
--base08: #9d0006;
--base09: #af3a03;
--base0A: #b57614;
--base0B: #79740e;
--base0C: #427b58;
--base0D: #076678;
--base0E: #8f3f71;
--base0F: #d65d0e;
}

View File

@ -0,0 +1,20 @@
/* Material by Nate Peterson */
:root {
--base00: #263238;
--base01: #2E3C43;
--base02: #314549;
--base03: #546E7A;
--base04: #B2CCD6;
--base05: #EEFFFF;
--base06: #EEFFFF;
--base07: #FFFFFF;
--base08: #F07178;
--base09: #F78C6C;
--base0A: #FFCB6B;
--base0B: #C3E88D;
--base0C: #89DDFF;
--base0D: #82AAFF;
--base0E: #C792EA;
--base0F: #FF5370;
}

View File

@ -0,0 +1,20 @@
/* PaperColor Dark by Jon Leopard (http://github.com/jonleopard) based on PaperColor Theme (https://github.com/NLKNguyen/papercolor-theme) */
:root {
--base00: #1c1c1c;
--base01: #af005f;
--base02: #5faf00;
--base03: #d7af5f;
--base04: #5fafd7;
--base05: #808080;
--base06: #d7875f;
--base07: #d0d0d0;
--base08: #585858;
--base09: #5faf5f;
--base0A: #afd700;
--base0B: #af87d7;
--base0C: #ffaf00;
--base0D: #ff5faf;
--base0E: #00afaf;
--base0F: #5f8787;
}

View File

@ -0,0 +1,20 @@
/* PaperColor Light by Jon Leopard (http://github.com/jonleopard) based on PaperColor Theme (https://github.com/NLKNguyen/papercolor-theme) */
:root {
--base00: #eeeeee;
--base01: #af0000;
--base02: #008700;
--base03: #5f8700;
--base04: #0087af;
--base05: #444444;
--base06: #005f87;
--base07: #878787;
--base08: #bcbcbc;
--base09: #d70000;
--base0A: #d70087;
--base0B: #8700af;
--base0C: #d75f00;
--base0D: #d75f00;
--base0E: #005faf;
--base0F: #005f87;
}

View File

@ -0,0 +1,20 @@
/* Solarized Dark by Ethan Schoonover (modified by aramisgithub) */
:root {
--base00: #002b36;
--base01: #073642;
--base02: #586e75;
--base03: #657b83;
--base04: #839496;
--base05: #93a1a1;
--base06: #eee8d5;
--base07: #fdf6e3;
--base08: #dc322f;
--base09: #cb4b16;
--base0A: #b58900;
--base0B: #859900;
--base0C: #2aa198;
--base0D: #268bd2;
--base0E: #6c71c4;
--base0F: #d33682;
}

View File

@ -0,0 +1,20 @@
/* Solarized Light by Ethan Schoonover (modified by aramisgithub) */
:root {
--base00: #fdf6e3;
--base01: #eee8d5;
--base02: #93a1a1;
--base03: #839496;
--base04: #657b83;
--base05: #586e75;
--base06: #073642;
--base07: #002b36;
--base08: #dc322f;
--base09: #cb4b16;
--base0A: #b58900;
--base0B: #859900;
--base0C: #2aa198;
--base0D: #268bd2;
--base0E: #6c71c4;
--base0F: #d33682;
}

View File

@ -0,0 +1,20 @@
/* tender by Jacobo Tabernero (https://github/com/jacoborus/tender.vim) */
:root {
--base00: #282828;
--base01: #383838;
--base02: #484848;
--base03: #4c4c4c;
--base04: #b8b8b8;
--base05: #eeeeee;
--base06: #e8e8e8;
--base07: #feffff;
--base08: #f43753;
--base09: #dc9656;
--base0A: #ffc24b;
--base0B: #c9d05c;
--base0C: #73cef4;
--base0D: #b3deef;
--base0E: #d3b987;
--base0F: #a16946;
}

View File

@ -0,0 +1,20 @@
/* Tokyo Night Dark by Michaël Ball */
:root {
--base00: #1A1B26;
--base01: #16161E;
--base02: #2F3549;
--base03: #444B6A;
--base04: #787C99;
--base05: #A9B1D6;
--base06: #CBCCD1;
--base07: #D5D6DB;
--base08: #C0CAF5;
--base09: #A9B1D6;
--base0A: #0DB9D7;
--base0B: #9ECE6A;
--base0C: #B4F9F8;
--base0D: #2AC3DE;
--base0E: #BB9AF7;
--base0F: #F7768E;
}

View File

@ -0,0 +1,20 @@
/* Tokyo Night Light by Michaël Ball */
:root {
--base00: #D5D6DB;
--base01: #CBCCD1;
--base02: #DFE0E5;
--base03: #9699A3;
--base04: #4C505E;
--base05: #343B59;
--base06: #1A1B26;
--base07: #1A1B26;
--base08: #343B58;
--base09: #965027;
--base0A: #166775;
--base0B: #485E30;
--base0C: #3E6968;
--base0D: #34548A;
--base0E: #5A4A78;
--base0F: #8C4351;
}

View File

@ -0,0 +1,20 @@
/* Windows 95 Light by Fergus Collins (https://github.com/C-Fergus) */
:root {
--base00: #fcfcfc;
--base01: #e0e0e0;
--base02: #c4c4c4;
--base03: #a8a8a8;
--base04: #7e7e7e;
--base05: #545454;
--base06: #2a2a2a;
--base07: #000000;
--base08: #a80000;
--base09: #fcfc54;
--base0A: #a85400;
--base0B: #00a800;
--base0C: #00a8a8;
--base0D: #0000a8;
--base0E: #a800a8;
--base0F: #54fc54;
}

View File

@ -0,0 +1,20 @@
/* Windows 95 by Fergus Collins (https://github.com/C-Fergus) */
:root {
--base00: #000000;
--base01: #1C1C1C;
--base02: #383838;
--base03: #545454;
--base04: #7e7e7e;
--base05: #a8a8a8;
--base06: #d2d2d2;
--base07: #fcfcfc;
--base08: #fc5454;
--base09: #a85400;
--base0A: #fcfc54;
--base0B: #54fc54;
--base0C: #54fcfc;
--base0D: #5454fc;
--base0E: #fc54fc;
--base0F: #00a800;
}

12
public/css/risotto.css Normal file
View File

@ -0,0 +1,12 @@
@import 'colours.css';
@import 'typography.css';
@import 'layout.css';
@import 'header.css';
@import 'logo.css';
@import 'about.css';
@import 'footer.css';
body {
background-color: var(--bg);
color: var(--fg);
}

215
public/css/typography.css Normal file
View File

@ -0,0 +1,215 @@
/* Fonts */
:root {
--font-monospace: "Fira Mono", monospace;
}
body {
font-family: var(--font-monospace);
font-size: 16px;
line-height: 1.5rem;
}
/* Headings */
h1,
h2,
h3,
h4,
h5,
h6 {
font-size: 1rem;
margin: 1.5rem 0 0 0;
font-weight: 600;
}
h1+h2,
h1+h3,
h1+h4,
h1+h5,
h1+h6,
h2+h3,
h2+h4,
h2+h5,
h2+h6,
h3+h4,
h3+h5,
h3+h6,
h4+h5,
h4+h6,
h5+h6 {
margin: 0;
}
h1:before { content: "# "; }
h2:before { content: "## "; }
h3:before { content: "### "; }
h4:before { content: "#### "; }
h5:before { content: "##### "; }
h6:before { content: "###### "; }
h1:before,
h2:before,
h3:before,
h4:before,
h5:before,
h6:before {
color: var(--muted);
}
h1:first-child {
margin-top: 0;
}
/* Paragraphs */
p {
margin: 0 0 1.5rem 0;
}
/* Links */
a:link, a:visited {
color: var(--link);
}
a:hover, a:active, a.active {
color: var(--hover);
}
/* Lists */
ul {
margin: 0 0 1.5rem 0;
padding-left: 1.25rem;
}
ol {
margin: 0 0 1.5rem 0;
padding-left: 1.75rem;
}
ul ul,
ul ol,
ol ul,
ol ol {
margin: 0;
}
ul li::marker {
content: '\00A0';
color: var(--muted);
}
ol li::marker {
color: var(--muted);
}
dt {
margin: 0;
font-weight: bold;
}
dd {
margin: 0 0 0 1.5rem;
font-style: italic;
}
dd + dt {
margin-top: 1.5rem;
}
dl {
margin: 0 0 1.5rem 0;
}
/* Blockquotes */
blockquote {
position: relative;
margin: 0 0 1.5rem 1.5rem;
}
blockquote::before {
position: absolute;
left: -1.5rem;
content: ">";
color: var(--muted);
}
.twitter-tweet::before {
content: "\f099";
font-family: "Font Awesome 5 Brands";
font-weight: 400;
}
/* Code */
pre,
code,
kbd,
samp {
background: var(--inner-bg) !important;
font-family: var(--font-monospace);
color: var(--off-fg);
}
pre {
overflow-x: auto;
padding: 1.5rem;
margin: 0 0 1.5rem 0;
}
/* Emphasis */
b,
strong {
font-weight: 600;
}
/* Highlighting */
::selection,
mark {
background-color: var(--highlight);
color: var(--bg);
}
/* Other typographic elements */
hr {
border: 0;
margin-bottom: 1.5rem;
}
hr:after {
content: '---';
color: var(--muted);
}
/* Prevent super/sub from affecting line height */
sup, sub {
vertical-align: baseline;
position: relative;
top: -0.25rem;
font-size: unset;
}
sub {
top: 0.25rem;
}
/* Tables */
table {
border-spacing: 0;
margin: 0 0 1.5rem 0;
overflow-wrap: anywhere;
}
th, td {
padding: 0 .75rem;
vertical-align: top;
}
th:first-child, td:first-child {
padding-left: 0;
}
th {
text-align: inherit;
}
/* Figures */
img {
max-width: 100%;
height: auto;
}

BIN
public/homelab.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

1
public/images/rice.svg Normal file
View File

@ -0,0 +1 @@
<svg height='100px' width='100px' fill="#000000" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" viewBox="0 0 100 80.944" enable-background="new 0 0 100 80.944" xml:space="preserve"><path d="M49.674,40.911c-2.018-6.836,8.971-10.963,8.841-4.075c1.016,3.678,1.302,5.808-2.448,6.511 C52.754,43.964,50.684,44.329,49.674,40.911z"></path><path d="M57.63,18.274c-1.094,3.718,4.311,4.251,2.91,8.359c2.819,0,1.999-2.246,3.054-4.095c1.523-2.656,5.052-3.301,4.792-6.96 c0.267,6.726,4.004-0.495,6.523-0.762c0.137-1.256-0.449-2.819-0.586-3.665c-1.237-2.656-1.127-5.248-4.531-3.379 c-2.429,1.321-5.547,3.88-2.507,6.185C64.206,14.407,58.763,14.381,57.63,18.274z"></path><path d="M49.74,8.586c-1.4,0.794-2.129,3.861-2.448,5.312c-0.586,2.689-0.41,11.211,4.108,9.824 c2.558-0.774,2.103-4.674,3.092-6.719c0.671-1.36,1.634-1.139,1.992-2.584c0.261-1.061-0.345-2.721-0.508-3.802 c1.719,4.427,8.366,2.429,6.731-2.031c-1.341-1.224-3.965-1.985-5.696-1.074c-2.52,1.335-0.222,2.793-2.148,2.865 C53.542,10.416,52.487,7.037,49.74,8.586z"></path><path d="M57.012,27.454c-1.843-6.126-12.884,2.767-10.768,6.576c1.543,2.793,4.056-1.959,5.612-2.76 C53.991,30.175,57.474,31.158,57.012,27.454z"></path><path d="M61.179,4.993c1.692,0.697,3.633,0.599,3.053-1.907C61.726,1.061,54.7,0.5,54.929,5.117 C56.888,4.869,59.258,4.192,61.179,4.993z"></path><path d="M65.925,28.938c1.861-1.282,4.961-1.087,4.466-4.192c-3.093-7.058-8.854,6.973-9.343,9.381 C63.269,33.176,63.913,30.312,65.925,28.938z"></path><path d="M79.069,38.092c1.061,2.057,5.67,0.749,7.994-0.41c3.041-1.498,3.75-3.529,3.034-6.934 C88.008,22.115,76.165,32.467,79.069,38.092z"></path><path d="M71.973,41.536c2.571-2.161,1.96-9.167,1.536-12.024c-2.682-0.423-5.924,0.749-7.832,2.682 c-1.38,1.419-5.286,8.08-3.73,10.04C62.995,43.554,71.042,42.331,71.973,41.536z"></path><path d="M86.979,24.596c2.076-0.423,1.295-3.691,0.95-5.586c-0.163-5.026-5.527-0.996-4.577,2.617 C83.73,23.04,85.247,24.947,86.979,24.596z"></path><path d="M72.949,24.622c0.808,1.511,2.864,1.523,3.405,4.193c0.618,3.014-0.71,6.198-0.312,9.264 c1.939-1.582,1.621-7.285,3.326-9.941c0.99-1.556,2.155-1.784,2.188-3.613c0.026-1.276-1.224-2.942-1.861-3.991 c1.973-0.091,3.965-7.135,1.172-6.999c-1.433-2.097-3.054-2.422-3.764-0.137c-0.742,2.396,2.155,4.713,2.891,6.712 C76.556,18.15,70.319,19.674,72.949,24.622z"></path><path d="M31.172,23.834c1.374-0.072,1.152,1.224,2.506,0.651c1.374-0.573,2.331-3.079,3.21-4.225 c1.432-6.348-11.517-5.365-10.404,2.142C26.927,25.383,28.229,24.01,31.172,23.834z"></path><path d="M25.319,16.438c-0.352-2.656-4.29-3.405-5.391-0.833C19.121,17.486,24.844,22.779,25.319,16.438z"></path><path d="M23.945,31.992c-0.866,1.797-1.185,4.017-1.029,6.002c0.28,3.502,0.684,2.715,3.171,3.516 c1.354,0.423,3.613,1.705,5.039,1.484c2.91-0.476,1.569-1.322,1.022-3.354c-0.449-1.686-1.517-3.47-1.498-5.254 c0.026-2.454,2.097-4.127,1.855-6.647C30.586,22.167,25.02,29.726,23.945,31.992z"></path><path d="M13.366,25.019c1.302,0.553,1.784,2.786,3.027,3.105c1.087,0.267,2.312-1.309,4.102-1.022 c1.537,0.254,1.816,3.119,3.418,0.677c0.964-1.484,0.664-3.119,0.104-4.727c-3.281-3.197-7.409-4.844-11.589-2.708 c-0.872,0.449-4.453,1.445-2.799,2.956C11.367,24.882,11.881,24.387,13.366,25.019z"></path><path d="M52.259,2.773C50.13-1.082,39.557-1.368,41.595,4.804C42.91,8.782,52.969,7.675,52.259,2.773z"></path><path d="M12.845,26.803c-2.396,1.348-4.876,3.607-3.503,6.712c2.461,5.54,3.379,2.493,4.902-0.996 c0.417,2.317-0.091,4.739,2.351,5.898c2.649,1.243,3.737-0.078,4.017-2.78c0.189-1.784,1.387-6.289-0.957-6.862 c-1.673-0.397-3.561,2.467-5.137,2.904c0.267-0.794,0.41-1.758,0.833-2.48C14.876,28.04,13.854,27.454,12.845,26.803z"></path><path d="M40.176,17.089c0.508,2.454-2.838,5.963-4.037,7.793c0.97-0.449,0.931-0.098,1.693-0.859 c0.098,1.25,0.195,2.493,0.299,3.743c3.425-0.475,4.316,3.19,6.999-1.159c2.513-4.056-0.072-5.924-4.193-5.377 c0.794-2.331,2.956-0.163,3.49-2.708c0.527-2.494,0.514-5.039,1.028-7.533c-1.048-1.23-3.574-2.891-5.149-2.428 c-1.12,0.345-3.809,3.705-3.659,4.688C36.947,15.195,39.72,14.921,40.176,17.089z"></path><path d="M34.023,34.211c-2.474,3.418,0.912,3.457,2.201,4.916c1.341,1.51,0.866,3.62,2.624,3.939 c1.302,0.228,4.049,1.36,5.326,0.403c2.604-1.946-0.697-7.35-1.953-9.557C40.566,31.542,35.729,31.868,34.023,34.211z"></path><path d="M100,34.075c0-3.613-2.07-6.973-5.605-9.974c-1.491,0.983-3.093,1.842-4.739,2.532c2.291,1.719,3.574,3.613,3.574,5.612 c0,7.806-19.355,14.128-43.229,14.128c-23.874,0-43.229-6.322-43.229-14.128c0-2.201,1.614-4.291,4.388-6.152l-4.492-2.891 C2.455,26.406,0,30.11,0,34.075c0,0.215,0.013,0.437,0.026,0.651H0c0.326,8.444,2.943,17.298,7.259,25.579 c0,0,10.462,20.639,42.741,20.639c32.278,0,42.565-20.814,42.565-20.814c4.303-8.242,7.109-17.174,7.422-25.403h-0.014 C99.987,34.511,100,34.29,100,34.075z"></path><path d="M38.027,7.122c1.68-5.872-12.305-0.124-9.863,5.99C29.948,17.564,36.706,9.205,38.027,7.122z"></path></svg>

After

Width:  |  Height:  |  Size: 4.8 KiB

95
public/index.html Normal file
View File

@ -0,0 +1,95 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta name="generator" content="Hugo 0.117.0"><title>howdoicomputer &ndash; howdoicomputer</title>
<meta name="description" content="A dumping ground for ideas related to making, tomfoolery, and tomfoolery related to making">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="UTF-8"/>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.2/css/all.min.css" integrity="sha512-1sCRPdkRXhBV2PBLUdRb4tMg1w2YPf37qatUFeS7zlBy7jJI8Lf4VHwWfZZfpXtYSLy85pkm9GaYVYMfw5BC1A==" crossorigin="anonymous" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/academicons/1.9.1/css/academicons.min.css" integrity="sha512-b1ASx0WHgVFL5ZQhTgiPWX+68KjS38Jk87jg7pe+qC7q9YkEtFq0z7xCglv7qGIs/68d3mAp+StfC8WKC5SSAg==" crossorigin="anonymous" />
<link rel="stylesheet" href="https://howdoicomputer.lol/css/palettes/tokyo-night-dark.css">
<link rel="stylesheet" href="https://howdoicomputer.lol/css/risotto.css">
<link rel="stylesheet" href="https://howdoicomputer.lol/css/custom.css">
</head>
<body>
<div class="page">
<header class="page__header"><nav class="page__nav main-nav">
<ul>
<h1 class="page__logo"><a href="https://howdoicomputer.lol/" class="page__logo-inner">howdoicomputer</a></h1>
<li class="main-nav__item"><a class="nav-main-item" href="https://howdoicomputer.lol/about" title="">About</a></li>
<li class="main-nav__item"><a class="nav-main-item" href="https://howdoicomputer.lol/posts/" title="Posts">Posts</a></li>
</ul>
</nav>
</header>
<section class="page__body">
<ul class="contents">
<li><a href="https://howdoicomputer.lol/posts/">Posts</a>
<div>
</div>
</li>
</ul>
</section>
<section class="page__aside">
<div class="aside__about">
<div class="aside__about">
<h1 class="about__title">howdoicomputer&#39;s blog</h1>
<p class="about__description">A dumping ground for ideas related to making, tomfoolery, and tomfoolery related to making</p>
</div>
<ul class="aside__social-links">
</ul>
</div>
<hr>
<div class="aside__content">
</div>
</section>
<footer class="page__footer"><p>
</p>
<br /><br />
<p class="copyright"></p>
<p class="advertisement">Powered by <a href="https://gohugo.io/">hugo</a> and <a href="https://github.com/joeroe/risotto">risotto</a>.</p>
</footer>
</div>
</body>
</html>

31
public/index.xml Normal file
View File

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>howdoicomputer</title>
<link>https://howdoicomputer.lol/</link>
<description>Recent content on howdoicomputer</description>
<generator>Hugo -- gohugo.io</generator>
<language>en-us</language>
<lastBuildDate>Sun, 27 Aug 2023 18:36:47 -0700</lastBuildDate><atom:link href="https://howdoicomputer.lol/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Homelab: Part 1</title>
<link>https://howdoicomputer.lol/posts/homelab-1/</link>
<pubDate>Sun, 27 Aug 2023 18:36:47 -0700</pubDate>
<guid>https://howdoicomputer.lol/posts/homelab-1/</guid>
<description>First part of a multi-part series about my current homelab</description>
</item>
<item>
<title>About</title>
<link>https://howdoicomputer.lol/about/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>https://howdoicomputer.lol/about/</guid>
<description>the man behind the books I&amp;rsquo;m a thirty-something who has been working as some flavor of SRE/DevOps/systems engineer for a little over a decade.
books? Yeah, I love em.
but what else I enjoy biking, board games, table-top RPGs, 3D printing, video games, guitar, and bad jokes.</description>
</item>
</channel>
</rss>

10
public/page/1/index.html Normal file
View File

@ -0,0 +1,10 @@
<!DOCTYPE html>
<html lang="en-us">
<head>
<title>https://howdoicomputer.lol/</title>
<link rel="canonical" href="https://howdoicomputer.lol/">
<meta name="robots" content="noindex">
<meta charset="utf-8">
<meta http-equiv="refresh" content="0; url=https://howdoicomputer.lol/">
</head>
</html>

View File

@ -0,0 +1,230 @@
<!DOCTYPE html>
<html lang="en">
<head><title>Homelab: Part 1 &ndash; howdoicomputer</title>
<meta name="description" content="A dumping ground for ideas related to making, tomfoolery, and tomfoolery related to making">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="UTF-8"/>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.2/css/all.min.css" integrity="sha512-1sCRPdkRXhBV2PBLUdRb4tMg1w2YPf37qatUFeS7zlBy7jJI8Lf4VHwWfZZfpXtYSLy85pkm9GaYVYMfw5BC1A==" crossorigin="anonymous" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/academicons/1.9.1/css/academicons.min.css" integrity="sha512-b1ASx0WHgVFL5ZQhTgiPWX+68KjS38Jk87jg7pe+qC7q9YkEtFq0z7xCglv7qGIs/68d3mAp+StfC8WKC5SSAg==" crossorigin="anonymous" />
<link rel="stylesheet" href="https://howdoicomputer.lol/css/palettes/tokyo-night-dark.css">
<link rel="stylesheet" href="https://howdoicomputer.lol/css/risotto.css">
<link rel="stylesheet" href="https://howdoicomputer.lol/css/custom.css">
</head>
<body>
<div class="page">
<header class="page__header"><nav class="page__nav main-nav">
<ul>
<h1 class="page__logo"><a href="https://howdoicomputer.lol/" class="page__logo-inner">howdoicomputer</a></h1>
<li class="main-nav__item"><a class="nav-main-item" href="https://howdoicomputer.lol/about" title="">About</a></li>
<li class="main-nav__item"><a class="nav-main-item active" href="https://howdoicomputer.lol/posts/" title="Posts">Posts</a></li>
</ul>
</nav>
</header>
<section class="page__body">
<header class="content__header">
<h1>Homelab: Part 1</h1>
</header>
<div class="content__body">
<p>This blog. The one that you are currently reading right now. Is running on a metal box that is just barely large enough to fit the average house cat. It cost ~$800 USD to build and has been christened Megamind. The HTTP request that you initiated when you visited <a href="https://blog.howdoicomputer.lol">https://blog.howdoicomputer.lol</a> has returned digital bits from hardware that is more than likely a couple feet from where I&rsquo;m sitting. Welcome!</p>
<h3 id="yeah-but-why">yeah, but why</h3>
<p>I like solving problems and these were mine:</p>
<ul>
<li>I have a plethora of software projects that I&rsquo;ve written that need a home. Discord bots, daemons, websites, etc.</li>
<li>I needed a place to host a blog. Hi!</li>
<li>I want to replace the myriad online software services that I&rsquo;m subscribed to. Spotify, Netflix, etc.</li>
<li>I want an experimentation platform that I could use to learn new technologies or try new ideas.</li>
</ul>
<p>I wanted to build a self-hosted platform with logging, metric collection, service discovery, orchestration, etc; <a href="https://fly.io/">fly.io</a> in a box, if you will.</p>
<p>Also, I love making things. Making things is fun.</p>
<h3 id="okay-but-how">okay, but how</h3>
<p><img src="/homelab.jpg" alt="homelab"></p>
<p>If you go on the /r/homelab subreddit and sort by the most popular posts then you&rsquo;ll see setups that involve quite a bit more hardware than what my homelab currently sports. I don&rsquo;t have a full metal rack with multiple blades and switches. There are no neatly braided corridors of ethernet cabling. My homelab is a box that is filled with consumer grade hardware that sprouts a single cable that snakes to my off-the-shelf, eight year old consumer router.</p>
<p>Currently, that box is outfitted with:</p>
<ul>
<li>Ryzen 5600X</li>
<li>64 GB of non-ECC memory</li>
<li>Intel Arc GPU</li>
<li>Two WD Red 12TB drives</li>
</ul>
<p>The hardware isn&rsquo;t the interesting part, however. The interesting part is what runs <em>inside</em> the computer. It&rsquo;s essentially a Platform as a Service (PaaS) solution in a box and I love it.</p>
<h3 id="nomad-and-nix-and-zfs-oh-my">nomad and nix and zfs oh my</h3>
<p>Here are some features of my homelab:</p>
<ul>
<li>Nomad is the container orchestrator</li>
<li>A ZFS mirrored pool for data redundancy</li>
<li>Consul exists as a service mesh</li>
<li>Vault exists for secret storage</li>
<li>Traefik is for ingress</li>
<li>Prometheus for monitoring and Grafana for dashboards</li>
<li>The operating system is NixOS and I use my laptop to do flake based deployments to the underlying OS</li>
</ul>
<p>A secret that I&rsquo;ve withheld from you so far is that Megamind isn&rsquo;t my first homelab. A previous homelab that I built was a k3s cluster running on top of Raspbery Pis. It was quaint but got decommissioned when I moved apartments. I never set it up again and it currently lies in pieces in a drawer somewhere.</p>
<p>So why Nomad? Mostly because, at the time, I was leading an infrastructure initiative at my day job to use Nomad to orchestrate applications that are deployed to heterogenous IoT devices spread across distinct geographic regions. I wanted to dog food my own proposal. Also, Nomad is <em>a lot</em> simpler to use than Kubernetes. Nomad starts as <em>just</em> an orchestrator but gives you the option to introduce complexity later on through Vault and Consul. Every concept is almost immediately grokable and it has just been a pleasure to work with.</p>
<h3 id="whats-runnin">what&rsquo;s runnin</h3>
<p>Here is what is running so far:</p>
<ul>
<li>Jellyfin (movies, TV shows, etc)</li>
<li>Gitea (Git server and Docker registry)</li>
<li>Factorio server</li>
<li>FoundryVTT</li>
<li>Dufs (a UI for uploading files to the server)</li>
<li>Calibre Web (my library of ebooks)</li>
<li>Navidrome (music server)</li>
<li>Grafana and Prometheus</li>
<li>A Discord bot for looking up books</li>
<li>An Elixir/Phoenix application that I&rsquo;m working on</li>
</ul>
<h3 id="internal-paas">internal paas</h3>
<p>I write code. I like writing code. Sometimes that code becomes semi-functional pieces of software that I need to deploy. Previously, I used <a href="fly.io">fly.io</a> to host applications but have now moved those applications to my homelab.</p>
<p>Here is how they are developed and deployed:</p>
<ul>
<li>Each application has a <code>ci/</code> directory that contains a <a href="https://dagger.io/">Dagger</a> pipeline for testing the application and building a docker image. This is local for now.</li>
<li>The docker image is uploaded to <code>git.howdoicomputer.lol</code>. What is behind that domain is a Gitea instance that serves as a git host and a docker registry.</li>
<li>That application also has a <code>deploy/</code> directory that contains a <code>job.nomad</code> file. That Nomad job definition specifies the docker image that exists in Gitea and is used for the job allocation.</li>
<li>If the application has a <code>/metrics</code> endpoint, then Prometheus will be updated to scrape that endpoint and collect those metrics. This is powered by Consul.</li>
<li>If the application needs secrets then they are fetched from Vault.</li>
<li>Traefik and Consul Registry tags are used to define the ingress for the application. Most services are behind a subdomain on the <code>howdoicomputer.lol</code> domain and Traefik is what maps those subdomains to running services. If the service is not ready for production, then an IP whitelist is used to make sure that only ingress from my Tailscale VPN is allowed to access the site.</li>
<li>Logs are displayed through the Nomad web dashboard.</li>
<li>Traefik manages Let&rsquo;s Encrypt SSL certs through the DNS challenge method.</li>
</ul>
<p>This blog is developed similarily. It&rsquo;s <a href="https://gohugo.io/">Hugo</a> based so posts are markdown files that get converted into HTML files. A Dagger pipeline executes Hugo to get those files and then builds the container image - which runs Nginx - and then uploads that image to Gitea. There is a job definition in the blog&rsquo;s repo that deploys that application to Nomad.</p>
<p><img src="/blog_nomad_job.png" alt="blog_nomad_job"></p>
<p>Here is the job file for the blog:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-hcl" data-lang="hcl"><span style="display:flex;"><span><span style="color:#66d9ef">job</span> <span style="color:#e6db74">&#34;blog&#34;</span> {
</span></span><span style="display:flex;"><span> type <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;service&#34;</span>
</span></span><span style="display:flex;"><span> datacenters <span style="color:#f92672">=</span> [<span style="color:#e6db74">&#34;dc1&#34;</span>]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">group</span> <span style="color:#e6db74">&#34;blog&#34;</span> {
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">network</span> {
</span></span><span style="display:flex;"><span> mode <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;bridge&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">port</span> <span style="color:#e6db74">&#34;http&#34;</span> {
</span></span><span style="display:flex;"><span> to <span style="color:#f92672">=</span> <span style="color:#ae81ff">80</span>
</span></span><span style="display:flex;"><span> }
</span></span><span style="display:flex;"><span> }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">service</span> {
</span></span><span style="display:flex;"><span> name <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;blog&#34;</span>
</span></span><span style="display:flex;"><span> port <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;http&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> tags <span style="color:#f92672">=</span> [
</span></span><span style="display:flex;"><span> &#34;traefik.enable<span style="color:#f92672">=</span><span style="color:#66d9ef">true</span><span style="color:#960050;background-color:#1e0010">&#34;</span>,
</span></span><span style="display:flex;"><span> &#34;traefik.http.routers.blog-https.tls<span style="color:#f92672">=</span><span style="color:#66d9ef">true</span><span style="color:#960050;background-color:#1e0010">&#34;</span>,
</span></span><span style="display:flex;"><span> &#34;traefik.http.routers.blog-https.rule<span style="color:#f92672">=</span><span style="color:#66d9ef">Host</span>(<span style="color:#960050;background-color:#1e0010">`</span><span style="color:#66d9ef">blog</span>.<span style="color:#66d9ef">howdoicomputer</span>.<span style="color:#66d9ef">lol</span><span style="color:#960050;background-color:#1e0010">`</span>)<span style="color:#960050;background-color:#1e0010">&#34;</span>,
</span></span><span style="display:flex;"><span> &#34;traefik.http.routers.blog-https.tls.certresolver<span style="color:#f92672">=</span><span style="color:#66d9ef">resolver</span><span style="color:#960050;background-color:#1e0010">&#34;</span>,
</span></span><span style="display:flex;"><span> &#34;traefik.http.routers.blog-https.tls.domains[0].main<span style="color:#f92672">=</span><span style="color:#66d9ef">blog</span>.<span style="color:#66d9ef">howdoicomputer</span>.<span style="color:#66d9ef">lol</span><span style="color:#960050;background-color:#1e0010">&#34;</span>,
</span></span><span style="display:flex;"><span> &#34;traefik.http.routers.blog-https.entrypoints<span style="color:#f92672">=</span><span style="color:#66d9ef">websecure</span><span style="color:#960050;background-color:#1e0010">&#34;</span>,
</span></span><span style="display:flex;"><span> &#34;traefik.http.routers.blog-http.entrypoints<span style="color:#f92672">=</span><span style="color:#66d9ef">web</span><span style="color:#960050;background-color:#1e0010">&#34;</span>,
</span></span><span style="display:flex;"><span> &#34;traefik.http.routers.blog-http.rule<span style="color:#f92672">=</span><span style="color:#66d9ef">Host</span>(<span style="color:#960050;background-color:#1e0010">`</span><span style="color:#66d9ef">blog</span>.<span style="color:#66d9ef">howdoicomputer</span>.<span style="color:#66d9ef">lol</span><span style="color:#960050;background-color:#1e0010">`</span>)<span style="color:#960050;background-color:#1e0010">&#34;</span>,
</span></span><span style="display:flex;"><span> &#34;traefik.http.routers.blog-http.middlewares<span style="color:#f92672">=</span><span style="color:#66d9ef">redirecthttps</span><span style="color:#960050;background-color:#1e0010">&#34;</span>,
</span></span><span style="display:flex;"><span> &#34;traefik.http.middlewares.redirecthttps.redirectscheme.scheme<span style="color:#f92672">=</span><span style="color:#66d9ef">https</span><span style="color:#960050;background-color:#1e0010">&#34;</span>
</span></span><span style="display:flex;"><span> ]
</span></span><span style="display:flex;"><span> }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">task</span> <span style="color:#e6db74">&#34;blog&#34;</span> {
</span></span><span style="display:flex;"><span> driver <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;docker&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">config</span> {
</span></span><span style="display:flex;"><span> image <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;git.howdoicomputer.lol/howdoicomputer/blog:2&#34;</span>
</span></span><span style="display:flex;"><span> ports <span style="color:#f92672">=</span> [<span style="color:#e6db74">&#34;http&#34;</span>]
</span></span><span style="display:flex;"><span> }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> <span style="color:#66d9ef">resources</span> {
</span></span><span style="display:flex;"><span> cpu <span style="color:#f92672">=</span> <span style="color:#ae81ff">500</span>
</span></span><span style="display:flex;"><span> memory <span style="color:#f92672">=</span> <span style="color:#ae81ff">200</span>
</span></span><span style="display:flex;"><span> }
</span></span><span style="display:flex;"><span> }
</span></span><span style="display:flex;"><span> }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h3 id="nix">nix</h3>
<p>The OS is configured remotely using <a href="https://github.com/serokell/deploy-rs">deploy-rs</a> - a Rust based CLI that allows you to apply a Nix flake to a specific host. This is what I&rsquo;ve replaced Ansible with. Nix is&hellip; okay. I&rsquo;ll review Nix later but one cool feature to note here is that deploy-rs will apply a Nix configuration and if the SSH connection is broken then the previous Nix state would be rolled back to on the host.</p>
<p>What Nix currently owns:</p>
<ul>
<li>The installation of Nomad, Consul, Vault and other packages on the host.</li>
<li>The creation of the HashiStack configuration files.</li>
<li>The ZFS pool.</li>
<li>Firewall rules.</li>
<li>User creation.</li>
<li>Kernel parameters.</li>
</ul>
<p>I do really like the immutability of Nix. Something I want to explore down the line is either <a href="https://nixos.wiki/wiki/Impermanence">impermanence</a> or baking an OS image and continuously reimagining the homelab server through PXE.</p>
<h3 id="the-future">the future</h3>
<p>The future is bright! It has been incredibly fluid to roll out new services to the server. There are two additional features that I want: a CI/CD solution and an auth model for friends who want to use services.</p>
<p>For CI/CD, I&rsquo;ll most likely go with <a href="https://www.drone.io/">Drone</a>. Really, I just want a UI for Dagger pipelines. For an auth model, eh, I am not sure. LDAP? There is also the possiblity of using Oauth2 and whitelisting accounts.</p>
<p>I also want to do a thorough lockdown of Gitea so that I can expose my code to the world.</p>
<p>Till next time.</p>
</div>
<footer class="content__footer"></footer>
</section>
<section class="page__aside">
<div class="aside__about">
<div class="aside__about">
<h1 class="about__title">howdoicomputer&#39;s blog</h1>
<p class="about__description">A dumping ground for ideas related to making, tomfoolery, and tomfoolery related to making</p>
</div>
<ul class="aside__social-links">
</ul>
</div>
<hr>
<div class="aside__content">
<p>
2023-08-27
</p>
</div>
</section>
<footer class="page__footer"><p>
</p>
<br /><br />
<p class="copyright"></p>
<p class="advertisement">Powered by <a href="https://gohugo.io/">hugo</a> and <a href="https://github.com/joeroe/risotto">risotto</a>.</p>
</footer>
</div>
</body>
</html>

2661
public/posts/images/cat.jpg Normal file

File diff suppressed because one or more lines are too long

97
public/posts/index.html Normal file
View File

@ -0,0 +1,97 @@
<!DOCTYPE html>
<html lang="en">
<head><title>Posts &ndash; howdoicomputer</title>
<meta name="description" content="A dumping ground for ideas related to making, tomfoolery, and tomfoolery related to making">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="UTF-8"/>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.2/css/all.min.css" integrity="sha512-1sCRPdkRXhBV2PBLUdRb4tMg1w2YPf37qatUFeS7zlBy7jJI8Lf4VHwWfZZfpXtYSLy85pkm9GaYVYMfw5BC1A==" crossorigin="anonymous" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/academicons/1.9.1/css/academicons.min.css" integrity="sha512-b1ASx0WHgVFL5ZQhTgiPWX+68KjS38Jk87jg7pe+qC7q9YkEtFq0z7xCglv7qGIs/68d3mAp+StfC8WKC5SSAg==" crossorigin="anonymous" />
<link rel="stylesheet" href="https://howdoicomputer.lol/css/palettes/tokyo-night-dark.css">
<link rel="stylesheet" href="https://howdoicomputer.lol/css/risotto.css">
<link rel="stylesheet" href="https://howdoicomputer.lol/css/custom.css">
</head>
<body>
<div class="page">
<header class="page__header"><nav class="page__nav main-nav">
<ul>
<h1 class="page__logo"><a href="https://howdoicomputer.lol/" class="page__logo-inner">howdoicomputer</a></h1>
<li class="main-nav__item"><a class="nav-main-item" href="https://howdoicomputer.lol/about" title="">About</a></li>
<li class="main-nav__item"><a class="nav-main-item active" href="https://howdoicomputer.lol/posts/" title="Posts">Posts</a></li>
</ul>
</nav>
</header>
<section class="page__body">
<h1 id="posts">Posts</h1>
<ul>
<li><a href="https://howdoicomputer.lol/posts/homelab-1/">Homelab: Part 1</a></li>
</ul>
</section>
<section class="page__aside">
<div class="aside__about">
<div class="aside__about">
<h1 class="about__title">howdoicomputer&#39;s blog</h1>
<p class="about__description">A dumping ground for ideas related to making, tomfoolery, and tomfoolery related to making</p>
</div>
<ul class="aside__social-links">
</ul>
</div>
<hr>
<div class="aside__content">
</div>
</section>
<footer class="page__footer"><p>
</p>
<br /><br />
<p class="copyright"></p>
<p class="advertisement">Powered by <a href="https://gohugo.io/">hugo</a> and <a href="https://github.com/joeroe/risotto">risotto</a>.</p>
</footer>
</div>
</body>
</html>

20
public/posts/index.xml Normal file
View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Posts on howdoicomputer</title>
<link>https://howdoicomputer.lol/posts/</link>
<description>Recent content in Posts on howdoicomputer</description>
<generator>Hugo -- gohugo.io</generator>
<language>en-us</language>
<lastBuildDate>Sun, 27 Aug 2023 18:36:47 -0700</lastBuildDate><atom:link href="https://howdoicomputer.lol/posts/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Homelab: Part 1</title>
<link>https://howdoicomputer.lol/posts/homelab-1/</link>
<pubDate>Sun, 27 Aug 2023 18:36:47 -0700</pubDate>
<guid>https://howdoicomputer.lol/posts/homelab-1/</guid>
<description>First part of a multi-part series about my current homelab</description>
</item>
</channel>
</rss>

33
public/sitemap.xml Normal file
View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<url>
<loc>https://howdoicomputer.lol/tags/consul/</loc>
<lastmod>2023-08-27T18:36:47-07:00</lastmod>
</url><url>
<loc>https://howdoicomputer.lol/tags/homelab/</loc>
<lastmod>2023-08-27T18:36:47-07:00</lastmod>
</url><url>
<loc>https://howdoicomputer.lol/posts/homelab-1/</loc>
<lastmod>2023-08-27T18:36:47-07:00</lastmod>
</url><url>
<loc>https://howdoicomputer.lol/</loc>
<lastmod>2023-08-27T18:36:47-07:00</lastmod>
</url><url>
<loc>https://howdoicomputer.lol/tags/nix/</loc>
<lastmod>2023-08-27T18:36:47-07:00</lastmod>
</url><url>
<loc>https://howdoicomputer.lol/tags/nomad/</loc>
<lastmod>2023-08-27T18:36:47-07:00</lastmod>
</url><url>
<loc>https://howdoicomputer.lol/posts/</loc>
<lastmod>2023-08-27T18:36:47-07:00</lastmod>
</url><url>
<loc>https://howdoicomputer.lol/tags/</loc>
<lastmod>2023-08-27T18:36:47-07:00</lastmod>
</url><url>
<loc>https://howdoicomputer.lol/about/</loc>
</url><url>
<loc>https://howdoicomputer.lol/categories/</loc>
</url>
</urlset>

View File

@ -0,0 +1,95 @@
<!DOCTYPE html>
<html lang="en">
<head><title>Consul &ndash; howdoicomputer</title>
<meta name="description" content="A dumping ground for ideas related to making, tomfoolery, and tomfoolery related to making">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="UTF-8"/>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.2/css/all.min.css" integrity="sha512-1sCRPdkRXhBV2PBLUdRb4tMg1w2YPf37qatUFeS7zlBy7jJI8Lf4VHwWfZZfpXtYSLy85pkm9GaYVYMfw5BC1A==" crossorigin="anonymous" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/academicons/1.9.1/css/academicons.min.css" integrity="sha512-b1ASx0WHgVFL5ZQhTgiPWX+68KjS38Jk87jg7pe+qC7q9YkEtFq0z7xCglv7qGIs/68d3mAp+StfC8WKC5SSAg==" crossorigin="anonymous" />
<link rel="stylesheet" href="https://howdoicomputer.lol/css/palettes/tokyo-night-dark.css">
<link rel="stylesheet" href="https://howdoicomputer.lol/css/risotto.css">
<link rel="stylesheet" href="https://howdoicomputer.lol/css/custom.css">
</head>
<body>
<div class="page">
<header class="page__header"><nav class="page__nav main-nav">
<ul>
<h1 class="page__logo"><a href="https://howdoicomputer.lol/" class="page__logo-inner">howdoicomputer</a></h1>
<li class="main-nav__item"><a class="nav-main-item" href="https://howdoicomputer.lol/about" title="">About</a></li>
<li class="main-nav__item"><a class="nav-main-item" href="https://howdoicomputer.lol/posts/" title="Posts">Posts</a></li>
</ul>
</nav>
</header>
<section class="page__body">
<h1 id="consul">Consul</h1>
<ul>
<li><a href="https://howdoicomputer.lol/posts/homelab-1/">Homelab: Part 1</a></li>
</ul>
</section>
<section class="page__aside">
<div class="aside__about">
<div class="aside__about">
<h1 class="about__title">howdoicomputer&#39;s blog</h1>
<p class="about__description">A dumping ground for ideas related to making, tomfoolery, and tomfoolery related to making</p>
</div>
<ul class="aside__social-links">
</ul>
</div>
<hr>
<div class="aside__content">
</div>
</section>
<footer class="page__footer"><p>
</p>
<br /><br />
<p class="copyright"></p>
<p class="advertisement">Powered by <a href="https://gohugo.io/">hugo</a> and <a href="https://github.com/joeroe/risotto">risotto</a>.</p>
</footer>
</div>
</body>
</html>

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Consul on howdoicomputer</title>
<link>https://howdoicomputer.lol/tags/consul/</link>
<description>Recent content in Consul on howdoicomputer</description>
<generator>Hugo -- gohugo.io</generator>
<language>en-us</language>
<lastBuildDate>Sun, 27 Aug 2023 18:36:47 -0700</lastBuildDate><atom:link href="https://howdoicomputer.lol/tags/consul/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Homelab: Part 1</title>
<link>https://howdoicomputer.lol/posts/homelab-1/</link>
<pubDate>Sun, 27 Aug 2023 18:36:47 -0700</pubDate>
<guid>https://howdoicomputer.lol/posts/homelab-1/</guid>
<description>First part of a multi-part series about my current homelab</description>
</item>
</channel>
</rss>

View File

@ -0,0 +1,95 @@
<!DOCTYPE html>
<html lang="en">
<head><title>Homelab &ndash; howdoicomputer</title>
<meta name="description" content="A dumping ground for ideas related to making, tomfoolery, and tomfoolery related to making">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="UTF-8"/>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.2/css/all.min.css" integrity="sha512-1sCRPdkRXhBV2PBLUdRb4tMg1w2YPf37qatUFeS7zlBy7jJI8Lf4VHwWfZZfpXtYSLy85pkm9GaYVYMfw5BC1A==" crossorigin="anonymous" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/academicons/1.9.1/css/academicons.min.css" integrity="sha512-b1ASx0WHgVFL5ZQhTgiPWX+68KjS38Jk87jg7pe+qC7q9YkEtFq0z7xCglv7qGIs/68d3mAp+StfC8WKC5SSAg==" crossorigin="anonymous" />
<link rel="stylesheet" href="https://howdoicomputer.lol/css/palettes/tokyo-night-dark.css">
<link rel="stylesheet" href="https://howdoicomputer.lol/css/risotto.css">
<link rel="stylesheet" href="https://howdoicomputer.lol/css/custom.css">
</head>
<body>
<div class="page">
<header class="page__header"><nav class="page__nav main-nav">
<ul>
<h1 class="page__logo"><a href="https://howdoicomputer.lol/" class="page__logo-inner">howdoicomputer</a></h1>
<li class="main-nav__item"><a class="nav-main-item" href="https://howdoicomputer.lol/about" title="">About</a></li>
<li class="main-nav__item"><a class="nav-main-item" href="https://howdoicomputer.lol/posts/" title="Posts">Posts</a></li>
</ul>
</nav>
</header>
<section class="page__body">
<h1 id="homelab">Homelab</h1>
<ul>
<li><a href="https://howdoicomputer.lol/posts/homelab-1/">Homelab: Part 1</a></li>
</ul>
</section>
<section class="page__aside">
<div class="aside__about">
<div class="aside__about">
<h1 class="about__title">howdoicomputer&#39;s blog</h1>
<p class="about__description">A dumping ground for ideas related to making, tomfoolery, and tomfoolery related to making</p>
</div>
<ul class="aside__social-links">
</ul>
</div>
<hr>
<div class="aside__content">
</div>
</section>
<footer class="page__footer"><p>
</p>
<br /><br />
<p class="copyright"></p>
<p class="advertisement">Powered by <a href="https://gohugo.io/">hugo</a> and <a href="https://github.com/joeroe/risotto">risotto</a>.</p>
</footer>
</div>
</body>
</html>

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Homelab on howdoicomputer</title>
<link>https://howdoicomputer.lol/tags/homelab/</link>
<description>Recent content in Homelab on howdoicomputer</description>
<generator>Hugo -- gohugo.io</generator>
<language>en-us</language>
<lastBuildDate>Sun, 27 Aug 2023 18:36:47 -0700</lastBuildDate><atom:link href="https://howdoicomputer.lol/tags/homelab/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Homelab: Part 1</title>
<link>https://howdoicomputer.lol/posts/homelab-1/</link>
<pubDate>Sun, 27 Aug 2023 18:36:47 -0700</pubDate>
<guid>https://howdoicomputer.lol/posts/homelab-1/</guid>
<description>First part of a multi-part series about my current homelab</description>
</item>
</channel>
</rss>

104
public/tags/index.html Normal file
View File

@ -0,0 +1,104 @@
<!DOCTYPE html>
<html lang="en">
<head><title>Tags &ndash; howdoicomputer</title>
<meta name="description" content="A dumping ground for ideas related to making, tomfoolery, and tomfoolery related to making">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="UTF-8"/>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.2/css/all.min.css" integrity="sha512-1sCRPdkRXhBV2PBLUdRb4tMg1w2YPf37qatUFeS7zlBy7jJI8Lf4VHwWfZZfpXtYSLy85pkm9GaYVYMfw5BC1A==" crossorigin="anonymous" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/academicons/1.9.1/css/academicons.min.css" integrity="sha512-b1ASx0WHgVFL5ZQhTgiPWX+68KjS38Jk87jg7pe+qC7q9YkEtFq0z7xCglv7qGIs/68d3mAp+StfC8WKC5SSAg==" crossorigin="anonymous" />
<link rel="stylesheet" href="https://howdoicomputer.lol/css/palettes/tokyo-night-dark.css">
<link rel="stylesheet" href="https://howdoicomputer.lol/css/risotto.css">
<link rel="stylesheet" href="https://howdoicomputer.lol/css/custom.css">
</head>
<body>
<div class="page">
<header class="page__header"><nav class="page__nav main-nav">
<ul>
<h1 class="page__logo"><a href="https://howdoicomputer.lol/" class="page__logo-inner">howdoicomputer</a></h1>
<li class="main-nav__item"><a class="nav-main-item" href="https://howdoicomputer.lol/about" title="">About</a></li>
<li class="main-nav__item"><a class="nav-main-item" href="https://howdoicomputer.lol/posts/" title="Posts">Posts</a></li>
</ul>
</nav>
</header>
<section class="page__body">
<h1 id="tags">Tags</h1>
<ul>
<li><a href="https://howdoicomputer.lol/tags/consul/">Consul</a></li>
<li><a href="https://howdoicomputer.lol/tags/homelab/">Homelab</a></li>
<li><a href="https://howdoicomputer.lol/tags/nix/">Nix</a></li>
<li><a href="https://howdoicomputer.lol/tags/nomad/">Nomad</a></li>
</ul>
</section>
<section class="page__aside">
<div class="aside__about">
<div class="aside__about">
<h1 class="about__title">howdoicomputer&#39;s blog</h1>
<p class="about__description">A dumping ground for ideas related to making, tomfoolery, and tomfoolery related to making</p>
</div>
<ul class="aside__social-links">
</ul>
</div>
<hr>
<div class="aside__content">
</div>
</section>
<footer class="page__footer"><p>
</p>
<br /><br />
<p class="copyright"></p>
<p class="advertisement">Powered by <a href="https://gohugo.io/">hugo</a> and <a href="https://github.com/joeroe/risotto">risotto</a>.</p>
</footer>
</div>
</body>
</html>

47
public/tags/index.xml Normal file
View File

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Tags on howdoicomputer</title>
<link>https://howdoicomputer.lol/tags/</link>
<description>Recent content in Tags on howdoicomputer</description>
<generator>Hugo -- gohugo.io</generator>
<language>en-us</language>
<lastBuildDate>Sun, 27 Aug 2023 18:36:47 -0700</lastBuildDate><atom:link href="https://howdoicomputer.lol/tags/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Consul</title>
<link>https://howdoicomputer.lol/tags/consul/</link>
<pubDate>Sun, 27 Aug 2023 18:36:47 -0700</pubDate>
<guid>https://howdoicomputer.lol/tags/consul/</guid>
<description></description>
</item>
<item>
<title>Homelab</title>
<link>https://howdoicomputer.lol/tags/homelab/</link>
<pubDate>Sun, 27 Aug 2023 18:36:47 -0700</pubDate>
<guid>https://howdoicomputer.lol/tags/homelab/</guid>
<description></description>
</item>
<item>
<title>Nix</title>
<link>https://howdoicomputer.lol/tags/nix/</link>
<pubDate>Sun, 27 Aug 2023 18:36:47 -0700</pubDate>
<guid>https://howdoicomputer.lol/tags/nix/</guid>
<description></description>
</item>
<item>
<title>Nomad</title>
<link>https://howdoicomputer.lol/tags/nomad/</link>
<pubDate>Sun, 27 Aug 2023 18:36:47 -0700</pubDate>
<guid>https://howdoicomputer.lol/tags/nomad/</guid>
<description></description>
</item>
</channel>
</rss>

View File

@ -0,0 +1,95 @@
<!DOCTYPE html>
<html lang="en">
<head><title>Nix &ndash; howdoicomputer</title>
<meta name="description" content="A dumping ground for ideas related to making, tomfoolery, and tomfoolery related to making">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="UTF-8"/>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.2/css/all.min.css" integrity="sha512-1sCRPdkRXhBV2PBLUdRb4tMg1w2YPf37qatUFeS7zlBy7jJI8Lf4VHwWfZZfpXtYSLy85pkm9GaYVYMfw5BC1A==" crossorigin="anonymous" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/academicons/1.9.1/css/academicons.min.css" integrity="sha512-b1ASx0WHgVFL5ZQhTgiPWX+68KjS38Jk87jg7pe+qC7q9YkEtFq0z7xCglv7qGIs/68d3mAp+StfC8WKC5SSAg==" crossorigin="anonymous" />
<link rel="stylesheet" href="https://howdoicomputer.lol/css/palettes/tokyo-night-dark.css">
<link rel="stylesheet" href="https://howdoicomputer.lol/css/risotto.css">
<link rel="stylesheet" href="https://howdoicomputer.lol/css/custom.css">
</head>
<body>
<div class="page">
<header class="page__header"><nav class="page__nav main-nav">
<ul>
<h1 class="page__logo"><a href="https://howdoicomputer.lol/" class="page__logo-inner">howdoicomputer</a></h1>
<li class="main-nav__item"><a class="nav-main-item" href="https://howdoicomputer.lol/about" title="">About</a></li>
<li class="main-nav__item"><a class="nav-main-item" href="https://howdoicomputer.lol/posts/" title="Posts">Posts</a></li>
</ul>
</nav>
</header>
<section class="page__body">
<h1 id="nix">Nix</h1>
<ul>
<li><a href="https://howdoicomputer.lol/posts/homelab-1/">Homelab: Part 1</a></li>
</ul>
</section>
<section class="page__aside">
<div class="aside__about">
<div class="aside__about">
<h1 class="about__title">howdoicomputer&#39;s blog</h1>
<p class="about__description">A dumping ground for ideas related to making, tomfoolery, and tomfoolery related to making</p>
</div>
<ul class="aside__social-links">
</ul>
</div>
<hr>
<div class="aside__content">
</div>
</section>
<footer class="page__footer"><p>
</p>
<br /><br />
<p class="copyright"></p>
<p class="advertisement">Powered by <a href="https://gohugo.io/">hugo</a> and <a href="https://github.com/joeroe/risotto">risotto</a>.</p>
</footer>
</div>
</body>
</html>

20
public/tags/nix/index.xml Normal file
View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Nix on howdoicomputer</title>
<link>https://howdoicomputer.lol/tags/nix/</link>
<description>Recent content in Nix on howdoicomputer</description>
<generator>Hugo -- gohugo.io</generator>
<language>en-us</language>
<lastBuildDate>Sun, 27 Aug 2023 18:36:47 -0700</lastBuildDate><atom:link href="https://howdoicomputer.lol/tags/nix/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Homelab: Part 1</title>
<link>https://howdoicomputer.lol/posts/homelab-1/</link>
<pubDate>Sun, 27 Aug 2023 18:36:47 -0700</pubDate>
<guid>https://howdoicomputer.lol/posts/homelab-1/</guid>
<description>First part of a multi-part series about my current homelab</description>
</item>
</channel>
</rss>

View File

@ -0,0 +1,95 @@
<!DOCTYPE html>
<html lang="en">
<head><title>Nomad &ndash; howdoicomputer</title>
<meta name="description" content="A dumping ground for ideas related to making, tomfoolery, and tomfoolery related to making">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="UTF-8"/>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.2/css/all.min.css" integrity="sha512-1sCRPdkRXhBV2PBLUdRb4tMg1w2YPf37qatUFeS7zlBy7jJI8Lf4VHwWfZZfpXtYSLy85pkm9GaYVYMfw5BC1A==" crossorigin="anonymous" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/academicons/1.9.1/css/academicons.min.css" integrity="sha512-b1ASx0WHgVFL5ZQhTgiPWX+68KjS38Jk87jg7pe+qC7q9YkEtFq0z7xCglv7qGIs/68d3mAp+StfC8WKC5SSAg==" crossorigin="anonymous" />
<link rel="stylesheet" href="https://howdoicomputer.lol/css/palettes/tokyo-night-dark.css">
<link rel="stylesheet" href="https://howdoicomputer.lol/css/risotto.css">
<link rel="stylesheet" href="https://howdoicomputer.lol/css/custom.css">
</head>
<body>
<div class="page">
<header class="page__header"><nav class="page__nav main-nav">
<ul>
<h1 class="page__logo"><a href="https://howdoicomputer.lol/" class="page__logo-inner">howdoicomputer</a></h1>
<li class="main-nav__item"><a class="nav-main-item" href="https://howdoicomputer.lol/about" title="">About</a></li>
<li class="main-nav__item"><a class="nav-main-item" href="https://howdoicomputer.lol/posts/" title="Posts">Posts</a></li>
</ul>
</nav>
</header>
<section class="page__body">
<h1 id="nomad">Nomad</h1>
<ul>
<li><a href="https://howdoicomputer.lol/posts/homelab-1/">Homelab: Part 1</a></li>
</ul>
</section>
<section class="page__aside">
<div class="aside__about">
<div class="aside__about">
<h1 class="about__title">howdoicomputer&#39;s blog</h1>
<p class="about__description">A dumping ground for ideas related to making, tomfoolery, and tomfoolery related to making</p>
</div>
<ul class="aside__social-links">
</ul>
</div>
<hr>
<div class="aside__content">
</div>
</section>
<footer class="page__footer"><p>
</p>
<br /><br />
<p class="copyright"></p>
<p class="advertisement">Powered by <a href="https://gohugo.io/">hugo</a> and <a href="https://github.com/joeroe/risotto">risotto</a>.</p>
</footer>
</div>
</body>
</html>

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Nomad on howdoicomputer</title>
<link>https://howdoicomputer.lol/tags/nomad/</link>
<description>Recent content in Nomad on howdoicomputer</description>
<generator>Hugo -- gohugo.io</generator>
<language>en-us</language>
<lastBuildDate>Sun, 27 Aug 2023 18:36:47 -0700</lastBuildDate><atom:link href="https://howdoicomputer.lol/tags/nomad/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Homelab: Part 1</title>
<link>https://howdoicomputer.lol/posts/homelab-1/</link>
<pubDate>Sun, 27 Aug 2023 18:36:47 -0700</pubDate>
<guid>https://howdoicomputer.lol/posts/homelab-1/</guid>
<description>First part of a multi-part series about my current homelab</description>
</item>
</channel>
</rss>

BIN
static/blog_nomad_job.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

BIN
static/homelab.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB