Tackling complex bugs and building reliable systems that actually work.

Seasoned engineer with a passion for solving tough problems and building reliable, scalable systems.

Docker Shell Tricks

Overview One of my all time favorite tricks when working with Docker. Getting information on or performing an action on multiple containers with similar naming schemes. Passing the –filter name= flag allows for fuzzy matching. docker container ps -q returns only container ids by default and is perfect for combining with commands like docker container stop or docker container rm. Of course if you are using docker compose, simply running docker compose down will accomplish the same thing. ...

June 18, 2025 · 3 min · 571 words · Mike Conrad

IaC (Infrastructure as Complexity?)

Why do IaC? (Or Infstructure as Complexity) This is a question I have thought a lot about lately. I have personally wrestled with it quite a bit as I grow in my career. While I certainly recognize the many benefits of IaC, I was having trouble justifiying why a small team or individual should adopt this approach. After all, it does introduce overhead and complications. It introduces somewhat specialized workflows, processes and tooling, plus the configs tend to be pretty verbose. ...

April 24, 2025 · 5 min · 1052 words · Mike Conrad

Quickly Convert Webflow to Static Site

I recently ran into a situation where a small site that I help manage went offline. I got the dreaded text on a Sunday morning as I was on my way to a coffee shop to focus on some side projects. The site is built/hosted on Webflow so my first suspicion was a billing issue. As soon as I got to the coffee sshop I logged into the Webflow dashboard to find out what was going on. ...

February 23, 2025 · 5 min · 879 words · Mike Conrad

Playwright Intellisense Issues Vscode

I maintain a number of Playwright tests for work and recently ran into a frustrating issue. I set up my new desktop recently and everything was running great but I was having issues getting intellisense to work for my Playwright stuff. At the top of all of my tests I was getting the dreaded: Cannot find module '@playwright/test' or its corresponding type declarations.ts(2307) error when hovering over: import { expect, test } from '@playwright/test'; I did a bunch of searches online that mention making sure Playwright is installed properly using npx playwright install. In my case I knew everything was set up and we use yarn workspaces for our project anyway. Well fortunately all of this was working on my Thinkpad so I started trying to compare everything. I had the Playwright extension installed already. I use VSCodium instead of VSCode but that doesn’t matter in this case. Then I wondered if maybe, just maybe it was a TypeScript issue so I looked at the version running on my Thinkpad. It was an older version than what was running on my desktop. I switched it on my desktop to use the workspace version and voila, everything started working! ...

January 18, 2025 · 2 min · 274 words · Mike Conrad

Standing up a Wireguard VPN

VPN’s have traditionally been slow, complex and hard to set up and configure. That all changed several years ago when Wireguard was officially merged into the mainline Linux kernel (src). I won’t go over all the reasons for why you should want to use Wireguard in this article, instead I will be focusing on just how easy it is to set up and configure. For this tutorial we will be using Terraform to stand up a Digital Ocean droplet and then install Wireguard onto that. The Digital Ocean droplet will be acting as our “server” in this example and we will be using our own computer as the “client”. Of course, you don’t have to use Terraform, you just need a Linux box to install Wireguard on. You can find the code for this tutorial on my personal Git server [here](https://git.hackanooga.com/Mike Conrad/wireguard-terraform-digitalocean). ...

September 25, 2024 · 10 min · 2080 words · Mike Conrad

Hardening your web server by only allowing traffic from Cloudflare

TDLR: If you just want the code you can find a convenient script on my Gitea server [here](https://git.hackanooga.com/Mike Conrad/random_scripts/src/branch/master/allow_only_cloudflare_traffic.sh). This version has been slightly modified so that it will work on more systems. I have been using Cloudflare for several years for both personal and professional projects. The free plan has some various gracious limits and it’s a great way to clear out some low hanging fruit and improve the security of your application. If you’re not familiar with how it works, basically Cloudflare has two modes for DNS records. DNS Only and Proxied. The only way to get the advantages of Cloudflare is to use Proxied mode. Cloudflare has some great documentation on how all of their services work but basically what happens is that you are pointing your domain to Cloudflare and Cloudflare provisions their network of Proxy servers to handle requests for your domain. ...

August 1, 2024 · 3 min · 462 words · Mike Conrad

SFTP Server Setup for Daily Inventory File Transfers

Job Description We are looking for an experienced professional to help us set up an SFTP server that will allow our vendors to send us inventory files on a daily basis. The server should ensure secure and reliable file transfers, allowing our vendors to easily upload their inventory updates. The successful candidate will possess expertise in SFTP server setup and configuration, as well as knowledge of network security protocols. The required skills for this job include: ...

July 16, 2024 · 2 min · 237 words · Mike Conrad

Debugging running Nginx config

I was recently working on project where a client had cPanel/WHM with Nginx and Apache. They had a large number of sites managed by Nginx with a large number of includes. I created a custom config to override a location block and needed to be certain that my changes where actually being picked up. Anytime I make changes to an Nginx config, I try to be vigilant about running: nginx -t to test my configuration and ensure I don’t have any syntax errors. I was looking for an easy way to view the actual compiled config and found the -T flag which will test the configuration and dump it to standard out. This is pretty handy if you have a large number of includes in various locations. Here is an example from a fresh Nginx Docker container: ...

July 16, 2024 · 3 min · 567 words · Mike Conrad

Fun with bots - SSH tarpitting

For those of you who aren’t familiar with the concept of a network tarpit it is a fairly simple concept. Wikipedia defines it like this: A tarpit is a service on a computer system (usually a server) that purposely delays incoming connections. The technique was developed as a defense against a computer worm, and the idea is that network abuses such as spamming or broad scanning are less effective, and therefore less attractive, if they take too long. The concept is analogous with a tar pit, in which animals can get bogged down and slowly sink under the surface, like in a swamp. ...

June 24, 2024 · 8 min · 1686 words · Mike Conrad

Traefik 3.0 service discovery in Docker Swarm mode

I recently decided to set up a Docker swarm cluster for a project I was working on. If you aren’t familiar with Swarm mode, it is similar in some ways to k8s but with much less complexity and it is built into Docker. If you are looking for a fairly straightforward way to deploy containers across a number of nodes without all the overhead of k8s it can be a good choice, however it isn’t a very popular or widespread solution these days. ...

May 11, 2024 · 3 min · 612 words · Mike Conrad