<?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>Thu, 15 Oct 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>From laravel-echo-server to laravel-websockets to Laravel Reverb</title><link>https://ma.ttias.be/from-laravel-echo-server-to-laravel-websockets-to-reverb/</link><pubDate>Thu, 15 Oct 2026 00:00:00 +0000</pubDate><author>mattias@ma.ttias.be (Mattias Geniar)</author><guid>https://ma.ttias.be/from-laravel-echo-server-to-laravel-websockets-to-reverb/</guid><description>&lt;p&gt;&lt;em&gt;This post replaces &amp;ldquo;Transitioning from Laravel Echo Server to Laravel WebSockets&amp;rdquo;, which I wrote for the &lt;a href="https://ohdear.app/news-and-updates?utm_source=ma.ttias.be&amp;amp;utm_medium=referral&amp;amp;utm_campaign=blogpost-from-laravel-echo-server-to-laravel-websockets-to-reverb" target="_blank" rel="noopener noreferrer"&gt;Oh Dear blog&lt;/a&gt;
on 4 December 2018. The full 2018 story is below. I added what happened to both packages since, what Oh Dear runs today, and how I&amp;rsquo;d set this up in 2026 with Laravel Reverb.&lt;/em&gt;&lt;/p&gt;</description></item><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?utm_source=ma.ttias.be&amp;amp;utm_medium=referral&amp;amp;utm_campaign=blogpost-linux-debugging-tools-i-use-daily" 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>Improvements to our status pages as we tackle a DDoS</title><link>https://ma.ttias.be/improvements-to-our-status-pages-as-we-tackle-a-ddos/</link><pubDate>Thu, 14 May 2026 00:00:00 +0000</pubDate><author>mattias@ma.ttias.be (Mattias Geniar)</author><guid>https://ma.ttias.be/improvements-to-our-status-pages-as-we-tackle-a-ddos/</guid><description>&lt;p&gt;&lt;em&gt;This post was originally published on the &lt;a href="https://ohdear.app/news-and-updates?utm_source=ma.ttias.be&amp;amp;utm_medium=referral&amp;amp;utm_campaign=blogpost-improvements-to-our-status-pages-as-we-tackle-a-ddos" target="_blank" rel="noopener noreferrer"&gt;Oh Dear blog&lt;/a&gt;
on 14 May 2026. I moved it to my own blog in October 2026.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>The effects of the Cloudflare outage on Oh Dear</title><link>https://ma.ttias.be/the-effects-of-the-cloudflare-outage-on-oh-dear/</link><pubDate>Wed, 19 Nov 2025 00:00:00 +0000</pubDate><author>mattias@ma.ttias.be (Mattias Geniar)</author><guid>https://ma.ttias.be/the-effects-of-the-cloudflare-outage-on-oh-dear/</guid><description>&lt;p&gt;&lt;em&gt;This post was originally published on the &lt;a href="https://ohdear.app/news-and-updates?utm_source=ma.ttias.be&amp;amp;utm_medium=referral&amp;amp;utm_campaign=blogpost-the-effects-of-the-cloudflare-outage-on-oh-dear" target="_blank" rel="noopener noreferrer"&gt;Oh Dear blog&lt;/a&gt;
on 19 November 2025. I moved it to my own blog in October 2026.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Running our test suite in parallel on GitHub Actions</title><link>https://ma.ttias.be/running-our-test-suite-in-parallel-on-github-actions/</link><pubDate>Wed, 23 Apr 2025 00:00:00 +0000</pubDate><author>mattias@ma.ttias.be (Mattias Geniar)</author><guid>https://ma.ttias.be/running-our-test-suite-in-parallel-on-github-actions/</guid><description>&lt;p&gt;&lt;em&gt;Freek Van der Herten wrote this post for the &lt;a href="https://ohdear.app/news-and-updates?utm_source=ma.ttias.be&amp;amp;utm_medium=referral&amp;amp;utm_campaign=blogpost-running-our-test-suite-in-parallel-on-github-actions" target="_blank" rel="noopener noreferrer"&gt;Oh Dear blog&lt;/a&gt;
, where it was published on 23 April 2025. It moved to this blog in October 2026. Freek also published this on &lt;a href="https://freek.dev/2843-running-php-tests-in-parallel-on-github-actions" target="_blank" rel="noopener noreferrer"&gt;freek.dev&lt;/a&gt;
.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A couple of years ago, Laravel introduced a great feature which allows to run PHPUnit / Pest tests in parallel. This results in a big boost in performance.&lt;/p&gt;
&lt;p&gt;First we had to do the groundwork: &lt;a href="https://ma.ttias.be/making-our-laravel-test-suite-ready-for-parallel-testing/"&gt;getting our Laravel suite ready for parallel testing&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;By default, it determines the concurrency level by taking a look at the number of CPU cores your machine has. So, if you&amp;rsquo;re using a modern Mac that has 10 CPU cores, it will run 10 tests at the same time, greatly cutting down on the time your testsuite needs to run completely.&lt;/p&gt;
&lt;p&gt;A default runner on GitHub doesn&amp;rsquo;t have that many cores, so you can&amp;rsquo;t leverage parallel testing as good as in your typical local environments.&lt;/p&gt;
&lt;p&gt;In this blog post, I&amp;rsquo;d like to show you a way of running your tests on GitHub, by splitting them up in small chunks that can run concurrently. We use this technique to cut down the running time of our vast testsuite from 16 minutes to only just 4. In this blog post all examples will come from our base.&lt;/p&gt;</description></item><item><title>PHP's CPU usage dropped nearly 40% after upgrading to Ubuntu 22.04</title><link>https://ma.ttias.be/php-cpu-usage-after-upgrading-ubuntu-2004-to-2204/</link><pubDate>Wed, 28 Feb 2024 00:00:00 +0000</pubDate><author>mattias@ma.ttias.be (Mattias Geniar)</author><guid>https://ma.ttias.be/php-cpu-usage-after-upgrading-ubuntu-2004-to-2204/</guid><description>&lt;p&gt;&lt;em&gt;This post was originally published on the &lt;a href="https://ohdear.app/news-and-updates?utm_source=ma.ttias.be&amp;amp;utm_medium=referral&amp;amp;utm_campaign=blogpost-php-cpu-usage-after-upgrading-ubuntu-2004-to-2204" target="_blank" rel="noopener noreferrer"&gt;Oh Dear blog&lt;/a&gt;
on 28 February 2024. I moved it to my own blog in October 2026.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>How to upgrade Ubuntu LTS: from 20.04 to 22.04, 24.04 and 26.04</title><link>https://ma.ttias.be/how-to-upgrade-ubuntu-lts/</link><pubDate>Tue, 20 Feb 2024 00:00:00 +0000</pubDate><author>mattias@ma.ttias.be (Mattias Geniar)</author><guid>https://ma.ttias.be/how-to-upgrade-ubuntu-lts/</guid><description>&lt;p&gt;&lt;em&gt;This post was originally published on the &lt;a href="https://ohdear.app/news-and-updates?utm_source=ma.ttias.be&amp;amp;utm_medium=referral&amp;amp;utm_campaign=blogpost-how-to-upgrade-ubuntu-lts" target="_blank" rel="noopener noreferrer"&gt;Oh Dear blog&lt;/a&gt;
on 20 February 2024. I moved it to my own blog in October 2026 and rewrote it to cover every LTS hop up to 26.04.&lt;/em&gt;&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></channel></rss>