SSD Nodes Learn 🎉 VPS от $5.50/мес
Руководства Matt ConnorАвтор: Matt Connor

Self-hosting Rakazo: установка на VPS

Руководство по запуску Rakazo через Docker Compose. Настройка Node 22, pnpm, Postgres и Graphile Worker. Узнайте требования к ресурсам VPS и нюансы выбора sandbox-провайдера.

Что на самом деле запускает Rakazo при self-hosting

Self-hosting Rakazo подразумевает запуск пяти компонентов на одном Linux-сервере: PostgreSQL, процесса Graphile Worker, API, веб-приложения и одного sandbox-контейнера для каждого активного бота. Rakazo — это open-source альтернатива Grok Bot, опубликованная пользователем elie222 под лицензией Apache 2.0. Каждый бот получает собственный поток, вычислительные ресурсы, память и историю; он также может порождать узлы-аналоги или кратковременные субагенты.

Последний пункт объясняет, почему для этого требуется VPS (виртуальный выделенный сервер), а не настольный компьютер. Бот, который хранит состояние в памяти и выполняет запланированные задачи, должен быть доступен, пока вы спите. Ноутбук, переходящий в спящий режим, прерывает работу очереди.

По состоянию на август 2026 года Rakazo находится на ранней стадии бета-тестирования, поэтому рассматривайте это как рабочую конфигурацию, а не как готовое к эксплуатации устройство. Весь стек написан на TypeScript: React 19 и Vite для веб-приложения, Hono для API, Postgres с Prisma, Better Auth для управления учетными записями и Graphile Worker для фоновых задач. Graphile Worker хранит очередь внутри Postgres, поэтому Redis или второе хранилище данных не требуются. .env.example задает WAKEUP_DRIVER=graphile, что означает, что пробуждение бота является задачей, поддерживаемой Postgres. Если остановить Postgres, все запланированные действия ботов также остановятся. Если вы предпочитаете собирать агента из отдельных частей, а не запускать чужой продукт, создание собственного агента из компонентов — это альтернативный путь.

Почему тариф с 1 GB RAM не справится с этой задачей

Посчитайте количество процессов. Postgres — это один процесс. API — это процесс Node. Воркер — второй. Веб-приложение — третий. Супервизор песочницы — четвёртый. Затем каждый запущенный бот получает контейнер, содержащий графический рабочий стол Linux и браузер.

В документации проекта по self-hosting указана одна честная цифра: машина с 2 vCPU и 4 GB RAM достаточна для API, воркера и Postgres, когда E2B берет на себя управление рабочими столами ботов. Это показатель только для плоскости управления (control plane), при условии, что ресурсоемкая часть размещена на сторонних мощностях. Установите SANDBOX_PROVIDER=docker, и эти рабочие столы переместятся на ваш VPS, поэтому 4 GB станут минимальным порогом, а не целевым значением. Начинайте с 8 GB, если планируете держать активным более одного бота, и замеряйте реальное потребление с помощью docker stats во время работы бота. Именно браузер внутри песочницы потребляет основной объем памяти, поэтому спецификации не дадут точного ответа. Общий метод подбора мощности сервера для работы агентов описан в статье сколько RAM и CPU на самом деле нужно VPS для агентов, где процесс измерения разобран подробно.

Один параметр не дает ситуации стать критической. .env.example поставляется с SANDBOX_IDLE_MS=600000, где указано, что этот параметр приостанавливает работу компьютеров E2B или останавливает Docker-контейнеры по истечении указанного количества миллисекунд простоя. Десять минут бездействия — и компьютер удаляется. Минимально допустимое значение — 30000. Без этого каждый запущенный вами бот удерживал бы память в оперативной памяти бесконечно.

Дисковое пространство также имеет значение. Образ песочницы, модули Node и том Postgres используют один диск, поэтому 40 GB — разумная отправная точка.

Фиксация версии перед клонированием

Проект Rakazo развивается быстро, а main не является стабильным релизом. По состоянию на 16 августа 2026 года в репозитории присутствует только один тег, v0.1.0-beta, опубликованный 13 августа 2026 года и помеченный как предварительный релиз.

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

Этот коммит является тем, на который указывает v0.1.0-beta. Фиксируйте именно коммит, а не ветку или тег. Ветка может измениться при следующем git pull, а тег — это перемещаемая метка, которую мейнтейнер может переназначить, поэтому ни то, ни другое не гарантирует возможность возврата к конкретному состоянию дерева. Идентификатор коммита неизменен. Запишите свой идентификатор рядом с другими параметрами сервера, так как при поломке после обновления самым простым решением будет git checkout <old commit> и пересборка, что возможно только в том случае, если вы знаете, какой коммит работал корректно.

Требования: Node 22, pnpm 9 и Docker

node -v
pnpm -v
docker --version

