DeployCloud

Architecture · Reference

Choosing a deployment model, without the hype

Static, server-rendered, serverless functions, containers, virtual machines and managed PaaS are six different answers to one question: where does your code actually run, and what does that cost you in cold starts, scaling behaviour and ongoing ops? The ledger below sorts and filters on the columns that matter; the prose around it explains the trade-offs a bare table can't.

Where logic and rendering happen

Static and SSR are a rendering choice, not a hosting choice

Before serverless-vs-containers even comes up, most apps first decide whether a page's HTML is built once at deploy time or rebuilt on every request.

Static rendering generates a separate HTML file per URL at build time, so every visitor gets an identical, already-finished response straight from a CDN edge node — nothing runs on a server when the request arrives. Server-side rendering (SSR) instead builds the HTML fresh for each request, which is slower per request but lets the page reflect data that's different for every visitor. Google's web.dev engineering team frames this as the core rendering decision underneath every other architecture choice, and is explicit that the two approaches have different, not simply better-or-worse, performance profiles: static rendering gets a consistently fast time-to-first-byte because nothing is computed on demand, while SSR can pull in live or personalised data that static pages structurally cannot.

The practical rule: if the same URL should show the same content to everyone, render it statically and let a CDN do the work for free at request time. If the content depends on who's asking — a logged-in dashboard, a cart, a personalised feed — you need SSR, a serverless function, or a full backend, because static output has no way to differ per visitor.

The ledger

Six models, sorted your way

Click any column to sort; type in the box to filter by model, use-case or keyword. No row is "best" — each is a default for a real, common situation.

ModelWhat it suitsCold-start behaviourScaling shapeTypical cost driverWhen it's the wrong choice
StaticMarketing pages, docs, blogs — content identical for every visitorNone — a CDN edge node returns a file it already has; no execution happensScales by serving more cached copies from more edge locations, essentially flat per requestBandwidth/requests to the CDN and build frequency, not runtime computeAny page whose content must differ per visitor — a dashboard, a cart, personalised results
Server-rendered (SSR)Pages that need fresh or personalised data on every load, but still want fast first paintUsually low if the server process is already running; a fresh cold instance still has to boot the app firstScales by running more server processes/instances behind a load balancer or platform autoscalerServer compute time per request, since every request re-rendersHigh-traffic pages whose content barely changes — you're paying to regenerate the same output repeatedly
Serverless functionsSpiky or infrequent traffic, thin endpoints (webhooks, forms, small APIs) that shouldn't need a server managed 24/7Provider-dependent and the single biggest differentiator in this row — see the sources ledger for AWS's and Cloudflare's own documented behaviourScales per request automatically, typically to zero when idle and up to provider concurrency limits under loadInvocation count plus compute time actually used (e.g. requests and CPU/duration), not idle capacityLong-running jobs, heavy startup dependencies, or workloads needing a persistent in-memory connection pool
ContainersCustom runtimes, long-running processes, or teams standardising on one packaging format across environmentsDepends on the platform: container platforms that scale to zero (e.g. request-driven container services) pay a startup cost on the first request after idle; container platforms kept always-on avoid it entirelyScales by starting more container instances, either automatically (managed platforms) or manually/via an orchestrator (Kubernetes)Reserved or metered compute time (CPU/memory) the container occupies, plus orchestration overhead at scaleA small, simple app where a full container/orchestrator adds operational weight with no matching payoff
Virtual machinesWorkloads needing full OS-level control, specific kernel/driver access, or legacy software that assumes a persistent serverNone during operation — a running VM has no per-request cold start; only a full reboot or new instance has boot timeScales by adding more VM instances behind a load balancer (horizontal) or resizing an instance (vertical); rarely scales to zeroReserved instance-hours, billed whether or not the VM is handling trafficSpiky or low-traffic workloads — you pay for capacity around the clock even while idle
Managed PaaSTeams that want to push code and get a running app without managing servers, containers or orchestration themselvesVaries by platform and plan; entry-level tiers on some platforms sleep idle apps, which then pay a wake-up cost on the next requestScales by adding platform-managed instances/dynos, usually via a dashboard slider or simple config, not custom orchestrationPer-instance or per-dyno pricing tiers, plus add-ons (databases, background workers) billed separatelyWorkloads with unusual resource needs (GPUs, specific OS packages) the platform's managed environment doesn't expose

