OpenClaw в open-source — полный гайд по установке AI-агента на VPS

OpenClaw в open-source — полный гайд по установке AI-агента на VPS

Два дня назад я опубликовал статью «Я посадил AI-агента на свой VPS и перестал открывать SSH». Реакция оказалась неожиданной: больше всего комментариев было не про сценарии использования, а про конкретику. «Покажи docker-compose», «дай скрипты», «как это повторить у себя».

По многочисленным просьбам выкладываю всё в open-source: конфиги, скрипты, docker-compose, deploy-скрипт — полный комплект, который можно клонировать и запустить за 10 минут.

Репозиторий: github.com/ShyDamn/openclaw-devops-kit

Лицензия — MIT. Берите, адаптируйте, делайте что хотите.

В этой статье — не просто «установи и запусти», а подробный разбор каждого компонента: что делает, зачем нужен, как адаптировать под себя. Чтобы при нештатной ситуации вы понимали, что происходит, а не работали с чёрной коробкой.

Что вы получите в итоге

AI-агент в Telegram, который живёт на вашем VPS и умеет:

  • Показывать статус контейнеров, логи, потребление ресурсов
  • Перезапускать контейнеры и docker compose проекты
  • Выполнять SQL-запросы в PostgreSQL (сам находит креды из переменных окружения контейнера)
  • Проверять сайты по HTTP и автоматически перезапускать упавшие
  • Смотреть ошибки Nginx, проверять fail2ban, искать подозрительные процессы
  • Управлять задачами в YouTrack, триггерить n8n-автоматизации
  • Каждый час самостоятельно проверять, что всё работает (heartbeat)
  • Редактировать файлы и код на сервере

При этом вы общаетесь с ним на человеческом языке. Не docker logs --tail 100 my-container-name, а «покажи последние логи auth-сервиса». Не docker exec postgres psql -U user -d mydb -c "SELECT COUNT(*) FROM users WHERE created_at > NOW() - INTERVAL '7 days'», а «сколько юзеров зарегалось за неделю».

Требования

  • VPS с Ubuntu 20.04+ (или любой Linux с Docker). Минимум 2 ГБ RAM — агент потребляет ~300–500 МБ.
  • Docker + Docker Compose V2. Проверить: docker compose version. Если нет — docs.docker.com/engine/install.
  • API-ключ OpenRouter (openrouter.ai/keys) — единый ключ для GPT-4o, Claude, Gemini, DeepSeek. Хватит $5–10 на месяц при активном использовании. Можно и напрямую через OpenAI или Anthropic, но OpenRouter удобнее: фолбэки между моделями, единый биллинг, все провайдеры в одном месте.
  • Telegram-бот от @BotFather.

Архитектура: что мы строим

Прежде чем лезть в конфиги — давайте разберёмся, из чего состоит система. Вот общая схема:

Ключевое: OpenClaw — это готовый open-source Docker-образ (ghcr.io/openclaw/openclaw). Мой репозиторий — не форк, а набор конфигов и скриптов, которые превращают голый образ в DevOps-ассистента. Вы клонируете конфиги, адаптируете под свой сервер, запускаете.

Шаг 1: Клонируем репозиторий

Если git не установлен:

Давайте посмотрим, что внутри:

Шаг 2: Создаём Telegram-бота

  1. Открываем @BotFather в Telegram
  2. /newbot → выбираем имя → получаем токен вида 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11
  3. Узнаём свой Telegram ID — пишем @userinfobot, он ответит числом вроде 778921250

Запоминаем оба значения.

Шаг 3: Заполняем .env

Обязательные поля:

Опциональные (если используете YouTrack, Firecrawl):

Шаг 4: Указываем Telegram ID

Находим "allowFrom" и вписываем свой ID:

Это whitelist. Бот будет отвечать только на сообщения от указанных ID. Все остальные — игнорируются. Можно добавить несколько ID через запятую, если доступ нужен коллеге.

Шаг 5: Описываем контекст

Это самый важный шаг. Именно контекстные файлы — разница между «GPT в Telegram» и реально работающим ассистентом. Без них агент будет на каждый чих переспрашивать: «Какой контейнер? Какой пароль от базы? Укажите путь к файлу».

SOUL.md — правила поведения

В шаблоне уже описаны базовые правила. Что нужно адаптировать:

1. Список PostgreSQL-контейнеров. Агент должен знать, где искать базы данных:

2. Таблица проектов. Какой проект в какой папке, какой стек:

3. Правила безопасности. В шаблоне уже настроено: чтение без подтверждения, изменения — с подтверждением. Адаптируйте под свои потребности.

Почему это критично: когда вы пишете «покажи логи auth-сервиса», агент должен сам знать, что auth-сервис — это контейнер my-auth-container. Когда пишете «сколько юзеров за неделю» — он должен знать, в каком контейнере база и как к ней подключиться. Без контекста он будет каждый раз переспрашивать, и весь смысл теряется.

USER.md — контекст о вас

Кто вы, какой стек, какие проекты, часовой пояс. Агент читает это при каждой сессии.

Шаг 6: Настраиваем мониторинг сайтов

