Skip to main content
Back to Blog
Four Clouds in Three Years: What Running a Side Project Actually Costs

Four Clouds in Three Years: What Running a Side Project Actually Costs.

EventSpotterInfrastructureAWSAzureHetznerCloud Costs
Andreas Schöngruber

Andreas Schöngruber

April 2, 2026·8 min read

I woke up one morning to find my hobby project had cost me $159.79 overnight. A one-line bug, an infinite loop, 238 GB written to CloudWatch while I slept. AWS refunded it. But that morning changed how I think about cloud infrastructure for side projects.

EventSpotter has run on four different infrastructure setups over three years: AWS, early Azure on free tiers, a full Azure rebuild on startup credits, and now Hetzner. Each switch made sense at the time, for reasons that were usually pretty mundane. I was learning something, it was cheaper, the free tier expired, the credits ran out. No grand plan, just a side project evolving alongside whatever I happened to be working on professionally.

The right infrastructure for a side project isn't determined by best practices. It's determined by what stage you're at. Here's the honest version of how it went, what each setup cost, and what I'd tell someone in a similar situation.


The Project, Briefly

EventSpotter is an event aggregation platform covering Austrian cities. It scrapes events from venues and organizers, tags them by category, and gives people one place to find what's on instead of checking five different venue websites. About 3,000 people use it every month. It's a Spring Boot backend, a Next.js frontend, a PostgreSQL database, and a headless Chrome instance for scraping event pages that don't expose clean data.

It started as something I was building for myself. Friends encouraged me to make it public, and that changed things. Suddenly uptime mattered a bit more, and so did having infrastructure that wouldn't fall over.


AWS (2022)

I started on AWS because I was interested in it. I managed everything with Terraform: ECS Fargate, DynamoDB, S3, CloudFront, Route 53. EventSpotter didn't need any of it. But I wanted to learn how these things worked, and a side project is a reasonable place to do that.

The setup was almost certainly overengineered for what it was. But it ran on Fargate Spot (0.5 vCPU, 1 GB), the frontend was a static export on S3 + CloudFront, and DynamoDB sat comfortably within the free tier. Route 53 cost $0.50 a month for the hosted zone.

Normal monthly bill: ~$4–6.

Then one night I deployed a small change, went to sleep, and woke up to $159.79 in charges. A one-line bug created an infinite log loop that wrote 238 GB to CloudWatch overnight. I wrote the full story in another post. AWS refunded the charges in the end, which was generous of them.

The cost on a normal month was completely fine. What stayed with me: no hard cap anywhere. One bug, one missed alert, and the bill goes up by 30x. For something I wasn't watching around the clock, that risk felt unnecessary. I was also switching the backend to proper Spring Boot and needed a relational database anyway, so the CloudWatch scare just accelerated an inevitable move.


Early Azure (2023)

I was doing a lot of Azure work in my day job at MIC Datenverarbeitung at this point, so switching made sense on multiple levels. I knew the platform, I'd get more useful practice out of it, and it was cheaper than AWS for what I needed.

The backend went onto App Service B1 (1 vCPU, 1.75 GB RAM, ~€12/month). I needed it running 24/7, so the free F1 tier with its CPU quotas was never really an option. The database was the cheap part: Azure PostgreSQL Flexible Server has a 12-month free tier on the B_Standard_B1ms (1 vCPU, 2 GB), which covered the first year entirely.

