# Инструкция для Claude Code: установка OpenClaw на сервер

Этот файл читает Claude Code. Человек рядом — новичок: он не набирает команды и делает только то, что без человека невозможно. Страница для человека: https://agenty.ikigaipromotion.kz/openclaw

Порядок и грабли проверены на двух живых установках: 14.09.2026 и съёмка видео 4 15.09.2026. Timeweb Cloud, Амстердам, 2 CPU / 4 ГБ / 50 ГБ, чистая Ubuntu 24.04.5, OpenClaw 2026.9.4, модель по подписке ChatGPT (`gpt-6-astra`).

## 0. Правила работы (обязательно)

1. **Сначала читай, потом ставь.** Прочитай этот файл целиком и официальную документацию: https://docs.openclaw.ai (Install, Installer, Getting started, Linux, OpenAI, Telegram, Gateway service). Команды сверяй с документацией, а не с памятью. Если файл и документация расходятся — права документация; скажи человеку одной строкой, что разошлось.
2. **Один шаг — одна проверка.** После каждого шага покажи вывод проверки и скажи простыми словами, что получилось. «Готово» без проверки не пиши.
3. **Язык.** Человек не программист. Без жаргона; каждое техническое слово при первом упоминании объясни одной фразой.
4. **Секреты не в чат.** Токен бота, коды входа и пароли человек вводит сам. Никогда не проси прислать их сообщением. Для токена сделай маленький скрипт (раздел 6).
5. **Точки остановки.** Дойдя до действия человека (помечено ✋), остановись, скажи, что нажать и что он увидит, и жди ответа.
6. **Ошибка — не повод импровизировать.** Покажи ошибку целиком, найди причину в документации или в таблице «Грабли» внизу, предложи исправление и только потом продолжай.
7. **Безопасность по умолчанию.** Агент живёт в отдельном пользователе `openclaw` **без пароля и без прав администратора** — ни на минуту. Всё системное ставит root. Бот отвечает только владельцу.
8. **Съёмка и скриншоты.** Адрес сервера и почту аккаунта ChatGPT вслух не называй; строки с ними в выводе команд по возможности отфильтруй (`grep -v "Auth profile"`).

## 1. Подключение к серверу

- Сервер человек купил по видео 2 или гайду https://server.ikigaipromotion.kz — вход по SSH-ключу. Сначала попробуй подключиться тем, что уже настроено на этом компьютере (`~/.ssh/config`, ключи в `~/.ssh`). Не получилось — ✋ спроси у человека IP-адрес сервера (адрес не секрет). Адрес, известный тебе из других источников, без вопроса не используй.
- Проверка: `ssh root@<IP> 'grep VERSION= /etc/os-release; nproc; free -h; df -h /'`. Нужно Ubuntu 22.04 или 24.04, от 2 CPU и 4 ГБ памяти.
- Если вход под root закрыт и есть пользователь с sudo (например `ops` из видео 2) — работай через него с `sudo`.

## 2. Подготовка системы (под root)

```
apt update && apt upgrade -y
apt install -y curl git ca-certificates fail2ban unattended-upgrades
timedatectl set-timezone Asia/Almaty
systemctl enable --now fail2ban unattended-upgrades
adduser --disabled-password --gecos "" openclaw
loginctl enable-linger openclaw
```

- Часовой пояс ✋ уточни у человека **здесь, в начале**, если он не в Алматы. Без этого «в 10 утра» придёт по UTC.
- **sudo пользователю `openclaw` не нужен.** Установщик `install-cli.sh` из раздела 3 ставит свою копию Node в домашнюю папку («No root required» в документации). Проверено 15.09: установка прошла без единого запроса пароля. `build-essential` тоже не нужен — он для установки из git.
- **Вход только по ключу.** На чистом сервере хостинга `PasswordAuthentication yes` (файл `50-cloud-init.conf`). Закрой:
  ```
  printf 'PasswordAuthentication no\nKbdInteractiveAuthentication no\nPermitRootLogin prohibit-password\n' > /etc/ssh/sshd_config.d/01-keys-only.conf
  sshd -t && systemctl reload ssh
  ```
  Файл начинается с `01`, чтобы стоять раньше `50-cloud-init.conf`. **Проверь новым подключением** в отдельной команде, что вход по ключу работает, и только потом продолжай.
