We're preparing to launch a house-rental application in production. It will store and serve a large number of property photos, and we want the setup to remain secure, affordable, scalable, and easy for a small team to maintain. We're considering Docker, Kubernetes, Terraform, Prometheus/Grafana, and GitHub Actions. For those with startup experience, what architecture and deployment workflow would you recommend? In particular, how would you handle image uploads and delivery without adding unnecessary infrastructure or cost?
5 Answers
The general rule is to start with the simplest reliable managed setup and move to more complex tooling only when you have a specific constraint. A container platform, managed database, object storage, CDN, and automated deployments are enough for many early-stage products. Add Kubernetes, more extensive infrastructure-as-code, or a full monitoring stack incrementally as traffic, team size, or deployment complexity makes the extra operational work worthwhile.
Managed application platforms are worth considering instead of owning all the infrastructure. Services such as Vercel or Netlify can provide a quick, inexpensive path to production, depending on the application architecture. They are not limited to toy projects, but you should check their database, background processing, networking, and image-delivery limitations before committing.
For image-heavy applications, a service such as Cloudinary can simplify transformations and CDN delivery, while object storage plus a CDN may be cheaper and more flexible if you only need a few standard sizes.
Separate the application from the image storage. Put property photos in private object storage such as S3, GCS, or R2, with a CDN in front. Direct browser uploads using short-lived signed URLs, restrict the allowed keys and file types, and validate the actual file signature and size before making an image public. A background job can generate a few fixed image sizes and remove EXIF metadata, which helps performance and avoids accidentally exposing GPS data. Cloudinary is worth considering if you need lots of on-demand transformations; otherwise, object storage plus a CDN is usually simpler.
For the app itself, start with a managed container platform such as Cloud Run, ECS Fargate, or Fly, alongside a managed database. Docker provides a useful deployment unit, while GitHub Actions can build and deploy immutable versioned images. Keep in mind that reverting an application image does not revert a database migration, so use backward-compatible expand-and-contract migrations.
Terraform is useful once manually recreating environments becomes risky. Kubernetes and self-managed Prometheus/Grafana can wait until a measurable limitation justifies their operational cost. From the beginning, add backups with tested restores, external uptime checks, error tracking, separate production secrets, billing alerts, and a documented rollback process.
I'd keep the initial setup deliberately boring: containerize the app, run it on a simple managed service or a small number of hosts, use a managed database, and deploy through GitHub Actions. Kubernetes creates a lot of ongoing maintenance for a small team and usually offers little benefit until you have enough scale, services, or operational complexity to need it. Terraform can still be a good choice, but keep the configuration small and understandable so the team can maintain it later.
ECS with Fargate and an application load balancer would be a reasonable AWS option. Serverless components can also work well and let you pay mostly for usage, but watch for cold starts, execution limits, and background-job behavior. The important thing is choosing a managed service that supports the application's real workload rather than adopting a platform because it is fashionable.

That makes sense. I had assumed platforms like Vercel or Netlify were mainly for smaller applications and that a more traditional setup would be necessary as we grew. I'm still learning how startups decide between managed services and operating more infrastructure themselves, especially when balancing cost, scalability, security, maintenance, and user experience. For now, I'm looking for the simplest option that fits our current stage without blocking future growth.