Back to Article List

Self-host Rakazo on a VPS (open-source Grok Bot alternative)

Self-host Rakazo on a VPS (open-source Grok Bot alternative) - Self-host Rakazo on a VPS (open-source Grok Bot alternative)

This past month has been incredible in terms of releases in the AI world. It's hard to keep up with the news, let alone write tutorials about it, but allow me to try. We had Jev, Laya, then OpenAI releasing Dots and Anthropic releasing capable budget models, and then Grokbot actually proved useful. And now, there's a great alternative to it...

Rakazo is an open-source agent platform built around persistent bots: each one keeps its own conversations, memory and routines, signs in to your tools and comes back when it needs an approval. The licence is Apache 2.0 by the way.

Run it on a laptop, and the bots stop when the lid closes. Run the backend on a VPS and they keep going, which is the whole point of an always-on agent.

This guide installs Rakazo from the published Docker images on Ubuntu 24.04, puts HTTPS in front of it with Caddy, locks signup to your own email, connects a model and sets up backups and upgrades. The desktop and mobile apps then connect to that server as clients.

Everything below follows the Rakazo self-hosting guide as it stood on 15 October 2026. The project is in beta and ships from the edge tag on every merge, so expect the installer and the .env keys to change; the guide on GitHub wins where the two differ.

What a Rakazo server needs

The stack is five containers plus one per bot computer: Postgres, an API, a worker, a sandbox supervisor and the web app, all from one ghcr.io/elie222/rakazo/app image, with a separate ghcr.io/elie222/rakazo/computer image that is a full Linux desktop with Chromium. The published-images path needs Docker Engine 26 or newer (the bot home volumes use subpath mounts, which arrived with API 1.45), the Compose plugin, curl and OpenSSL. No Node, no clone.

Sizing comes from the documented ceilings. Each Docker computer is capped at 2g of memory and 2 CPUs by default and the web container at 512 MB. Postgres, the API, the worker and the supervisor run beside them. A 2 vCPU, 4 GB server runs the stack with the one shared Team Computer that bots use by default. Private computers per bot each add another 2 GB ceiling, so 8 GB is the sensible floor once you want two or three bots working at the same time. The computer image is a desktop with a browser inside it, so give the disk room: 40 GB or more leaves space for the images, bot homes and local backups.

You also need a domain or subdomain pointed at the server's IP (rakazo.example.com below) and a model to connect: an OpenRouter key, an Anthropic or OpenAI key, a ChatGPT or Claude subscription sign-in or a local model served from Ollama.

Your idea deserves better hosting

24/7 support 30-day money-back guaranteeRefund covers the VPS plan on your first order. Cancel anytime
Billing Cycle

VPS.S1

$5.99 Save  17 %
$4.99 Monthly
  • 2 vCPU AMD EPYC
  • 2 GB RAMMEMORY
  • 30 GB NVMeSTORAGE
  • Unmetered bandwidth
  • IPv4 & IPv6IPv6 is currently unavailable in France, Finland or the Netherlands. included

VPS.S3

$14.99 Save  33 %
$9.99 Monthly
  • 4 vCPU AMD EPYC
  • 6 GB RAMMEMORY
  • 70 GB NVMeSTORAGE
  • Unmetered bandwidth
  • IPv4 & IPv6IPv6 is currently unavailable in France, Finland or the Netherlands. included

VPS.S4

$19.99 Save  20 %
$15.99 Monthly
  • 6 vCPU AMD EPYC
  • 8 GB RAMMEMORY
  • 80 GB NVMeSTORAGE
  • Unmetered bandwidth
  • IPv4 & IPv6IPv6 is currently unavailable in France, Finland or the Netherlands. included

EPYC VPS.P1

$8.99 Save  22 %
$6.99 Monthly
  • 2 vCPU AMD EPYC
  • 4 GB RAMMEMORY
  • 40 GB NVMeSTORAGE
  • Unmetered bandwidth
  • IPv4 & IPv6IPv6 is currently unavailable in France, Finland or the Netherlands. included
  • Free auto backupsIncludes one backup slot you can set to run daily, weekly or monthly.

EPYC VPS.P2

$16.99 Save  24 %
$12.99 Monthly
  • 2 vCPU AMD EPYC
  • 8 GB RAMMEMORY
  • 80 GB NVMeSTORAGE
  • Unmetered bandwidth
  • IPv4 & IPv6IPv6 is currently unavailable in France, Finland or the Netherlands. included
  • Free auto backupsIncludes one backup slot you can set to run daily, weekly or monthly.

EPYC VPS.P4