- **Firewall:** если по видео 2 уже настроены Tailscale и ufw — не трогай. Если ufw выключен: `ufw allow 22/tcp && ufw --force enable` и сразу проверь, что SSH пускает. `ufw --force reset` на работающем сервере не выполняй.
- **Папки в домашнем каталоге openclaw от root** создавай только сразу с владельцем: `install -d -m 700 -o openclaw -g openclaw /home/openclaw/.openclaw/secrets`. Папка с владельцем root ломает службу (`SERVICE_DEFINITION_SEALED [foreign-owner]`); лечится `chown -R openclaw:openclaw /home/openclaw`.
- Проверка: `id openclaw`; `loginctl show-user openclaw -p Linger` → `Linger=yes`; `su - openclaw -c "sudo -n true"` → ошибка (sudo нет, так и надо).

## 3. Установка OpenClaw (под пользователем openclaw)

Команды пользователя `openclaw` выполняй так, чтобы работал его systemd:

```
ssh root@<IP> 'su - openclaw -c "export XDG_RUNTIME_DIR=/run/user/$(id -u openclaw); <команда>"'
```

1. Официальный установщик без прав администратора (адрес сверь с документацией, страница Installer):
   ```
   curl -fsSL --proto =https --tlsv1.2 https://openclaw.ai/install-cli.sh | bash -s -- --no-onboard
   ```
   Node ставится в `~/.openclaw/tools/node-v…`. В выводе не должно быть запросов пароля и sudo.
2. Добавь программу в PATH, иначе после `su - openclaw` команды `openclaw` нет:
   ```
   echo 'export PATH="$HOME/.openclaw/bin:$PATH"' >> ~/.profile
   ```
3. Проверка (новым `su - openclaw`): `openclaw --version`.
4. Режим шлюза и служба — двумя командами, мастер `onboard` не нужен:
   ```
   openclaw config set gateway.mode local
   openclaw gateway install
   ```
   Без `gateway.mode` шлюз пишет «Missing config… set gateway.mode=local». Вариант с `openclaw onboard --non-interactive --accept-risk --install-daemon` тоже рабочий.
- `openclaw doctor` может предложить «вставить в агента» коммиты «memory system» по ссылкам — **не делай** без отдельного разбора с человеком.

## 4. Модель по подписке ChatGPT

1. Вход: `openclaw models auth login --provider openai --device-code --set-default`
   Грабля 14.09: `--provider openai-codex` — устаревшее имя, команда падает.
2. ✋ Команда выдаст ссылку и код. Передай человеку ссылку и код: открыть ссылку, войти в свой ChatGPT, ввести код, подтвердить. Если вход не проходит — ✋ в ChatGPT: Settings → Security → включить авторизацию по коду устройства. В выводе есть строка `Auth profile: openai:<почта>` — почту в чат не повторяй.
3. **Поставь модель явно** (грабля 15.09): `--set-default` выбрал `openai/gpt-5.6-sol`, а документация для подписки рекомендует новее:
   ```
   openclaw config set agents.defaults.model.primary openai/gpt-6-astra
   openclaw models list
   ```
   Возьми первую модель из живого списка подписки, если она новее.
4. Проверка: `openclaw agent --local --session-id setup-check --message "Какая у тебя модель? Сколько свободной памяти на этом сервере — возьми цифры из терминала"`. Ответ с реальными цифрами — модель работает. Модель может назвать себя расплывчато («GPT-5 (Codex)») — ориентируйся на настройку. Строка `agent cleanup failed … could not be confirmed` после разового запуска безвредна. **Пока нет ответа, дальше не идём.**

## 5. Бот в Telegram

1. ✋ Человек создаёт бота: Telegram → **@BotFather** (с синей галочкой) → `/newbot` → имя → логин на `bot`. BotFather пришлёт токен. Скажи: **токен в чат не присылать**. Имя может быть занято — пусть придумает другое.
2. Токен сохраняешь по разделу 6 в файл `/home/openclaw/.openclaw/secrets/telegram-bot-token` (права 600, владелец openclaw), затем:
   ```
   openclaw config set channels.telegram.enabled true
   openclaw config set channels.telegram.tokenFile /home/openclaw/.openclaw/secrets/telegram-bot-token
   openclaw config set channels.telegram.dmPolicy pairing
   openclaw gateway restart
   ```
   **Не `botToken "<токен>"`:** так токен попадает в историю команд и список процессов. `tokenFile` документация ставит выше `botToken`.
