Инструкции

Clawdbot с Docker и Ollama: гайд по селф-хостингу AI-стека

Деплой Clawdbot (OpenClaw) с Docker и Ollama на VPS: локальные LLM без API-счетов, SSL через Nginx, продакшн-конфиг. Полное руководство.

Команда is*hosting 4 июн. 2026 7 мин
Clawdbot с Docker и Ollama: гайд по селф-хостингу AI-стека
Содержание

Clawdbot в связке с Docker и Ollama — это селф-хостинг AI-агент, который крутит локальные языковые модели на вашем VPS без единого запроса к OpenAI API. OpenClaw отвечает за логику агента, Docker изолирует окружение, Ollama запускает инференс локально.

Зачем Docker + Ollama для Clawdbot?

Что дает Docker

Зафиксированные зависимости, воспроизводимое поведение, перезапуск за две секунды. У OpenClaw в 2026 году была advisory по command injection (GHSA-mc68-q9jw-2h3v) — пиньте версии, не используйте latest.

Что дает Ollama

Ollama запускает LLaMA, Mistral, Qwen и Phi локально. Предоставляет нативный эндпоинт /api/chat (на него OpenClaw опирается при tool calling) и OpenAI-совместимый /v1. Используйте /api/chat.

Clawdbot + OpenAI API vs Clawdbot + Ollama

Селф-хостинг меняет помегабайтные API-счета на фиксированную стоимость железа. Данные остаются на вашем сервере — это важно при работе под GDPR или HIPAA. Компромисс: локальные модели — это не GPT-4, но qwen2.5-coder:32b или gpt-oss:20b справляются с большинством агентных циклов.

Требования к серверу

Что нужно для запуска Clawdbot с Docker и Ollama:

  • Память: минимум 16 ГБ RAM для 8B-моделей
  • ОС: Ubuntu 22.04 LTS или Debian 12
  • Софт: Docker Engine 24+ и Docker Compose v2
  • Диск: 80 ГБ свободного места
  • Сеть: доменное имя для SSL
  • Процессор: CPU с поддержкой AVX2 (cat /proc/cpuinfo | grep -m1 avx2)
  • GPU (опционально): на CPU-машине с 4–6 ядрами и 16 ГБ RAM 8B-модель в Q4 выдает 2–6 токенов/сек. GPU-карта дает примерно 10–20× прирост, но конкретные цифры зависят от карты.

OpenClaw требует контекстное окно 64k, что примерно удваивает потребление памяти по сравнению с дефолтным 4k.

Конфигурации: минимум, рекомендуемая, тяжелая нагрузка

Уровень

vCPU

RAM

Диск

Вместимость моделей

VPS от is*hosting

Минимум

4

16 ГБ

80 ГБ SSD

7B Q4, короткий контекст

Elite VPS

Рекомендуемая

6

24-32 ГБ

120 ГБ NVMe

8B-14B Q4 при 64k контексте

Exclusive VPS

Тяжелая (CPU)

8

64 ГБ

200 ГБ NVMe

32B Q4 или 70B Q4 с offload

Exclusive VPS + апгрейд RAM и диска

GPU

8 vCPU + 24 ГБ VRAM

32 ГБ

200 ГБ NVMe

14B-32B на полной скорости

is*hosting GPU сервер

Тяжелая GPU

8 vCPU + 48 ГБ VRAM

64 ГБ

400 ГБ NVMe

70B Q4 (~40 ГБ VRAM на веса)

GPU сервер (top tier)

70B Q4 требует ~40 ГБ VRAM только на веса. 16 ГБ карта — OOM.

VPS за 5-15 минут

Выделенные ресурсы и изоляция KVM для глобальных экспериментов.

Выбрать VPS

Шаг 1. Установка Docker и контейнера Clawdbot

Установка Docker на Ubuntu 22.04

Не используйте apt install docker.io — берите из официального репозитория:

sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc docker-buildx podman-docker containerd runc | cut -f1)
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo usermod -aG docker $USER
newgrp docker

docker-compose.yml: базовый конфиг