$29.99 Save  23 %
$22.99 Monthly
  • 4 vCPU AMD EPYC
  • 16 GB RAMMEMORY
  • 160 GB NVMeSTORAGE
  • Unmetered bandwidth
  • IPv4 & IPv6IPv6 is currently unavailable in France, Finland or the Netherlands. included
  • Free auto backupsIncludes one backup slot you can set to run daily, weekly or monthly.

EPYC VPS.P5

$39.99 Save  25 %
$29.99 Monthly
  • 8 vCPU AMD EPYC
  • 16 GB RAMMEMORY
  • 180 GB NVMeSTORAGE
  • Unmetered bandwidth
  • IPv4 & IPv6IPv6 is currently unavailable in France, Finland or the Netherlands. included
  • Free auto backupsIncludes one backup slot you can set to run daily, weekly or monthly.

EPYC VPS.P6

$59.99 Save  25 %
$44.99 Monthly
  • 8 vCPU AMD EPYC
  • 32 GB RAMMEMORY
  • 200 GB NVMeSTORAGE
  • Unmetered bandwidth
  • IPv4 & IPv6IPv6 is currently unavailable in France, Finland or the Netherlands. included
  • Free auto backupsIncludes one backup slot you can set to run daily, weekly or monthly.

EPYC VPS.P7

$69.99 Save  29 %
$49.99 Monthly
  • 16 vCPU AMD EPYC
  • 32 GB RAMMEMORY
  • 240 GB NVMeSTORAGE
  • Unmetered bandwidth
  • IPv4 & IPv6IPv6 is currently unavailable in France, Finland or the Netherlands. included
  • Free auto backupsIncludes one backup slot you can set to run daily, weekly or monthly.

Genoa VPS.G2

$24.99 Save  20 %
$19.99 Monthly
  • 2 vCPUAMD EPYC Genoa 4th generation 9xx4 with 3.25 GHz or similar, on Zen 4 architecture. AMD EPYC G4
  • 4 GB DDR5MEMORY
  • 50 GB NVMeSTORAGE
  • Unmetered bandwidth
  • IPv4 & IPv6IPv6 is currently unavailable in France, Finland or the Netherlands. included
  • Free auto backupsIncludes one backup slot you can set to run daily, weekly or monthly.

Genoa VPS.G4

$44.99 Save  22 %
$34.99 Monthly
  • 4 vCPUAMD EPYC Genoa 4th generation 9xx4 with 3.25 GHz or similar, on Zen 4 architecture. AMD EPYC G4
  • 8 GB DDR5MEMORY
  • 100 GB NVMeSTORAGE
  • Unmetered bandwidth
  • IPv4 & IPv6IPv6 is currently unavailable in France, Finland or the Netherlands. included
  • Free auto backupsIncludes one backup slot you can set to run daily, weekly or monthly.

Genoa VPS.G6

$89.99 Save  22 %
$69.99 Monthly
  • 8 vCPUAMD EPYC Genoa 4th generation 9xx4 with 3.25 GHz or similar, on Zen 4 architecture. AMD EPYC G4
  • 16 GB DDR5MEMORY
  • 200 GB NVMeSTORAGE
  • Unmetered bandwidth
  • IPv4 & IPv6IPv6 is currently unavailable in France, Finland or the Netherlands. included
  • Free auto backupsIncludes one backup slot you can set to run daily, weekly or monthly.

Genoa VPS.G7

$159.99 Save  22 %
$124.99 Monthly
  • 8 vCPUAMD EPYC Genoa 4th generation 9xx4 with 3.25 GHz or similar, on Zen 4 architecture. AMD EPYC G4
  • 32 GB DDR5MEMORY
  • 250 GB NVMeSTORAGE
  • Unmetered bandwidth
  • IPv4 & IPv6IPv6 is currently unavailable in France, Finland or the Netherlands. included
  • Free auto backupsIncludes one backup slot you can set to run daily, weekly or monthly.

AMD Ryzen VPS.R1

$16.99 Save  18 %
$13.99 Monthly
  • 1 dedicated CPU AMD Ryzen 9 7950X with 4.5 GHz or similar, on Zen 4 architecture. vCPU
  • 4 GB DDR5MEMORY
  • 50 GB NVMeSTORAGE
  • Unmetered bandwidth
  • IPv4 & IPv6 included IPv6 support is currently unavailable in France, Finland or the Netherlands.
  • Auto backup included

AMD Ryzen VPS.R2

