<?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 ma.ttias.be</title><link>https://ma.ttias.be/categories/devops/</link><description>Recent content in DevOps on ma.ttias.be</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><managingEditor>mattias@ma.ttias.be (Mattias Geniar)</managingEditor><webMaster>mattias@ma.ttias.be (Mattias Geniar)</webMaster><lastBuildDate>Fri, 12 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://ma.ttias.be/categories/devops/index.xml" rel="self" type="application/rss+xml"/><item><title>Linux debugging tools I use daily</title><link>https://ma.ttias.be/linux-debugging-tools-i-use-daily/</link><pubDate>Fri, 12 Jun 2026 00:00:00 +0000</pubDate><author>mattias@ma.ttias.be (Mattias Geniar)</author><guid>https://ma.ttias.be/linux-debugging-tools-i-use-daily/</guid><description>&lt;p&gt;Every server I run, including the fleet behind &lt;a href="https://ohdear.app" target="_blank" rel="noopener noreferrer"&gt;Oh Dear&lt;/a&gt;
&amp;rsquo;s uptime checks, has the same set of debugging tools installed before anything goes wrong. Not because the application needs them, but because the one time you reach for &lt;code&gt;strace&lt;/code&gt; is at 2am, the box is misbehaving, and &lt;code&gt;apt install&lt;/code&gt; is the last thing you want to be doing while you work out what broke.&lt;/p&gt;</description></item><item><title>Transcribing my old podcast locally with open-source AI</title><link>https://ma.ttias.be/transcribing-syscast-with-local-ai/</link><pubDate>Tue, 09 Jun 2026 00:00:00 +0000</pubDate><author>mattias@ma.ttias.be (Mattias Geniar)</author><guid>https://ma.ttias.be/transcribing-syscast-with-local-ai/</guid><description>&lt;p&gt;Back in 2016 and 2017 I recorded a podcast called &lt;a href="https://ma.ttias.be/syscast/"&gt;Syscast&lt;/a&gt;
: interviews with people I admired in the Linux, open source and infrastructure world. &lt;a href="https://ma.ttias.be/syscast/1-matt-holt-creator-caddy-webserver/"&gt;Matt Holt about Caddy&lt;/a&gt;
, &lt;a href="https://ma.ttias.be/syscast/4-curl-libcurl-future-web-daniel-stenberg/"&gt;Daniel Stenberg about curl&lt;/a&gt;
, &lt;a href="https://ma.ttias.be/syscast/3-managing-secrets-vault-seth-vargo/"&gt;Seth Vargo about Vault&lt;/a&gt;
, and a handful more. Ten episodes, roughly ten hours of audio, and then life got in the way and I put it on pause.&lt;/p&gt;</description></item><item><title>Recap: measuring linux performance - how to avoid typical mistakes</title><link>https://ma.ttias.be/recap-measuring-linux-performance-avoid-typical-mistakes/</link><pubDate>Thu, 09 Jul 2020 06:50:00 +0100</pubDate><author>mattias@ma.ttias.be (Mattias Geniar)</author><guid>https://ma.ttias.be/recap-measuring-linux-performance-avoid-typical-mistakes/</guid><description>&lt;p&gt;In the last two weeks, &lt;a href="https://twitter.com/PeterZaitsev" target="_blank" rel="noopener noreferrer"&gt;Peter Zaitsev&lt;/a&gt;
published a 4-part series on measuring Linux performance on this blog.&lt;/p&gt;</description></item><item><title>How to measure Linux Performance Avoiding Most Typical Mistakes: Network</title><link>https://ma.ttias.be/how-to-measure-linux-performance-avoiding-most-typical-mistakes-network/</link><pubDate>Wed, 08 Jul 2020 06:50:00 +0100</pubDate><author>mattias@ma.ttias.be (Mattias Geniar)</author><guid>https://ma.ttias.be/how-to-measure-linux-performance-avoiding-most-typical-mistakes-network/</guid><description>&lt;p&gt;In this series, we are talking about Linux performance measurement, how to measure it right. Linux performance is a very broad topic, so we&amp;rsquo;ll focus on the four primary resources which are typically going to drive your system performance – obviously CPU, memory, disk storage, and network.&lt;/p&gt;</description></item><item><title>How to measure Linux Performance Avoiding Most Typical Mistakes: Memory</title><link>https://ma.ttias.be/how-to-measure-linux-performance-avoiding-most-typical-mistakes-memory/</link><pubDate>Mon, 06 Jul 2020 06:50:00 +0100</pubDate><author>mattias@ma.ttias.be (Mattias Geniar)</author><guid>https://ma.ttias.be/how-to-measure-linux-performance-avoiding-most-typical-mistakes-memory/</guid><description>&lt;p&gt;In this series, we are talking about Linux performance measurement, how to measure it right. Linux performance is a very broad topic, so we&amp;rsquo;ll focus on the four primary resources which are typically going to drive your system performance – obviously CPU, memory, disk storage, and network.&lt;/p&gt;</description></item><item><title>How to measure Linux Performance Avoiding Most Typical Mistakes: Disk Storage</title><link>https://ma.ttias.be/how-to-measure-linux-performance-avoiding-most-typical-mistakes-disk-storage/</link><pubDate>Thu, 02 Jul 2020 06:50:00 +0100</pubDate><author>mattias@ma.ttias.be (Mattias Geniar)</author><guid>https://ma.ttias.be/how-to-measure-linux-performance-avoiding-most-typical-mistakes-disk-storage/</guid><description>&lt;p&gt;In this series, we are talking about Linux performance measurement, how to measure it right. Linux performance is a very broad topic, so we&amp;rsquo;ll focus on the four primary resources which are typically going to drive your system performance – obviously CPU, memory, disk storage, and network.&lt;/p&gt;</description></item><item><title>Adding SWAP to Linux</title><link>https://ma.ttias.be/add-swap-linux/</link><pubDate>Tue, 30 Jun 2020 00:00:00 +0000</pubDate><author>mattias@ma.ttias.be (Mattias Geniar)</author><guid>https://ma.ttias.be/add-swap-linux/</guid><description>&lt;p&gt;Here are the steps needed to add a new SWAP partition to your Linux machine. This&amp;rsquo;ll allocate 2GB of space on your disk, and allow it to be used as RAM if your server is running low.&lt;/p&gt;</description></item><item><title>Git commit without the pre-commit hook</title><link>https://ma.ttias.be/git-commit-without-pre-commit-hook/</link><pubDate>Mon, 29 Jun 2020 00:00:00 +0000</pubDate><author>mattias@ma.ttias.be (Mattias Geniar)</author><guid>https://ma.ttias.be/git-commit-without-pre-commit-hook/</guid><description>&lt;p&gt;Quick tip if you want to skip the pre-commit validations and quickly want to get a commit out there.&lt;/p&gt;</description></item><item><title>How to measure Linux Performance Avoiding Most Typical Mistakes: CPU</title><link>https://ma.ttias.be/how-to-measure-linux-performance-avoiding-most-typical-mistakes-cpu/</link><pubDate>Mon, 29 Jun 2020 00:00:00 +0000</pubDate><author>mattias@ma.ttias.be (Mattias Geniar)</author><guid>https://ma.ttias.be/how-to-measure-linux-performance-avoiding-most-typical-mistakes-cpu/</guid><description>&lt;p&gt;In this series, we are going to talk about Linux performance measurement, how to measure it right. Linux performance is a very broad topic, so we&amp;rsquo;ll focus on the four primary resources which are typically going to drive your system performance – obviously CPU, memory, disk storage, and network.&lt;/p&gt;</description></item><item><title>Making life easier with cron</title><link>https://ma.ttias.be/making-life-easier-with-cron/</link><pubDate>Thu, 04 Jun 2020 00:00:00 +0000</pubDate><author>mattias@ma.ttias.be (Mattias Geniar)</author><guid>https://ma.ttias.be/making-life-easier-with-cron/</guid><description>&lt;p&gt;This post shares some ideas about working with cronjobs, to help make common tasks more easy for both junior and senior sysadmins.&lt;/p&gt;</description></item><item><title>MySQL: ERROR 1153 (08S01): Got a packet bigger than 'max_allowed_packet' bytes</title><link>https://ma.ttias.be/mysql-error-1153-08s01-got-a-packet-bigger-than-max-allowed-packet-bytes/</link><pubDate>Fri, 15 May 2020 00:00:00 +0000</pubDate><author>mattias@ma.ttias.be (Mattias Geniar)</author><guid>https://ma.ttias.be/mysql-error-1153-08s01-got-a-packet-bigger-than-max-allowed-packet-bytes/</guid><description>&lt;p&gt;I ran into this error when doing a very large MySQL import from a dumpfile.&lt;/p&gt;</description></item><item><title>Bash script to send a push notification when string is found in logs</title><link>https://ma.ttias.be/bash-script-send-push-notification-string-found-logs/</link><pubDate>Sun, 03 May 2020 00:00:00 +0000</pubDate><author>mattias@ma.ttias.be (Mattias Geniar)</author><guid>https://ma.ttias.be/bash-script-send-push-notification-string-found-logs/</guid><description>&lt;p&gt;I had a use case where I wanted to be notified whenever a particular string occured in a log file. This seemed a bit overkill to make a custom implementation in a monitoring solution, so I wrote a simple Bash script to send me a push notification whenever it occurs.&lt;/p&gt;</description></item><item><title>Build &amp; test your Laravel project via Bitbucket Pipelines</title><link>https://ma.ttias.be/build-test-laravel-project-bitbucket-pipelines/</link><pubDate>Wed, 29 Apr 2020 00:00:00 +0000</pubDate><author>mattias@ma.ttias.be (Mattias Geniar)</author><guid>https://ma.ttias.be/build-test-laravel-project-bitbucket-pipelines/</guid><description>&lt;p&gt;This post will show you how to use &lt;a href="https://bitbucket.org/product/features/pipelines" target="_blank" rel="noopener noreferrer"&gt;Bitbucket Pipelines&lt;/a&gt;
to build and test your Laravel Project in a docker container.&lt;/p&gt;</description></item><item><title>Deploying a highly-available K3s with K3sup</title><link>https://ma.ttias.be/deploying-highly-available-k3s-k3sup/</link><pubDate>Mon, 27 Apr 2020 00:00:00 +0000</pubDate><author>mattias@ma.ttias.be (Mattias Geniar)</author><guid>https://ma.ttias.be/deploying-highly-available-k3s-k3sup/</guid><description>&lt;h2 id="introduction" class="heading-anchor-group"&gt;Introduction&lt;a href="#introduction" class="heading-anchor" aria-label="Link to this section"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Some of members of the cloud-native computing world have recently been trying to find a way to address the areas where Kubernetes falls short when trying to run on resource constrained environments.&lt;/p&gt;</description></item><item><title>Clean up Linux Server Using These Simple Tips</title><link>https://ma.ttias.be/clean-up-linux-server-using-these-simple-tips/</link><pubDate>Sun, 26 Apr 2020 00:00:00 +0000</pubDate><author>mattias@ma.ttias.be (Mattias Geniar)</author><guid>https://ma.ttias.be/clean-up-linux-server-using-these-simple-tips/</guid><description>&lt;p&gt;Deploying a Linux server is really easy these days thanks to the abundance of cloud server providers like Linode, Digital Ocean etc. This enables not-so-expert people, like me, to deploy and manage their own Linux servers.&lt;/p&gt;</description></item><item><title>Different ways of writing crontab syntax</title><link>https://ma.ttias.be/different-ways-of-writing-crontab-syntax/</link><pubDate>Sun, 26 Apr 2020 00:00:00 +0000</pubDate><author>mattias@ma.ttias.be (Mattias Geniar)</author><guid>https://ma.ttias.be/different-ways-of-writing-crontab-syntax/</guid><description>&lt;p&gt;Here&amp;rsquo;s what I&amp;rsquo;ve been doing for most of my life, when it comes to writing &lt;code&gt;crontab&lt;/code&gt; entries:&lt;/p&gt;</description></item><item><title>Set up a custom 404 page for static sites with Caddy 2</title><link>https://ma.ttias.be/set-up-custom-404-page-static-sites-caddy/</link><pubDate>Sun, 26 Apr 2020 00:00:00 +0000</pubDate><author>mattias@ma.ttias.be (Mattias Geniar)</author><guid>https://ma.ttias.be/set-up-custom-404-page-static-sites-caddy/</guid><description>&lt;p&gt;Here&amp;rsquo;s a quick example of setting up a custom 404 landing page if you use Caddy V2 to serve static sites, like this blog.&lt;/p&gt;</description></item><item><title>How to run HTTP/3 with Caddy 2</title><link>https://ma.ttias.be/how-run-http-3-with-caddy-2/</link><pubDate>Fri, 10 Apr 2020 06:30:00 +0100</pubDate><author>mattias@ma.ttias.be (Mattias Geniar)</author><guid>https://ma.ttias.be/how-run-http-3-with-caddy-2/</guid><description>&lt;p&gt;I &lt;a href="https://ma.ttias.be/migrating-caddy-2/"&gt;just migrated this webserver to Caddy 2&lt;/a&gt;
and with it, enabled HTTP/3 support. This post will give a short explanation how you can do that.&lt;/p&gt;</description></item><item><title>Migrating to Caddy 2</title><link>https://ma.ttias.be/migrating-caddy-2/</link><pubDate>Fri, 10 Apr 2020 06:00:00 +0100</pubDate><author>mattias@ma.ttias.be (Mattias Geniar)</author><guid>https://ma.ttias.be/migrating-caddy-2/</guid><description>&lt;p&gt;Last week, the &lt;a href="https://github.com/caddyserver/caddy/releases" target="_blank" rel="noopener noreferrer"&gt;first Release Candidate of Caddy 2&lt;/a&gt;
saw the light of day. I don&amp;rsquo;t usually like to run production environments on beta software, but for Caddy I wanted to make an exception&lt;/p&gt;</description></item><item><title>Dumping specific tables in MySQL using mysqldump</title><link>https://ma.ttias.be/dumping-specific-tables-mysql-mysqldump/</link><pubDate>Fri, 17 Jan 2020 00:00:00 +0000</pubDate><author>mattias@ma.ttias.be (Mattias Geniar)</author><guid>https://ma.ttias.be/dumping-specific-tables-mysql-mysqldump/</guid><description>&lt;p&gt;Here&amp;rsquo;s a small little trick when using &lt;code&gt;mysqldump&lt;/code&gt;: you don&amp;rsquo;t &lt;em&gt;have&lt;/em&gt; to dump an entire database, you can dump individual tables too.&lt;/p&gt;</description></item><item><title>Auto-restart a crashed service in systemd</title><link>https://ma.ttias.be/auto-restart-crashed-service-systemd/</link><pubDate>Mon, 13 Jan 2020 00:00:00 +0000</pubDate><author>mattias@ma.ttias.be (Mattias Geniar)</author><guid>https://ma.ttias.be/auto-restart-crashed-service-systemd/</guid><description>&lt;p&gt;Systemd allows you to configure a service so that it automatically restarts in case it&amp;rsquo;s crashed.&lt;/p&gt;</description></item><item><title>Name your Laravel Horizon workers for easier debugging at the CLI</title><link>https://ma.ttias.be/name-laravel-horizon-worker-easier-debugging-cli/</link><pubDate>Thu, 19 Dec 2019 00:00:00 +0000</pubDate><author>mattias@ma.ttias.be (Mattias Geniar)</author><guid>https://ma.ttias.be/name-laravel-horizon-worker-easier-debugging-cli/</guid><description>&lt;p&gt;As part of our &lt;a href="https://ohdear.app/" target="_blank" rel="noopener noreferrer"&gt;Oh Dear! monitoring service&lt;/a&gt;
, we run workers. A &lt;em&gt;lot&lt;/em&gt; of workers. Every site uptime check is a new worker, every broken links job is a new worker, every certificate check is a- you get the idea.&lt;/p&gt;</description></item><item><title>Set up a static IP address on Ubuntu 18.04 LTS server</title><link>https://ma.ttias.be/set-up-static-ip-address-ubuntu-18-04-server/</link><pubDate>Thu, 05 Dec 2019 00:00:00 +0000</pubDate><author>mattias@ma.ttias.be (Mattias Geniar)</author><guid>https://ma.ttias.be/set-up-static-ip-address-ubuntu-18-04-server/</guid><description>&lt;p&gt;If you&amp;rsquo;re setting up an Ubuntu 18.04 LTS server, you might want to give it a static IP address instead of one assigned by your router over DHCP.&lt;/p&gt;</description></item><item><title>Auto-start VirtualBox VMs (headless) after reboot on Mac OSX</title><link>https://ma.ttias.be/auto-start-virtualbox-vms-headless-after-reboot-on-mac-osx/</link><pubDate>Wed, 27 Nov 2019 00:00:00 +0000</pubDate><author>mattias@ma.ttias.be (Mattias Geniar)</author><guid>https://ma.ttias.be/auto-start-virtualbox-vms-headless-after-reboot-on-mac-osx/</guid><description>&lt;p&gt;I&amp;rsquo;ve got a Mac Mini at home to act as a server &amp;amp; desktop. On it there are several Virtual Box VMs, among which a &lt;a href="https://ma.ttias.be/pi-hole-dns-based-blacklist-ads-tracking-raspberry-pi/"&gt;a pihole to block unwanted requests via DNS&lt;/a&gt;
. It&amp;rsquo;s pretty vital these run at all time.&lt;/p&gt;</description></item><item><title>VirtualBox: Failed to open/create the internal network 'HostInterfaceNetworking-en0' (VERR_SUPDRV_COMPONENT_NOT_FOUND)</title><link>https://ma.ttias.be/virtualbox-failed-open-create-internal-network-verr-supdrv-component-not-found/</link><pubDate>Wed, 27 Nov 2019 00:00:00 +0000</pubDate><author>mattias@ma.ttias.be (Mattias Geniar)</author><guid>https://ma.ttias.be/virtualbox-failed-open-create-internal-network-verr-supdrv-component-not-found/</guid><description>&lt;p&gt;There&amp;rsquo;s an annoying little bug in VirtualBox that can cause your network config in the VM to become invalid after a reboot of your host Mac.&lt;/p&gt;</description></item></channel></rss>