OpenClaw игнорирует переменную LLM_PROVIDER. Конфиг живет в ~/.openclaw/openclaw.json, внутри контейнера это /home/node/.openclaw/openclaw.json: образ работает под пользователем node (uid 1000) и отдает Gateway и Control UI на порту 18789. Создайте папку проекта и токен Gateway:

mkdir -p ~/clawdbot/data && cd ~/clawdbot
echo "OPENCLAW_GATEWAY_TOKEN=$(openssl rand -hex 32)" > .env

Docker Compose передает токен из .env в контейнер. Этот же токен вы вставите в Control UI для входа. Создайте docker-compose.yml:

services:
  clawdbot:
    image: ghcr.io/openclaw/openclaw:2026.10.10
    container_name: clawdbot
    restart: unless-stopped
    env_file:
      - .env
    environment:
      OLLAMA_API_KEY: "ollama-local"
    volumes:
      - ./data:/home/node/.openclaw
    extra_hosts:
      - "host.docker.internal:host-gateway"
    ports:
      - "127.0.0.1:18789:18789"

Создайте openclaw.json

Сохраните конфиг как data/openclaw.json:

{
  "gateway": {
    "mode": "local",
    "bind": "lan",
    "auth": { "mode": "token" },
    "trustedProxies": ["172.28.0.10"],
    "controlUi": {
      "allowedOrigins": ["https://your-domain.com", "http://127.0.0.1:18789", "http://localhost:18789"]
    }
  },
  "agents": {
    "defaults": { "model": { "primary": "ollama/llama3.1:8b" } }
  },
  "models": {
    "providers": {
      "ollama": {
        "baseUrl": "http://host.docker.internal:11434",
        "apiKey": "ollama-local",
        "api": "ollama",
        "models": [
          {
            "id": "llama3.1:8b",
            "name": "LLaMA 3.1 8B",
            "contextWindow": 65536,
            "maxTokens": 8192,
            "params": { "num_ctx": 65536 },
            "cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 }
          }
        ]
      }
    }
  }
}

Блок gateway обязателен: без "mode": "local" Gateway не запускается, а при привязке по умолчанию (loopback) до него не достучаться через проброс порта Docker, поэтому нужен "bind": "lan". "auth": { "mode": "token" } использует OPENCLAW_GATEWAY_TOKEN из .env. allowedOrigins перечисляет адреса, с которых браузер может открыть Control UI: ваш домен для шага 4 и 127.0.0.1:18789 для SSH-туннеля ниже. trustedProxies нужен для Nginx в шаге 4. baseUrl указывает на Ollama на хосте (шаг 2); для полного стека из шага 4 замените его на http://ollama:11434.

Gateway пишет в эту папку (обновляет openclaw.json и хранит рядом резервные копии), поэтому не монтируйте конфиг только для чтения и передайте папку пользователю контейнера. Иначе Gateway упадет с ошибкой EACCES:

sudo chown -R 1000:1000 data

Запустите контейнер командой docker compose up -d. Control UI слушает только 127.0.0.1:18789, поэтому открывайте его со своего компьютера через SSH-туннель, затем перейдите на http://127.0.0.1:18789 и вставьте токен из .env в настройках Control UI:

ssh -L 18789:127.0.0.1:18789 root@YOUR_SERVER_IP

Две ошибки, которые убивают сетап сразу:

  • Биндинг на 0.0.0.0. ports: - "18789:18789" выставляет порт агента наружу и обходит UFW через Docker iptables. Всегда биндите на 127.0.0.1:18789:18789.
  • Отсутствие restart policy. Без restart: unless-stopped упавшие контейнеры лежат, пока вы не заметите.

Шаг 2. Установка Ollama и выбор модели

Примечание: этот systemd-способ описывает установку Ollama на хост. Если вы сразу идете к полному docker-compose.yml из шага 4, пропустите этот шаг — там Ollama работает как контейнер.

Установка Ollama как systemd-сервиса

curl -fsSL https://ollama.com/install.sh | sh
sudo systemctl edit ollama

Добавьте переменные окружения:

[Service]
Environment="OLLAMA_HOST=0.0.0.0:11434"
Environment="OLLAMA_NUM_PARALLEL=2"
Environment="OLLAMA_KEEP_ALIVE=30m"

