Infrastructure
Servers and regions
What gets provisioned, how big it is, how to grow it, and where it physically runs.
Where your store runs
Hetzner Cloud, in the location you choose when you create the store:
| Location | Where | |
|---|---|---|
fsn1 |
Falkenstein | Germany |
nbg1 |
Nuremberg | Germany |
hel1 |
Helsinki | Finland |
ash |
Ashburn, VA | United States |
hil |
Hillsboro, OR | United States |
sin |
Singapore | Singapore |
Every server for a store — application, database, cache and search — is built in that one location, and it cannot be moved afterwards. Pick the one closest to your shoppers.
Database backups are held in Germany, whichever location you choose, because our backup storage exists only in Europe. If that is not acceptable for your store, tell us before you launch.
Every server runs Ubuntu 24.04.
What an environment provisions
Four servers, each with one job:
| Role | Default size | What is on it |
|---|---|---|
| Application | Small · 2 vCPU · 4 GB | nginx, PHP-FPM, Composer, certbot, your code |
| Database | Small · 2 vCPU · 4 GB | MySQL 8.0 or 8.4 |
| Cache | Small · 2 vCPU · 4 GB | Valkey 8, Redis-compatible |
| Search | Standard · 4 vCPU · 8 GB | OpenSearch 2 |
You pick the application size when you create the store, and can change it afterwards from the environment canvas. Small is the starting point so a store costs little before it earns anything; a catalogue with several store views, or a build that deploys many locales, wants Standard or more.
Sizes available everywhere sizes are chosen:
| Size | vCPU | RAM |
|---|---|---|
| Small | 2 | 4 GB |
| Standard | 4 | 8 GB |
| Large | 8 | 16 GB |
| XL | 16 | 32 GB |
Only the application server is exclusive to one environment. Database, cache and search clusters belong to the team, and several environments can share one — which is how an agency runs a handful of small stores off a single database server.
The network
Each team gets a private network. Your servers talk to each other on private addresses; that is what DB_HOST and the rest resolve to.
Two firewalls sit in front:
- Application servers accept 22, 80 and 443 from anywhere.
- Database, cache and search servers accept only SSH. They are not reachable from the internet.
That second rule is doing real work: MySQL binds to all interfaces and OpenSearch runs with its security plugin disabled, because inside the private network they are only reachable by your own machines. The firewall is what keeps that true. The one way to change it is the public endpoint toggle on a database cluster, which opens port 3306 to the world.
PHP
Set the version under Settings → PHP version. It applies on the next deploy, which rebuilds vendor/ against it.
Changing PHP version means you cannot roll back across the change — see Rollbacks.
Growing a server
Settings → Server size for the application server; Resources for a database, cache or search server.
A resize powers the machine off, changes the type, powers it back on, and re-tunes the service that runs on it — MySQL's buffer pool or OpenSearch's heap are recalculated for the new memory. The store is briefly unavailable while it happens.
Two rules, both from the provider:
- Servers only grow. RAM must strictly increase. There is no way back down — disk cannot shrink once upgraded.
- A shared resource cannot be resized while more than one environment is using it, and nothing can be resized during a deploy.
Faster provisioning
Nautvia keeps pre-baked images of fully installed servers. When one matches the role, size and configuration you need, the server boots from it in about a minute instead of installing from scratch. When there is no match, it falls back to a full install — correct either way, just slower.