Назад к блогу
Развертывание

Руководство по развертыванию BotBrowser в Docker

Лучшие практики развертывания BotBrowser в контейнерах Docker: Dockerfile, Docker Compose, тома и защита для production.

Введение

Docker обеспечивает повторяемость, изоляцию и масштабируемость, необходимые для production-развертывания BotBrowser. Контейнеры запускаются из предсказуемого состояния, работают изолированно и могут быть воспроизведены в любой инфраструктуре с поддержкой Docker.

В этом руководстве описаны шаги: сборка образа, управление конфигурациями и скриптами через тома, настройка общей памяти, масштабирование с помощью Docker Compose и защита для production. Подход применим как для одиночных контейнеров, так и для кластеров в облаке.

Зачем Docker

BotBrowser зависит от системных библиотек, виртуального сервера отображения и точных настроек окружения. На чистом хосте каждому серверу нужно вручную установить зависимости, настроить Xvfb, задать переменные окружения и проверить работу. Docker упаковывает всё в образ, обеспечивая согласованность.

Docker также изолирует процессы: каждый контейнер имеет собственную файловую систему, сетевой неймспейс и лимиты ресурсов. Утечка памяти в одном контейнере не повлияет на другие, а политики перезапуска Docker автоматически восстанавливают упавшие процессы.

Для команд, которым нужны множественные инстансы с разными профилями и прокси, Docker Compose или оркестрация позволяют описать и управлять всем стеком в одном файле.

Технические детали

Chrome и /dev/shm

Chrome активно использует /dev/shm для IPC между процессами браузера, GPU и рендеринга. По умолчанию Docker выделяет 64 МБ, что слишком мало. Chrome может падать без минимум 1–2 ГБ общей памяти.

Решение: запускать с --shm-size=2g или указывать shm_size: '2g' в Docker Compose.

Сервер отображения в контейнере

Как и на хосте, контейнер должен запускать Xvfb перед Chrome и устанавливать переменную DISPLAY.

Директория пользовательских данных

Каждому экземпляру нужен собственный --user-data-dir. В контейнере этот каталог временный, если не смонтировать том. Для сохранения сессий используйте монтирование тома.

Размер образа

Образ с необходимыми зависимостями обычно весит 500–800 МБ. Используйте multi-stage сборки или сократите список пакетов, но учитывайте, что отсутствие библиотек может вызвать ошибки в рантайме.

Docker Container Xvfb :10 Virtual Display BotBrowser Chrome + Profile Node.js Automation Script /dev/shm 2 GB Shared Mem Volume: /opt/profiles (host mounted) Volume: /data/sessions (persistent)

Общие подходы

Монолитный контейнер

Простой, но ограниченно масштабируемый: всё — Xvfb, бот, скрипты — в одном контейнере. Один сбой останавливает весь контейнер.

Один контейнер на браузер

Максимальная изоляция: отдельный профиль и прокси для каждого контейнера. Больше затрат, но проще масштабировать и отлаживать.

Sidecar-паттерн

Sidecar с Xvfb может уменьшить использование ресурсов, но усложняет сеть и создаёт единичную точку отказа.

Использование официального образа Chromium

Удобно, но может не хватать зависимостей. Ubuntu даёт более явный контроль.

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

Базовый образ: Ubuntu 22.04. Установите зависимости, скопируйте бинарь BotBrowser и профили, запустите Xvfb перед автоматизацией. Подход проверен и стабилен.

Конфигурация и примеры

Dockerfile

FROM ubuntu:22.04

