Below you will find pages that utilize the taxonomy term “Linux”
Coordinated Reboots for bootc Hosts
TL;DR – My bootc hosts stage new images every hour, but nothing rebooted them into those images. Now a small timer on each host checks a time window, its own health and its neighbours, takes a lock from a ~200-line Python FleetLock server, and only then reboots. No Kubernetes, no etcd, and protocol-compatible with the Fedora CoreOS tooling in case I outgrow it.
In how I tweak my base image I
described how I replaced bootc-fetch-apply-updates.timer with my own
bootc-fetch.timer: every hour bootc update pulls the newest image and
stages it, but doesn’t reboot. I ended that post with “the actual reboot is a
separate step I control manually or via another timer”. This post is about
that missing step.
AI Agents in My Hosting Workflow
My homelab is mostly text: Docker Swarm compose files, bootc Containerfiles, Forgejo workflows, a few Ansible playbooks and this Hugo blog. All of it lives in git, and for years the workflow has been the same: edit in an editor, render, deploy, check the logs, repeat.
Over the last months two coding agents moved into that loop: opencode and Claude Code. This post covers how I set them up, what they do for me, and where I still keep my hands on the wheel.
Why I Run My Models Locally
Every prompt you send to a hosted LLM leaves your network. That includes the text you type, the files you attach, and whatever context your tools decide to pack around it. For a quick question about a regex that doesn’t matter. For your mailbox, your customers’ tickets or your company wiki, it matters a lot.
That is the main reason I run most of my models on my own hardware with Ollama. This post covers why, and where these models are useful in a self-hosted setup.
Conditional bootc build
Running image builds on a schedule makes sense for security – you want your bootc images to pick up the latest Fedora updates automatically. But scheduling a daily build that rebuilds every image every day, even when nothing upstream changed, wastes runner time and fills the registry with identical layers.
This post covers how I added upstream change detection to my Forgejo CI pipelines for gorgeOS, so that scheduled builds are truly no-ops when the upstream image hasn’t moved.
Bootc Matrix Build
Running a Fedora-based bootc image stack means tracking multiple Fedora releases in parallel. Instead of duplicating every job in the workflow, I wired up the matrix strategy in Forgejo Actions to build F43 and F44 from a single job definition.
The Problem With Hardcoded Versions
Before, every Containerfile had a hardcoded base image:
FROM git.m1ch.eu/oci/c-os:base-43
Supporting F44 would have meant either duplicating the whole workflow or a manual find-and-replace for every release. Neither scales.
Using SSH Config `Match exec` to Route Hostnames Dynamically
Why bother with a fancy Match block?
When you SSH into a fleet of servers that share a naming scheme, you usually end up copying-pasting the same options over and over. A Match block that tests the host name and then tweaks the connection parameters lets you:
- Keep a single config file that works for every member of the group.
- Automate proxying or port-translation without having to write a wrapper script.
The example below demonstrates the trick.
Glusterfs down
This morning I woke up and the radio was not playing. I soon figured out, that my DNS, AdGuard, was for some reason down.
I started with the debugging, even before I had breakfast. Not evan a coffee!
The docker-container for AdGuard was running and reported no error. So I dug deeper and deeper, just to find out, that several containers showed strange behavior. For example did Traefik had som error that it could not find the middlewares, that where configured via environment variables.