Sometime in mid-2023 I moved the frontend to Vercel, which was simpler than managing it separately. That was essentially free (Vercel's free tier covers small projects well enough).

Chrome can't run on Azure App Service due to sandboxing restrictions, so I spun up a Hetzner CX22 (2 vCPU, 4 GB RAM, €4.49/month) to handle scraping remotely. That box has been running ever since.

Service Monthly
Azure App Service B1 (1 vCPU, 1.75 GB) ~€12
Azure PostgreSQL Flexible Server B1ms €0 (12-month free tier)
Vercel (frontend) €0
Hetzner CX22 (remote Chrome) €4.49
Hetzner DNS €0
Domains (×2) ~€2
Total ~€15/month

I also moved DNS to Hetzner during this period. Their DNS is free; Route 53 charged $0.50/month per hosted zone.

After about a year the free database tier expired and the B1ms went to ~€13/month. The bill crept up to around €35/month.

That's when I applied to the Azure for Startups program and got in.


Azure Startup Program (early 2025)

The program came with up to $150,000 in credits over 4 years and access to Azure OpenAI, which I'd been wanting to try for generating event captions. It was a good excuse to rebuild the infrastructure properly and work through parts of Azure I hadn't touched yet.

The stack grew into something I was genuinely happy with:

Service Rack rate/month
Azure App Service P1v3 (2 vCPU, 8 GB) ~€100
Azure App Service deployment slot (frontend) €0 (included)
Azure PostgreSQL Flexible Server B2s + P6 storage ~€130
Azure Key Vault ~€0
VNet + private DNS zone ~€0
Azure OpenAI S0 (GPT-4o-mini, usage-based) ~€1–5
Azure Function (consumption plan) ~€0
Azure Blob Storage ~€0
Azure Email Communication €0
Microsoft Defender for Cloud €10+
Hetzner CX22 (remote Chrome) €4.49
Domains (×2) ~€2
Rack rate total ~€250/month
What I actually paid ~€6–7/month

The rack rate of all this was somewhere around €250/month. What I actually paid: just the CX22 and the domains. Credits covered everything else.

I learned a lot building this. VNet integration, private DNS zones, Key Vault references in App Service, Azure Functions, the OpenAI API. Things I wouldn't have had a reason to use otherwise. That part was worth it regardless of what came next.

Microsoft discontinued the program before I'd used my full allocation, and my credits had a hard end date. Once the date was clear, the math was obvious: move to Hetzner.


Hetzner (today)

When the credits ran out, the numbers made the decision for me. A Hetzner CPX32 (4 vCPU, 8 GB RAM) costs €13.99/month. Azure App Service P1v3 (2 vCPU, 8 GB) costs roughly €130/month without credits. On a project that generates no revenue, that gap is impossible to justify.

Everything that could move to Hetzner, moved. The things still on Azure are either free-tier or covered by the remaining credits.

The current setup:

Service Monthly
Hetzner CPX32 (4 vCPU, 8 GB, 160 GB SSD) — backend, frontend, PostgreSQL, Traefik €13.99
Hetzner CX22 (remote Chrome) €4.49
Hetzner Block Storage 10 GB (PostgreSQL volume) €0.52
Azure OpenAI (remaining credits until mid-May 2026) €0 for now
Azure Function + Blob Storage (image resizing) ~€0
Azure Email Communication €0
Hetzner DNS €0
Domains (×2) ~€2
Total ~€21/month

Everything runs in Docker Compose. Traefik handles reverse proxying and TLS termination via Let's Encrypt. GitHub Actions pushes deployments over SSH.

After the credits expire, Azure OpenAI at current usage (a few hundred captions a month) will cost a few euros at most. The total stays around €21–24.


What I'd Tell Someone Starting This

The free tier clock starts immediately. The 12-month free PostgreSQL database is a genuinely good deal, but it expires whether you're watching or not. Know when your free tiers end before they do, not after the first paid invoice.

Startup programs are worth applying to. The credits let me run infrastructure and build features I'd have put off indefinitely. Even if the program gets discontinued mid-way through, the time you spend on it isn't wasted. Apply while they're available, because availability isn't guaranteed.

Managed services have a per-hour cost that adds up fast at zero revenue. App Service P1v3 makes sense if you're serving paying customers. On a free side project it's hard to justify. The habit I've built: check the hourly rate, multiply by 730, and ask whether that number makes sense for where the project actually is.

A single VPS is the right call at this scale. Running everything on one CPX32 means a server outage takes everything down. For 3,000 monthly users and no SLA, that's fine. The block storage volume means PostgreSQL data survives a rebuild, and a working deployment pipeline means recovery takes minutes.

The obvious counter-argument is that managed services don't just buy uptime, they buy back your time. You don't babysit a managed database. You don't debug Traefik configs at midnight. That's a real cost that doesn't show up in a monthly bill. My honest answer: for a project I'm actively developing, the ops overhead is fine because I'm in the code anyway. If EventSpotter were in pure maintenance mode, I'd think harder about it. Know what you're trading before you assume cheaper is always better.

Using cloud infrastructure is how you learn it. I wouldn't have a real understanding of ECS, App Service, VNet integration, or Azure Functions without having run them on something real. A side project is a low-stakes place to get that experience. The cost was real but reasonable for what I got out of it.

€21 a month is a bill I'll happily pay for my side project.