Deployment.sh

Static site hosting, own server, atomic releases and smart cache headers

A static site deserves the same care as an app: a reproducible build, an atomic switch so visitors never see half-uploaded files, correct cache headers, and a way back when a release breaks a page. Deployment builds your Astro, Hugo, Vite, Eleventy or Docusaurus project on your own server and serves it from nginx or Caddy, next to your apps and under your own domains.

Designer reviewing a printed website layout on a light table in a small studio

What Deployment detects in a static site repository

astro in package.json selects an Astro build with dist/ as the output. A hugo.toml, hugo.yaml or config.toml with a content/ folder selects Hugo with public/. Vite projects (React, Vue, Svelte or plain) build into dist/, Eleventy into _site/, Docusaurus and Gatsby into build/ and public/. If an Astro or SvelteKit project uses a server adapter, Deployment notices that it is not purely static and offers a Node process instead, as described on node js hosting.

  • Build command and output folder per generator, editable in the panel
  • Node LTS or the Hugo extended binary in the version your project expects
  • Single page app fallback to index.html for client-side routing
  • Clean URLs without .html when the generator writes folders with index files

What Deployment installs for static sites

The server gets the same hardening as any other (firewall, key-only SSH, unattended security updates, swap), plus nginx or Caddy, the build toolchain your generator needs, and a free Let's Encrypt certificate for every domain and alias, renewed automatically. Wildcard certificates are issued through your DNS provider's API, which is handy for preview subdomains. Redirects from old URLs are managed in the panel and written into the server block, so a migrated blog keeps its rankings.

Developer at a cafe table at dusk closing a laptop, phone face down next to a flat white, rain on the window

A static build and deploy script

For Hugo the build is hugo --minify --environment production. The last line is a cheap guard: if the build produced no index page, the release stops before anything changes for visitors. The web root then points at the output folder of the new release.

bash
cd "$RELEASE_PATH"
npm ci
npm run build
test -f dist/index.html

Cache headers that match how static files change

Generators put a content hash into the names of CSS, JavaScript and font files. Those files never change, so Deployment serves them with Cache-Control: public, max-age=31536000, immutable. HTML pages change with every release, so they get no-cache, which lets browsers revalidate with an ETag and still load quickly. You can add your own rules per path in the panel, and gzip and Brotli compression are on by default.

nginx
location ~* \.(css|js|woff2|svg|png|jpg|webp|avif)$ {
    add_header Cache-Control "public, max-age=31536000, immutable";
}
location / {
    add_header Cache-Control "no-cache";
    try_files $uri $uri/ $uri.html =404;
}

Atomic releases and instant rollback for static sites

Uploading files over an old site leaves a window in which a page references a stylesheet that does not exist yet. Deployment builds into a new release folder and moves the web root with one symlink switch, so every visitor gets either the full old site or the full new one. Previous releases stay on disk, which makes rollback a one-click switch with no rebuild. Read how this works on zero downtime deployment, and connect a branch per environment on deploy from git.

Static sites next to your apps on one server

Most teams have a marketing site, a docs site and a status or landing page beside their main app. On Deployment they share the server you already pay for, each with its own domain, certificate, build and deploy history. Builds run on push, so content editors working in git or a headless CMS that commits to your repository see their changes live minutes later. Uptime checks watch each site and alert you by email, Slack, Discord or webhook if a page stops answering.

Which plan fits your static site hosting

PlanMonthlyYearly, per monthServersSites
Starter49 USD24 USD315
Team199 USD99 USD15100
Agency499 USD249 USD60unlimited within servers
Enterprise1 499 USD749 USD250unlimited within servers

Static sites count as sites, so Starter covers a handful alongside your apps. Agencies hosting dozens of client sites pick Agency for unlimited sites within their servers.

Static site hosting questions

Can I build on my CI and only upload the result?

Yes. Replace the build lines with a download of the build artifact for the commit. The release still switches atomically and keeps its rollback history.

Do single page apps with client routing work?

Yes. Turn on the fallback for the site and every unknown path is served by index.html, while real files and assets are served directly.

Can I put a CDN in front?

Yes. Cache headers from the server are respected by common CDNs, and you can purge the CDN from the deploy script after the switch.

Can I try Deployment before I pay?

Yes. The home page has a free one-time demo: paste a public repository URL and see the detected stack, the server plan and the first lines of the deploy script. Plans start at 49 USD a month, or 24 USD a month billed yearly.

Host your static sites where your apps live

Connect a server, add your repository and push.

Try the demo