OLLAMA_HOST=0.0.0.0 позволяет контейнеру clawdbot обращаться к Ollama через host.docker.internal, но заодно открывает API Ollama, у которого нет авторизации, на публичном интерфейсе сервера. Закройте порт 11434 через UFW и разрешите его только из Docker-сетей (172.16.0.0/12 покрывает стандартные bridge-сети Docker):

sudo ufw allow OpenSSH
sudo ufw allow from 172.16.0.0/12 to any port 11434 proto tcp
sudo ufw enable

Здесь UFW действует: Ollama запущена прямо на хосте, поэтому правила iptables Docker его не обходят.

Перезапустите и скачайте модель:

sudo systemctl daemon-reload
sudo systemctl restart ollama
ollama pull llama3.1:8b

LLaMA 3.1 vs Mistral vs Qwen2.5: что влезет в RAM?

OpenClaw требует модели с поддержкой tool calling. Проверьте совместимость перед тем, как ставить:

ollama show qwen2.5-coder:7b --modelfile | grep -i tool

Модель

Размер файла (Q4)

RAM при 64k контексте

Примечания

Mistral 7B

4.1 ГБ

~10 ГБ

Слабый tool calling

LLaMA 3.1 8B

4.7 ГБ

~12 ГБ

Стабильный tool calling

Qwen2.5-Coder 7B

4.4 ГБ

~11 ГБ

Выбор OpenClaw для кодинга

gpt-oss 20B

12 ГБ

~20 ГБ

Рекомендуемый дефолт OpenClaw

Шаг 3. Подключение Clawdbot к Ollama

Детали конфигурации

Используйте "api": "ollama". OpenClaw рекомендует нативный эндпоинт /api/chat: OpenAI-совместимый /v1 в Ollama тоже поддерживает tools и streaming, но tool calling через него с OpenClaw работает ненадежно. Не добавляйте /v1 в baseUrl. Укажите и contextWindow, и params.num_ctx равными 65536: contextWindow описывает модель для OpenClaw, а num_ctx задает размер контекста, который OpenClaw запрашивает у Ollama.

Docker-сеть: host vs bridge

localhost внутри контейнера в bridge-сети указывает на сам контейнер, а не на хост. http://localhost:11434 не сработает.

Решение зависит от того, где работает Ollama. Если на хосте (шаг 2), используйте http://host.docker.internal:11434: строка extra_hosts в Compose-файле связывает это имя с хостом. Если Ollama работает как контейнер в той же Compose-сети (полный стек из шага 4), подключайтесь через http://ollama:11434.

Шаг 4. Продакшн-хардинг

SSL через Nginx + Certbot

Nginx не стартует без сертификатов; Certbot'у нужен открытый порт 80. Поэтому сначала поднимаем HTTP-конфиг, потом переключаемся на SSL.

Создайте nginx/conf.d/clawdbot.conf:

server {
    listen 80;
    server_name your-domain.com;

    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }

    location / {
        proxy_pass http://clawdbot:18789;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_buffering off;
        proxy_read_timeout 300s;
    }
}

Запустите стек с полным docker-compose.yml из конца этого шага (сначала прочитайте примечание под ним), затем получите сертификат:

sudo apt install -y certbot
sudo mkdir -p /var/www/certbot
sudo certbot certonly --webroot -w /var/www/certbot -d your-domain.com --agree-tos -m [email protected] --non-interactive

Примечание: /var/www/certbot на хосте монтируется в контейнер Nginx через volume из docker-compose.yml. Сначала запускаете Nginx с HTTP-конфигом, получаете сертификат, потом переключаетесь на SSL-конфиг и перезагружаете.

Замените конфиг на SSL-версию:

