SSD Nodes Learn 🎉 VPS từ $5.50/tháng
Hướng dẫn Matt ConnorBởi Matt Connor

Tự host Rakazo trên VPS: cần bao nhiêu tài nguyên?

Chạy Rakazo trên VPS với Node 22, pnpm, Postgres và Graphile Worker trong Docker Compose. Biết cách chọn sandbox, giữ key và sizing thực tế.

Rakazo thực sự chạy những gì khi tự host

Tự host Rakazo có nghĩa là chạy 5 thành phần trên một Linux server: PostgreSQL, một tiến trình Graphile Worker, API, web app và một sandbox container cho mỗi bot đang hoạt động. Rakazo là một lựa chọn mã nguồn mở thay thế Grok Bot, do elie222 phát hành theo giấy phép Apache 2.0. Mỗi bot có thread riêng, computer riêng, memory riêng và history riêng. Bot cũng có thể tạo các peer hoặc subagent chạy trong thời gian ngắn.

Đó là lý do Rakazo phù hợp với VPS (virtual private server), không phải desktop. Bot lưu memory và chạy công việc theo lịch phải có thể truy cập được trong lúc bạn ngủ. Laptop chuyển sang chế độ suspend sẽ làm queue dừng lại.

Tính đến tháng 8 năm 2026, Rakazo vẫn đang ở giai đoạn beta ban đầu. Vì vậy, hãy xem đây là một cấu hình đang hoạt động, không phải một appliance hoàn thiện. Stack này dùng TypeScript xuyên suốt: React 19 và Vite cho web app, Hono cho API, Postgres với Prisma, Better Auth cho account và Graphile Worker cho background job. Graphile Worker lưu queue bên trong Postgres, nên không cần chạy Redis hay một data store thứ hai. .env.example thiết lập WAKEUP_DRIVER=graphile, nghĩa là việc bot thức dậy được xử lý như một job dựa trên Postgres. Dừng Postgres sẽ làm mọi hành động theo lịch của bot dừng theo. Nếu muốn tự lắp ráp một agent từ các thành phần thay vì chạy sản phẩm của người khác, tự xây agent từ các thành phần là lựa chọn còn lại.

Vì sao gói 1 GB không đủ cho hệ thống này

Hãy đếm các process. Postgres là một process. API là một Node process. Worker là process thứ hai. Web app là process thứ ba. Sandbox supervisor là process thứ tư. Sau đó, mỗi bot đang chạy lại có một container chứa desktop Linux đồ họa và browser.

Tài liệu self-host của dự án đưa ra một con số rõ ràng: máy 2 vCPU và 4 GB đủ chạy API, worker và Postgres khi E2B quản lý các desktop của bot. Đây chỉ là con số cho control plane, còn phần nặng được host ở nơi khác. Khi đặt SANDBOX_PROVIDER=docker, các desktop đó được chuyển sang VPS của bạn, nên 4 GB trở thành mức sàn thay vì mức mục tiêu. Hãy bắt đầu với 8 GB nếu bạn định giữ nhiều hơn một bot hoạt động, rồi đo con số thực tế bằng docker stats trong khi bot chạy. Browser bên trong sandbox là thành phần làm tăng mức dùng memory, nên chỉ xem spec không cho bạn biết con số chính xác. Để biết phương pháp chung khi sizing máy cho agent, agent VPS thực sự cần bao nhiêu RAM và CPU trình bày chi tiết cách đo.

Một setting giúp ngăn tình trạng này xấu hơn. .env.example cung cấp SANDBOX_IDLE_MS=600000 kèm comment cho biết setting này sẽ pause các máy tính E2B hoặc stop các máy Docker sau số milliseconds idle tương ứng. Khi idle 10 phút, máy tính sẽ bị dừng. Giá trị tối thiểu được chấp nhận là 30000. Nếu không có setting này, mọi bot bạn từng mở sẽ giữ memory mãi mãi.

Disk cũng cần được tính. Sandbox image, các Node module và Postgres volume dùng chung một disk, nên 40 GB là điểm bắt đầu hợp lý.

Pin phiên bản trước khi clone

Rakazo phát triển rất nhanh và main không phải là một bản release. Tính đến ngày 16 August 2026, repository chỉ có đúng một tag là v0.1.0-beta, được phát hành ngày 13 August 2026 và được đánh dấu là prerelease.

git clone https://github.com/elie222/rakazo.git
cd rakazo
git checkout 53b119a68d9ef843d23aa3b7e3719b6be7b51fdb
git log -1 --format='%H %ci'

