Руководство по развертыванию 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 сборки или сократите список пакетов, но учитывайте, что отсутствие библиотек может вызвать ошибки в рантайме.
Общие подходы
Монолитный контейнер
Простой, но ограниченно масштабируемый: всё — 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.
Начало работы
- Скачайте BotBrowser с GitHub
- Соберите Docker-образ с Dockerfile выше
- Подключите профили и настройте прокси для каждого контейнера