| 1 | --- |
| 2 | title: Hetzner |
| 3 | description: Build applications on Hetzner Cloud with Alchemy — Servers running your Effect programs as Services, plus volumes, networks, firewalls, load balancers, and DNS, all in one typed program. |
| 4 | --- |
| 5 | |
| 6 | An Alchemy app on Hetzner is one or more **Servers** — real VMs, |
| 7 | booted in seconds and billed by the hour — running your Effect |
| 8 | programs as **Services**: bundled with rolldown, copied over SSH, and |
| 9 | supervised by systemd. No Dockerfile, no ansible, no hand-written |
| 10 | unit files. Around them you declare the rest of the platform — |
| 11 | volumes, private networks, firewalls, load balancers, and DNS — in |
| 12 | the same TypeScript program. |
| 13 | |
| 14 | New here? [Set up your project and API token](/hetzner/setup), then |
| 15 | start the [tutorial](/hetzner/tutorial/part-1). |
| 16 | |
| 17 | ## Compute |
| 18 | |
| 19 | - **[Servers](/hetzner/compute/servers)** — the VM: pick a |
| 20 | `serverType`, an `image`, and a `location`; attach SSH keys, |
| 21 | networks, firewalls, volumes, and placement groups. Alchemy injects |
| 22 | a deploy key so it can reach every server it manages. |
| 23 | - **[Services](/hetzner/compute/services)** — your code on a Server. |
| 24 | An HTTP `fetch` handler (or a background process) deployed as a |
| 25 | systemd unit; N Services can share one Server. |
| 26 | - **[SSH](/hetzner/compute/servers#run-commands-over-ssh)** — typed |
| 27 | `exec`/`scp` against any managed Server, usable from deploy-time |
| 28 | Effects. |
| 29 | - **Images & snapshots** — snapshot a Server with `Hetzner.Image`, |
| 30 | look up stock images with `Hetzner.findImage`. |
| 31 | |
| 32 | ## Frontend |
| 33 | |
| 34 | - **[Websites](/hetzner/frontend/websites)** — Vite, Astro, |
| 35 | Next.js, Nuxt, React Router, SolidStart, SvelteKit, TanStack |
| 36 | Start, Waku, Octane, Foldkit, Vocs, and StaticSite. Each builds |
| 37 | your app and deploys a systemd |
| 38 | [Service](/hetzner/compute/services) on a |
| 39 | [Server](/hetzner/compute/servers). Several sites can share one |
| 40 | VM. Live URL is `http://{ipv4}:3000`. |
| 41 | - [`Vite`](/hetzner/frontend/vite), [`Astro`](/hetzner/frontend/astro), |
| 42 | [`Next.js`](/hetzner/frontend/nextjs), [`Nuxt`](/hetzner/frontend/nuxt), |
| 43 | [`React Router`](/hetzner/frontend/react-router), |
| 44 | [`SolidStart`](/hetzner/frontend/solidstart), |
| 45 | [`SvelteKit`](/hetzner/frontend/sveltekit), |
| 46 | [`TanStack Start`](/hetzner/frontend/tanstack-start), |
| 47 | [`Waku`](/hetzner/frontend/waku), |
| 48 | [`Octane`](/hetzner/frontend/octane), [`Foldkit`](/hetzner/frontend/foldkit), |
| 49 | [`Vocs`](/hetzner/frontend/vocs), |
| 50 | [`StaticSite`](/hetzner/frontend/static-site). |
| 51 | |
| 52 | ## Storage |
| 53 | |
| 54 | - **[Volumes](/hetzner/data/volumes)** — network block storage |
| 55 | attached to a Server. Mount one into a Service with the |
| 56 | `MountVolume` binding and read/write it like a local directory. |
| 57 | |
| 58 | ## Networking |
| 59 | |
| 60 | - **[Networks, Firewalls & Load Balancers](/hetzner/networking)** — |
| 61 | private networks with subnets, stateful firewall rules applied to |
| 62 | servers, and managed load balancers with health checks and TLS |
| 63 | certificates. |
| 64 | - **Floating & Primary IPs** — stable public addresses that survive |
| 65 | server replacement. |
| 66 | |
| 67 | ## DNS |
| 68 | |
| 69 | - **[Zones & records](/hetzner/networking/dns)** — Hetzner DNS zones |
| 70 | and record sets as resources, plus `ReadDns`/`WriteDns` bindings |
| 71 | for querying and mutating records from deploy-time Effects. |
| 72 | |
| 73 | ## What are you building? |
| 74 | |
| 75 | | You're building | Reach for | |
| 76 | | ---------------------------------- | ------------------------------------------------------------------------------------------------------------ | |
| 77 | | An HTTP API on a VM | [Server](/hetzner/compute/servers) + [Service](/hetzner/compute/services) | |
| 78 | | A Vite SPA | [`Website.Vite`](/hetzner/frontend/vite) — pass `server` to share the VM | |
| 79 | | An SSR site (Astro, Next, Nuxt, …) | [`Website`](/hetzner/frontend/websites) | |
| 80 | | A background worker / daemon | [Service](/hetzner/compute/services) with `host.run(...)` — no port, no HTTP | |
| 81 | | Persistent state on disk | [Volume + MountVolume](/hetzner/data/volumes) | |
| 82 | | A load-balanced, TLS-terminated app | [Load Balancer + Certificate](/hetzner/networking#load-balancer) | |
| 83 | | Servers talking privately | [Network](/hetzner/networking#private-networks) + `usePrivateIp` targets | |
| 84 | | Locking down public access | [Firewall](/hetzner/networking#firewalls) | |
| 85 | | Your own domain | [Zone + RecordSet](/hetzner/networking/dns) | |
| 86 | | A stable IP across replacements | Primary IP / Floating IP — see [Networking](/hetzner/networking#floating--primary-ips) | |
| 87 | | Golden images | `Hetzner.Image` snapshots — see [Servers](/hetzner/compute/servers#snapshots) | |
| 88 | |
| 89 | ## Where next |
| 90 | |
| 91 | - [Setup](/hetzner/setup) — create a Hetzner project, generate an |
| 92 | API token, and connect alchemy. |
| 93 | - [Tutorial](/hetzner/tutorial/part-1) — from empty directory to a |
| 94 | Server running an HTTP Service with a mounted Volume and a |
| 95 | firewall. |
| 96 | - [Websites](/hetzner/frontend/websites) — Vite, Astro, Next.js, and |
| 97 | other framework sites as a systemd unit. |
| 98 | - [Providers reference](/providers) — generated API docs for every |
| 99 | Hetzner resource Alchemy ships. |