package.json объявляет "engines": { "node": ">=22" } и "packageManager": "pnpm@9.15.0", поэтому node -v должен выводить v22 или выше. Пакет Node в репозиториях Ubuntu обычно более старой версии, поэтому устанавливайте его через NodeSource или nvm. pnpm поставляется вместе с Node через corepack:

corepack enable
corepack prepare pnpm@9.15.0 --activate

Docker Engine вместе с плагином compose закрывает остальные требования, при этом ваш пользователь должен иметь доступ к демону. Если docker ps возвращает permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock, добавьте своего пользователя в группу docker и откройте новую сессию входа. Сначала осознайте последствия: членство в docker равносильно правам root на машине, так как любой участник этой группы может запустить контейнер, который примонтирует файловую систему хоста.

Настройка .env и запуск Postgres

cp .env.example .env
chmod 600 .env

Перед тем как открывать доступ к сети, необходимо изменить два значения. .env.example поставляется с BETTER_AUTH_SECRET=replace-with-32-plus-character-secret и ENCRYPTION_KEY=replace-with-64-char-hex-or-passphrase. Rakazo отклоняет эти значения-заглушки при использовании вне среды разработки, поэтому некорректно настроенное развертывание завершится с ошибкой, вместо того чтобы работать с секретом, опубликованным в репозитории.

openssl rand -base64 48
openssl rand -hex 32

Затем запустите базу данных отдельно и выполните миграции.

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 собирает образ компьютера бота, определенный в package.json как docker build -t rakazo/computer:local infra/sandboxes/computer. Это графический образ, поэтому первая сборка загружает большой объем данных и требует времени. Убедитесь, что образ появился, выполнив docker image ls rakazo/computer — команда должна вывести одну строку.

Файл compose публикует Postgres как 127.0.0.1:5433:5432, доступный только через loopback. Оставьте эту настройку. Учетные данные для разработки — rakazo:rakazo, они находятся в репозитории, а порт Postgres, доступный из Интернета с опубликованным паролем, обнаруживается сканерами в течение нескольких часов. В производственном файле compose используется POSTGRES_PASSWORD, поэтому установите для него случайную строку, когда дойдете до этого этапа.

Первый запуск

pnpm dev

Эта команда запускает четыре компонента: API на порту 3100, Graphile Worker, веб-приложение Vite на порту 5173 и песочницу-супервизор на порту 7091. Приложение доступно по адресу http://127.0.0.1:5173, где должна открыться страница входа.

При работе на VPS вы не находитесь непосредственно за консолью сервера, поэтому не следует открывать порт 5173 для доступа извне. Вместо этого используйте проброс портов через SSH (secure shell) с вашего локального компьютера.

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

Будьте внимательны при выборе способа запуска. Команда pnpm dev запускает Vite на хосте с привязкой к локальному интерфейсу. Сервис web в файле compose публикует порт 5173:5173 на всех сетевых интерфейсах. Запуск полного стека разработки через compose на публичном VPS делает приложение доступным для всех, поэтому для любых постоянно работающих сервисов используйте production-файл конфигурации и reverse proxy.

Какой провайдер песочницы безопасен на сервере?

Это единственный параметр, который необходимо настроить правильно. SANDBOX_PROVIDER в .env принимает четыре значения.

  • docker — значение по умолчанию. Каждый бот получает собственный контейнер на вашей машине, собранный из образа, созданного pnpm sandbox:build. Это самый быстрый вариант для self-hosted установки.
  • e2b запускает компьютеры ботов на E2B и требует E2B_API_KEY. Проект рекомендует этот вариант для публичных или многопользовательских развертываний, так как он изолирует компьютеры ботов от хоста, на котором работают ваш API и база данных.
  • desktop запускает команды бота непосредственно на хосте API и воркера. Инструкция репозитория прямолинейна: не используйте этот режим на публичном или общем сервере.
  • fake — это внутрипроцессный эмулятор для тестов. Он не является средой выполнения.

Воспринимайте предупреждение о desktop режиме буквально. В desktop режиме граница изоляции отсутствует полностью, поэтому бот выполняет shell-команды от имени пользователя, под которым запущен процесс API, с доступом к домашней директории этого пользователя, его SSH-ключам, облачным учетным данным и .env. Текст на веб-странице, который считывает бот, превращается в команду на вашем сервере. Использование desktop режима на сервере — это путь к тому, что бот получит доступ к вашим учетным данным. Используйте его только на машине, за которой вы работаете лично, или не используйте вовсе.