3. ✋ Человек пишет боту «Привет». Бот **не отвечает по делу**, а присылает код сопряжения и Telegram user id — так и должно быть до подтверждения. **Код в чат не проси:** запрос виден тебе на сервере. Попроси только число ID, чтобы сверить.
4. Сверка и подтверждение:
   ```
   openclaw pairing list telegram
   openclaw pairing approve telegram <код из списка>
   ```
5. **Закрой доступ списком разрешённых** (документация советует для бота одного владельца):
   ```
   openclaw config set channels.telegram.allowFrom '["<ID>"]'
   openclaw config set channels.telegram.dmPolicy allowlist
   openclaw gateway restart
   openclaw channels status --probe
   ```
   `config set` пишет «Restart the gateway to apply» — перезапуск обязателен. В статусе должно быть `connected … works`.
6. Проверка: ✋ человек пишет боту «Привет, ты кто? Сколько свободной памяти на сервере — посмотри сам» — бот отвечает с реальными цифрами.

## 6. Как принять секрет, не видя его

Сделай на компьютере человека маленький скрипт: он спрашивает токен скрытым вводом и по SSH записывает его в файл на сервере (права 600, владелец openclaw). Человек запускает скрипт одной короткой строкой.

- **Windows (PowerShell):** `Read-Host -AsSecureString`, перевод в строку, **удалить символы `\r` и `\n`** перед отправкой. Грабля: PowerShell дописывает невидимый символ, токен становится длиннее, Telegram его не принимает.
- **Длинные команды не давай копировать из чата** — они рвутся на строки. Только короткая строка запуска скрипта.
- После записи проверь длину и формат `цифры:буквы`, **не выводя сам токен** (например, через `getMe` без печати токена). Скрипт и временный файл после использования удали.

## 7. Служба, heartbeat и перезагрузка

```
systemctl --user is-enabled openclaw-gateway.service   # enabled
systemctl --user is-active openclaw-gateway.service    # active
```

- Шлюз слушает только локальный адрес (`127.0.0.1:18789`) — наружу его не открывай.
- **Выключи heartbeat** (грабля 14.09): сразу после установки агент просыпается каждые 30 минут и тратит подписку (~48 обращений в сутки), даже когда человек молчит.
  ```
  openclaw config set agents.defaults.heartbeat.every 0m
  openclaw gateway restart
  openclaw cron list --all        # Heartbeat → disabled
  ```
  Грабля 15.09: команда отвечает «без перезапуска», но до `gateway restart` в `cron list` Heartbeat остаётся `every 30m`.
- **Перезапуск шлюза, пока агент работает, висит до 5 минут** в `deactivating` (ждёт окончания работы, `TimeoutStopSec=330`) и прерывает задачу. Перезапускай, когда агент свободен; иначе предупреди человека.
- **Проверка перезагрузкой:** предупреди человека, выполни `reboot`, подожди около 40 секунд, проверь `is-active` и `channels status --probe`, ✋ человек пишет боту. Время сверяй по часам сервера (`uptime -s`), а не ноутбука — они могут расходиться. Ответил — шаг пройден.

## 8. Бизнес-скиллы

Сначала проверь, потом ставь:

```
openclaw skills verify @coreyhaines31/offers          # pass · clean · benign
openclaw skills install @coreyhaines31/product-marketing
openclaw skills install @coreyhaines31/offers
openclaw skills install @coreyhaines31/competitor-profiling
openclaw skills install @coreyhaines31/lead-magnets
openclaw skills list
```

