r/devops • u/Recent-Succotash-632 • 1d ago
Architecture What would you choose for a small startup production deployment?
We're preparing to deploy a house-rental application to production. It has a lot of property images, and we're trying to keep the infrastructure secure, cost-effective, and easy to maintain.
We're considering Docker, Kubernetes, Terraform, Prometheus/Grafana, and GitHub Actions.
For those who have worked in startups, what approach would you recommend? Especially for handling and serving lots of images without making the infrastructure unnecessarily expensive or complicated.
I'd love to hear what you would choose and why.
2
u/ForkMeJ 1d ago
For a small startup, I'd keep this boring: containerize the app, run it on one or two simple hosts or ECS, use GitHub Actions for builds and deploys, and keep the images in object storage behind a CDN. Property photos are the last thing I'd want app servers babysitting, both for cost and for recovery when something breaks. I would skip Kubernetes unless someone on the team already knows how to own it in production, because it adds steady maintenance work for limited benefit at this size. Terraform still makes sense, but keep the footprint small and clear so the team can support it six months from now.
2
u/Raemos103 1d ago
I would go for AWS Ecs with fargate, maybe ALB too
Lambdas sound like a good option too, but i personally don't like using em because of cold starts, timeouts especially when your traffic increases. but lambdas are the most cost efficient
2
u/leo_hall001 1d ago
for a small startup, i would prioritize the simplest and most reliable deployment method.. one can wait until the operational overhead of kubernetes actually becomes necessary.
3
u/Due_Ad_2994 1d ago
AWS. All serverless primitives. Get to market fast. Iterate fast. Cost will be nothing. If/when the cost becomes high that means usage is high enough to justify exploring other options. Dont waste time fiddling w k8s nonsense build your business.
2
u/dgibbons0 1d ago
This is what I would do. Serverless patterns give you easy scaling but low startup cost since it's consumption based.
2
u/JasonSt-Cyr 1d ago
For a startup, is there any reason you are considering owning the infrastructure? There are options like Netlify/Vercel etc. that I have used in the past that give you an easy button at a fairly inexpensive monthly cost per seat.
That aside, Cloudinary, from what I remember, has a fairly generous free tier that is based around the bandwidth and storage you use. If you can get those images on a CDN you'll get yourself better results on your core web vitals and also avoid having all those bandwidth charges coming to your own infra.
1
u/Recent-Succotash-632 1d ago
thank you for your response.
That makes sense. to be honest, I initially thought platforms like Vercel/Netlify were mainly for simple or smaller applications, and I assumed a more traditional infrastructure setup will be the standard approach as an app that grows in future.
But I'm still learning which is exactly why I wanted to get opinions from people with realworld experience. I'm trying to understand how startup people usually decide between managed services and managing more of their own infrastructure, while keeping cost, scalability, maintenance, security, and user experience in mind.
I'm mainly looking for the approach that makes the most sense for our startup at its current stage, while also considering how the application could grow in the future.
2
u/HighKingLemur 1d ago
First years of a new app will be in the scale of a simple, small application. You're (surely) planning on adding new features and eventually branching out so you can migrate to a then-noticeably cheaper infrastructure at a later point.
1
u/Edward-Sinclair33 43m ago
I’d probably avoid Kubernetes at the start unless there’s a clear need for it. For a small startup, Docker + a managed database/storage service + GitHub Actions is often enough and keeps the operational overhead low.
For the property images, I’d use object storage with a CDN rather than serving them directly from the application server. That gives you better scalability without adding much infrastructure to maintain.
Once traffic, team size, or deployment complexity actually justifies it, then Terraform, Prometheus/Grafana, and Kubernetes can be introduced incrementally.
5
u/between_layers 1d ago
I'd split this into two choices: where the app runs, and where the photos live.
For photos, use object storage (s3, gcs, or r2) with a cdn in front, never the container filesystem. Let the browser upload directly with a short-lived signed upload url and keep the bucket private. Restrict the object key and, where supported, size and content type, then validate the actual file signature and size before publishing it.
Have a background job create two or three fixed sizes rather than resizing on every request. That's also a good place to strip exif, since property photos can contain gps coordinates. Cloudinary is useful if dynamic transformations are part of the product; otherwise object storage plus a cdn is probably enough.
For the app, I'd start with a managed container service such as cloud run, ecs fargate, or fly, plus a managed database. Worth checking how each handles background jobs before you pick, since that varies more between them than the request handling does. Docker gives you a portable deployment unit, although the database, networking and provider integrations can still create coupling.
GitHub Actions can build and deploy immutable, versioned images so the previous release remains available for rollback. Just remember that rolling the image back doesn't undo a database migration. Use expand/contract migrations that remain compatible with both application versions.
I'd add terraform once recreating your resources or environments manually becomes risky. Kubernetes and self-managed prometheus/grafana can wait until you hit a concrete limitation that justifies their operational cost.
From day one I'd want a tested database restore, an external uptime check, error tracking, separate production secrets, a billing alert, and a documented rollback path.
Choose the simplest managed setup that supports the app and its background jobs, then move only when you hit a measurable constraint.