Get started on my own blog
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
public/
|
||||
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
[submodule "themes/radion"]
|
||||
path = themes/radion
|
||||
url = https://github.com/micahkepe/radion.git
|
||||
9
Dockerfile
Normal file
9
Dockerfile
Normal file
@@ -0,0 +1,9 @@
|
||||
FROM ghcr.io/getzola/zola:v0.22.1 as zola
|
||||
|
||||
COPY . /project
|
||||
WORKDIR /project
|
||||
RUN ["zola", "build"]
|
||||
|
||||
FROM ghcr.io/static-web-server/static-web-server:2
|
||||
WORKDIR /
|
||||
COPY --from=zola /project/public /public
|
||||
5
content/_index.md
Normal file
5
content/_index.md
Normal file
@@ -0,0 +1,5 @@
|
||||
+++
|
||||
title = "List of blog posts"
|
||||
sort_by = "date"
|
||||
paginate_by = 10
|
||||
+++
|
||||
12
content/ceph-benchmarking/index.md
Normal file
12
content/ceph-benchmarking/index.md
Normal file
@@ -0,0 +1,12 @@
|
||||
+++
|
||||
title = "Ceph Benchmarking"
|
||||
date = 2026-03-01
|
||||
description = "The results of some of my recent ceph benchmarks"
|
||||
draft = true
|
||||
|
||||
[taxonomies]
|
||||
categories = ["Homelab"]
|
||||
tags = ["Homelab", "Ceph"]
|
||||
+++
|
||||
|
||||
TODO
|
||||
20
content/homelab-ipv4-expose/index.md
Normal file
20
content/homelab-ipv4-expose/index.md
Normal file
@@ -0,0 +1,20 @@
|
||||
+++
|
||||
title = "Homelab - IPv4 Expose"
|
||||
date = 2026-02-16
|
||||
description = "How I expose my IPv6 only Homelab for IPv4 clients"
|
||||
draft = true
|
||||
|
||||
[taxonomies]
|
||||
categories = ["Homelab"]
|
||||
tags = ["Homelab", "IPv4", "IPv6"]
|
||||
+++
|
||||
|
||||
## Current Setup
|
||||
Currently I am renting a VPS which runs a custom proxy, that loads the configuration from consul based on tags and then accepts traffic on the proper ports and forwards it manually.
|
||||
|
||||
## Plan
|
||||
Services that need to be exposed get their own virtual IPv6 address using keepalived. The active/master node will be forced to the node on which the service is currently running using priorities.
|
||||
|
||||
On my external server setup Jool with SIIT-DC and iptable rules.
|
||||
1. Everything coming in at the given port for the service (for example HTTP, Teamspeak, etc.) is redirected to a different internal IPv4 address using iptables
|
||||
2. Jool listens on the internal IPv4 address and performs SIIT-DC or SIIT-EAM forwarding to the correct virtual IPv6 address
|
||||
10
content/homelab-monitoring/index.md
Normal file
10
content/homelab-monitoring/index.md
Normal file
@@ -0,0 +1,10 @@
|
||||
+++
|
||||
title = "Homelab - Monitoring"
|
||||
date = 2026-02-16
|
||||
description = "My current homelab monitoring setup"
|
||||
draft = true
|
||||
|
||||
[taxonomies]
|
||||
categories = ["Homelab"]
|
||||
tags = ["Homelab"]
|
||||
+++
|
||||
53
content/homelab-overview/index.md
Normal file
53
content/homelab-overview/index.md
Normal file
@@ -0,0 +1,53 @@
|
||||
+++
|
||||
title = "Homelab - Overview"
|
||||
date = 2026-02-16
|
||||
description = "A quick and rough overview of my Homelab setup"
|
||||
draft = true
|
||||
|
||||
[taxonomies]
|
||||
categories = ["Homelab"]
|
||||
tags = ["Homelab", "Ceph", "Vault", "Nomad", "Consul"]
|
||||
+++
|
||||
|
||||
The goal of this post to give a quick high-level overview of my current Homelab setup, to avoid having to re-explain everything on every following post that focuses on one part of it.
|
||||
|
||||
## Hardware
|
||||
- Unifi Network setup
|
||||
- Normal and Management traffic over 1GbE
|
||||
- Cluster networking using 10GbE
|
||||
- 3 Servers
|
||||
- 4-8 Cores (8-16 Threads)
|
||||
- 64GB RAM
|
||||
- APC UPS
|
||||
|
||||
## Internet
|
||||
For my internet connection I only have normal residential internet with 250Mb down and 50Mb up.
|
||||
This means I have no public IPv4 address, but have a /48 IPv6 Prefix, which is not ideal but at least the IPv6 forces me to learn it and use "newer" technologies (if you consider IPv6 "new").
|
||||
|
||||
## Infrastructure
|
||||
Getting to the more interesting bits now.
|
||||
|
||||
The foundational setup consists of Consul, Nomad, Vault and Ceph.
|
||||
|
||||
Vault is responsible for all my secret management and runs mostly independent of anything else. For this purpose it is running as 3-node cluster, with automatic unsealing using GCP KMS and using the integrated raft storage backend.
|
||||
This should ensure that apart from unsealing, my vault cluster is always operational and does not depend on anything else, which might complicate setup during a cold-start / entire cluster restart.
|
||||
|
||||
Consul is my service discovery and service mesh of choice and also acts as a simple KV store for some minor things, to help orchestrate things.
|
||||
|
||||
Nomad is setup on top of consul and is my container/application orchestrator of choice. This is also integrated with vault to provide easy secret management, for any service that might need it.
|
||||
Basically everything that I deploy to my cluster is deployed to nomad for easier management.
|
||||
|
||||
The last foundational piece is my 3-node Ceph cluster, which provides the persistent storage for all of my deployed services.
|
||||
For this purpose it provides both S3 compatible storage using cephs' RGW and also provides block storage using RBD to my containers using the ceph-csi plugin.
|
||||
In the future I also plan to try out using ceph to provide storage for my desktop using RBD directly on linux or use iSCSI or NvmeoF for windows, but that is still in the planning/draft stage.
|
||||
|
||||
## Ingress Traffic - IPv6
|
||||
For HTTP/HTTPS traffic, I have a single traefik instance deployed, which handles all the routing to the different services.
|
||||
Traefik itself dynamically loads the configuration from consul, looking for services with specific tags.
|
||||
|
||||
Other TCP traffic is usually forwarded to the correct service directly, like for minecraft servers or teamspeak. I plan to improve this a bit, but currently this work fine and thus there is little urgency for me to fix this.
|
||||
|
||||
## Ingress Traffic - IPv4
|
||||
As previously mentioned, I do not have a public routable IPv4 address, which makes this setup a bit more complex.
|
||||
Over time I had a lot of different setups for this, but currently I settled on having a custom proxy, which dynamically loads the services that should be exposed from consul and then forwards the traffic on the ports accordingly.
|
||||
This setup is definetly not ideal and I want to move towards a better more scalable approach, with something like SIIT but I will have to see.
|
||||
12
content/quickfacts-1/index.md
Normal file
12
content/quickfacts-1/index.md
Normal file
@@ -0,0 +1,12 @@
|
||||
+++
|
||||
title = "Quickfacts - Part 1"
|
||||
date = 2026-03-01
|
||||
description = "The first part of a series about my Quickfacts project"
|
||||
draft = true
|
||||
|
||||
[taxonomies]
|
||||
categories = ["Programming"]
|
||||
tags = ["Factorio", "Rust"]
|
||||
+++
|
||||
|
||||
TODO
|
||||
12
content/quickfacts-intro/index.md
Normal file
12
content/quickfacts-intro/index.md
Normal file
@@ -0,0 +1,12 @@
|
||||
+++
|
||||
title = "Quickfacts - Intro"
|
||||
date = 2026-03-01
|
||||
description = "An introduction to my Quickfacts project"
|
||||
draft = true
|
||||
|
||||
[taxonomies]
|
||||
categories = ["Programming"]
|
||||
tags = ["Factorio", "Rust"]
|
||||
+++
|
||||
|
||||
TODO
|
||||
1
themes/radion
Submodule
1
themes/radion
Submodule
Submodule themes/radion added at 76aaf58d60
48
zola.toml
Normal file
48
zola.toml
Normal file
@@ -0,0 +1,48 @@
|
||||
# The URL the site will be built for
|
||||
base_url = "https://personal.lol3r.com"
|
||||
|
||||
# Whether to automatically compile all Sass files in the sass directory
|
||||
compile_sass = true
|
||||
|
||||
# Whether to build a search index to be used later on by a JavaScript library
|
||||
build_search_index = true
|
||||
|
||||
theme = "radion"
|
||||
|
||||
taxonomies = [
|
||||
# You can enable/disable RSS
|
||||
{ name = "categories", feed = true },
|
||||
{ name = "tags", feed = true },
|
||||
]
|
||||
|
||||
author = "Leon"
|
||||
generate_feeds = true
|
||||
|
||||
[search]
|
||||
index_format = "elasticlunr_json"
|
||||
|
||||
[markdown]
|
||||
|
||||
[markdown.highlighting]
|
||||
theme = "catppuccin-mocha"
|
||||
|
||||
[extra]
|
||||
# Put all your custom variables here
|
||||
enable_search = true
|
||||
taxonomies = [
|
||||
# You can enable/disable RSS
|
||||
{ name = "categories", feed = true },
|
||||
{ name = "tags", feed = true },
|
||||
]
|
||||
|
||||
radion_title = "Leon's Personal Blog"
|
||||
radion_menu = [
|
||||
{ url = "$BASE_URL", name = "Home" },
|
||||
{ url = "$BASE_URL/categories", name = "Categories" },
|
||||
{ url = "$BASE_URL/tags", name = "Tags" },
|
||||
]
|
||||
theme = "toggle" # options: {light, dark, auto, toggle}
|
||||
toc = true
|
||||
comments = false
|
||||
codeblock = true
|
||||
|
||||
Reference in New Issue
Block a user