| I've built infra for a lot of different orgs over a long period of time. My recommendation is that unless (and until) you're building for scale, you Keep It Simple, Stupid (KISS). Use an IaC system (Terraform, Pulumi, etc) to manage everything from Day 1: 1. Use a major cloud provider (AWS or GCP, probably) 2. Get a managed HTTP load balancer (ELB, ALB, whatever) 3. Package your app in a container image, and run your app on 3+ containers behind the load balancer (using on bare VMs, K8S, whatever you prefer), ideally at least 2x containers in 2x AZs. 4. Set up a managed database cluster with Postgres or MySQL and run it with multi-AZ and failover 5. Run 2x VM instances (for redundancy) for asynchronous jobs (using a message bus service or using your database as a work queue), ideally 1x in each of the AZs your database is in 6. Store any large files in cloud storage and put them behind a CDN That's all 99% of companies will ever need to do. These are all old technologies that Just Work. |
Then there's more nuanced things that most teams will miss early on without someone pointing the problem and the solution e.g. decouple configuration from the app, design stateless apps (e.g. 12 factor app), use secrets management easily (e.g. dynamoDB based solutions like credstash are dirt cheap, AWS secrets is okay-ish), used managed DBs (RDS is the most common choice) and more.