OpenClaw на VPS: Telegram только для себя, бот в Discord, обновления и защита сервера
Закрываем Telegram-бота allowlist-ом, подключаем Discord, обновляем OpenClaw с бэкапом и откатом, ограничиваем команды агента и правим типовые поломки. Ubuntu и Debian.

Агент установлен и отвечает на первое сообщение. Теперь ему предстоит месяцами работать на публичном сервере так, чтобы никто чужой не смог им управлять. Здесь — что делать после установки: привязать Telegram к своему аккаунту, добавить Discord, обновляться без поломок, ограничить, что агент может выполнять, и какие команды смотреть, когда канал замолчал.
Локальные модели упираются в память: на tanaka.host тариф можно расширить без переустановки, а пробовать удобно на сервере с оплатой по дням.
OpenClaw развивается быстро, документация меняется еженедельно. Если команда на вашей версии ведёт себя иначе, правы docs.openclaw.ai.
Что нужно
- OpenClaw установлен, шлюз работает как служба.
- Вход по SSH, лучше по ключу.
- Актуальный Node.js: 24.16.0+ или 26.1.0+. Проверьте
node -v— на старом Node обновления откажутся запускаться.
Главный конфиг — ~/.openclaw/openclaw.json. Формат JSON5: комментарии и висячие запятые допустимы. Большинство изменений каналов шлюз подхватывает на лету без перезапуска.
1. Telegram только для своего аккаунта
Имя бота публично, и любой может открыть с ним чат. Что происходит с чужими, решает channels.telegram.dmPolicy:
| Значение | Кто может писать боту в личку |
|---|---|
pairing (по умолчанию) |
Незнакомец получает код сопряжения и ничего больше, пока вы не одобрите его на сервере |
allowlist |
Только числовые ID из allowFrom |
open |
Кто угодно, и только если в allowFrom стоит "*" |
disabled |
Никто |
Сопряжение годится для старта, но для бота «только для себя» allowlist строже: незнакомцам нечего тыкать, а ваш доступ не зависит от базы сопряжений.
Узнайте свой числовой ID (не @username и не телефон). Пока политика ещё pairing, ID есть в ответе бота с кодом. Или посмотрите в логе, пока пишете боту:
openclaw logs --follow
Ищите senderUserId в записи telegram pairing request, выход — Ctrl+C.
Переключитесь на allowlist:
nano ~/.openclaw/openclaw.json
{
channels: {
telegram: {
enabled: true,
dmPolicy: "allowlist",
allowFrom: ["123456789"],
},
},
}
botToken (или tokenFile) оставьте как записал мастер. Пустой allowFrom при allowlist валидация отвергнет, так что случайно запереть себя снаружи нельзя. Проверьте канал:
openclaw channels status --probe
Если остаётесь на pairing: openclaw pairing list telegram и openclaw pairing approve telegram <CODE>. Код живёт час, одобрение даёт только личный чат — не группы и не права владельца.
Группы проверяются отдельно. groupPolicy по умолчанию allowlist: без карты groups бот игнорирует все группы, с ней — отвечает только в перечисленных ID (отрицательные числа с -100) или во всех при "*". Внутри разрешённой группы триггерить агента могут только отправители из groupAllowFrom, а если он не задан — из вашего allowFrom. requireMention: true заставляет реагировать только на упоминание @your_bot. Чтобы бот читал все сообщения группы, отключите privacy mode у BotFather командой /setprivacy, затем удалите бота из группы и добавьте заново.
ID групп не кладут в
allowFromиgroupAllowFrom. Эти поля принимают только ID пользователей.
2. Бот в Discord
Discord — естественный второй канал: каждому топику свой текстовый канал, каждый канал — отдельная сессия агента.
Создайте приложение на Discord Developer Portal: New Application. На странице Bot задайте имя и в Privileged Gateway Intents включите Message Content Intent (и Server Members Intent, если будете разрешать пользователей по роли или имени). Там же Reset Token — несмотря на название, это и создаёт первый токен; скопируйте его.
В OAuth2 → URL Generator отметьте скоупы bot и applications.commands, права минимум View Channels, Send Messages, Read Message History, Embed Links, Attach Files (плюс Send Messages in Threads, если нужны треды). Откройте сгенерированную ссылку и добавьте бота на свой сервер — лучше отдельный приватный, только для вас и бота.
В приложении Discord включите Developer Mode (User Settings → Advanced) и скопируйте Server ID и свой User ID. В настройках приватности сервера разрешите личные сообщения, иначе бот не пришлёт код сопряжения.
Передайте токен OpenClaw через env-файл, а не прямо в конфиг:
echo 'DISCORD_BOT_TOKEN=YOUR_BOT_TOKEN' >> ~/.openclaw/.env
chmod 600 ~/.openclaw/.env
{
channels: {
discord: {
enabled: true,
token: { source: "env", provider: "default", id: "DISCORD_BOT_TOKEN" },
groupPolicy: "allowlist",
guilds: {
"YOUR_SERVER_ID": {
requireMention: true,
users: ["YOUR_USER_ID"],
},
},
},
},
}
Discord идёт официальным плагином. Если openclaw channels status --probe сообщает, что его нет — openclaw channels add и выберите Discord, плагин доставится. Перезапустите шлюз, чтобы служба прочитала новую переменную:
openclaw gateway restart
Сопряжение. Напишите боту в личку, он ответит кодом:
openclaw pairing list discord
openclaw pairing approve discord <CODE>
Личка в Discord использует те же значения dmPolicy, что и Telegram. После проверки переведите на allowlist с вашим ID в channels.discord.allowFrom. На приватном сервере можно поставить requireMention: false, чтобы агент отвечал на каждое сообщение.
Бот онлайн, но не реагирует на сообщения в каналах. Почти всегда выключен Message Content Intent. Включите в Developer Portal и перезапустите шлюз.
Другие каналы (WhatsApp, Signal, Slack, Matrix, Teams и т. д.) подключаются через openclaw channels add без флагов. Signal и WhatsApp держат дополнительное состояние на диске, iMessage требует Mac — на headless-VPS они неудобнее токен-ботов.
3. Обновления
Релизы выходят часто, многие с исправлениями безопасности. Штатный путь — встроенный апдейтер: он определяет способ установки, проверяет новую версию, пока старый шлюз работает, переключается и верифицирует результат.
openclaw --version
openclaw status
Первая показывает версию CLI, вторая — что крутит служба. Если расходятся, у вас две установки (например, после смены версии Node) — разберитесь до обновления.
Сделайте проверенный бэкап и посмотрите план:
mkdir -p ~/Backups/openclaw
openclaw backup create --output ~/Backups/openclaw --verify
openclaw update --dry-run
Обновите:
openclaw update
Запускать от того же Linux-пользователя, которому принадлежит шлюз. openclaw update status покажет результат и историю. По умолчанию канал stable; beta получает релизы раньше, dev — main-ветка, не для рабочего агента.
Предпочитайте апдейтер голому npm.
npm install -g openclaw@latestзаменит пакет, но пропустит миграции и не сохранит копию для отката. Если всё же обновились через npm — следомopenclaw doctor --fixиopenclaw gateway restart.
Откат на известную рабочую версию:
openclaw update --tag <known-good-version> --dry-run
openclaw update --tag <known-good-version>
Даунгрейд пакета не отменяет миграции конфига и БД. Если старая версия отказывается читать новое состояние — восстанавливайте бэкап, сделанный до обновления, вместе с соответствующей версией OpenClaw.
4. Защита сервера и агента
Дефолты OpenClaw консервативны: шлюз на localhost, незнакомцам — код сопряжения, группам — allowlist. Проблемы начинаются, когда их ослабляют или дают агенту больше, чем нужно. Начните с аудита:
openclaw security audit
openclaw security audit --deep
Он проверяет, кто может достучаться до бота, не торчит ли шлюз наружу, права файлов и рискованные настройки инструментов. openclaw security audit --fix применяет только безопасные правки: открытые групповые политики → allowlist, 600 на конфиги и 700 на каталоги. Повторяйте после каждого изменения конфига.
Шлюз на localhost. gateway.bind должен оставаться loopback. Панель — через туннель с вашего компьютера:
ssh -N -L 18789:127.0.0.1:18789 openclaw@YOUR_SERVER_IP
Токен — openclaw gateway auth-token --show; слабый или утёкший перевыпускается openclaw doctor --generate-gateway-token плюс перезапуск. Reverse proxy возможен, но требует gateway.trustedProxies, перезаписи X-Forwarded-For и обязательной аутентификации — для одного владельца туннель проще и безопаснее.
Брандмауэр. Telegram работает long polling-ом, Discord сам подключается наружу — входящих портов им не надо. Открыт должен быть только SSH:
ufw allow OpenSSH
ufw enable
ufw status
Подробнее — UFW и firewalld и fail2ban.
Не root. Агент запускает shell-команды; под root одна плохая инструкция может затронуть всю систему. Документация рекомендует root только для настройки системы, а шлюз — под обычным пользователем:
adduser openclaw
usermod -aG sudo openclaw
loginctl enable-linger openclaw
su - openclaw
openclaw onboard --install-daemon
Если агенту никогда не нужны админские права, группу sudo не добавляйте. Переезд с root: бэкап → openclaw gateway stop и openclaw gateway uninstall под root → onboarding под новым пользователем и повторное подключение каналов.
Ограничьте выполнение команд. По умолчанию команды на хосте выполняются без вопросов (exec security full, ask off). Есть пресеты:
openclaw gateway stop
openclaw exec-policy preset cautious
openclaw gateway start
cautious разрешает только команды из allowlist и спрашивает про остальное; deny-all полностью запрещает команды на хосте. Запросы на одобрение Telegram может слать владельцу в личку (channels.telegram.execApprovals). Текущее состояние — openclaw exec-policy show.
Ещё два слоя: tools.profile (messaging — без файловых и shell-инструментов, coding — с ними, full ставится мастером по умолчанию) и песочница agents.defaults.sandbox.mode (non-main гоняет инструменты всех сессий, кроме главной, в контейнере; all — всё). Бэкенд по умолчанию Docker — как поставить. openclaw sandbox explain показывает, что реально применяется к сессии.
Ключи API держите в ~/.openclaw/.env или в SecretRef-ах конфига, а не в файлах workspace, которые агент правит. Поставьте месячный лимит трат у поставщика модели. Всё под ~/.openclaw — секреты: конфиг, учётки каналов, SQLite с сопряжениями. В git не коммитить.
Бэкапы. openclaw backup create упаковывает состояние, конфиг, учётные данные, сессии и workspace (~/.openclaw/workspace с AGENTS.md, SOUL.md и памятью) и корректно снимает живые SQLite-базы, чего простой cp не умеет:
openclaw backup create --output ~/Backups/openclaw --verify
Архив содержит учётные данные — права 600 и копия вне сервера. Восстановление всегда в чистый каталог: openclaw backup restore <archive> --target <new-directory>. Снимок всего сервера поверх — резервные копии VPS.
Сколько памяти
Модель крутится у поставщика, GPU не нужен. Память уходит на Node.js, плагины и прежде всего на headless-браузер или контейнеры песочницы. Официальный минимум — 1 ГБ и одно ядро (с 2 ГБ swap); один канал с облачной моделью — 1–2 ГБ; Telegram + Discord — 2 ГБ; автоматизация браузера или Docker-песочница — от 4 ГБ, потому что один headless Chromium берёт больше гигабайта. Как добавить swap — swap в Linux.
Если что-то сломалось
Официальная лестница диагностики, по порядку:
openclaw status
openclaw gateway status
openclaw logs --follow
openclaw doctor
openclaw channels status --probe
Здоровый шлюз показывает Runtime: running, doctor — без блокирующих проблем. Типовые случаи:
| Симптом | Причина и решение |
|---|---|
Telegram молчит, в логе getMe returned 401 |
Токен неверный или отозван. Перевыпустите в BotFather, обновите botToken |
Telegram тормозит или fetch failed |
Сломанный IPv6-egress к api.telegram.org. Поставьте channels.telegram.network.dnsResultOrder в "ipv4first" |
| Бот игнорирует группу | ID группы нет в channels.telegram.groups или включён requireMention. Причину пропуска видно в openclaw logs --follow |
| Discord онлайн, но слеп | Message Content Intent; ID сервера в channels.discord.guilds; перезапуск. Если у гильдии есть карта channels, работают только перечисленные |
refusing to bind gateway ... without auth |
gateway.bind сдвинули с loopback без токена. Верните loopback или настройте auth |
EADDRINUSE / another gateway instance is already listening |
Два шлюза на 18789, часто старый root-сервис рядом с новым. openclaw gateway status --deep покажет оба |
| Сломалось после обновления | openclaw update status, затем openclaw doctor --fix и openclaw gateway restart. Если which openclaw указывает на старый бинарник — почините PATH |
| Шлюз пропадает под нагрузкой | Кончилась память, обычно на браузере. free -h, swap или сервер побольше |
Четыре привычки держат агента здоровым: allowlist вместо сопряжения, openclaw update с проверенным бэкапом, шлюз на localhost под не-root-пользователем и openclaw security audit после каждой правки конфига.