Commit đó là commit mà v0.1.0-beta trỏ tới. Hãy pin commit thay vì branch hoặc tag. Branch có thể thay đổi sau lần git pull tiếp theo, còn tag là nhãn có thể di chuyển mà maintainer có thể trỏ lại, nên cả hai đều không xác định được một tree mà bạn có thể quay lại. Identifier của commit không thể thay đổi. Hãy ghi lại identifier này cùng các thông tin khác về server, vì khi một lần upgrade gây lỗi, cách sửa nhanh và ít tốn kém là git checkout <old commit> rồi rebuild; cách này chỉ hiệu quả nếu bạn biết commit nào đang hoạt động.

Yêu cầu: Node 22, pnpm 9 và Docker

node -v
pnpm -v
docker --version

package.json khai báo "engines": { "node": ">=22" }"packageManager": "pnpm@9.15.0", vì vậy node -v phải in ra v22 hoặc cao hơn. Gói Node trong kho Ubuntu thường cũ hơn mức này, nên hãy cài từ NodeSource hoặc nvm. pnpm đi kèm Node thông qua corepack:

corepack enable
corepack prepare pnpm@9.15.0 --activate

Docker Engine cùng compose plugin đáp ứng phần còn lại, và user của bạn phải truy cập được daemon. Nếu docker ps trả về permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock, hãy thêm user của bạn vào group docker rồi mở một login shell mới. Trước tiên, cần hiểu quyền được cấp: thành viên của docker tương đương với root trên máy, vì bất kỳ ai trong group đó cũng có thể khởi động một container mount filesystem của host.

Cấu hình .env, sau đó khởi động Postgres

cp .env.example .env
chmod 600 .env

Phải thay đổi 2 giá trị trước khi bất kỳ thành phần nào được đưa lên mạng. .env.example cung cấp sẵn BETTER_AUTH_SECRET=replace-with-32-plus-character-secretENCRYPTION_KEY=replace-with-64-char-hex-or-passphrase. Rakazo từ chối các giá trị placeholder này ngoài môi trường development, nên lần triển khai cấu hình thiếu sẽ báo lỗi rõ ràng thay vì chạy với secret đã được công khai trong repository.

openssl rand -base64 48
openssl rand -hex 32

Sau đó khởi động riêng database và chạy các migration.

docker compose --env-file .env -f infra/compose/docker-compose.yml up postgres -d
pnpm install
pnpm db:generate
pnpm db:migrate
pnpm sandbox:build

pnpm sandbox:build build image máy tính cho bot, được định nghĩa trong package.jsondocker build -t rakazo/computer:local infra/sandboxes/computer. Đây là image đồ họa, nên lần build đầu tiên sẽ tải nhiều dữ liệu và mất thời gian. Xác nhận image đã được tạo bằng docker image ls rakazo/computer. Lệnh này phải in ra 1 dòng.

File compose publish Postgres tại 127.0.0.1:5433:5432 và chỉ bind trên loopback. Giữ nguyên cấu hình đó. Credential development là rakazo:rakazo và được lưu trong repository. Một cổng Postgres có thể truy cập từ Internet cùng password đã publish sẽ bị scanner phát hiện trong vài giờ. File compose production thay vào đó đọc POSTGRES_PASSWORD, nên hãy đặt biến này thành một chuỗi ngẫu nhiên khi đến bước đó.

Lần chạy đầu tiên

pnpm dev

Lệnh này khởi động 4 thành phần: API trên port 3100, Graphile Worker, web app Vite trên port 5173 và sandbox supervisor trên port 7091. App nằm tại http://127.0.0.1:5173 và bạn sẽ thấy trang đăng nhập.

Trên VPS, bạn không ngồi trực tiếp tại máy đó và không nên public port 5173 để truy cập app. Thay vào đó, hãy forward các port qua SSH (secure shell) từ máy của bạn.

ssh -L 5173:127.0.0.1:5173 -L 3100:127.0.0.1:3100 you@your-server

Hãy lưu ý sự khác biệt giữa 2 cách chạy này. pnpm dev chạy Vite trên host và chỉ bind cục bộ. Service web trong file compose publish 5173:5173 trên mọi interface. Nếu khởi động toàn bộ development compose stack trên VPS public, app sẽ bị expose. Vì vậy, hãy dùng production file và reverse proxy cho mọi thứ bạn để chạy liên tục.

Nhà cung cấp sandbox nào an toàn trên server?