$29.99 Save  17 %
$24.99 Monthly
  • 2 dedicated CPUs AMD Ryzen 9 7950X with 4.5 GHz or similar, on Zen 4 architecture. vCPU
  • 8 GB DDR5MEMORY
  • 100 GB NVMeSTORAGE
  • Unmetered bandwidth
  • IPv4 & IPv6 included IPv6 support is currently unavailable in France, Finland or the Netherlands.
  • Auto backup included

AMD Ryzen VPS.R4

$109.99 Save  18 %
$89.99 Monthly
  • 8 dedicated CPUs AMD Ryzen 9 7950X with 4.5 GHz or similar, on Zen 4 architecture. vCPU
  • 32 GB DDR5MEMORY
  • 400 GB NVMeSTORAGE
  • Unmetered bandwidth
  • IPv4 & IPv6 included IPv6 support is currently unavailable in France, Finland or the Netherlands.
  • Auto backup included

*VAT excluded.

INCLUDED WITH EVERY PLAN

✓ No setup fees ✓1 Gbps network
✓ Full root access on KVM ✓ Free server monitoring ✓ Firewall management ✓24/7 support

Step 1: Install Docker Engine 26 or newer

The docker.io package in Ubuntu's own repositories can lag behind, and the version matters here. Use Docker's install script, which sets up Docker's apt repository and installs the current Engine with the Compose plugin:

sudo apt update && sudo apt install -y curl openssl
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER

Log out and back in so the group change applies, then check both numbers the installer will later check for you:

docker version --format '{{.Server.Version}}'
docker compose version

The first line must read 26 or higher. A LumaDock VPS deployed from the Docker template skips this step, since Docker comes preinstalled, though the version check is still worth running on any server you did not set up yourself.

Step 2: Download the installer and prepare .env

Rakazo's installer is a single shell script. Run it with --prepare-only first, so it downloads the Compose file, writes .env with random secrets and stops before pulling anything:

mkdir -p ~/rakazo && cd ~/rakazo
curl -fsSLO https://raw.githubusercontent.com/elie222/rakazo/main/infra/compose/install-images.sh
bash install-images.sh --prepare-only

You now have docker-compose.images.yml and a .env in which five values were generated for you with openssl rand: POSTGRES_PASSWORD, BETTER_AUTH_SECRET, ENCRYPTION_KEY, SCREEN_PROXY_SECRET and SANDBOX_SUPERVISOR_TOKEN. Leave them alone. The secrets checklist asks that the four long ones stay independent of each other, and ENCRYPTION_KEY in particular must never change later, because it encrypts every stored credential.

Open .env and change the public origin lines. Out of the box they point at http://127.0.0.1:5173, which is right for a laptop and wrong for a server:

BETTER_AUTH_URL=https://rakazo.example.com
WEB_ORIGIN=https://rakazo.example.com
API_URL=https://rakazo.example.com
RAKAZO_HOST=rakazo.example.com

All three origins must be the same HTTPS URL, and RAKAZO_HOST must be the bare hostname, because the web container's preview server only answers for hosts on its allowlist. Leave it at localhost and the site will load through Caddy and then refuse every request.

Two more lines before the first start. SIGNUPS_ENABLED is read once, when the API starts for the first time, and is not reapplied on restarts. A non-empty SIGNUP_ALLOWLIST is applied on every start and replaces whatever list is stored:

SIGNUPS_ENABLED=true
[email protected]

With the allowlist set and no SMTP configured, your own account can register without email verification, and nobody else can register at all. That is the sequence the docs recommend for a public host: allowlist first, then expose, then sign up. If you want password recovery later, fill SMTP_URL and EMAIL_FROM as well; Rakazo rejects SMTP settings that disable TLS, so use smtps:// on port 465 or smtp:// with STARTTLS.

Optionally add OPENROUTER_API_KEY now. Any other provider can be connected from the web UI after signup, so an empty key is fine. OK, next!

Step 3: Start Rakazo and check the containers

Run the installer again without the flag. It keeps your edited .env, validates that the five secrets are non-empty (an empty one fails the Compose config on purpose), pulls the images and brings the stack up:

bash install-images.sh

The first pull takes a while because of the computer image. When it finishes you should see the stack healthy:

docker compose --env-file .env -f docker-compose.images.yml ps
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:5173/

The computer and data-init entries show as exited; they only pull the desktop image and fix volume ownership. Postgres, the supervisor, the API, the worker and web should all be running. Web is bound to 127.0.0.1:5173 and the API to 127.0.0.1:3100, so nothing is reachable from the internet yet, and the Postgres port is not published at all. Keep it that way; the next step adds the one public door.

Step 4: Put HTTPS in front with Caddy

