Развертывание

Настройка headless-браузера на Ubuntu: полное руководство для сервера

Как настроить автоматизацию headless-браузера на Ubuntu с Xvfb, системными зависимостями, systemd-сервисами и конфигурацией для продакшена.

Документация

Нужна поддерживаемая продуктовая документация?

У этой статьи есть соответствующая страница в центре документации. Используйте docs для каноничного сценария настройки, актуальных флагов и долгосрочной справки.

Введение

Запуск BotBrowser на headless-сервере Ubuntu - основа большинства продакшен-развёртываний. Серверы не имеют физических дисплеев, драйверы GPU отличаются от десктопных систем, а Chrome имеет специфические зависимости от библиотек, которые не установлены по умолчанию на минимальных серверных образах. Правильная настройка этих деталей - разница между стабильной продакшен-средой и периодическими сбоями, которые сложно диагностировать.

Это руководство охватывает всё: от установки системных зависимостей до настройки Xvfb (X Virtual Frame Buffer), создания systemd-сервисов для постоянной работы и запуска BotBrowser с Playwright или Puppeteer в headless-режиме. К концу у вас будет надёжный сервер Ubuntu, работающий с экземплярами BotBrowser в автоматическом режиме.

Зачем нужна настройка headless-сервера

Десктопные среды автоматически управляют дисплеем, инициализацией GPU и рендерингом шрифтов. Серверные среды лишены всего этого. Минимальная установка Ubuntu Server не содержит разделяемых библиотек, необходимых Chrome для рендеринга, X11-сервера дисплея, который ожидает даже headless Chrome, и пакетов шрифтов, влияющих на рендеринг текста.

Без правильной настройки вы столкнётесь с ошибками от очевидных («cannot open display») до незаметных (segfault при WebGL-рендеринге, пустой вывод Canvas или отсутствующие семейства шрифтов при проверке отпечатков). Каждая из этих проблем может незаметно ухудшить вашу защиту отпечатков без явного сообщения об ошибке.

Переменная окружения DISPLAY особенно важна. Даже при запуске Chrome в headless-режиме Chrome всё равно инициализирует некоторые подсистемы, связанные с дисплеем. На Ubuntu необходимо установить DISPLAY=:10.0 и запустить Xvfb на этом дисплее. Пропуск этого шага ведёт к сбоям или ухудшению рендеринга, влияющему на согласованность отпечатков.

Техническая база

Xvfb (X Virtual Frame Buffer)

Xvfb предоставляет виртуальный сервер дисплея, реализующий протокол X11 без необходимости физического оборудования дисплея. Chrome подключается к Xvfb как к реальному дисплею, корректно завершая инициализацию рендеринга.

Ключевые параметры настройки:

  • Номер дисплея (:10): произвольный идентификатор. Использование :10 позволяет избежать конфликтов с :0, который может использоваться десктопными установками.
  • Спецификация экрана (1920x1080x24): ширина, высота и глубина цвета. 24-битная глубина цвета необходима для точного рендеринга. Меньшая глубина вызывает полосатость цветов на скриншотах и некорректный вывод Canvas.
  • Переменная окружения DISPLAY (DISPLAY=:10.0): должна быть установлена для каждого процесса, запускающего Chrome, включая скрипты Node.js и shell-скрипты.

Системные зависимости Chrome

Chrome зависит от десятков разделяемых библиотек для рендеринга, аудио, сети и доступности. На десктопной установке Ubuntu большинство из них присутствуют. На серверной установке их необходимо устанавливать явно.

Критические категории:

  • Графика: libdrm2, libgbm1, libxcomposite1, libxdamage1, libxrandr2 для композитинга дисплея
  • Инструментарий UI: libgtk-3-0, libatk-bridge2.0-0, libatk1.0-0 для доступности и рендеринга виджетов
  • Безопасность: libnss3, libnspr4 для TLS и обработки сертификатов
  • Аудио: libasound2 для инициализации аудиоподсистемы (даже без воспроизведения аудио)
  • Шрифты: fonts-liberation для базовой доступности шрифтов
  • Интеграция с рабочим столом: xdg-utils для обработки MIME-типов