- Скиллы ставятся в `~/.openclaw/workspace/skills/`. У каждого в списке должен быть статус `✓ ready`.
- `unsigned` в `skills verify` — норма для скиллов сообщества. Если проверка или установка предупреждает о политике безопасности — не подтверждай вслепую: покажи человеку предупреждение и объясни простыми словами.
- `competitor-profiling` написан под платные Firecrawl и DataForSEO и ждёт готовые ссылки. Без них агент работает своим браузером (раздел 9) — дай ему ссылки на страницы конкурентов прямо в задаче.
- **Скилл из ceo-ai-os** (например `competitive-analysis`) в ClawHub нет; формат `skills-sh:CodeAlive-AI/ceo-ai-os/…` отвечает «not found», а `git:` ждёт `SKILL.md` в корне. Рабочий путь: скачать папку скилла из GitHub на сервер, прочитать файлы (нет ли команд и ключей) и `openclaw skills install <папка> --as competitive-analysis`.
- `copywriting` в OpenClaw не проверен (в Hermes его заблокировал сканер) — не ставь без проверки.
- ✋ Человек пишет боту: «Используй скилл offers. <свой бизнес, цена, в чём сложность>. Упакуй короткий оффер для поста в Instagram». Жди готовый текст — это контрольная точка.

## 9. Браузер агента

На чистой Ubuntu браузера нет. Для задач с живыми сайтами агент сам скачивает Chromium (Playwright), но **без root он не запустится** — не хватает системных библиотек, а Ubuntu 24.04 запрещает браузеру песочницу. Сделай под root заранее, до браузерных задач:

1. Системные библиотеки (только стандартные репозитории Ubuntu):
   ```
   cd /tmp && npx --yes playwright install-deps chromium
   ```
   У root `npx` нет — возьми Node пользователя: `export PATH=$(ls -d /home/openclaw/.openclaw/tools/node-v*/bin | head -1):$PATH`. Проверка: `ldd <путь к chrome> | grep -c "not found"` → `0`.
2. Точечное правило AppArmor только для браузера агента (иначе `No usable sandbox!`, грабля 15.09):
   ```
   cat > /etc/apparmor.d/openclaw-chromium <<'EOF'
   abi <abi/4.0>,
   include <tunables/global>
   profile openclaw-chromium /home/openclaw/.cache/ms-playwright/chromium-*/chrome-linux64/chrome flags=(unconfined) {
     userns,
     include if exists <local/openclaw-chromium>
   }
   EOF
   apparmor_parser -r /etc/apparmor.d/openclaw-chromium
   ```
   **Не** `noSandbox` и **не** `sysctl kernel.apparmor_restrict_unprivileged_userns=0`: они снимают защиту шире, чем нужно. Если агент ещё не скачал Chromium — путь появится после его первой браузерной задачи или `openclaw browser start`; тогда перезагрузи профиль.
3. Проверка: `openclaw browser start` → `detectedBrowser: chromium`, `cdpReady: true`.

## 10. Задача по расписанию и лимит подписки

- Задачи ставятся **сообщением боту**. ✋ Человек пишет, например: «каждый понедельник в 10:00 по Алматы <задание>». Бот сам создаёт cron с часовым поясом и доставкой в Telegram.
- Каждая задача выполняется в чистой сессии, без истории — формулировка должна быть самодостаточной.
- Для проверки: ✋ человек просит разовую задачу через 2–3 минуты и подтверждает, что сообщение пришло само. Проверь `openclaw cron list --all` и `openclaw cron runs`.
- **Лимит подписки.** У подписки ChatGPT (Codex) норма на 5 часов. Тяжёлые браузерные задачи подряд её выбирают: 15.09 одна сверка трёх страниц отправила ~49 тыс. токенов, следующая упала с `You've reached your Codex subscription usage limit`. **Сообщение о сбое в Telegram не пришло** — написать его должна была та же модель. Предупреди человека до браузерных прогонов; молчит бот — смотри `openclaw cron runs`.
- **Встроенные задачи** тоже тратят подписку, их видно в `cron list --all`: Memory Dreaming (каждую ночь в 3:00, агент упорядочивает память) и Skill collection review (раз в 7 дней). Не отключай молча — расскажи человеку.
- Одна своя задача на старт, не десять.

## 11. Безопасность и памятка