Находим массив SITES и вписываем свои домены:

Формат: домен|имя_контейнера|папка_проекта. Скрипт проверяет HTTP-код каждого домена. Если 5xx или таймаут — автоматически перезапускает контейнер и проверяет снова. Если после рестарта не починилось — сообщает RESTART FAILED, и агент пишет вам срочное уведомление.

Шаг 7: Запускаем

Скрипт сделает всё автоматически:

  1. Проверит, что Docker и Docker Compose V2 установлены
  2. Создаст /var/www/openclaw/ и скопирует файлы
  3. Проверит, что .env и Telegram ID заполнены
  4. Определит GID группы docker на хосте и пропишет в .env
  5. Установит chmod 600 на .env
  6. Скачает Docker-образ OpenClaw
  7. Запустит контейнер

После запуска — привязываем Telegram. Напишите что-нибудь боту. Он пришлёт код подтверждения:

Готово. Пишите боту в Telegram.

Разбор скриптов-инструментов

Скрипты монтируются внутрь контейнера в /tools/ (read-only) и доступны агенту. Он сам выбирает нужный скрипт на основе контекста из SOUL.md. Вы пишете задачу на человеческом языке — агент решает, какой инструмент вызвать.

Давайте разберём каждый.

docker-status.sh — статус контейнеров

Простейший скрипт — отформатированный вывод docker ps. Агент вызывает его когда вы спрашиваете «что запущено», «какой статус контейнеров», или в рамках heartbeat.

docker-logs.sh — логи контейнера

Обёртка над docker logs с дефолтом в 50 строк. «Покажи логи auth-сервиса» → агент знает из SOUL.md, что auth-сервис — это контейнер auth-container, и вызывает docker-logs.sh auth-container.

system-stats.sh — ресурсы сервера

Четыре команды в одном скрипте: RAM, диск, нагрузка CPU и top контейнеров по потреблению. Используется в heartbeat для мониторинга ресурсов и по прямому запросу.

db-discover.sh — авто-обнаружение всех баз данных

Этот скрипт — одна из самых полезных штук в наборе. Он обходит все запущенные PostgreSQL-контейнеры на сервере, достаёт креды из переменных окружения (POSTGRES_USER, POSTGRES_DB), подключается и показывает список таблиц.

Зачем: когда у вас 5 PostgreSQL-контейнеров для разных проектов, и вы не помните, в каком из них лежит таблица orders — агент запускает db-discover.sh и находит сам. Без этого скрипта ему пришлось бы спрашивать у вас строку подключения, а весь смысл автоматизации теряется.

db-query.sh — SQL-запрос с авто-определением кредов

Принцип тот же: креды берутся из переменных окружения контейнера. Не нужно хранить пароли в конфигах агента и не нужно передавать их в чате.

Агент использует это так: вы пишете «сколько юзеров зарегалось за неделю в базе auth», он генерирует SQL, определяет контейнер по контексту из SOUL.md и выполняет запрос.

health-check.sh — HTTP-проверка сайтов с авто-рестартом

Самый ценный скрипт для heartbeat. Логика:

  1. Обходит все сайты из массива SITES
  2. Делает HTTP-запрос с таймаутом 10 секунд
  3. Если 5xx или таймаут (код 000) — автоматически перезапускает контейнер
  4. Ждёт 10 секунд и проверяет снова
  5. Если починилось — AUTO-FIXED, если нет — RESTART FAILED

Агент в heartbeat интерпретирует результат: ALL_SITES_OK → молчит, AUTO-FIXED → сообщает что починил, RESTART FAILED → пишет срочное уведомление.

security-check.sh — базовая проверка безопасности

Пять проверок в одном скрипте: fail2ban, заблокированные IP за сутки, top-10 IP по количеству соединений, 4xx/5xx ошибки Nginx за последний час, процессы с CPU > 50% (потенциальные майнеры).

Одна команда в Telegram «проверь безопасность» вместо четырёх разных утилит в SSH.

youtrack-api.sh — управление задачами

REST API обёртка для YouTrack. Если у вас YouTrack в Docker на том же сервере — он доступен через localhost. Поддерживает: список проектов, задачи, создание, назначение, смена статуса.

«Создай задачу в проекте SA: добавить rate limiting» → агент вызывает youtrack-api.sh create ... и возвращает номер задачи.

n8n-workflows.sh — триггер автоматизаций

Если используете n8n для автоматизаций — агент может просматривать список workflows и триггерить вебхуки.

firecrawl.sh и context7.sh — вспомогательные

firecrawl.sh — скрапинг веб-страниц через Firecrawl API. Агент может «зайти» на сайт и прочитать контент. Полезно для исследования документации, проверки что сайт показывает правильный контент.

context7.sh — актуальная документация библиотек. Когда нужна свежая дока по React, Next.js или другой библиотеке — агент получает её через Context7, а не полагается на свои устаревшие знания.

Docker Compose: разбор конфигурации

Разберём ключевые решения.

/var/run/docker.sock — даёт агенту возможность управлять контейнерами на хосте. Без этого docker ps, docker restart, docker logs изнутри контейнера не работают. Это самый «опасный» маунт — по сути, это root-доступ к Docker daemon. Но без него агент бесполезен.