<svg viewBox="0 0 700 300" xmlns="http://www.w3.org/2000/svg" style={{maxWidth: '100%', height: 'auto'}}> Headless Server Architecture BotBrowser Chrome + Profile Headless Mode Xvfb :10 Virtual Display 1920x1080x24 System Libs GTK, NSS, GBM Fonts, Audio Ubuntu 22.04 LTS (Headless) DISPLAY=:10.0 set in environment

Распространённые подходы и ограничения

Запуск без Xvfb

Некоторые руководства предлагают запускать Chrome headless без Xvfb. Хотя флаг --headless Chrome не требует строго X-дисплея для базовой загрузки страниц, определённые операции рендеринга, пути инициализации GPU и процедуры перечисления шрифтов ведут себя по-разному без сервера дисплея. Результат - несогласованный рендеринг, влияющий на стабильность отпечатков.

Профили BotBrowser определяют конкретные свойства дисплея. Без Xvfb браузер может переключиться на пути программного рендеринга, которые дают иной вывод Canvas и WebGL, чем указано в профиле. Всегда запускайте Xvfb.

Отсутствующие пакеты шрифтов

Ubuntu Server поставляется с минимальной поддержкой шрифтов. Chrome может рендерить текст без дополнительных шрифтов, но список доступных шрифтов и метрики рендеринга не будут соответствовать тому, что имел бы реальный десктопный пользователь. Это создаёт несоответствие отпечатков. Кроссплатформенный движок шрифтов BotBrowser смягчает это, встраивая шрифты из профиля, но наличие системных шрифтов в качестве запасного варианта улучшает согласованность рендеринга.

Некорректная глубина дисплея

Использование Xvfb :10 -screen 0 1920x1080x16 (16-битный цвет) вместо 24-битного вызывает проблемы с глубиной цвета. Canvas-рендеринг использует меньше цветовых каналов, создавая другие пиксельные данные и другие хеши отпечатков. Всегда используйте 24-битную глубину.

Запуск от root без флагов sandbox

Sandbox Chrome требует определённых возможностей ядра. В Docker-контейнерах или при запуске от root sandbox тихо завершается с ошибкой или вызывает сбой. Используйте --disable-setuid-sandbox в таких окружениях.

Подход BotBrowser

BotBrowser разработан для headless-серверных развёртываний. Его кроссплатформенная система профилей гарантирует, что профиль Windows, загруженный на Linux-сервере, создаёт тот же отпечаток, что и на реальной машине Windows. Встроенный движок шрифтов рендерит текст, используя данные шрифтов профиля, независимо от шрифтов, установленных на сервере. Значения отпечатка GPU берутся из профиля, а не из фактического GPU сервера.

Это означает, что оборудование сервера не просачивается в отпечаток. VPS за $5 и выделенный сервер за $500 дают идентичный вывод при использовании одного профиля.

Однако сервер всё равно должен предоставлять инфраструктуру рендеринга, которую ожидает Chrome. BotBrowser не может корректно инициализироваться без перечисленных выше системных библиотек и работающего сервера дисплея.

Настройка и использование

Шаг 1: Установка системных зависимостей

sudo apt-get update && sudo 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

Для Ubuntu 24.04 некоторые имена пакетов изменились. При возникновении ошибок выполните:

sudo apt-get install -y \
  libasound2t64 libatk-bridge2.0-0 libatk1.0-0 \
  libcups2t64 libgbm1 libgtk-3-0t64 \
  libnss3 libxcomposite1 libxdamage1 \
  libxrandr2 xvfb fonts-liberation xdg-utils

Шаг 2: Запуск Xvfb

Для быстрого тестирования:

Xvfb :10 -screen 0 1920x1080x24 &
export DISPLAY=:10.0

Для продакшена создайте systemd-сервис:

