Docker-контейнер для OpenClaw решает три проблемы сразу: изоляция среды, простой деплой на любой VPS и гарантированный автозапуск после перезагрузки сервера. Это стандарт для продакшн-развёртывания агентов.
Зачем контейнеризировать OpenClaw
Без Docker:
- «Работает у меня, не работает на сервере» — разные версии Node.js, зависимостей
- Ручной перезапуск после краша или ребута
- Сложно масштабировать и обновлять
С Docker:
- Одинаковое окружение везде — dev, staging, production
- Автоматический рестарт через
restart: always - Изоляция: агент не имеет доступа к хосту сверх разрешённого
- Обновление — один
docker pull+docker-compose up -d
Dockerfile
# Dockerfile
FROM node:22-alpine AS base
# Зависимости безопасности
RUN apk add --no-cache git ca-certificates
# Создаём непривилегированного пользователя
RUN addgroup -S openclaw && adduser -S openclaw -G openclaw
WORKDIR /app
# Устанавливаем OpenClaw глобально
RUN npm install -g @openclaw/cli@latest
# Создаём директории для данных
RUN mkdir -p /app/sessions /app/workspace && \
chown -R openclaw:openclaw /app
# Переключаемся на непривилегированного пользователя
USER openclaw
# Рабочая директория для проектов
WORKDIR /workspace
# Переменные окружения по умолчанию
ENV NODE_ENV=production
ENV OPENCLAW_HOME=/app
# Порт (если используете HTTP API)
EXPOSE 3000
# Healthcheck
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
CMD openclaw --version || exit 1
CMD ["openclaw", "--no-interactive", "--session", "main"]
docker-compose.yml для полного стека
version: "3.9"
services:
openclaw:
build: .
image: myorg/openclaw-agent:latest
container_name: openclaw-agent
restart: always
environment:
# API ключ из .env файла
ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY}
OPENCLAW_MODEL: claude-sonnet-4-6
# Ограничение расходов
OPENCLAW_MAX_TOKENS_PER_SESSION: 100000
OPENCLAW_HEARTBEAT_INTERVAL: 300
volumes:
# Персистентные сессии
- openclaw-sessions:/app/sessions
# Рабочая директория — монтируем ваш проект
- ./workspace:/workspace:rw
# Конфиг OpenClaw
- ./openclaw.json:/app/.openclaw/openclaw.json:ro
# AGENTS.md вашего проекта
- ./AGENTS.md:/workspace/AGENTS.md:ro
# Ограничения ресурсов
deploy:
resources:
limits:
cpus: "1.0"
memory: 1G
reservations:
cpus: "0.25"
memory: 256M
# Сети: изолируем агента
networks:
- agent-net
logging:
driver: "json-file"
options:
max-size: "50m"
max-file: "5"
# ChromaDB для RAG (опционально)
chroma:
image: chromadb/chroma:latest
container_name: chroma-db
restart: always
volumes:
- chroma-data:/chroma/chroma
networks:
- agent-net
# Не открываем порт наружу — только внутри сети
volumes:
openclaw-sessions:
chroma-data:
networks:
agent-net:
driver: bridge
Файл .env (не коммитить в Git!)
# .env
ANTHROPIC_API_KEY=sk-ant-api03-...
BEGET_DEPLOY_KEY=...
DATABASE_URL=postgresql://user:pass@db:5432/myapp
Добавьте в .gitignore:
.env
.env.local
.env.*.local
Сборка и запуск
# Первый запуск
docker-compose up -d --build
# Просмотр логов
docker-compose logs -f openclaw
# Подключение к агенту в интерактивном режиме
docker-compose exec openclaw openclaw
# Остановка
docker-compose down
# Обновление до новой версии
docker-compose pull && docker-compose up -d
Конфигурация openclaw.json
{
"model": "claude-sonnet-4-6",
"mcpServers": {
"rag": {
"command": "node",
"args": ["/app/mcp-servers/rag/dist/index.js"],
"env": {
"CHROMA_URL": "http://chroma:8000"
}
}
},
"permissions": {
"allowedPaths": ["/workspace/src", "/workspace/docs"],
"deniedPaths": ["/workspace/.env*", "/workspace/secrets"]
},
"sessions": {
"persistPath": "/app/sessions",
"maxAge": "30d"
}
}
Продакшен: Traefik + HTTPS
Если нужен веб-интерфейс агента с HTTPS:
services:
traefik:
image: traefik:v3
command:
- "--providers.docker=true"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.letsencrypt.acme.email=you@example.com"
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
- "--certificatesresolvers.letsencrypt.acme.tlschallenge=true"
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- letsencrypt:/letsencrypt
openclaw:
# ... остальная конфигурация
labels:
- "traefik.enable=true"
- "traefik.http.routers.openclaw.rule=Host(`agent.mydomain.com`)"
- "traefik.http.routers.openclaw.tls.certresolver=letsencrypt"
Мониторинг и алерты
Добавьте health endpoint и настройте уведомления при падении:
# Проверка статуса
docker inspect --format='{{.State.Health.Status}}' openclaw-agent
# Скрипт для Telegram-уведомлений при падении
# /usr/local/bin/check-agent.sh
#!/bin/bash
STATUS=$(docker inspect --format='{{.State.Status}}' openclaw-agent 2>/dev/null)
if [ "$STATUS" != "running" ]; then
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
-d "chat_id=${TELEGRAM_CHAT_ID}" \
-d "text=⚠️ OpenClaw agent is DOWN on $(hostname)"
fi
# Cron для проверки каждые 5 минут
*/5 * * * * /usr/local/bin/check-agent.sh
Безопасность в контейнере
Минимальные права:
- Всегда запускайте от непривилегированного пользователя (
USER openclaw) - Монтируйте workspace как
rw, конфиги как:ro - Не открывайте лишние порты
Изоляция сети:
- Внутренние сервисы (ChromaDB, PostgreSQL) только в
agent-net - Не открывайте их порты на хост через
ports:
Секреты:
- Используйте Docker Secrets для production:
docker secret create anthropic_key - - Никогда не вшивайте ключи в Dockerfile или docker-compose.yml
Обновление без даунтайма
# Обновление образа
docker pull myorg/openclaw-agent:latest
# Перезапуск с нулевым даунтаймом (если используете Swarm/K8s)
docker service update --image myorg/openclaw-agent:latest openclaw_openclaw
# Для обычного compose
docker-compose up -d --no-deps --build openclaw
Частые ошибки
1. Volume permissions
Если контейнер не может писать в volume — проблема с правами. Решение: chown -R 1000:1000 /path/to/volume на хосте.
2. Нет персистентности сессий Если не монтируете volume для сессий — при рестарте контейнера весь контекст теряется.
3. Утечка API ключей
Никогда не добавляйте .env в Git. Используйте docker secret или переменные CI/CD.
4. Забыли restart: always
После ребута сервера агент не запустится. Всегда добавляйте restart: always в production.
Итог
Docker-развёртывание OpenClaw занимает 30-60 минут при первой настройке. Результат: агент работает 24/7, автоматически перезапускается, изолирован от хоста и легко обновляется. Это минимальный стандарт для любого продакшн-агента.
Следующий шаг: запустите RAG-поиск по документам прямо в этом контейнере.