/var/www:/projects — агент видит все проекты на сервере. По умолчанию read-write, чтобы мог редактировать код. Если хотите ограничить — поменяйте на /var/www:/projects:ro.

./tools:/tools:ro — скрипты доступны только на чтение. Агент может их вызывать, но не модифицировать.

/var/log/nginx:/var/log/nginx:ro — для скрипта nginx-errors.sh.

/usr/libexec/docker/cli-plugins:/usr/libexec/docker/cli-plugins:ro — без этого docker compose внутри контейнера не работает. Docker Compose V2 — это плагин, а не отдельный бинарник.

group_add: "${DOCKER_GID:-999}" — GID группы docker на хосте. Контейнер работает от пользователя node (не root), и ему нужны права на docker.sock. Deploy-скрипт автоматически определяет GID и прописывает в .env.

cap_drop+no-new-privileges — ограничение привилегий контейнера. NET_RAW и NET_ADMIN не нужны, no-new-privileges запрещает повышение привилегий внутри контейнера.

mem_limit: 3g — чтобы агент сам не съел всю память на сервере. OpenClaw написан на Node.js, и без ограничения V8 может разрастаться.

Конфиг агента: openclaw.json

Полный файл в репозитории, здесь — ключевые секции с объяснениями.

Модели и фолбэки

Основная модель — GPT-4o через OpenRouter. Если rate limit или ошибка — агент автоматически переключается на DeepSeek, затем на Gemini Flash. Вы даже не заметите — ответ придёт от другой модели, но поведение останется тем же (благодаря SOUL.md).

Каждый час агент «просыпается» на дешёвой модели (DeepSeek — центы за запрос) и выполняет чеклист из HEARTBEAT.md. Результат: если всё ок — молчит (HEARTBEAT_OK). Если есть проблемы — пишет вам в Telegram.

lightContext: true — при heartbeat загружается минимум контекста, чтобы экономить токены. Полный контекст грузится только при прямом общении.

Контекст разговора живёт 3 часа бездействия. Можно утром написать «помоги с nginx-конфигом», через час уточнить «а добавь туда rate limiting» — агент помнит, о каком конфиге речь. Через 3 часа молчания — новая сессия.

HEARTBEAT.md — автоматический мониторинг

Это конфигурируемый чеклист. Агент выполняет его буквально: запускает скрипты по порядку, интерпретирует результаты, принимает решение — писать вам или молчать.

Разница с обычным мониторингом (Grafana, Prometheus): те говорят «плохо», а агент говорит «плохо, потому что вот это, и я уже починил». Разница между пожарной сигнализацией и пожарным.

Как расширять

Добавить свой скрипт

Принцип простой: bash-скрипт + описание в SOUL.md.

  1. Создайте файл в tools/:
  1. chmod +x tools/my-tool.sh
  2. Добавьте в workspace/SOUL.md:
  1. Перезапустите: docker compose restart openclaw-gateway

Любое API, до которого достучится контейнер (внутренние сервисы, REST API, даже внешние сервисы), можно обернуть в bash-скрипт и дать агенту. YouTrack, n8n, Grafana API, Slack webhooks — всё что угодно.

Безопасность

Этот вопрос был самым частым в комментариях к первой статье. Разберём по пунктам.

Whitelist по Telegram ID. Бот отвечает только на ID из allowFrom. Все остальные сообщения игнорируются. Это первый и самый важный барьер — без вашего Telegram ID никто не может отправить команду агенту.

Docker-контейнер. Агент работает от пользователя node, не от root хоста. Да, у него есть доступ к docker.sock — это эквивалент root на Docker, но не на хосте.

.env с chmod 600. API-ключи и токены недоступны другим пользователям на сервере.

cap_drop + no-new-privileges. Ограничение сетевых привилегий и запрет на повышение прав внутри контейнера.

Двухуровневые операции. Настраивается в SOUL.md:

  • Чтение (логи, файлы, SELECT) — без подтверждения
  • Изменения (DELETE, UPDATE, редактирование кода) — только с вашим approve

Главный риск — не взлом, а ошибка агента. Он может неправильно интерпретировать задачу. Поэтому деструктивные операции — только с подтверждением. Это как code review, только через Telegram.

Полезные команды после установки

Сколько стоит

При активном использовании (10–30 запросов в день + heartbeat каждый час на дешёвой модели) — $5–15 в месяц через OpenRouter. Heartbeat на DeepSeek стоит копейки. Основные расходы — GPT-4o или Claude на сложные задачи (дебаг, редактирование кода, длинные SQL).

Репозиторий: github.com/ShyDamn/openclaw-devops-kit

Внутри: docker-compose, конфиги, 14 скриптов, deploy-скрипт, шаблоны контекстных файлов. MIT лицензия.

Время установки: 10 минут. Нужно: VPS с Docker, API-ключ OpenRouter, Telegram-бот.

Клонируйте, адаптируйте контекст под свой сервер, запустите. Если будут вопросы по конкретным сценариям или нюансам настройки — спрашивайте в комментариях.

Читать оригинал