Never Done: Zero-Downtime Deploys and the Road to OpenShift

This is the final part of the 10-part Musaned series.

Building Musaned was never just writing PHP. From day one I've also been the person who runs it: the Linux servers, the releases, the 2 a.m. questions. This closing post is about that side of the journey — and where it's heading next.

Deployment as a first-class feature

When you're a team of one, manual deployment is a tax on every improvement you want to ship. Worse, it adds fear — and fear makes you ship less often, which makes each release bigger and riskier. So automating deployment was one of the earliest investments: push, and the pipeline takes over.

Zero-downtime came next, because an internal platform that executives and business teams rely on cannot blink during working hours. The recipe is battle-tested rather than clever: each release is prepared side by side with the running one — dependencies installed, caches warmed — and traffic switches atomically only when the new release is fully ready. Queue workers restart gracefully so no job dies mid-flight; migrations are written to be backward-compatible so the previous release keeps working during the switch. If anything looks wrong, switching back is seconds, not a rebuild.

The payoff isn't technical elegance — it's behavioral. When releasing is free and safe, you release constantly. Small changes, quickly delivered, closely watched: that rhythm is what let one engineer keep an enterprise platform moving.

Why OpenShift, and why containers earn their keep here

The current chapter is moving Musaned onto OpenShift, and the preparation work is building proper Docker images. For most Laravel apps that's routine. For Musaned it's therapeutic — because of everything this series described: Oracle Instant Client, oci8, the Microsoft ODBC stack, sqlsrv. Every server that ever hosted Musaned needed that fragile dependency ritual performed on it.

In a container world, the ritual happens once, in a Dockerfile, reviewed and version-controlled. The image that passed testing is byte-for-byte the image that runs in production. "Works on my machine" stops being a sentence anyone says. Add OpenShift's scheduling, health checks, and rollouts, and the zero-downtime machinery I built by hand becomes something the platform simply provides.

From a team of one to technical leadership

Somewhere along this journey, a teammate joined, and my job quietly changed. The habits from the solo phase turned out to be the onboarding material: boring technology choices meant nothing exotic to explain; service-class boundaries meant clear places to start; automated deployment meant no tribal release knowledge to transfer. Leadership, I've found, is mostly making yourself unnecessary in as many places as possible — the code review, the architecture conversation, the "why is it built this way" documentation. The parts of the system I'm proudest of are the ones that no longer need me.

Never actually done

Musaned started in 2023 and is still in active development — not because it's unfinished, but because it succeeded. Every solved problem surfaces the next one; every team that gets self-service asks what else could work that way. Use cases never stopped coming in, and I've stopped expecting them to. A platform like this is never done, and that's the healthiest thing you can say about it.

If you've read the whole series — from the vendor quote that started everything, through Oracle and MSSQL trenches, queue design, Voucher Query, and a BPM tool built in a week for the CEO's office — thank you. And if you're standing where I stood in 2023, staring at a prohibitive quote and wondering whether to build: the honest answer is that it's harder than the blog posts make it look, and still worth it.

Leave a Reply

Your email address will not be published.

Navigation

Socials