When to Upgrade Your VPS: Signs You Have Outgrown It
How do you know when your side project has outgrown its cheap VPS? Here are the real signs to upgrade, and the ones that just mean fix your config first.
Upgrade your VPS when the box is genuinely constrained on a resource you cannot reclaim, not when something feels slow. The real signals are steady memory pressure with active swapping, CPU pinned during normal load rather than in spikes, disk that keeps filling despite cleanup, and latency that climbs with traffic even after you have tuned the app. Most "I need a bigger box" moments are actually a misconfiguration or a leak, and moving to a larger VPS just makes the same problem more expensive. Diagnose first, then upgrade.
How do I know my VPS is too small?
Look at what is actually saturated, over a normal week, not during a one-off spike. Four resources, four questions:
- Memory: is the box swapping regularly? Occasional swap is fine. Constant swapping means you are out of RAM and paying for it in latency. This is the most common real reason to upgrade, because Postgres and app processes both want memory.
- CPU: is it pinned near 100 percent during ordinary traffic, or only during brief bursts? Sustained saturation is a signal. Bursts are normal and not a reason to upgrade.
- Disk: is it filling faster than you can clean it, after you have turned on log rotation and cleared old Docker images? If cleanup keeps buying you room, it is a hygiene problem, not a capacity one.
- Latency: does response time climb as concurrent users rise, even after you have added the obvious database indexes? That is the box running out of headroom.
If two or more of these are steadily red under normal load, it is time. If it is one intermittent spike, it is not. Get these on a dashboard so you are reading data, not vibes, using the monitoring setup in self-host monitoring instead of Datadog.
Fix the config before you buy a bigger box
Half the time the fix is free. A memory-hungry Postgres with default settings will thrash on a small box until you tune its buffers. An app with N+1 queries will pin the CPU no matter how many cores you throw at it. A disk fills because nobody set up log rotation. Upgrading the VPS papers over all of these at a higher monthly cost, and the problem comes right back one size up.
Before you upgrade, do the cheap diagnostics. Find the slow queries and index them. Cap the memory each container is allowed so one process cannot starve the others. Turn on log rotation and prune unused images. Add a cache for the expensive read paths. This is the same discipline as sizing a VPS for your workload in the first place: match the resource to the actual work. Only after the config is clean and the box is still saturated do you have a real capacity problem.
Scale up first, scale out later
When you do need more, the right first move is almost always a bigger single box, not a fleet of small ones. Vertical scaling, more RAM and cores on one VPS, is dramatically simpler than going distributed. Your Compose stack moves over unchanged. There is no orchestration, no load balancer to configure, no shared-state problem to solve. You are still running the same simple thing, just on stronger hardware.
Distributed architecture is a big jump in operational complexity, and you should defer it until a single large box genuinely cannot keep up, which is further out than most side projects ever get. This is the same reason you don't need Kubernetes for the workloads people reach for it with. One well-sized box handles a surprising amount of real traffic.
Splitting the database out is often the smarter upgrade
There is a middle move between "bigger box" and "distributed fleet": move the database to its own VPS while the app stays put. If your box is memory-constrained because Postgres and the app are fighting over RAM, giving the database dedicated hardware fixes the specific bottleneck without a full re-architecture. I cover the tradeoff in should the database share the app's box or get its own.
The upgrade path, in order: tune the config, then scale the box up, then split the database out, then and only then consider going distributed. Each step is bigger than the last, so take the smallest one that solves your actual bottleneck. Running on HostSSH makes every one of these a deliberate choice you control, instead of an autoscaler quietly deciding for you and sending the bill. Upgrade on evidence, not on nerves.