# /etc/systemd/system/xvfb.service
[Unit]
Description=X Virtual Frame Buffer
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/Xvfb :10 -screen 0 1920x1080x24
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Включите и запустите сервис:

sudo systemctl daemon-reload
sudo systemctl enable xvfb
sudo systemctl start xvfb

Шаг 3: Установка BotBrowser

# Скачайте последний релиз
wget -O botbrowser.tar.gz \
  https://github.com/botswin/BotBrowser/releases/latest/

# Распакуйте в /opt
sudo mkdir -p /opt/botbrowser
sudo tar -xzf botbrowser.tar.gz -C /opt/botbrowser/
sudo chmod +x /opt/botbrowser/chrome

# Проверьте установку
DISPLAY=:10.0 /opt/botbrowser/chrome --version

Шаг 4: Загрузка профилей

sudo mkdir -p /opt/profiles
git clone https://github.com/botswin/BotBrowser.git /opt/profiles

Шаг 5: Тестовый запуск

DISPLAY=:10.0 /opt/botbrowser/chrome \
  --bot-profile="/opt/profiles/windows-chrome-131.enc" \
  --headless \
  --remote-debugging-port=9222 &

Проверьте, что браузер работает:

curl -s http://localhost:9222/json/version | python3 -m json.tool

Шаг 6: Интеграция с Playwright

npm install playwright-core
const { chromium } = require('playwright-core');