# Install system dependencies
RUN apt-get update && apt-get install -y \
    wget ca-certificates fonts-liberation \
    libasound2 libatk-bridge2.0-0 libatk1.0-0 \
    libcups2 libdbus-1-3 libdrm2 libgbm1 \
    libgtk-3-0 libnspr4 libnss3 \
    libxcomposite1 libxdamage1 libxrandr2 \
    xdg-utils xvfb curl \
    && rm -rf /var/lib/apt/lists/*

# Install Node.js
RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \
    && apt-get install -y nodejs \
    && rm -rf /var/lib/apt/lists/*

# Set display environment
ENV DISPLAY=:10.0

# Copy BotBrowser binary
COPY botbrowser/ /opt/botbrowser/
RUN chmod +x /opt/botbrowser/chrome

# Copy profiles
COPY profiles/ /opt/profiles/

# Copy automation scripts
WORKDIR /opt/app
COPY package.json package-lock.json ./
RUN npm ci --production
COPY scripts/ ./scripts/

# Health check
HEALTHCHECK --interval=30s --timeout=10s --retries=3 \
  CMD pgrep -x Xvfb && pgrep -f "chrome" || exit 1

# Start Xvfb and run the automation script
CMD Xvfb :10 -screen 0 1920x1080x24 -ac & \
    sleep 1 && \
    node scripts/main.js

Сборка и запуск

docker build -t botbrowser-worker .
docker run --rm --shm-size=2g botbrowser-worker

Скрипт автоматизации

// scripts/main.js
const { chromium } = require('playwright-core');

const PROFILE = process.env.PROFILE || '/opt/profiles/profile.enc';
const PROXY = process.env.PROXY || '';

async function main() {
  const args = [
    '--disable-setuid-sandbox',
    `--bot-profile=${PROFILE}`,
  ];

  if (PROXY) args.push(`--proxy-server=${PROXY}`);

  const browser = await chromium.launch({
    executablePath: '/opt/botbrowser/chrome',
    args: args,
    headless: true,
  });

  try {
    const context = await browser.newContext();
    const page = await context.newPage();
    await page.goto('https://example.com');
    console.log('Title:', await page.title());
  } finally {
    await browser.close();
  }
}

process.on('SIGTERM', async () => { console.log('SIGTERM'); process.exit(0); });
process.on('SIGINT', async () => { console.log('SIGINT'); process.exit(0); });

main().catch(console.error);

Docker Compose

version: '3.8'

services:
  worker-us:
    build: .
    shm_size: '2g'
    environment:
      - PROFILE=/opt/profiles/windows-chrome-131.enc
      - PROXY=socks5://user:pass@us-proxy.example.com:1080
    volumes:
      - ./profiles:/opt/profiles:ro
      - session-us:/data/session
    deploy:
      resources:
        limits:
          memory: 4g
          cpus: '2'
    restart: unless-stopped

  worker-eu:
    build: .
    shm_size: '2g'
    environment:
      - PROFILE=/opt/profiles/windows-chrome-132.enc
      - PROXY=socks5://user:pass@eu-proxy.example.com:1080
    volumes:
      - ./profiles:/opt/profiles:ro
      - session-eu:/data/session
    deploy:
      resources:
        limits:
          memory: 4g
          cpus: '2'
    restart: unless-stopped

volumes:
  session-us:
  session-eu:

Рекомендации

  • Всегда указывайте --shm-size=2g.
  • Используйте --disable-setuid-sandbox в контейнерах.
  • Монтируйте профили как read-only.
  • Присваивайте версиям теги, избегайте :latest.
  • Используйте --init или tini для обработки зомби-процессов.

FAQ

Вопросы: ошибки связанные с /dev/shm, поддержка Alpine, удалённый порт отладки.

Итог

Docker — надёжный способ развернуть BotBrowser в production. Убедитесь, что /dev/shm выделена в достаточном объёме и профили смонтированы для сохранения состояния. Доп. материалы в других статьях репозитория.

title: "Руководство по развертыванию BotBrowser в Docker" description: "Развертывайте BotBrowser в Docker-контейнерах для воспроизводимой, изолированной автоматизации браузера в масштабе." date: "2026-01-07" locale: ru category: deployment tags: ["docker", "deployment", "server", "automation", "devops"] published: true

Обзор

Docker обеспечивает воспроизводимые среды, изоляцию процессов и простое масштабирование для развертываний BotBrowser. Каждый контейнер стартует с чистым состоянием и работает независимо.

Dockerfile

FROM ubuntu:22.04

RUN apt-get update && apt-get install -y \
    wget ca-certificates fonts-liberation \
    libasound2 libatk-bridge2.0-0 libatk1.0-0 \
    libcups2 libdbus-1-3 libdrm2 libgbm1 \
    libgtk-3-0 libnspr4 libnss3 \
    libxcomposite1 libxdamage1 libxrandr2 \
    xdg-utils xvfb \
    && rm -rf /var/lib/apt/lists/*

ENV DISPLAY=:10.0

COPY botbrowser/ /opt/botbrowser/
COPY profiles/ /opt/profiles/
RUN chmod +x /opt/botbrowser/chrome

COPY scripts/ /opt/scripts/

CMD Xvfb :10 -screen 0 1920x1080x24 & \
    sleep 1 && \
    node /opt/scripts/main.js

Сборка и запуск

docker build -t botbrowser-worker .
docker run --rm --shm-size=2g botbrowser-worker

Флаг --shm-size=2g важен. Chrome использует /dev/shm для разделяемой памяти, а стандартный размер Docker (64 МБ) недостаточен.

Скрипт автоматизации

// /opt/scripts/main.js
const { chromium } = require('playwright-core');

(async () => {
  const browser = await chromium.launch({
    executablePath: '/opt/botbrowser/chrome',
    args: [
      '--disable-setuid-sandbox',
      '--bot-profile=/opt/profiles/profile.enc',
    ],
    headless: true,
    defaultViewport: null,
  });

  const page = await (await browser.newContext()).newPage();
  await page.goto('https://example.com');
  console.log(await page.title());
  await browser.close();
})();

Масштабирование с Docker Compose

version: '3.8'
services:
  worker-1:
    build: .
    shm_size: '2g'
    environment:
      - PROFILE=/opt/profiles/profile-1.enc
      - PROXY=socks5://proxy1:1080
  worker-2:
    build: .
    shm_size: '2g'
    environment:
      - PROFILE=/opt/profiles/profile-2.enc
      - PROXY=socks5://proxy2:1080

Лучшие практики для продакшена

Лимиты ресурсов. docker run --memory=4g --cpus=2 --shm-size=2g botbrowser-worker

Проверки здоровья. HEALTHCHECK --interval=30s --timeout=10s --retries=3 CMD pgrep chrome || exit 1

Корректное завершение. Обрабатывайте SIGTERM:

process.on('SIGTERM', async () => {
  await browser.close();
  process.exit(0);
});

Устранение неполадок

Сбой "out of memory": увеличьте --shm-size минимум до 2g.

"Cannot open display": убедитесь, что Xvfb запущен и DISPLAY установлен.

"Permission denied": используйте --disable-setuid-sandbox.

Начало работы

  1. Скачайте BotBrowser с GitHub
  2. Соберите Docker-образ с Dockerfile выше
  3. Подключите профили и настройте прокси для каждого контейнера
#docker#deployment#server#automation#devops