A VPS that keeps your bots and scripts running, day and night.
First month $1, then the normal monthly price. One per customer.
A Discord bot. A Telegram bot. Cron jobs, Python and Node scripts that are not allowed to stop, and Playwright workers that have to show up from one fixed IP. For all of that we hand you a KVM VPS with full root, a fixed IPv4, NVMe RAID10 and unlimited traffic, in Amsterdam or New York. Close the laptop, go home. It keeps running.
Transparent pricing
Plans and prices
| Plan | vCPU | Memory | NVMe | Traffic | Monthly | 1 year | |
|---|---|---|---|---|---|---|---|
| Standard | |||||||
| S-2Standard | 1vCPU | 2 GBMemory | 30 GBNVMe RAID10 | UnlimitedTraffic | $7.99/moFirst month $1 | $7.19/mo on 1 year | Start for $1 |
| S-4Standard | 2vCPU | 4 GBMemory | 60 GBNVMe RAID10 | UnlimitedTraffic | $13.99/moFirst month $1 | $12.59/mo on 1 year | Start for $1 |
| S-8Standard | 3vCPU | 8 GBMemory | 120 GBNVMe RAID10 | UnlimitedTraffic | $24.99/moFirst month $1 | $22.49/mo on 1 year | Start for $1 |
| S-16Standard | 4vCPU | 16 GBMemory | 240 GBNVMe RAID10 | UnlimitedTraffic | $44.99/moFirst month $1 | $40.49/mo on 1 year | Start for $1 |
| S-32Standard | 8vCPU | 32 GBMemory | 480 GBNVMe RAID10 | UnlimitedTraffic | $84.99/moFirst month $1 | $76.49/mo on 1 year | Start for $1 |
| S-64Standard | 16vCPU | 64 GBMemory | 720 GBNVMe RAID10 | UnlimitedTraffic | $159.99/moFirst month $1 | $143.99/mo on 1 year | Start for $1 |
| Dedicated CPU | |||||||
| D-4Dedicated | 1vCPU | 4 GBMemory | 45 GBNVMe RAID10 | UnlimitedTraffic | $37.00/moFirst month $1 | $31.45/mo on 1 year | Start for $1 |
| D-8Dedicated | 4vCPU | 8 GBMemory | 90 GBNVMe RAID10 | UnlimitedTraffic | $69.00/moFirst month $1 | $58.65/mo on 1 year | Start for $1 |
| D-16Dedicated | 4vCPU | 16 GBMemory | 160 GBNVMe RAID10 | UnlimitedTraffic | $118.00/moFirst month $1 | $100.30/mo on 1 year | Start for $1 |
| D-32Dedicated | 6vCPU | 32 GBMemory | 220 GBNVMe RAID10 | UnlimitedTraffic | $215.00/mo | $182.75/mo on 1 year | Deploy D-32 |
| D-64Dedicated | 10vCPU | 64 GBMemory | 400 GBNVMe RAID10 | UnlimitedTraffic | $377.00/mo | $320.45/mo on 1 year | Deploy D-64 |
| High Memory | |||||||
| H-64High Memory | 8vCPU | 64 GBMemory | 480 GBNVMe RAID10 | UnlimitedTraffic | $249.00/mo | $211.65/mo on 1 year | Deploy H-64 |
| H-128High Memory | 16vCPU | 128 GBMemory | 960 GBNVMe RAID10 | UnlimitedTraffic | $459.00/mo | $390.15/mo on 1 year | Deploy H-128 |
| H-192High Memory | 24vCPU | 192 GBMemory | 1.4 TBNVMe RAID10 | UnlimitedTraffic | $669.00/mo | $568.65/mo on 1 year | Deploy H-192 |
What people run on a bot VPS.
Nearly all of it is one long-running process with a token in an env file. The rest is scheduled work.
Discord bots with discord.py or discord.js
Moderation, music, role management, maybe a little game for the server. What the bot does hardly matters. Underneath, every one of them is holding a websocket open to Discord's gateway, and that connection is the thing that has to stay up. Which comes down to two requirements. Something that restarts the bot the second it dies, and a machine that never goes to sleep.
Telegram bots with python-telegram-bot
Polling bot? Then not a single inbound port is needed. A webhook bot does need HTTPS, and Caddy on the VPS hands you that in one line of config. Either way Telegram keeps seeing the same fixed IPv4, year after year, and that keeps it happy.
24/7 scripts and cron jobs
Say, a price watcher. A feed-to-Slack relay, the nightly report, that one job that cleans up a bucket at 03:00 while everyone is asleep. Cron on a VPS is still the simplest scheduler we know of for this kind of work. Nothing to learn. And journald holds on to the output, so you can read it the next morning.
Playwright and headless Chrome workers
Screenshots for a report, form fills against your own systems, collecting data where the site's terms permit it. But a real Chromium eats memory. Of everything on this page, this is the one workload the S-2 can't carry.
Which plan for this workload.
A chat bot sits idle most of the time. A browser never does. So if there are browsers, size for those.
| Setup | Plan | Why |
|---|---|---|
| Two or three Discord or Telegram bots plus some cron jobs | S-2 | An idle bot takes a few dozen MB, so 1 vCPU is plenty |
| Bots with Postgres or Redis next to them, a webhook endpoint, a small dashboard | S-4 | The database gets headroom of its own from 2 vCPU and 4 GB |
| Two to three headless browsers running at the same time | S-8 | Count 2 GB per browser, so 8 GB and 3 vCPU carry three |
| Sustained CPU from morning to night: scraping, image processing, tight polling loops | S-8 or D-4 | One pinned core that runs at the same speed every hour: D-4 (1 vCPU, 4 GB, 45 GB NVMe) at €34.00 a month ($37.00) |
| A whole fleet of browsers, or many CPU-bound workers | D-8 | Four pinned cores on the D-8 (4 vCPU, 8 GB, 90 GB NVMe) at €64.00 a month ($69.00) |
Standard plans share vCPUs at a 1:4 ratio, which is fine for bots that wait on a websocket or an API. When a process wants a core for hours on end, a pinned core on a Dedicated plan behaves more predictably. Our published numbers on /vps-benchmarks/ come from a 2 vCPU dedicated instance: Geekbench 6 single-core 2,000, multi-core 6,414. For headless browsers the rule is 2 GB of RAM per concurrent browser; running more than that on a plan swaps or gets processes killed. Start small and resize in place when the bot outgrows the box; RAM and vCPU change with one short reboot, and the IP stays. Disk is rarely the limit unless you keep screenshots or scraped files forever.
Setting it up on BuyVPS.
Step 1: order, create a user, install the runtime
Order an S-2 and pick Ubuntu 24.04. Payment goes through and 30 to 60 seconds later the server is up. Then, please, don't run the bot as root. Create a user, install Python, put the bot in a virtualenv and leave it there. Node people: get a current release from NodeSource or nvm, not the one from apt.
Step 2: keep the token out of the code
Put secrets in a .env file that only the bot user can read. systemd loads it with EnvironmentFile, so the token never appears in the repository or in ps output.
Step 3: a systemd unit that restarts the bot
And that, honestly, is the entire trick to 24/7. There is nothing clever in it. The unit waits until the network is up, restarts five seconds after any exit, crash or clean quit alike, and comes back at boot.
Step 4: or pm2 for Node, or Docker for either
pm2 does the same job for Node projects and writes its own logs. Docker is the better choice when the bot has native dependencies or when you deploy it to more than one machine; restart: unless-stopped in the compose file replaces the unit above.
Step 5: cap the logs
journald grows until it hits its limit. Fine. Except the default limit is a share of the disk, not a fixed number. So give it an explicit cap, because a chatty bot can otherwise fill the 30 GB on an S-2, and we've seen it happen.
Step 6: Playwright workers and cron
Playwright brings its own Chromium along, and the system libraries that go with it. Run the workers under the same kind of unit, one unit for every browser you want going in parallel. Scheduled scripts? Set the server timezone first. Only then add the crontab entry, not the other way round.
For a Node bot, Docker with a memory cap is the tidiest option. The cap turns a leak into a restart instead of a dead server.
Cron jobs get a lock, so a slow run never overlaps with the next one.
Playwright's documentation is at playwright.dev. Keep scrapers lawful: read robots.txt and the site's terms, identify your client honestly, and rate-limit yourself. We do not help with evading blocks, and abuse complaints against a server lead to suspension.
Pitfalls we see, and how to avoid them.
Rate limits and platform terms
Discord rate-limits you. Telegram does too, and both of them ban a bot that spams. Use the rate limiter your library already ships with, back off the moment a 429 comes back, and read the developer terms once, properly, with coffee. Scraping? Same story with robots.txt and whatever terms the site publishes. One more thing. A fixed IP that gets blocked stays blocked, and that IP happens to be yours.
Secrets in the repository
Commit a token to Git and someone else finds it. Not maybe. Every time. So the token goes in the .env file with mode 600, .env goes in .gitignore, and the day a token leaks, even once, you rotate it and get on with your life. Database passwords sitting in compose files? Same treatment, and for exactly the same reason.
Slow memory leaks
A bot that grows a few MB a day gets killed after a month. Watch systemctl status mybot for memory, add MemoryMax= to the unit as a safety net, and restart on a schedule if the library or a dependency is the cause. Headless browsers should be closed after every job, not reused for days.
Timezones
A fresh server runs on UTC. Which is why the "daily at 09:00" reminder goes off at 11:00 in Amsterdam in summer. Set the timezone with timedatectl, or, better, store every time in UTC and convert inside the bot. Cron follows the system timezone. Check it again after every reinstall, because you will forget.
Pick the region closest to your users.
For bots the users are the APIs you talk to and the people who wait for replies. From Amsterdam we measure 9.0 ms to London and 8.5 ms to Frankfurt; from New York 4-7 ms to Philadelphia and 7-12 ms to Washington DC. Prices are identical in both. See Amsterdam and New York.
Questions about hosting bots on a VPS.
Is a VPS better than a free bot hosting service?
Different, yes. A VPS gives you full root, a fixed IPv4, unlimited traffic and no sleep timer, and in return the updates and the process manager are your job. Is that a good trade? For a bot that has to stay online and talk to third-party APIs from one known address, usually, at €6.99 a month, it is.
How many bots fit on the S-2 plan?
A few, without strain. An idle Discord or Telegram bot sits at tens of MB, so two or three of those and a handful of cron jobs live happily on 1 vCPU and 2 GB. Then there is the headless browser. Add one and you move to the S-8, no discussion, because each browser wants about 2 GB for itself and takes it, whatever else happens to be running.
Does the IP address change?
No. Reboots, resizes, none of that touches the IPv4 or the /64 IPv6 block, they stay with the server. So whitelist the IPv4 once at the services you call and forget about it. Need a second address? An extra IPv4 is €5.00 a month plus $10 setup.
Can I run Playwright or headless Chrome?
Yes. On Ubuntu 24.04, playwright install --with-deps chromium pulls in Chromium together with the libraries it needs. Count on 2 GB of RAM per concurrent browser and steady CPU, which for sustained work means S-8 or D-4. And close the browser after each job. People forget that one.
Will you help me scrape a site that blocks me?
No. We host lawful automation, and only that. In practice: robots.txt is respected, the terms of the sites you visit are respected, your client says who it is, and you stay inside the rate limits. Simple rules. But when abuse complaints about a server start landing in our inbox, that server is suspended under our acceptable use policy.
What happens if my bot crashes at night?
Back within seconds. Restart=always in the systemd unit handles it, so does pm2, so does restart: unless-stopped in Docker. A reboot? Covered too, because the unit is enabled at boot. What we would still add is an uptime check or a heartbeat ping. Without one, the bot can restart quietly all night long and you hear nothing about it the next morning.
Deploy a measured VPS
From $6.79/mo on a 2-year term. KVM on AMD EPYC, NVMe RAID10, ECC memory. No setup fee, cancel monthly.
30-day performance guarantee. Not satisfied? Full refund, no admin fee. How it works