- Доступ: `dmPolicy allowlist`, в `allowFrom` только ID владельца.
- `openclaw security audit` → 0 critical. Ложные тревоги: `models.weak_tier` (считает `gpt-6-astra` «ниже GPT-5» — не узнаёт имя), `tools.elevated: enabled` без эффекта (sudo у пользователя нет). `trusted_proxies_missing` не нужен, пока панель только на 127.0.0.1.
- Порты: `ss -tlnp`. Наружу — только SSH (и Tailscale, если есть). `zabbix_agentd :10050` — мониторинг хостинга, ufw закрывает его снаружи, не трогать. Порты браузера и шлюза на `127.0.0.1` — норма.
- Плагины не включены без необходимости; скиллы только проверенные.
- В конце дай человеку короткую памятку простыми словами: как понять, что бот жив (`openclaw channels status --probe`); логи (`openclaw logs --follow`); диагностика (`openclaw doctor`); как обновить (`openclaw update`); как удалить всё (`openclaw backup create` → `openclaw uninstall --all --yes` → от root `deluser --remove-home openclaw` → `/deletebot` у BotFather; перед необратимым спросить).

## Финиш: установка закончена, когда

1. Бот отвечает владельцу в Telegram.
2. После перезагрузки сервера бот ответил снова.
3. Скилл offers вернул готовый текст.
4. Разовая задача по расписанию пришла сама с результатом.
5. Heartbeat `disabled` в `cron list --all`, у `openclaw` нет sudo, вход на сервер только по ключу.
6. Человек получил памятку.

## Грабли, проверенные 14–15.09.2026

| Симптом | Причина | Что делать |
|---|---|---|
| «Node.js not found… Administrator privileges required» | запущен `install.sh` без sudo | раздел 3: `install-cli.sh` — ставит Node в домашнюю папку без root |
| `openclaw: command not found` после `su - openclaw` | нет в PATH | раздел 3, п. 2: строка в `~/.profile` |
| «Missing config… set gateway.mode=local» | шлюз без режима | `openclaw config set gateway.mode local` |
| `"openai-codex" is a legacy provider ID` | старое имя провайдера | `--provider openai` |
| Модель встала `gpt-5.6-sol` | так выбирает `--set-default` | раздел 4, п. 3: `agents.defaults.model.primary openai/gpt-6-astra` |
| `agent cleanup failed … could not be confirmed` | уборка после разового `--local` | безвредно, ответ полный |
| `A Gateway is running… Run without --local` | шлюз уже запущен | `openclaw agent --agent main -m "…"` без `--local` |
| `SERVICE_DEFINITION_SEALED [foreign-owner]` | папку в домашнем каталоге создал root без владельца | `chown -R openclaw:openclaw /home/openclaw` |
| `Failed to connect to bus` | у `su -` нет XDG_RUNTIME_DIR | `export XDG_RUNTIME_DIR=/run/user/$(id -u openclaw)`, linger включён |
| Бот не принимает токен | невидимый `\r` из PowerShell | раздел 6: удалить `\r\n` |
| Настройка Telegram «не применилась» | `config set` ждёт перезапуска | `openclaw gateway restart` |
| Бот молчит на «Привет» и шлёт код | сопряжение не подтверждено | раздел 5, п. 4–5 |
| Подписка тратится, хотя никто не пишет | heartbeat включён или не перезапущен шлюз | раздел 7: `every 0m` + `gateway restart` + `cron list --all` |
| Перезапуск висит 5 минут в `deactivating` | шлюз ждёт окончания работы агента | перезапускать, когда агент свободен |
| Агент не может открыть сайт, `exit 100` / `exit 127` | нет системных библиотек Chromium | раздел 9, п. 1 |
| `No usable sandbox!` | Ubuntu 24.04 запрещает песочницу | раздел 9, п. 2: профиль AppArmor, не `noSandbox` |
| Задача по расписанию стартовала, ответа нет | исчерпан лимит подписки Codex | `openclaw cron runs`; ждать сброса, облегчить задачу |
| `skills-sh:…` → not found on ClawHub | скилла нет в ClawHub | раздел 8: установка из локальной папки |
| `security audit`: `models.weak_tier` для astra | проверка не знает новое имя | ложная тревога |
| Бот замолчал через полдня | Telegram-адаптер | проверить `is-active` и логи шлюза, перезапустить службу |