The web container proxies /api and /rpc to the API itself, so a reverse proxy only needs to reach port 5173. Caddy fetches and renews the certificate on its own. Install it from the Caddy project's apt repository:

sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo chmod o+r /usr/share/keyrings/caddy-stable-archive-keyring.gpg /etc/apt/sources.list.d/caddy-stable.list
sudo apt update && sudo apt install -y caddy

Replace /etc/caddy/Caddyfile with the two-line site block from Rakazo's docs, then reload:

rakazo.example.com {
    reverse_proxy 127.0.0.1:5173
}
sudo systemctl reload caddy

If the server runs ufw, allow SSH, HTTP and HTTPS and nothing else. Port 80 stays open because Caddy answers the certificate challenge there and redirects everything else to HTTPS:

sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

Open https://rakazo.example.com. The sign-in page should load with a valid certificate. If you get a "Blocked request" error instead, the usual cause is RAKAZO_HOST still set to localhost; fix it and recreate the web container with docker compose --env-file .env -f docker-compose.images.yml up -d web.

Step 5: Create the owner account and connect a model

Register with the email from your allowlist. The first registered user becomes the deployment owner, which is why the allowlist went in before the first start. Then connect a model under the bot setup: an OpenRouter key if you set one in .env, otherwise a provider key or a ChatGPT or Claude subscription sign-in, which Rakazo supports through its Pi harness. Create a bot, open Agent computer and you should see a live Linux desktop streaming from the Docker computer on your server.

Local models work too, and they are the reason some people pick Rakazo over a hosted agent in the first place. Install Ollama on the same server or a GPU server next to it, following the Ollama install guide for Ubuntu, and add it as an OpenAI-compatible connection. Two details matter: from inside the containers 127.0.0.1 is the container, so Ollama must listen on an address the API container can reach, such as the Docker bridge address of the host; and bots with screen tools need a model that accepts images, so tick the connection's Supports images setting for a vision-capable model (centrally managed endpoints list theirs in RAKAZO_OPENAI_COMPATIBLE_VISION_MODELS instead). A text-only model still runs a bot. It just cannot read screenshots of what the computer is doing.

Which model to pick depends on what the bots do all day. A reader on r/GrokBot reported running six Rakazo agents on DeepSeek for a few dollars a day, and the bills others quote for hosted agents go the other way. Spend it where the work is: one capable model for the bot that writes to people, a cheap one for the bot that only triages.

Run your models on a GPU you don't share

Open models on a dedicated card keep your prompts on your own server and swap the per-token bill for one flat monthly price.

Step 6: Restrict what the bot computers can reach

A Docker computer has full outbound access by default: the internet, but also the host, the LAN and any cloud metadata address. For a server that holds nothing else, that is tolerable. For one that sits next to other machines, or runs on a cloud with an instance-metadata service, Rakazo's docs call the metadata path "instance-credential theft for anything a bot runs" and ship a two-part fix. Set the flag in .env:

SANDBOX_COMPUTER_EGRESS=restricted

Recreate the supervisor so each computer gets a named bridge, then apply the host firewall rules once:

docker compose --env-file .env -f docker-compose.images.yml up -d supervisor
curl -fsSLO https://raw.githubusercontent.com/elie222/rakazo/main/infra/compose/restrict-computer-egress.sh
sudo bash restrict-computer-egress.sh

The script drops traffic from the rakazo-c* bridges to every non-public destination and to the host, and installs a systemd unit so the rules survive a reboot. --print shows the rules without applying them and --remove takes them out. It needs Docker's iptables backend, which is what a stock Ubuntu install has; Docker Desktop, rootless Docker and the nftables backend are unsupported. Skip this step if the bots must reach a service on your LAN or a proxy bound to the host.

Backups: Postgres plus the appdata volume

The scripts/backup.sh helper in the repository targets a source checkout and its data/ directory. The published-images stack keeps state in two named Docker volumes instead, rakazo_pgdata and rakazo_appdata (bot homes, workspaces and browser profiles), so back those up directly:

mkdir -p ~/rakazo/backups && cd ~/rakazo
docker compose --env-file .env -f docker-compose.images.yml exec -T postgres pg_dump -U rakazo rakazo > backups/rakazo-$(date +%F).sql
docker run --rm -v rakazo_appdata:/data -v ~/rakazo/backups:/backup busybox tar czf /backup/appdata-$(date +%F).tgz -C /data .

Back up .env with them. A restored database is useless without the ENCRYPTION_KEY that wrote it, and the five secrets cannot be regenerated into the same values. Copy the three files off the server; a cron job that runs the two commands and an rsync to a second machine covers it.