Đây là thiết lập cần cấu hình đúng ngay từ đầu. SANDBOX_PROVIDER trong .env nhận 4 giá trị.

  • docker là giá trị mặc định. Mỗi bot có một container riêng trên máy của bạn, được tạo từ image do pnpm sandbox:build tạo ra. Đây là cách triển khai self-hosted nhanh nhất.
  • e2b chạy các máy tính của bot trên E2B và cần E2B_API_KEY. Dự án khuyến nghị tùy chọn này cho các hệ thống public hoặc nhiều người dùng, vì nó tách máy tính của bot khỏi host đang chạy API và database.
  • desktop chạy trực tiếp các lệnh của bot trên host chạy API và worker. Hướng dẫn của repository nói rất rõ: không dùng tùy chọn này trên server public hoặc server dùng chung.
  • fake là emulator chạy trong process, dùng cho test. Nó không phải runtime.

Hãy hiểu đúng cảnh báo về desktop đó. Ở desktop mode hoàn toàn không có ranh giới cách ly, nên bot chạy shell command bằng user đang chạy process API, cùng với home directory, SSH key, cloud credential và .env của user đó. Nội dung trên một web page mà bot đọc có thể trở thành command trên server của bạn. Chạy desktop mode trên server là cách để bot nắm được credential của bạn. Chỉ dùng tùy chọn này trên máy bạn trực tiếp sử dụng, hoặc không dùng.

docker tạo ra một ranh giới thực sự, nhưng ranh giới này không tuyệt đối. Một bot không thể đọc file của bot khác vì mỗi bot có container riêng. Tuy nhiên, supervisor tạo các container đó lại mount /var/run/docker.sock, và quyền kiểm soát Docker socket của host đồng nghĩa với quyền kiểm soát host. Vì vậy, hãy giữ supervisor ở chế độ private. .env.example ghi rõ SANDBOX_SUPERVISOR_TOKEN là credential tùy chọn cho một service riêng, mặc định là BETTER_AUTH_SECRET khi để trống. Điều này có nghĩa là nếu giữ secret ở giá trị placeholder, service tạo container sẽ được bảo vệ bằng một chuỗi mà bất kỳ ai cũng có thể đọc trên GitHub. Hãy đặt cả hai giá trị. Để có mức tách biệt cao nhất trong các lựa chọn hiện có, hãy dùng e2b, hoặc dành riêng cho Rakazo một máy không chứa bất kỳ thứ gì khác. Đây cũng là lý do để chạy coding agent trong một VM dùng một lần: cách rẻ nhất để giảm hậu quả khi agent làm sai là chạy nó trên một máy không có giá trị gì.

Khóa API của model được đặt ở đâu?

Rakazo không quản lý việc tính phí model. Bạn tự cung cấp key. .env.example đặt PI_DEFAULT_PROVIDER=openrouter, vì vậy OPENROUTER_API_KEY là vị trí thường dùng, và key của các provider cũng hoạt động qua cùng setting này.

Giữ key trong .env và không đưa vào bất kỳ file nào được commit. Cả hai lệnh compose trong repository đều truyền --env-file .env, vì vậy các giá trị được đưa vào container mà không bao giờ được ghi vào YAML do git theo dõi. Bạn cũng có thể để trống OPENROUTER_API_KEY rồi dán key vào app trong quá trình onboarding. Đây là một lý do nữa khiến ENCRYPTION_KEY phải có giá trị ngẫu nhiên thực sự thay vì placeholder đi kèm.

Hãy đặt giới hạn chi tiêu cho key tại provider trước khi bot sử dụng key. Bot bị lặp sẽ tiếp tục phát sinh chi phí, và giới hạn riêng cho từng key là biện pháp dừng duy nhất không phụ thuộc vào việc bạn phải theo dõi liên tục. Đặt tên riêng cho key này để có thể thu hồi riêng nó.

Chuyển từ chế độ dev sang hệ thống có thể để chạy lâu dài

Repository có file Compose cho production. File này chạy Postgres, API, worker, web app và Caddy để tự động lấy chứng chỉ TLS (bảo mật tầng truyền tải). File này cần E2B cho các máy tính bot.

sudo DEPLOY_USER=deploy bash infra/compose/harden-host.sh
docker compose --env-file .env -f infra/compose/docker-compose.prod.yml up -d --build

