$5/mo USDor $50/yr
Deploy Spark in London- vcpu
- 1
- memory
- 2 GB
- nvme disk
- 20 GB
- port
- 1 Gbps
- traffic
- unmetered
- ipv4
- 1 dedicated
Who Spark is for
Spark is for the server that does exactly one thing. A WireGuard endpoint so your laptop exits in London. A Caddy instance serving a static site and terminating TLS. A Discord or Slack bot. An uptime checker that pings your real infrastructure from outside it. A small Git mirror. Each of those idles at a few hundred megabytes of memory and barely touches a core.
It is also the cheapest way to get a clean, public London IPv4 with editable reverse DNS. Plenty of people buy one purely as a jump host: a fixed address they can allow-list in other firewalls and SSH through.
The 2 GB budget
Memory is the number to plan around. This is roughly what a minimal Debian 12 install with a typical single-service workload looks like after boot:
| Component | Resident |
|---|---|
| Kernel, systemd, journald, sshd | ~150 MB |
| Caddy or Nginx | 20–60 MB |
| A small Node, Python or Go service | 80–300 MB |
| SQLite or a tiny Postgres | 50–250 MB |
| Page cache and headroom | the rest |
That leaves well over a gigabyte for the kernel to use as page cache, which matters more than people think: on NVMe-backed storage a warm cache is what turns fast reads into instant ones. Once your resident set creeps past 1.4 GB, it is time to look at Boost.
Living with one core
A single vCPU handles request-response workloads well because most of their time is spent waiting on the network. What it handles badly is anything CPU-bound running alongside latency-sensitive work: compiling, image resizing, compression, a busy cron job. If your service stutters every time a backup runs, the fix is either to nice the background job or to move up a size.
# run a background job at lowest CPU and I/O priority
nice -n 19 ionice -c3 tar czf /root/site-$(date +%F).tgz /srv/site
20 GB of disk
A base image uses roughly 2–3 GB. That leaves plenty for a service, its logs and a modest data set. The things that fill a small disk unexpectedly are journald, old kernels and container images. Cap the journal on day one:
mkdir -p /etc/systemd/journald.conf.d
printf '[Journal]\nSystemMaxUse=300M\n' > /etc/systemd/journald.conf.d/size.conf
systemctl restart systemd-journald
If you run Docker, add docker system prune -af to a weekly timer, or images from old deploys will eat the disk a few hundred megabytes at a time.
A sensible first ten minutes
Spark boxes tend to be set up quickly and then forgotten for a year, so make the defaults safe before you walk away:
apt update && apt -y full-upgrade
apt -y install unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades
fallocate -l 1G /swapfile && chmod 600 /swapfile
mkswap /swapfile && swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab
Then lock down SSH to keys only. The SSH hardening guide covers it in about five commands. Add a portal firewall rule allowing only the ports your one service needs, and you have a box that can safely sit unattended.
Good fits and poor fits
- Good: VPN endpoint (see the WireGuard guide), reverse proxy, static or lightly dynamic site, webhook receiver, monitoring probe, DNS resolver for a small network, IRC or Matrix bridge.
- Poor: anything with a JVM, a mail server with spam filtering, a CI runner for a real codebase, more than one database, a self-hosted Git forge with CI.
When to move
Move to Boost when you see the OOM killer in dmesg, when swap usage stays above a few hundred megabytes for days, or when you want the database on the same box as the app. Boost doubles memory, cores and disk for $3 more a month. There is no size below Spark; if it is too much machine, it is already the cheapest way to own a London IPv4.
Spark costs $5 a month or $50 a year, charged in US dollars. Images available on it include Debian 12, Ubuntu 24.04 and AlmaLinux 9.