a vps is a computer. you own it. stop crying. a manifesto.

A VPS costs six dollars a month. Six. You get root. You get SSH. You get a real Linux machine humming in a datacenter somewhere, quietly doing whatever you tell it, without asking you to configure an IAM role or agree to a 47-page pricing addendum. It just sits there. Patient. Reliable. Not charging you per invocation.

This post is about that. About the beautiful, unglamorous, deeply underrated fact that a server is just a computer, and you are allowed to use it like one.

The VPS does not care about your feelings or your Series A ambitions. It cares about uptime and whether your nginx.conf has a syntax error. This is the correct relationship to have with infrastructure.

// the scene of the crime

Picture this. A developer - let's call them you, three years ago - is building a side project. A small web app. Maybe 40 users. Maybe 10 on a good day. And they are on AWS. They have: EC2, RDS, ElastiCache, SQS, SNS, API Gateway, Lambda, CloudFront, Route 53, Cognito, WAF, CloudWatch, a VPC with three subnets, and what appears to be a NAT Gateway that costs $32/month doing absolutely nothing.

The bill is $340 last month. The app has seventeen active users. One of them is their mom. Three are bots. The developer is not sleeping. They have a Notion doc titled "cost optimization" that they have opened forty times and closed immediately.

I have seen, with my own eyes, a person configure AWS Step Functions for a form that sends an email. A single email. On submit. To one address. There was an SQS queue involved. There was a Lambda for validation and a separate Lambda for the send. There was a DLQ. The DLQ had an alarm. THE ALARM HAD A BUDGET. The email was for a contact form on a portfolio website. The website had a Wix alternative available for free.

// what a vps actually gives you

A VPS gives you a machine. A real one. It has CPUs. It has RAM. It has a disk. It has a network interface. You SSH into it and you are the root user. You can install anything. You can run anything. You can configure the kernel if you're in that kind of mood. Nobody is watching. Nobody is charging you per request. The machine does not know what a "serverless function" is and it is better for it.

$ ssh deploy@my-server.whatever
Welcome to Ubuntu 24.04 LTS
Last login: 6 hours ago (you were sleeping like a normal person)

$ uptime
09:14:02 up 247 days, 3:21, load average: 0.04, 0.05, 0.01

$ docker compose ps
NAME STATUS PORTS
web Up 247 days 0.0.0.0:80->3000/tcp
db Up 247 days (healthy)
redis Up 247 days (healthy)

# everything is fine. it has been fine for 247 days.
# nobody paged you. nobody will page you. go make coffee.

That is it. That is the whole thing. It is running. It has been running. It will continue running until you make it stop or the datacenter floods.

// the unicorn arithmetic problem

Here is the logic that gets people into trouble. They think: "What if we get TechCrunch'd? What if we suddenly have a million users? What if we need to scale to handle the load?"

Here is the counter-logic: you will not get a million users. Not this week. Possibly not ever. And if you somehow do, you will have so much money and so many engineers by then that "we have to migrate off a VPS" is a genuinely great problem to have.

SCENARIO VPS ($6/mo) THE CLOUD (arbitrary)
Side project, 50 users $6/mo. Done. $80-$340/mo. NAT Gateway crying somewhere.
Deploy a new version git pull && docker compose up -d CodePipeline -> CodeBuild -> ECR -> ECS -> 18 min -> pray
Check what's running docker ps 6 CloudWatch dashboards, 2 of which are wrong
Debug an issue at 2am tail -f /var/log/app.log CloudWatch Logs Insights, $0.005/GB scanned, crying
Actual scale needed Upgrade the VPS. $12/mo. Problem solved. Technically possible. Spiritually costly.
5-minute outage ssh in. fix it. done. Create incident. Update status page. Write postmortem. Attend retro. Assign 3 Jira tickets to "reduce blast radius".

// the actual stack. the one that works.

Here is what works. Here is what has worked for a decade and will continue working after whatever the next cloud trend is:

VPS (any provider - $4-12/mo)
- Ubuntu LTS. boring. stable. documented everywhere.

Docker + Docker Compose
- your app is a container. compose defines the whole thing.
- one file. version controlled. reproducible.

nginx (reverse proxy)
- routes traffic and terminates https
- let's encrypt made ssl certificates free in 2015 (mainstream by 2016)
- no need to pay $100+/year for a basic cert anymore

Postgres (local or managed, your call)
- runs in a container. back up with pg_dump. done.

A cron job or two
- crontab -e. not a Lambda. not an EventBridge rule.
- just a cron job. like it's 1988 and things were fine.

TOTAL: ~$8/mo. SERVICES: 1. SLEEP QUALITY: restored.

Nginx started in 2004, but free automated TLS is a 2015/2016 Let's Encrypt story.

// closing argument

The cloud is not bad. The cloud is good for things the cloud is good for. Managed databases when you do not want to be a DBA, CDNs, and large-scale object storage.

But a blog, a side project, a small SaaS with forty paying customers, an internal dashboard, or a portfolio with a contact form does not need 200 AWS services.

Rent the machine. SSH into it. Enjoy the fact that it is just a computer and you are in charge of it.


// filed under: things that are obvious in retrospect · written during a $0.00 outage · no NAT Gateways were harmed in the production of this post