# Add a server

Pyvolt runs your apps on servers you own. Connect a cloud account and let Pyvolt create the machine, or bring any Ubuntu box you can SSH into.

## Option A - create via a connected provider (Hetzner)

1. From the [dashboard](https://pyvolt.com/servers/), click **New server**.
2. Pick **Hetzner** (or **Connect a new provider** and paste an API token - created in the Hetzner Cloud console under Security → API tokens).
3. Choose location, server type and Ubuntu version. Pyvolt creates the VM through the Hetzner API, installs its SSH key automatically, and moves straight to provisioning.

## Option B - bring your own server (any provider)

Any fresh Ubuntu 22.04 / 24.04 machine works - DigitalOcean, Linode, OVH, a box under your desk.

1. **New server** → provider **Custom / BYO**.
2. Fill in the name, public IP, SSH port (usually 22) and SSH user (usually root).
3. Add the shown public SSH key to the server so Pyvolt can connect:

```bash
ssh root@your-server-ip
echo "PASTE_THE_KEY_HERE" >> ~/.ssh/authorized_keys
```

## Provisioning

Click **Provision**. Pyvolt SSHes in and sets the machine up end to end - you watch a step checklist with the live log beside it. 2–5 minutes.

| Component | Purpose |
|-----------|---------|
| [Nginx](https://nginx.org) | Reverse proxy, serves static files and SPA frontends |
| [PostgreSQL](https://www.postgresql.org) | Database, ready whether your app uses one or not |
| [Redis](https://github.com/redis/redis) | Cache + Celery broker |
| [mise](https://github.com/jdx/mise) | Version manager that installs the Python (and Node) versions each app pins, so one box runs many apps on different versions |
| [Node.js](https://github.com/nodejs/node) | Frontend builds (npm/yarn/pnpm) |
| [UFW](https://help.ubuntu.com/community/UFW) | Firewall - ports 22, 80, 443 open |
| [fail2ban](https://github.com/fail2ban/fail2ban) | Brute-force protection |

It's all installed and configured for you. Use the parts your app needs and ignore the rest.

A dedicated `pyvolt` user owns everything app-related; your apps never run as root.

Once the status flips to **Ready**, you can add apps.

## Next step

[Add an app →](add-app.md)