(async () => {
  const browser = await chromium.launch({
    executablePath: '/opt/botbrowser/chrome',
    args: [
      '--disable-setuid-sandbox',
      '--bot-profile=/opt/profiles/windows-chrome-131.enc',
      '--proxy-server=socks5://user:pass@proxy.example.com:1080',
    ],
    headless: true,
  });

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

Запустите с переменной дисплея:

DISPLAY=:10.0 node script.js

Шаг 7: Systemd-сервис для автоматизации

Для постоянных воркеров автоматизации:

# /etc/systemd/system/botbrowser-worker.service
[Unit]
Description=BotBrowser Automation Worker
After=xvfb.service
Requires=xvfb.service

[Service]
Type=simple
Environment=DISPLAY=:10.0
WorkingDirectory=/opt/scripts
ExecStart=/usr/bin/node /opt/scripts/worker.js
Restart=always
RestartSec=10
User=botbrowser
Group=botbrowser

[Install]
WantedBy=multi-user.target

Несколько экземпляров

Каждому параллельному экземпляру нужен свой --user-data-dir:

for i in $(seq 1 5); do
  DISPLAY=:10.0 /opt/botbrowser/chrome \
    --bot-profile="/opt/profiles/profile-${i}.enc" \
    --user-data-dir="/tmp/bb-session-${i}" \
    --remote-debugging-port=$((9222 + i)) \
    --headless &
done

Управление процессами с PM2

npm install -g pm2

DISPLAY=:10.0 pm2 start worker.js --name "bb-worker-1" \
  -- --profile="/opt/profiles/profile-1.enc"

DISPLAY=:10.0 pm2 start worker.js --name "bb-worker-2" \
  -- --profile="/opt/profiles/profile-2.enc"

pm2 save
pm2 startup  # Генерация автозапуска через systemd

Проверка

После завершения настройки проверьте, что всё работает:

# Проверьте, что Xvfb запущен
systemctl status xvfb

# Проверьте доступность дисплея
DISPLAY=:10.0 xdpyinfo | head -5

# Проверьте, что зависимости Chrome удовлетворены
ldd /opt/botbrowser/chrome | grep "not found"

# Запустите и проверьте отпечаток
DISPLAY=:10.0 node -e "
const { chromium } = require('playwright-core');
(async () => {
  const b = await chromium.launch({
    executablePath: '/opt/botbrowser/chrome',
    args: ['--bot-profile=/opt/profiles/profile.enc'],
    headless: true,
  });
  const p = await (await b.newContext()).newPage();
  const ua = await p.evaluate(() => navigator.userAgent);
  console.log('User-Agent:', ua);
  const wd = await p.evaluate(() => navigator.webdriver);
  console.log('webdriver:', wd);
  await b.close();
})();
"

Значение webdriver должно быть false, а User-Agent должен соответствовать загруженному профилю.

Лучшие практики

Всегда устанавливайте DISPLAY=:10.0. Добавьте это в /etc/environment или файлы сервисов, чтобы никогда не забывать. Даже headless Chrome нуждается в этом на Linux.

Используйте 24-битную глубину цвета для Xvfb. Меньшая глубина создаёт некорректный вывод рендеринга.

Мониторьте использование диска. Chrome записывает дампы сбоев и данные кеша в --user-data-dir. Настройте ротацию логов или периодическую очистку для предотвращения исчерпания диска.

Поддерживайте зависимости актуальными. Периодически запускайте apt-get upgrade. Несоответствие версий библиотек может вызвать незаметные проблемы рендеринга.

Установите ограничения ресурсов. Используйте MemoryLimit и CPUQuota systemd для предотвращения потребления всех ресурсов сервера вышедшими из-под контроля экземплярами.

Часто задаваемые вопросы

Работает ли BotBrowser на Ubuntu 24.04?

Да. Некоторые имена пакетов изменились (например, libasound2 стал libasound2t64). Альтернативная команда установки в шаге 1 учитывает эти изменения.

Можно ли использовать более высокое разрешение Xvfb?

Да. Вы можете установить Xvfb :10 -screen 0 2560x1440x24 или любое необходимое разрешение. Сопоставьте его с разрешением экрана профиля для лучших результатов.

Нужен ли GPU на сервере?

Нет. BotBrowser использует значения GPU профиля для отчётности об отпечатках. Фактический GPU сервера (или его отсутствие) не влияет на вывод отпечатков.

Почему бы просто не использовать --headless=new без Xvfb?

Новый headless-режим Chrome всё равно инициализирует подсистемы дисплея. Без Xvfb некоторые пути рендеринга переключаются на чисто программный режим, который может давать отличный вывод Canvas и WebGL. Для согласованных результатов отпечатков всегда запускайте Xvfb.

Сколько экземпляров можно запустить на одном сервере?

Зависит от ресурсов сервера. Каждый экземпляр Chrome использует 200-500 МБ RAM. Сервер с 16 ГБ RAM может комфортно запускать 20-30 экземпляров с запасом для ОС и вспомогательных сервисов. Мониторьте использование памяти и снижайте параллелизм при обнаружении использования swap.

Как проверить отсутствующие библиотеки?

Выполните ldd /opt/botbrowser/chrome | grep "not found". Все библиотеки, указанные как «not found», необходимо установить. Используйте apt-file search libname.so для нахождения пакета, предоставляющего конкретную библиотеку.

Можно ли запустить BotBrowser на Ubuntu-серверах с архитектурой ARM?

BotBrowser предоставляет сборки Linux для x86_64. Поддержка ARM зависит от конкретного релиза. Проверьте страницу релизов GitHub на предмет доступных архитектур.

Как обновить BotBrowser?

Скачайте последний релиз и распакуйте поверх существующей установки. Изменения конфигурации не требуются. Одновременно обновите профили из репозитория BotBrowser Profiles, чтобы они соответствовали новой версии браузера.

Итоги

Настройка BotBrowser на headless-сервере Ubuntu требует установки системных зависимостей, конфигурации Xvfb и корректного управления переменными окружения. После настройки сервер обеспечивает стабильную основу для запуска любого количества экземпляров BotBrowser с согласованной защитой отпечатков.

Для контейнерных развёртываний смотрите Руководство по развёртыванию в Docker. Для оптимизации производительности при масштабировании смотрите Оптимизация производительности BotBrowser в продакшене. Для комбинаций CLI-флагов смотрите Рецепты CLI.

#headless#Ubuntu#Server#развертывание#Linux

Переведите BotBrowser из исследований в продакшн

Используйте эти руководства, чтобы понять модель, а затем перейти к кроссплатформенной валидации, изолированным контекстам и масштабируемому браузерному развертыванию.