server {
    listen 80;
    server_name your-domain.com;
    location /.well-known/acme-challenge/ { root /var/www/certbot; }
    location / { return 301 https://$host$request_uri; }
}

server {
    listen 443 ssl;
    http2 on;
    server_name your-domain.com;

    ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;

    location / {
        proxy_pass http://clawdbot:18789;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_buffering off;
        proxy_read_timeout 300s;
    }
}

Перезагрузите Nginx:

docker compose exec nginx nginx -s reload

Авторизация, бэкапы и файрвол

  • Auth: добавьте Nginx basic auth или IP allowlist.
  • Бэкапы: tar на директорию ./data (в ней лежит openclaw.json), файл .env и nginx/conf.d. Храните копию вне сервера.
  • Лимиты памяти: задайте в Compose, чтобы избежать OOM-киллов.
  • Файрвол: Docker-mapped порты обходят UFW. Держите Ollama только во внутренней Compose-сети — не выставляйте порт 11434 наружу.

Полный docker-compose.yml для продакшна

services:
  clawdbot:
    image: ghcr.io/openclaw/openclaw:2026.10.10
    container_name: clawdbot
    restart: unless-stopped
    environment:
      OLLAMA_API_KEY: "ollama-local"
    env_file:
      - .env
    volumes:
      - ./data:/home/node/.openclaw
    depends_on:
      ollama:
        condition: service_healthy
      ollama-bootstrap:
        condition: service_completed_successfully
    networks:
      - agentnet
    deploy:
      resources:
        limits:
          memory: 4g

  ollama:
    image: ollama/ollama:0.40.14
    container_name: ollama
    restart: unless-stopped
    environment:
      OLLAMA_KEEP_ALIVE: "30m"
      OLLAMA_NUM_PARALLEL: "2"
    volumes:
      - ollama_models:/root/.ollama
    healthcheck:
      test: ["CMD-SHELL", "ollama list >/dev/null 2>&1 || exit 1"]
      interval: 10s
      timeout: 5s
      retries: 12
      start_period: 60s
    networks:
      - agentnet
    deploy:
      resources:
        limits:
          memory: 14g

  ollama-bootstrap:
    image: ollama/ollama:0.40.14
    depends_on:
      ollama:
        condition: service_healthy
    entrypoint: ["/bin/sh", "-c"]
    command: ["OLLAMA_HOST=http://ollama:11434 ollama pull llama3.1:8b"]
    networks:
      - agentnet
    restart: "no"

  nginx:
    image: nginx:1.27-alpine
    container_name: nginx
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d:ro
      - /etc/letsencrypt:/etc/letsencrypt:ro
      - /var/www/certbot:/var/www/certbot:ro
    depends_on:
      - clawdbot
    networks:
      agentnet:
        ipv4_address: 172.28.0.10

networks:
  agentnet:
    driver: bridge
    ipam:
      config:
        - subnet: 172.28.0.0/24

volumes:
  ollama_models:

Перед запуском замените baseUrl в data/openclaw.json на http://ollama:11434. Nginx получает фиксированный адрес 172.28.0.10, который совпадает с gateway.trustedProxies: запросы через прокси с адресов, которым Gateway не доверяет, он отклоняет с ошибкой 403.

Запуск и проверка

docker compose up -d
docker compose ps
docker compose exec clawdbot node dist/index.js models list
ss -ltnp | grep -E ':(80|443|18789|11434)\b'

Публично должны слушать только порты 80 и 443. Чтобы войти, откройте https://your-domain.com и вставьте токен из .env в настройках Control UI. Если Control UI попросит подтвердить устройство, сделайте это с сервера:

docker compose exec clawdbot node dist/index.js devices list
docker compose exec clawdbot node dist/index.js devices approve <requestId>
VPS недостаточно?

Возьмите выделенный сервер. Для требовательных рабочих нагрузок и кастомных настроек.

Выбрать сервер

Итого

Арендуете VPS с 16–32 ГБ RAM, ставите Docker, поднимаете Ollama и OpenClaw в общей Compose-сети, проксируете через Nginx с HTTPS. Используете нативный /api/chat, контекстное окно — 64k или выше (contextWindow и num_ctx).

Рекомендуемая конфигурация соответствует тарифу VPS Exclusive от is*hosting: достаточно RAM для 8B–14B модели при полном 64k-контексте. Для моделей 32B+ — Exclusive с апгрейдом RAM или GPU-сервер.

Выделенный сервер с GPU

Мощность для ML, рендеринга и тяжелых расчетов.

От $88.75/месяц