From 12bf8b7ef8416425b5cef3868cb8612c4c1601ba Mon Sep 17 00:00:00 2001 From: Lol3rrr Date: Tue, 17 Feb 2026 00:09:09 +0100 Subject: [PATCH] Get started on my own blog --- .gitignore | 1 + .gitmodules | 3 ++ Dockerfile | 9 +++++ content/_index.md | 5 +++ content/ceph-benchmarking/index.md | 12 +++++++ content/homelab-ipv4-expose/index.md | 20 +++++++++++ content/homelab-monitoring/index.md | 10 ++++++ content/homelab-overview/index.md | 53 ++++++++++++++++++++++++++++ content/quickfacts-1/index.md | 12 +++++++ content/quickfacts-intro/index.md | 12 +++++++ themes/radion | 1 + zola.toml | 48 +++++++++++++++++++++++++ 12 files changed, 186 insertions(+) create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 Dockerfile create mode 100644 content/_index.md create mode 100644 content/ceph-benchmarking/index.md create mode 100644 content/homelab-ipv4-expose/index.md create mode 100644 content/homelab-monitoring/index.md create mode 100644 content/homelab-overview/index.md create mode 100644 content/quickfacts-1/index.md create mode 100644 content/quickfacts-intro/index.md create mode 160000 themes/radion create mode 100644 zola.toml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..364fdec --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +public/ diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..bc36660 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "themes/radion"] + path = themes/radion + url = https://github.com/micahkepe/radion.git diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..fdecd41 --- /dev/null +++ b/Dockerfile @@ -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 diff --git a/content/_index.md b/content/_index.md new file mode 100644 index 0000000..f48223f --- /dev/null +++ b/content/_index.md @@ -0,0 +1,5 @@ ++++ +title = "List of blog posts" +sort_by = "date" +paginate_by = 10 ++++ diff --git a/content/ceph-benchmarking/index.md b/content/ceph-benchmarking/index.md new file mode 100644 index 0000000..944b41b --- /dev/null +++ b/content/ceph-benchmarking/index.md @@ -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 diff --git a/content/homelab-ipv4-expose/index.md b/content/homelab-ipv4-expose/index.md new file mode 100644 index 0000000..0b6cd9c --- /dev/null +++ b/content/homelab-ipv4-expose/index.md @@ -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 diff --git a/content/homelab-monitoring/index.md b/content/homelab-monitoring/index.md new file mode 100644 index 0000000..2f34687 --- /dev/null +++ b/content/homelab-monitoring/index.md @@ -0,0 +1,10 @@ ++++ +title = "Homelab - Monitoring" +date = 2026-02-16 +description = "My current homelab monitoring setup" +draft = true + +[taxonomies] +categories = ["Homelab"] +tags = ["Homelab"] ++++ diff --git a/content/homelab-overview/index.md b/content/homelab-overview/index.md new file mode 100644 index 0000000..b84e6e8 --- /dev/null +++ b/content/homelab-overview/index.md @@ -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. diff --git a/content/quickfacts-1/index.md b/content/quickfacts-1/index.md new file mode 100644 index 0000000..ec411b8 --- /dev/null +++ b/content/quickfacts-1/index.md @@ -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 diff --git a/content/quickfacts-intro/index.md b/content/quickfacts-intro/index.md new file mode 100644 index 0000000..eb641a0 --- /dev/null +++ b/content/quickfacts-intro/index.md @@ -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 diff --git a/themes/radion b/themes/radion new file mode 160000 index 0000000..76aaf58 --- /dev/null +++ b/themes/radion @@ -0,0 +1 @@ +Subproject commit 76aaf58d60822922632631883c92af035dc764b0 diff --git a/zola.toml b/zola.toml new file mode 100644 index 0000000..48c5d9f --- /dev/null +++ b/zola.toml @@ -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 +