Upgrading a published-images install

This is the question in issue #1373, and for this install path the answer is short. The default RAKAZO_IMAGE_TAG=edge follows every merge to main, so an upgrade is a pull and a recreate, which is exactly what the installer does on a rerun:

cd ~/rakazo && bash install-images.sh

It preserves .env, pulls the newer edge images and runs up -d --wait. The API runs its database migrations before it serves, so a failed migration shows up as an unhealthy API rather than a half-working one. Take the backup above first; the docs note that an upgrade across one particular migration needs a credential check beforehand, and a dump is the cheap insurance against surprises like that.

If you would rather not ride main, set RAKAZO_IMAGE_TAG and RAKAZO_COMPUTER_IMAGE_TAG in .env to a release tag you can see in the GitHub releases list, and move them deliberately. The docs warn against pinning latest until a stable release exists in the registry.

Common problems on a first install

  • "Set SANDBOX_SUPERVISOR_TOKEN in .env" at startup: one of the five required secrets is empty. The stack fails closed rather than starting without it. Fill it with openssl rand -hex 32 and rerun the installer.
  • Image pull fails behind a proxy: the Docker daemon does not read your shell's HTTP_PROXY. Configure the daemon proxy, or point RAKAZO_IMAGE and RAKAZO_COMPUTER_IMAGE at a mirror that already has the images; the docs have a restricted-network guide for exactly this.
  • Site loads on the server but not through the domain: RAKAZO_HOST or one of the three origins still carries the loopback default. All four must name the public HTTPS host.
  • Bot computer's browser restarts every few minutes: reported in issue #1387 and open at the time of writing. The first thing to rule out is the 2 GB memory ceiling on a computer running Chromium: raise RAKAZO_COMPUTER_MEMORY on a server that has the headroom and recreate the supervisor.
  • Lost the owner password with no SMTP: password changes for a signed-in user need no email, but recovery from the sign-in page only appears when an SMTP provider is configured. Add SMTP_URL and EMAIL_FROM, restart the API and the recovery link appears.

Logs for any of these come from docker compose --env-file .env -f docker-compose.images.yml logs -f api worker supervisor. The services log structured lines at info by default; LOG_LEVEL=debug in .env turns the volume up when a bug report needs it.

Connecting the desktop and mobile apps

The server is the whole product; the apps are clients of the same API the browser uses. In the desktop app choose Existing instance at first launch and enter https://rakazo.example.com; it checks the health endpoint before saving and refuses plain HTTP for anything that is not loopback or a private LAN address. On iPhone or Android, tap Use a custom server on the sign-in screen and enter the same origin as WEB_ORIGIN. Switching servers signs the device out of the previous one, so do it once and leave it.

If this server is also where your Hermes Agent lives, the two do not conflict: Hermes runs as its own process and gateway, Rakazo as its own Compose project. I saw a thread on r/hermesagent that describes a Hermes install that set up Rakazo for its owner. Our comparison of Hermes and OpenClaw for self-hosting covers how those two differ from each other; Rakazo sits closer to the Grok Bot model, with a desktop per bot and approvals in the chat. Readers who landed here because OpenAI's dots are not available on their plan have the same choice laid out in our OpenAI dots alternative piece, and the install above is the server half of it.

Questions?

Is there a simpler upgrade path for a self-hosted Rakazo?

For the published-images install, rerunning bash install-images.sh in the install directory is the upgrade. It keeps .env, pulls the newer edge images and recreates the containers with up -d --wait. The longer upgrade procedure in the docs applies to the production Compose stack and the updater sidecar, not to this path.

Ellie Grace Hayes
About the author

Ellie Grace Hayes

I grew up in Minnesota and started working remotely before I decided that travelling was going to become a permanent part of my life. And it kinda did, more or less... I tend to stay somewhere for a month or two, sometimes longer if I like the place (so "digital nomad" is technically accurate, even if most days are much less exciting than the term suggests). Usually I'm at a desk in a rented room trying to work out why a command behaved differently on two supposedly identical machines :)

I came into technical writing through support work & community tutorials. Linux was the first subject I wrote about, but since then I've wandered into containers, hosting, networking plus a lot of self-hosted software. I've played Minecraft since I was a kid and still go through phases where I get completely absorbed in it for a few weeks. I don't have a five-year plan. I've tried - it keeps becoming a six-month plan instead.

Deploy your next project in seconds

Bring your winning ideas online faster, with modern hardware and unmetered bandwidth. Join a European cloud trusted by thousands of developers and businesses worldwide.