<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>DevOps on Charlie Howlett</title>
		<link>https://charliehowlett.co.uk/tags/devops/</link>
		<description>Recent content in DevOps on Charlie Howlett</description>
		<generator>Hugo</generator>
		<language>en-gb</language>
		
		
		
		
			<lastBuildDate>Tue, 18 Aug 2026 00:00:00 +0000</lastBuildDate>
		
			<atom:link href="https://charliehowlett.co.uk/tags/devops/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>Managing My Homelab with Ansible</title>
				<link>https://charliehowlett.co.uk/posts/2026-08-18-managing-my-homelab-with-ansible/</link>
				<pubDate>Tue, 18 Aug 2026 00:00:00 +0000</pubDate>
				<guid>https://charliehowlett.co.uk/posts/2026-08-18-managing-my-homelab-with-ansible/</guid>
				<description>&lt;p&gt;In previous posts, I described how I set up my &lt;a href=&#34;https://charliehowlett.co.uk/posts/2026-05-22-repurposing-a-laptop-as-a-home-server/&#34;&gt;repurposed laptop server&lt;/a&gt; and &lt;a href=&#34;https://charliehowlett.co.uk/posts/2026-06-12-raspberry-pi-server-rack/&#34;&gt;Raspberry Pi server rack&lt;/a&gt;. Together, they have grown into a useful little homelab.&lt;/p&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&lt;img&#xA;  class=&#34;image-large&#34;&#xA;  src=&#34;https://charliehowlett.co.uk/posts/2026-08-18-managing-my-homelab-with-ansible/homelab-topology.svg&#34;&#xA;  alt=&#34;Topology diagram showing SSD directly connected to Raspberry Pi 3, with all hosts connected to a shared Ethernet bus.&#34;&#xA;  decoding=&#34;async&#34;&gt;&#xA;&#xA;&#xA;&lt;p&gt;The top-level topology is simple, but the deployed services and their configuration complicate things quickly.&lt;/p&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&lt;img&#xA;  class=&#34;image-large&#34;&#xA;  src=&#34;https://charliehowlett.co.uk/posts/2026-08-18-managing-my-homelab-with-ansible/homelab-topology--services.svg&#34;&#xA;  alt=&#34;Topology diagram showing applications deployed on each homelab host: the server laptop runs Super Productivity, a productivity planner; every host runs Alloy; Pi 2 also runs device monitoring and Git Auto Sync, while Pi 3 hosts SSD storage, Samba, PostgreSQL, and the Grafana and Loki monitoring stack.&#34;&#xA;  decoding=&#34;async&#34;&gt;&#xA;&#xA;&#xA;&lt;p&gt;It can be tricky to keep track of:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Automating LinkedIn Cross-Posting</title>
				<link>https://charliehowlett.co.uk/posts/2026-08-05-linkedin-cross-posting/</link>
				<pubDate>Wed, 05 Aug 2026 00:00:00 +0000</pubDate>
				<guid>https://charliehowlett.co.uk/posts/2026-08-05-linkedin-cross-posting/</guid>
				<description>&lt;p&gt;I&amp;rsquo;ve been writing posts here for quite a while, and during that time the site has grown to cover a fairly wide mix of topics. I felt it would be nice to share that work with a larger audience, so I decided to implement a CI/CD pipeline for automatically cross-posting to LinkedIn.&lt;/p&gt;&#xA;&lt;h2 id=&#34;implementation&#34;&gt;Implementation&lt;/h2&gt;&#xA;&lt;p&gt;I originally considered using Zapier for this, but the free tier did not offer the functionality I needed, so I built a small publishing pipeline myself using GitHub Actions.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Mobile Dev Setup</title>
				<link>https://charliehowlett.co.uk/posts/2026-07-03-mobile-dev-setup/</link>
				<pubDate>Fri, 03 Jul 2026 00:00:00 +0000</pubDate>
				<guid>https://charliehowlett.co.uk/posts/2026-07-03-mobile-dev-setup/</guid>
				<description>&lt;p&gt;I&amp;rsquo;ve always felt quite restless once I start working on a project. If I&amp;rsquo;m sitting in a park, on a train, or away from my desk with an idea in my head, I often want to make a quick change or keep a thread of work moving. But without my laptop I&amp;rsquo;ve always had to settle for doing something else. Still, I have always been curious about what options were available so years ago I looked into Termux, an app that provides a terminal on your phone. I wanted to try coding on the go, but writing productive code from such a small screen and keyboard felt impractical. However, when AI agents came along the idea started to seem much more realistic so I decide to try again.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Optimizing Hugo Image Loading Time</title>
				<link>https://charliehowlett.co.uk/posts/2026-06-24-optimizing-image-loading-time/</link>
				<pubDate>Wed, 24 Jun 2026 00:00:00 +0000</pubDate>
				<guid>https://charliehowlett.co.uk/posts/2026-06-24-optimizing-image-loading-time/</guid>
				<description>&lt;p&gt;As I&amp;rsquo;ve added more posts to &lt;a href=&#34;https://charliehowlett.co.uk/&#34;&gt;charliehowlett.co.uk&lt;/a&gt;, the site has gradually accumulated lots of screenshots, photos, and short animations. I usually upload whatever media files I have available without first optimising them for web, which can increase site size and negatively impact page load times. At first I thought to simply enable the &lt;code&gt;img-bot&lt;/code&gt; GitHub action to automatically optimise images, but unfortunately the service&amp;rsquo;s free tier does not extend to private repositories. So I spent some time implementing my own automatic image optimisation process.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Monitoring My Homelab with Grafana</title>
				<link>https://charliehowlett.co.uk/posts/2026-06-17-monitoring-my-homelab-with-grafana/</link>
				<pubDate>Wed, 17 Jun 2026 00:00:00 +0000</pubDate>
				<guid>https://charliehowlett.co.uk/posts/2026-06-17-monitoring-my-homelab-with-grafana/</guid>
				<description>&lt;p&gt;Once I had several processes running continuously in my homelab, I needed a single place to inspect what they were doing. Connecting to a machine via SSH and reading logs directly is useful, but hardly convenient, so I set up an observability platform. I use Grafana for querying and visualising logs, Loki for storing and querying logs, and Grafana Alloy for collecting and forwarding logs. The components run as Docker containers on a Raspberry Pi with an attached SSD for persistent storage.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Git Auto Sync</title>
				<link>https://charliehowlett.co.uk/posts/2026-06-14-git-auto-sync/</link>
				<pubDate>Sun, 14 Jun 2026 00:00:00 +0000</pubDate>
				<guid>https://charliehowlett.co.uk/posts/2026-06-14-git-auto-sync/</guid>
				<description>&lt;p&gt;After setting up my &lt;a href=&#34;https://charliehowlett.co.uk/posts/2026-06-12-raspberry-pi-server-rack/&#34;&gt;Raspberry Pi home lab&lt;/a&gt;, I deployed a small project onto one of the Pis and immediately wanted a cleaner method for continuous deployment. The app lived in a Git repository, and I wanted the running copy on the Pi to update automatically whenever the repo changed.&lt;/p&gt;&#xA;&lt;p&gt;The obvious approach would have been a webhook: GitHub sends a request, a local service receives it, and the Pi pulls the latest code. I decided against that for security reasons. I did not want to expose a service on my home network just so GitHub could tell it that a commit had landed, and I did not want to build a tunnel or webhook receiver for something that could be solved more simply.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Monitoring Devices on My Home Network</title>
				<link>https://charliehowlett.co.uk/posts/2026-06-13-device-monitoring/</link>
				<pubDate>Sat, 13 Jun 2026 00:00:00 +0000</pubDate>
				<guid>https://charliehowlett.co.uk/posts/2026-06-13-device-monitoring/</guid>
				<description>&lt;p&gt;My router gives me a basic view of the devices currently connected to my network, but it does not expose historical information. I started this project to fill that gap: a small Raspberry Pi service that scans the LAN, records which devices it sees, and shows that data in a dashboard.&lt;/p&gt;&#xA;&lt;h2 id=&#34;implementation&#34;&gt;Implementation&lt;/h2&gt;&#xA;&lt;p&gt;The service periodically runs &lt;code&gt;arp-scan&lt;/code&gt; to discover devices on the local network, then stores the results in a database with both the current device state and a history of online/offline events. That split lets the system track when a device first appeared, when it was last seen, and how its presence changed across a day or week.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Building a Raspberry Pi Server Rack</title>
				<link>https://charliehowlett.co.uk/posts/2026-06-12-raspberry-pi-server-rack/</link>
				<pubDate>Fri, 12 Jun 2026 00:00:00 +0000</pubDate>
				<guid>https://charliehowlett.co.uk/posts/2026-06-12-raspberry-pi-server-rack/</guid>
				<description>&lt;p&gt;I had three old Raspberry Pis and an SSD sitting unused in a cupboard, so I decided to turn them into a small cluster of home servers. I wanted the finished setup to be compact and tidy enough to live on a little shelf in my television stand, rather than becoming another loose collection of boards, cables, and power adapters tucked away in some cupboard.&lt;/p&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&lt;picture&gt;&#xA;  &lt;source&#xA;    type=&#34;image/webp&#34;&#xA;    srcset=&#34;https://charliehowlett.co.uk/posts/2026-06-12-raspberry-pi-server-rack/pi-server-rack_hu_5aea18687e9fc9c5.webp 520w, https://charliehowlett.co.uk/posts/2026-06-12-raspberry-pi-server-rack/pi-server-rack_hu_d994c08c850007de.webp 1040w&#34;&#xA;    sizes=&#34;(max-width: 700px) 90vw, 520px&#34;&gt;&#xA;  &lt;img&#xA;    class=&#34;image-medium&#34;&#xA;    src=&#34;https://charliehowlett.co.uk/fallback-images/posts/2026-06-12-raspberry-pi-server-rack/pi-server-rack.jpg&#34;&#xA;    alt=&#34;The completed Raspberry Pi server rack&#34;&#xA;    width=&#34;1800&#34;&#xA;    height=&#34;1350&#34;&#xA;    decoding=&#34;async&#34;&gt;&#xA;&lt;/picture&gt;&#xA;&#xA;&#xA;&lt;p&gt;For the chassis, I joined two 12-inch server rack trays using a pair of small rack-mounting posts. This was cheaper than buying a premade desktop rack and gave me a reusable foundation: if I later expand the cluster or move it into a larger rack, the trays and mounting hardware can become part of the new setup.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Repurposing a Laptop as a Home Server</title>
				<link>https://charliehowlett.co.uk/posts/2026-05-22-repurposing-a-laptop-as-a-home-server/</link>
				<pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate>
				<guid>https://charliehowlett.co.uk/posts/2026-05-22-repurposing-a-laptop-as-a-home-server/</guid>
				<description>&lt;p&gt;I was recently given an old laptop that had been retired by my company. Despite no longer being needed for work, it still had quite capable hardware, so I decided to repurpose it as a compact, general-purpose home server rather than let it go unused.&lt;/p&gt;&#xA;&lt;p&gt;Because the server will remain plugged in, I removed the battery to reduce unnecessary heat and avoid leaving an ageing battery permanently charging. I also removed the display, which improved airflow, made the machine easier to fit into tight spaces, and left the power button accessible without needing to open and close a lid. I saved the screen so it can be reused in a future project.&lt;/p&gt;</description>
			</item>
			<item>
				<title>GitHub Action to Automate Screenshots</title>
				<link>https://charliehowlett.co.uk/posts/2026-05-06-update-screenshots-action/</link>
				<pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate>
				<guid>https://charliehowlett.co.uk/posts/2026-05-06-update-screenshots-action/</guid>
				<description>&lt;p&gt;Screenshots can make project documentation much clearer, but they quickly become misleading when they fall out of date. I built update-screenshots-action to automate that maintenance: capture a web page, save the image in the repository, and update a known section of a Markdown file.&lt;/p&gt;&#xA;&lt;h2 id=&#34;implementation&#34;&gt;Implementation&lt;/h2&gt;&#xA;&lt;p&gt;The action takes a URL, opens it in Chromium through Playwright, and captures either a PNG or an animated GIF at a repository-relative path. It then rewrites a marked block in a Markdown file so the reference remains in sync with the generated asset. Optional commit-and-push support allows the action to run on a schedule or after changes to a site without requiring additional workflow steps. Even within that narrow scope, running reliably in CI required handling several operational details. Navigation is retried while local preview servers start, and commits are only created when one of the managed files has actually changed.&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
