Check if it fits Tell us what keeps taking extra work or getting delayed. We will check what, if anything, makes sense next, at no cost.
← All posts

Lean and Predictable Deploys on a Single VPS

I rebuilt how my site ships updates—smaller containers, faster deploys, safer defaults. Each change reduced friction until releases became routine instead of risky.

By Mirko Imperio Trotta

A sleek, modern cargo ship sailing across calm, glassy ocean waters under a clear blue sky. The ship carries neatly stacked containers arranged in an orderly grid. Some containers are subtly labeled with tech terms like ‘Docker’, ‘Next.js’, and ‘FastAPI’ in a modern, minimalist font. The overall color palette is cool and clean—shades of blue and gray with soft accents of orange or yellow. The image should evoke clarity, speed, and reliability. Style should be semi-realistic digital illustration or lightly stylized realism. High detail. 16:9 aspect ratio.

Context

If you’ve been following along, I’ve tightened deployments, made analytics compliant, moved publishing to real-time, and added human-in-the-loop approvals.

Now I’m pushing the same outcome from a different angle: keep the system light, fast, and controlled.

What changed

The site worked, but deploys felt heavy. Too many steps. Too much time. I rebuilt the images so they ship only what’s needed to run—nothing extra.

What that means in practice:

  • Updates that took minutes finish in seconds.
  • One identical artifact runs everywhere: dev, staging, production.
  • Releases are calm, reversible, and secure by default.

It’s less about tools and more about discipline: keep things identical, predictable, and easy to recover.

Implementation notes

  • Frontend: Next.js 15 multi-stage build on node:22-slim; final image ships .next/standalone.
  • Backend: Python multi-stage build on python:3.11-slim; deps baked in a build stage; runtime runs as non-root appuser (UID/GID 1001).
  • Config: One image per service; compose.production.yaml, compose.staging.yaml, and compose.override.yaml switch env/TAG and settings.
  • Cleanup next: remove leftover /app/content from the frontend image after full Sanity migration.

Why it matters

Lean process gives time back. Fewer surprises, lower cost, clear ownership. That scales from a one-person setup to a larger org.

What’s next

Trim migration leftovers and tighten runtime isolation. Small, steady steps that keep production calm.

In short

Less waste. More control. Same standard across environments.

Is recurring work behind the question?

Tell us what keeps happening in the free fit check. We will review whether Groundlens is the right next step.