The right level of orchestration, not the most impressive one
Container orchestration suffers from one recurring flaw: the solution chosen often reflects the fashion of the moment rather than the actual workload. A three-node Kubernetes cluster to host a brochure site and two internal APIs is a permanent operations bill for a problem you don’t have.
We reason the other way round, starting from what you actually need.
Docker and Docker Compose — the foundation
For a single application or a handful of connected services, a docker compose stack on a properly sized server remains the clearest and most economical answer. Each service is a versioned image, the configuration lives in a readable file, and a newcomer understands the whole thing in ten minutes. With Traefik in front for routing and automatic TLS certificates, this architecture comfortably handles the load of most business applications.
The caveat: a single server is still a single point of failure. That’s acceptable for plenty of internal workloads; it stops being acceptable the moment downtime costs money by the hour.
Docker Swarm — pragmatic high availability
Swarm adds what Compose lacks without changing its concepts: multiple nodes, automatic container placement, restart on another host when one fails, rolling updates with rollback, and an encrypted network between machines. Your deployment files stay close to the ones you already know.
This is our default recommendation as soon as availability matters: the operational gain is real, and the running cost stays proportionate to a small or mid-sized company.
Kubernetes — when scale justifies it
Kubernetes brings horizontal autoscaling, fine-grained resource management, a granular security model (RBAC, NetworkPolicies), and an operator ecosystem that automates the running of complex components — databases, message queues, certificates. The price is a markedly more demanding operational load: cluster upgrades, storage, observability, and a team that has to climb the learning curve.
We deploy and operate it when the need is real: variable traffic, several teams, strict isolation between environments, or a genuine autoscaling constraint.
Infrastructure as code, not as folklore
A server configured by hand is a one-off: nobody knows exactly what it contains, and it becomes irreplaceable — which is precisely the problem.
We describe infrastructure in versioned files: provisioning with Terraform or Ansible, application deployments in Git, networking and TLS configuration included. Three direct consequences: the platform can be rebuilt identically after a disaster, every change is traced and reviewed, and you retain a complete description of your own system.
What we host
Web applications and business APIs, back offices and customer portals, open-source ERP and CRM systems (Dolibarr, Odoo), PostgreSQL and MariaDB databases, brochure and static sites, internal tools, Git forges and CI runners, monitoring platforms. If it runs in a container — or can be made to — we know how to operate it.