BlogProduct

A Heroku alternative on your own VPS, without Docker

A Heroku alternative for 2026: move your app to a VPS you own. What maps to what, real costs, five migration steps, and what ox does not do.

The cheapest Heroku alternative that still feels like Heroku is a VPS you rent yourself, with a tool on top that gives back push-to-deploy, config vars, add-ons and rollbacks. You pay one flat monthly price for the machine, run several apps on it, and your data stays on a server you control. The trade: one server per app, and no autoscaling.

Heroku made deploying feel like git push and nothing else. On February 6, 2026, Heroku said it is "transitioning to a sustaining engineering model", focused on stability and security rather than new features, and stopped offering Enterprise contracts to new customers. Existing apps keep running, and nothing changed for card-paying customers. Still, many teams are asking where to go next. This post explains the own-server option, how Heroku's ideas map onto it, what it costs, how to move an app, and where it falls short.

In this guide:

What "on your own server" means here

You rent a VPS from a company like Hetzner, DigitalOcean, Vultr or Linode, running the latest Ubuntu LTS. Your app, your database and your backups live on it. You pay the provider directly, one flat price per month for the whole machine.

ox is the part that makes it feel like Heroku. ox is not self-hosted: its control panel is hosted, so you run nothing extra yourself. You paste one command on the server, which installs a small agent and Caddy. From then on you deploy from the dashboard, the ox command line, or a git push.

ox doesn't use Docker or buildpacks. Your app runs as a plain systemd service under its own Linux user, behind Caddy with automatic HTTPS. The agent dials out to ox over an encrypted connection, so no port is opened for it and ox holds no SSH key.

Heroku concepts and their ox names

On HerokuOn ox
web process in the Procfile[app] start in ox.toml, or detected from your repo
worker processes[workers], one line each
release phase (migrations)[build] migrate, run before traffic moves to the new release
BuildpacksDetection from your lockfile and version files; toolchains installed with mise
Config varsVariables, with history and undo
Postgres and Redis add-ons[services]: postgres = {}, redis = {} on your server
Heroku Scheduler[cron], with a schedule per job
Pipelines and promotionA staging copy and Promote to production
Review appsBranch previews, each with its own database and web address
heroku releases:rollbackox rollback, to a kept release, with no rebuild
heroku logs --tailox logs myapp --follow

One difference to know: ox does not read a Procfile. You move its lines into ox.toml, which takes a minute (example below). Review apps become branch previews and a staging copy, which run on the same server.

Heroku pricing compared with a VPS

Heroku prices each process and each add-on. On October 8, 2026, Heroku's pricing page listed Eco dynos at $5 a month, Basic at $7, Standard-1X at $25, and the smallest Heroku Postgres plan (Essential-0) at $5. A web process and a worker on Basic plus that database comes to $19 a month for one app, before Redis or more apps.

On your own server you pay for the machine once and put several apps on it. Small servers cost about $5 to $24 a month. ox is free during its beta, and nothing is charged. After the beta we expect it to cost about $8 to $12 per server each month, for every app on that server. That price isn't final: we will announce it before the beta ends and give notice before anything is charged.

HerokuYour VPS with ox
How you payPer dyno and per add-on, per appOne server price, any number of apps on it
Where the app runsHeroku's machinesYour server, as a systemd service
DatabaseHeroku Postgres add-onPostgreSQL on your server, backed up daily
ScalingMore dynos, autoscaling on some plansA bigger server; no autoscaling
Who runs the machineHerokuYou own it; ox hardens and updates it

How to migrate from Heroku to a VPS, step by step

The move takes five steps. Keep the Heroku app running until the last one.

1. Add a server and the repository

Sign in to ox with GitHub, add a fresh Ubuntu LTS server with the command ox shows, and pick your app's repository. ox reads it and shows what it will run before anything starts. The quickstart walks through these screens.

2. Turn the Procfile into ox.toml

A typical Python Procfile:

Code
web: gunicorn config.wsgi --bind 0.0.0.0:$PORT
worker: celery -A config worker
release: python manage.py migrate --noinput

becomes:

TOML
domains = ["example.com"]

[app]
start = "uv run gunicorn config.wsgi --bind 127.0.0.1:$PORT"

[build]
migrate = "uv run python manage.py migrate --noinput"

[workers]
worker = "uv run celery -A config worker"

[services]
postgres = {}
redis    = {}

ox gives each process its $PORT and sets HOST=127.0.0.1. Bind there, as above, and Caddy stays the only thing facing the internet. Run ox check in the repo to see the resolved plan and any missing variables before you deploy. For other stacks, the guides have a complete ox.toml each: deploy Next.js, deploy FastAPI, deploy a Node API and deploy Laravel.

3. Copy your config vars