harden-host.sh tắt đăng nhập SSH bằng mật khẩu, thiết lập rule UFW (tường lửa không phức tạp) cho SSH, HTTP và HTTPS, bật fail2ban và áp dụng các profile AppArmor. Hãy đọc file trước khi chạy, vì nó thay đổi cách bạn đăng nhập. Giữ một phiên SSH thứ hai mở trong khi lệnh chạy.

.env cho production cần nhiều cấu hình hơn bản development. Tài liệu self-host liệt kê cấu hình tối thiểu này.

NODE_ENV=production
RAKAZO_HOST=app.example.com
BETTER_AUTH_URL=https://app.example.com
WEB_ORIGIN=https://app.example.com
API_URL=https://app.example.com
POSTGRES_PASSWORD=<random>
BETTER_AUTH_SECRET=<random>
ENCRYPTION_KEY=<random>
E2B_API_KEY=<your key>
OPENROUTER_API_KEY=<your key>
SANDBOX_PROVIDER=e2b
AGENT_RUNTIME=pi
DATA_DIR=/data

Trỏ một bản ghi A đến server trước khi chạy up lần đầu. Caddy yêu cầu chứng chỉ cho tên trong RAKAZO_HOST. Yêu cầu sẽ thất bại nếu tên đó không phân giải đến máy này hoặc cổng 80 bị chặn từ bên ngoài.

Bạn cũng phải thiết lập SIGNUP_ALLOWLIST=you@example.com. SIGNUPS_ENABLED=true là giá trị mặc định. Vì vậy, một instance trên hostname public sẽ nhận đăng ký từ bất kỳ ai tìm thấy nó, và mỗi tài khoản mới sẽ được cấp một máy tính. Hãy tạo allowlist trước. Sau đó bạn có thể nới lỏng nếu muốn.

Hãy xem docs/self-host.md trong repository là nguồn cấu hình production chính thức, vì file này thay đổi theo code còn hướng dẫn này thì không. Vì Compose thực hiện toàn bộ công việc, các quy tắc thông thường vẫn áp dụng. Phần cơ bản về Docker Compose cho VPS giải thích vì sao --env-file và named volume trở nên quan trọng hơn khi bạn để một stack chạy trong nhiều tháng.

Bản sao lưu

Postgres và thư mục data/ là toàn bộ instance.

./scripts/backup.sh
./scripts/restore.sh backups/BACKUP_TIMESTAMP

backup.sh dump Postgres và lưu trữ data/. Với máy chủ quan trọng, hãy cài infra/compose/backup-prod.sh dưới dạng /usr/local/sbin/rakazo-backup bằng timer do repository cung cấp để hệ thống tự xoay vòng bản sao lưu. Bản sao lưu nằm cùng ổ đĩa với database không được xem là bản sao lưu, vì vậy hãy sao chép nó ra khỏi máy chủ. Sau đó, hãy khôi phục thử một lần trên máy chủ dự phòng trước khi thực sự cần dùng.

Vì sao hệ thống lỗi và bạn sẽ thấy gì

pnpm db:migrate không thể kết nối đến database. Migration báo không thể kết nối đến database server tại 127.0.0.1:5433. Có thể container Postgres chưa chạy, hoặc đã chạy nhưng chưa sẵn sàng. Chạy docker compose --env-file .env -f infra/compose/docker-compose.yml ps và tìm service postgres có trạng thái healthy, vì compose file cấu hình health check chạy mỗi ba giây. Container liên tục restart thường có nghĩa volume pgdata được tạo với credential khác. docker compose ... down -v xóa volume này, đồng thời xóa toàn bộ data trong đó.

Cổng đã bị chiếm. Khởi động Postgres sẽ lỗi với bind: address already in use nếu tiến trình khác đang dùng cổng 5433, thường là một Rakazo stack cũ mà bạn quên stop. sudo ss -lntp | grep 5433 cho biết tiến trình đang giữ cổng.

Bot không bao giờ được cấp computer. Khi có SANDBOX_PROVIDER=docker nhưng không có image rakazo/computer:local, hệ thống không có gì để khởi động. docker image ls rakazo/computer trả lời câu hỏi này trong một dòng, còn pnpm sandbox:build khắc phục lỗi. Nếu supervisor không thể truy cập Docker socket thì cũng không thể tạo container, và thông báo lỗi sẽ cho biết path: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock.

Một command chạy lâu bị dừng giữa chừng. .env.example đặt SANDBOX_COMMAND_TIMEOUT_MS=300000, nên một command duy nhất bên trong computer của bot sẽ bị dừng sau năm phút. Hãy tăng giá trị này cho các build chậm, thay vì cho rằng sandbox đã bị crash.