docker — это реальная, хотя и несовершенная граница. Один бот не может прочитать файлы другого бота, так как у каждого свой контейнер. Однако супервизор, создающий эти контейнеры, монтирует /var/run/docker.sock, а контроль над Docker socket хоста означает контроль над самим хостом. Поэтому держите супервизор в закрытом доступе. .env.example документирует SANDBOX_SUPERVISOR_TOKEN как опциональный отдельный сервисный ключ, который по умолчанию принимает значение BETTER_AUTH_SECRET, если поле пустое. Это означает, что если оставить этот секрет в виде заглушки, сервис создания контейнеров будет защищен строкой, которую может прочитать любой на GitHub. Установите оба значения. Для обеспечения максимально возможной изоляции используйте e2b или выделите для Rakazo машину, на которой больше ничего нет. Это та же логика, что лежит в основе запуска агентов для написания кода в одноразовой VM: самый дешевый способ пережить ошибку агента — сделать так, чтобы его машина не представляла никакой ценности.

Где хранить API-ключи для моделей?

В Rakazo нет встроенной системы биллинга для моделей. Вы используете собственный ключ. .env.example задает PI_DEFAULT_PROVIDER=openrouter, поэтому OPENROUTER_API_KEY является стандартным местом для этого, и ключи провайдеров работают через ту же настройку.

Храните ключ в .env и не включайте его в файлы, которые вы отправляете в репозиторий. Обе команды compose в репозитории передают --env-file .env, поэтому значения попадают в контейнеры, не записываясь в YAML-файлы, отслеживаемые git. Вы также можете оставить OPENROUTER_API_KEY пустым и вставить ключ в приложении во время первоначальной настройки; это еще одна причина, по которой ENCRYPTION_KEY должен содержать реальное случайное значение, а не стандартный шаблон.

Установите лимит расходов для ключа на стороне провайдера до того, как его начнет использовать бот. Бот, попавший в бесконечный цикл, расходует средства, и лимит на конкретный ключ — единственный способ защиты, не требующий вашего постоянного контроля. Присвойте этому ключу уникальное имя, чтобы при необходимости можно было отозвать только его.

Переход от режима разработки к постоянной работе

Репозиторий содержит production-файл compose, который запускает Postgres, API, worker, веб-приложение и Caddy для автоматического получения сертификатов TLS (transport layer security). Для работы ботов требуется E2B.

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 отключает вход по паролю SSH, настраивает правила UFW (uncomplicated firewall) для SSH, HTTP и HTTPS, включает fail2ban и применяет профили AppArmor. Ознакомьтесь с содержимым перед запуском, так как скрипт меняет параметры входа. Держите вторую SSH-сессию открытой во время выполнения.

Для production .env требуется больше ресурсов, чем для разработки. Минимальные требования указаны в документации по self-host.

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

Направьте A-запись на сервер перед первым запуском up. Caddy запрашивает сертификат для имени, указанного в RAKAZO_HOST; запрос завершится ошибкой, если имя не указывает на этот сервер или если порт 80 закрыт для внешних подключений.

Также настройте SIGNUP_ALLOWLIST=you@example.com. SIGNUPS_ENABLED=true используется по умолчанию, поэтому экземпляр с публичным именем принимает регистрации от всех желающих, и каждая новая учетная запись получает компьютер. Сначала настройте список разрешенных пользователей (allowlist). При необходимости вы сможете ослабить ограничения позже.

Считайте docs/self-host.md в репозитории основным источником информации о настройках для production, так как этот файл обновляется вместе с кодом, в отличие от данного руководства. Поскольку работу выполняет Compose, действуют стандартные правила, а в основах Docker Compose для VPS описано, почему --env-file и именованные тома становятся важнее, когда стек работает без вмешательства месяцами.

Резервное копирование

Postgres и каталог data/ составляют весь экземпляр приложения.

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

backup.sh создает дампы Postgres и архивирует data/. Для критически важной машины установите infra/compose/backup-prod.sh в качестве /usr/local/sbin/rakazo-backup с таймером, который поставляется в репозитории, чтобы ротация происходила автоматически. Резервная копия, хранящаяся на том же диске, что и база данных, не является резервной копией, поэтому копируйте данные на другой узел. После этого выполните восстановление один раз на резервном сервере, прежде чем это потребуется в экстренной ситуации.

Почему возникают сбои и что вы увидите

pnpm db:migrate не может подключиться к базе данных. Миграция сообщает, что не удается установить соединение с сервером базы данных по адресу 127.0.0.1:5433. Либо контейнер Postgres не запущен, либо он запущен, но еще не готов к работе. Выполните docker compose --env-file .env -f infra/compose/docker-compose.yml ps и убедитесь, что сервис postgres сообщает о статусе healthy, так как в файле compose настроена проверка работоспособности, выполняемая каждые 3 секунды. Если контейнер постоянно перезапускается, это обычно означает, что том pgdata был создан с другими учетными данными. Команда docker compose ... down -v очищает его, удаляя при этом все данные.

Порт уже занят. Запуск Postgres завершается ошибкой bind: address already in use, если порт 5433 занят другим процессом, чаще всего — забытым запущенным стеком Rakazo. Команда sudo ss -lntp | grep 5433 покажет имя этого процесса.

