Skip to content
Martin Aziz®

Playbook / 01

The architecture

The same shape for every client, one dedicated server, a single proxy, isolated apps. Predictable on day one, predictable on day eight hundred.

Public request

Internet → Cloudflare

:80 / :443

Kamal Proxy

TLS via Let's Encrypt

  • vault.<domain>

    Vaultwarden

  • docs.<domain>

    ONLYOFFICE DocSpace

  • <domain>, www.<domain>

    Your site or app

One dedicated Hetzner server per client. Apps run as Docker containers; they share a host, not state.

We deploy every client to the same shape. Not because we lack imagination, because predictability is a feature, and a fleet of one-off snowflake servers is the opposite of reliable.

One client, one server

Every client gets their own Hetzner dedicated machine. Single-tenant. No shared resources with other clients. No “private namespace” in a multi-tenant cluster. The server’s IP, hostname, disk, and CPUs belong to one company.

This is what we mean by self-hosted. It’s also what makes a clean exit possible: when an engagement ends, we hand over root credentials, the data, the backups, the configuration repo, and walk away. Nothing about the architecture forces a re-platforming if a client decides to operate the server themselves.

A single ingress, isolated apps

Kamal Proxy owns the public ports (80 and 443). It terminates TLS via Let’s Encrypt and routes by Host header to whichever application is responsible for that subdomain:

  • vault.<domain> → Vaultwarden (password management)
  • docs.<domain> → ONLYOFFICE DocSpace (documents and collaboration)
  • <domain> and www.<domain> → the client’s site or application

Apps run as Docker containers. They don’t see each other’s ports. They share a host, not state. If one app needs to be restarted, the others don’t notice.

Why this shape

It’s debuggable. When something is wrong, the topology fits in one diagram. The path from a public request to an app container is three hops, not thirty.

It’s portable. The whole shape is a few Docker containers, a few configuration files, and a backup. Every piece is open source. If we hand a server to a new operator, they have what they need.

It’s small. Most outages happen at the boundaries between systems. Fewer boundaries, fewer outages. We’ve deliberately chosen a topology that one engineer can hold in their head.

It’s the same as ours. We don’t run a different shape internally. The marketing site you’re reading right now, our project management, our password vault, they all run on the architecture described on this page.

Next in the playbookThe stack

Get in touch

Want the same operational discipline applied to your business?

Tell us where you are now. We'll come back with a concrete plan using exactly the architecture, stack, and process you've just read about.

What to expect

  1. 01We read every inquiry within one business day.
  2. 02A candid reply with follow-ups, no boilerplate.
  3. 03If there's a fit, we scope the work on a short call.