pnpm install lỗi theo cách khó xác định. Trước tiên hãy kiểm tra node -v. Workspace khai báo >=22, còn Node phiên bản cũ sẽ lỗi trong dependency code thay vì báo lỗi về version.

Đăng nhập được locally nhưng không qua domain. BETTER_AUTH_URL, WEB_ORIGINAPI_URL đều phải dùng cùng public origin với địa chỉ trên thanh địa chỉ, bao gồm cả scheme. Một http://127.0.0.1:5173 cũ còn sót lại trong một trong các giá trị này thường là nguyên nhân khiến session không được duy trì.

Cập nhật checkout đã ghim

Quy trình nâng cấp trong tài liệu self-host khá ngắn: pull source mới, chạy migration database, rồi restart API và worker.

./scripts/backup.sh
git fetch --all
git checkout NEW_COMMIT_SHA
pnpm install
pnpm --filter @rakazo/db migrate
docker compose --env-file .env -f infra/compose/docker-compose.prod.yml up -d --build

Trước tiên hãy backup. Migration chỉ tiến về phía trước, còn bản beta không cho bạn một đường quay lui đáng tin cậy. Hãy đọc các commit giữa SHA đã ghim và SHA mới trước khi áp dụng, vì một project còn non trẻ như vậy có thể đổi tên biến môi trường mà không thông báo, và biến bị thiếu sẽ khiến service khởi động rồi thoát. Nếu bạn vẫn đang cân nhắc Rakazo có phải là thứ phù hợp để chạy hay không, bài tổng hợp về các AI agent tự host trình bày những lựa chọn khác trong nhóm này và chi phí để duy trì từng lựa chọn.

FAQ

Tôi có thể chạy Rakazo trên VPS 1 GB không?

Không. Postgres, API, worker, sandbox supervisor và web app đều chạy cùng lúc. Với SANDBOX_PROVIDER=docker, mỗi bot đang hoạt động còn thêm một container chứa desktop đồ họa và trình duyệt. Tài liệu của dự án chỉ coi 2 vCPU và 4 GB là đủ cho riêng API, worker và Postgres khi E2B lưu trữ các desktop của bot. Hãy coi 4 GB là mức tối thiểu cho control plane. Nếu desktop chạy trên máy của bạn, hãy dùng cấu hình cao hơn.

Desktop sandbox provider có an toàn trên server không?

Không. desktop chạy trực tiếp các lệnh của bot trên host chạy API và worker, với quyền của user chạy process đó. Các file và credential của user này đều có thể bị truy cập. Repository khuyến cáo không dùng nó trên server public hoặc server dùng chung. Dùng docker để chạy một container cho mỗi bot, hoặc e2b khi có nhiều người đăng nhập.

Tôi nên cài phiên bản Rakazo nào?

Tính đến 16 August 2026, chỉ có một tag là v0.1.0-beta. Tag này được publish vào 13 August 2026 và được đánh dấu là prerelease. Hãy checkout commit mà tag trỏ tới, 53b119a68d9ef843d23aa3b7e3719b6be7b51fdb, thay vì theo dõi main. Branch có thể thay đổi trong quá trình bạn sử dụng. Tag cũng có thể được trỏ lại, nên cả hai đều không xác định được một tree mà bạn có thể quay lại. Hãy ghi lại commit, vì chỉ có thể rollback khi biết phiên bản nào đã hoạt động.

Tôi đặt OpenRouter API key ở đâu?

Đặt trong .env dưới tên OPENROUTER_API_KEY. Không bao giờ đặt key trong compose file mà bạn commit. Cả hai lệnh compose trong repository đều truyền --env-file .env, nên giá trị được chuyển vào các container mà không bị ghi vào YAML được theo dõi trong Git. Bạn cũng có thể để trống và dán key vào app trong quá trình onboarding. Hãy đặt spending limit cho key tại provider, vì bot bị lặp có thể tiếp tục gọi model cho đến khi có thứ gì đó dừng nó.

Tôi có cần domain name và TLS không?

Nếu dùng lâu hơn một lần test đầu tiên thì có. Production compose file chạy Caddy và tự động lấy certificate. RAKAZO_HOST, BETTER_AUTH_URL, WEB_ORIGINAPI_URL đều phải dùng cùng một public HTTPS origin. Để xem thử lần đầu, bạn có thể bỏ qua domain: chạy pnpm dev và forward port 5173 qua SSH thay vì public port này.