Blog

Building a GitHub to Gitea Migration Tool

giteagithubbashautomationself-hostedtutorial

I run a self-hosted Gitea instance for my personal projects. Recently, I decided to import a bunch of repositories from GitHub - both my own and some open-source projects I reference frequently.

Doing this manually through Gitea’s UI is tedious. One repo at a time, fill out a form, wait, repeat. For 20+ repos, that’s a lot of clicking.

So I built a script to automate it. Here’s how.

The Goal

I wanted a tool that could:

Debugging a 100% CPU Bug in Production: A Mautic Worker Post-Mortem

mauticdebuggingdockermonitoringpost-mortem

Last night, my phone buzzed with a Grafana alert:

ContainerHighCPU
container: mautic-worker
host: launchstacks-server
cpu: 99.90%
severity: warning

The mautic-worker container was pinned at 100% CPU. Here’s how I debugged it and the surprisingly simple fix.

The Investigation

First, I confirmed the alert was accurate:

$ ssh clowe@192.168.50.10 'sudo docker stats --no-stream | grep mautic'

NAME              CPU %     MEM USAGE / LIMIT
mautic-worker     99.44%    161.5MiB / 512MiB
mautic-web        0.00%     179.6MiB / 15.52GiB
mautic-cron       0.00%     38.16MiB / 15.52GiB
mautic-db         0.11%     170.2MiB / 15.52GiB

Yep. The worker was maxed out while everything else was idle. Let’s check the logs:

Why I Self-Host My Marketing Stack (And Why You Might Not Want To)

self-hostedmarketing-automationmauticopinioncost-analysis

I run my entire marketing stack on a server in my basement. Email campaigns, landing pages, analytics, workflow automation - all self-hosted. When I tell other developers this, the reaction is usually one of two things:

  1. “That’s awesome, I should do that!”
  2. “That sounds like a nightmare, why would you do that?”

Both reactions are valid. Here’s my honest take.

The Financial Case

Let’s start with money, because that’s usually what sparks the conversation.

Cloudflare Tunnels: Secure External Access Without Port Forwarding

cloudflaretunnelssecuritynetworkinginfrastructuretutorial

You’ve built something useful. Maybe it’s a dashboard, an automation platform, or an internal tool. Now you want to access it from anywhere, or share it with your team. The question every infrastructure person hits: how do I expose this without making my security posture worse?

The traditional answers all have tradeoffs. Port forwarding punches holes in your firewall and exposes your IP. Dynamic DNS is fragile and still requires open ports. VPNs work but add friction for every connection, and good luck getting non-technical users to set one up.

Welcome to LaunchStacks

announcementself-hostedhomelabdevopsopen-source

I’ve spent the last several years learning infrastructure, DevOps, software development, and security, figuring out how all the pieces tie together. The homelab came later. I only started keeping services persistent this year, but the foundation was years of tinkering, breaking things, and understanding how systems actually work.

The pivotal moment was discovering Terraform and infrastructure as code. Instead of pointing and clicking through consoles or manually typing out configs after every install, I could declare what I wanted and let the tooling figure out how to get there. That changed everything for me. I fell in love with architecture and infrastructure in a way I hadn’t expected.