"Typical cost driver" names the usage dimension you're billed on, not a rate — published rates change too often to print here honestly; see each provider's own pricing page for current numbers.

The honest part

Cold starts are a real cost, and providers document them differently

This is the one row in the ledger where "it depends on the provider" isn't a dodge — it's the actual answer, and it's worth reading a primary source rather than a rule of thumb.

AWS documents its own Lambda cold starts directly: an execution environment is created by downloading the function's code, starting the runtime, and running any initialization code outside the handler, and AWS states that this "typically" happens in under 1% of invocations, with the added latency ranging from under 100 milliseconds to over a second depending on runtime, package size and memory configuration. Reused ("warm") environments skip all of that and finish faster. Cloudflare, by contrast, documents Workers as billing on requests and CPU time with no separate charge for idle capacity, running each request in an isolated V8 context rather than a full container — a structurally different execution model, not just a faster version of the same one. Google Cloud Run's own documentation focuses less on cold starts and more on concurrency: a single instance can be configured to handle up to hundreds of simultaneous requests, and minimum-instance settings exist specifically to keep instances warm when a cold start would be unacceptable.

The honest takeaway: don't repeat a specific millisecond figure you read somewhere as if it applies to your stack. Cold-start duration depends on your runtime, package size, memory allocation and how long the platform keeps environments warm — read the provider's own current documentation (linked in the sources ledger) for the workload you're actually deploying, and if the number matters to your product, measure it yourself in a staging environment before you commit.

Sources

  1. Addy Osmani & Jason Miller, "Rendering on the Web," web.dev (Google Chrome team). web.dev/articles/rendering-on-the-web. Accessed 26 Jul 2026.
  2. AWS, "Understanding the Lambda execution environment lifecycle" — Init/Invoke/Shutdown phases and the documented cold-start frequency and duration range. docs.aws.amazon.com/lambda/latest/dg/lambda-runtime-environment.html. Accessed 26 Jul 2026.
  3. Cloudflare, "Pricing · Cloudflare Workers docs" — request- and CPU-time-based billing with no separate egress/bandwidth charge. developers.cloudflare.com/workers/platform/pricing/. Accessed 26 Jul 2026.
  4. Google Cloud, "Maximum concurrent requests for services · Cloud Run" — per-instance concurrency and its relationship to instance count and cost. docs.cloud.google.com/run/docs/about-concurrency. Accessed 26 Jul 2026.
  5. DeployCloud, "Serverless or containers — choose without regret" (this site) — a narrower, FAQ-style companion focused specifically on the serverless-vs-containers decision. deploycloud.allfrontierglobal.com/serverless-vs-containers-guide.

FAQ

Good to know

Is one deployment model just better than the others?
No. Each row in the ledger is the right default for a real, common shape of app — the mistake is picking based on hype rather than your own traffic pattern, team size and how much operational work you're willing to own.
Can I mix more than one model in the same app?
Yes, and most real production apps do — a static marketing shell, a few serverless functions for forms or webhooks, and a container or managed PaaS instance for the core API is a very common split.
What actually causes a cold start?
An execution environment has to be created before your code can run: downloading the code, starting a runtime, and running any setup code outside your handler. Providers differ sharply in how often this happens and how long it takes — see the sources ledger for how AWS and Cloudflare each document their own model.
Why isn't there a price column?
Published rates change often enough that a printed number here would be stale within weeks. The "typical cost driver" column instead names which usage dimension you're actually paying for on each model, which stays true even after prices move.

Terms used on this page

Tap any term for this site’s own definition — no search, no leaving the page.

More in this section

Now apply it

Turn a model into a running scaffold

Describe what you're building and pick a tier — the generator maps your answer to real config files, not just advice.