Бот не получает вычислительные ресурсы. Если используется SANDBOX_PROVIDER=docker, но отсутствует образ rakazo/computer:local, запускать нечего. Команда docker image ls rakazo/computer позволяет проверить это одной строкой, а pnpm sandbox:build исправляет ситуацию. Если супервизор не может получить доступ к сокету Docker, он также не сможет создавать контейнеры, и в сообщении об ошибке будет указан путь: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock.

Длительная команда прерывается. Параметр .env.example задает SANDBOX_COMMAND_TIMEOUT_MS=300000, поэтому выполнение любой команды внутри контейнера бота принудительно завершается через 5 минут. Увеличьте это значение для медленных сборок, вместо того чтобы предполагать сбой песочницы.

pnpm install работает некорректно. Прежде всего проверьте node -v. В рабочем окружении объявлена версия >=22, и устаревшая версия Node может приводить к ошибкам в коде зависимостей, а не к явному сообщению о несовместимости версий.

Вход в систему работает локально, но не через домен. Параметры BETTER_AUTH_URL, WEB_ORIGIN и API_URL должны содержать один и тот же публичный origin, соответствующий адресу в строке браузера, включая схему. Устаревшее значение http://127.0.0.1:5173 в одном из них — самая частая причина того, что сессия не сохраняется.

Обновление зафиксированной версии (pinned checkout)

Путь обновления в документации по self-hosted установке краток: получите новый исходный код, выполните миграцию базы данных, перезапустите API и воркер.

./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

Сначала сделайте резервную копию. Миграции выполняются только в прямом направлении, и бета-версия не гарантирует возможности отката. Перед обновлением изучите коммиты между вашим текущим зафиксированным SHA и новым. В столь молодом проекте переменные окружения могут переименовываться без предварительного уведомления, а отсутствие переменной приведет к тому, что сервис запустится и сразу завершит работу. Если вы еще не решили, подходит ли вам Rakazo, обзор self-hosted AI-агентов поможет ознакомиться с другими решениями в этой категории и оценить стоимость их поддержки.

FAQ

Можно ли запустить Rakazo на VPS с 1 GB оперативной памяти?

Нет. Postgres, API, worker, sandbox supervisor и веб-приложение работают одновременно. При использовании SANDBOX_PROVIDER=docker каждый активный бот запускает контейнер с графическим рабочим столом и браузером. Согласно документации проекта, 2 vCPU и 4 GB RAM достаточно для API, worker и Postgres только в том случае, если E2B размещает рабочие столы ботов у себя. Считайте 4 GB минимальным порогом для управляющего узла (control plane) и увеличивайте объем, если рабочие столы запускаются на вашем сервере.

Безопасен ли провайдер песочницы рабочего стола на сервере?

Нет. desktop выполняет команды бота непосредственно на хосте с API и worker от имени пользователя, под которым запущен процесс. Это дает боту доступ к файлам и учетным данным этого пользователя. В репозитории указано, что не следует использовать этот метод на публичных или общих серверах. Используйте docker для запуска отдельного контейнера на каждого бота или e2b, если в системе работают несколько пользователей.

Какую версию Rakazo следует установить?

По состоянию на 16 августа 2026 года существует один тег, v0.1.0-beta, опубликованный 13 августа 2026 года и помеченный как предварительный релиз (prerelease). Используйте коммит, на который он указывает, 53b119a68d9ef843d23aa3b7e3719b6be7b51fdb, вместо отслеживания ветки main. Ветка может измениться, а тег может быть переназначен, поэтому ни то, ни другое не гарантирует фиксацию состояния системы. Записывайте хеш коммита: откат возможен только в том случае, если вы знаете, какая версия работала корректно.

Где указать API-ключ OpenRouter?

В файле .env в переменной OPENROUTER_API_KEY. Никогда не помещайте ключ в файлы compose, которые вы отправляете в репозиторий. Обе команды compose в репозитории передают --env-file .env, поэтому значение попадает в контейнеры, не записываясь в отслеживаемый YAML-файл. Вы также можете оставить это поле пустым и ввести ключ в приложении во время первоначальной настройки. Установите лимит расходов для ключа на стороне провайдера, так как бот в бесконечном цикле будет обращаться к модели до тех пор, пока его что-то не остановит.

Нужны ли доменное имя и TLS?

Для любых задач, выходящих за рамки первичного тестирования, — да. Файл compose для продакшена запускает Caddy и автоматически получает сертификаты. Параметры RAKAZO_HOST, BETTER_AUTH_URL, WEB_ORIGIN и API_URL должны использовать один и тот же публичный HTTPS-источник. Для ознакомления можно обойтись без домена: запустите pnpm dev и пробросьте порт 5173 через SSH вместо публикации порта наружу.