Print them with heroku config -s --app myapp and add your own keys in ox's Variables tab, or with ox vars set. Skip DATABASE_URL, REDIS_URL and PORT: ox provides those, pointing at the services on your server.

4. Bring the Heroku Postgres database over

Shell
heroku pg:backups:capture --app myapp
heroku pg:backups:download --app myapp

That saves latest.dump, a pg_dump archive. ox restores it from a file: it loads the dump into a copy first, so the live database changes only when the load works. The dashboard takes files up to 95 MB, and the command line takes one too:

Shell
ox restore myapp postgres --file latest.dump --confirm myapp --wait

5. Deploy, check, then switch DNS

Deploy. Before your domain points at the server, ox gives the app a temporary address so you can check it. When it looks right, point your domain's A record at the server. Caddy gets the HTTPS certificate on its own. Turn off the Heroku dynos once traffic has moved.

What you get beyond the move

  • Updates with no downtime: the new release starts beside the old one and visitors move only after it answers its health check (how zero-downtime deploys work with systemd and Caddy).

  • A daily backup of every database, kept on the server and copied to your S3 bucket if you add one, plus a snapshot before every migration.

  • A command line your AI coding agent can drive: every command takes --json and exits with an error when something fails.

  • Your data stays on your server. ox shows your variables in the dashboard but keeps no copy.

What ox does not do

Know these before you move:

  • One project runs on one server. There is no scaling across several servers and no autoscaling. You pick a bigger server when you need one.

  • Rails works, with a few limits. ox deploys a standard Rails app with Postgres, and the Rails guide shows how. Background jobs need a [workers] line, and SQLite-only apps and Jekyll sites are not supported.

  • No Procfile and no buildpacks. Your build runs from your lockfile and ox.toml.

  • No Docker. If your app only ships as a container image, ox is not the right fit.

  • One operating system. Servers run the latest Ubuntu LTS.

  • One person per account for now. Teams are planned for after the beta.

  • The server is yours. ox sets up a firewall, fail2ban and automatic security updates, but the machine, its size and its provider are your choice and your bill.

Other Heroku alternatives worth a look

  • Dokku is an open-source Heroku alternative you install on your server. It builds with Heroku buildpacks and runs apps in Docker containers.

  • Coolify is open source and self-hostable, deploys anything that works with Docker, and also offers a hosted plan.

  • Kamal, from 37signals, deploys containerized apps to your servers from the command line, with zero-downtime deploys.

  • Hosting platforms like Render, Railway and Fly.io run your app on their machines, closer to Heroku's model.

If you want containers, those are good fits. ox is for when you want your app to be a plain service on a server you own, without running a panel yourself.

Key takeaways

  • Heroku is in sustaining engineering since February 2026: apps keep running, but new features have stopped.
  • A VPS costs one flat monthly price for several apps; Heroku charges per dyno and per add-on.
  • Every Heroku idea has an ox equivalent except the Procfile and buildpacks, which become a short ox.toml.
  • The move is five steps, and the Heroku app keeps serving until you switch DNS.
  • ox does not autoscale or spread one app over several servers.

Frequently asked questions

Is Heroku shutting down?

No end date has been announced. Heroku's February 2026 update says it is moving to a sustaining engineering model, focused on stability, security and support, and existing customers' apps and contracts continue. What changed is that new features have stopped and new customers can no longer sign Enterprise contracts.

What is the cheapest Heroku alternative?

For more than one app, usually a VPS of your own. A small server costs about $5 to $24 a month and holds several apps and their databases, while Heroku charges per dyno and per add-on for each app. The catch is the server work, which a tool like ox, Dokku or Coolify takes over.

Do I need to know Linux to run my app on a VPS?

Not with ox. You paste one command on the server once, and everything after that happens in the dashboard or the CLI. You won't need to log in to the server. ox sets up the firewall, fail2ban and automatic security updates, so the usual first-day hardening is done for you.

Which languages can I move off Heroku to ox?

JavaScript and TypeScript (npm, pnpm, Yarn, Bun), Python (uv, Poetry, pip, Django, FastAPI), Go, Rust, Ruby on Rails, PHP and plain websites. Each stack guide in the docs has a complete ox.toml you can copy, and ox check shows what ox will run before you deploy anything.

Can I leave ox later?

Yes. Your apps are plain programs on your server and your database is plain PostgreSQL, so nothing is locked into a format only ox reads. ox removes itself cleanly and leaves the security settings in place. Your backups are standard PostgreSQL dumps you can restore anywhere.

Next step

Pick the smallest app you run on Heroku and try the move on a fresh $5 to $10 server while the Heroku copy keeps serving. The quickstart takes you from sign-in to a first deploy in five steps.

Keep reading

Deploy to a server you own

ox sets up systemd, Caddy and PostgreSQL on your Ubuntu server and deploys on every push. Free during the beta.

Sign up with GitHub Read the docs