Как запустить Selenium на сервере без своего компьютера

Selenium-скрипт обычно начинается на своём ноутбуке: браузер открывается, кликает по страницам, собирает данные. Проблема в том, что как только вы закрываете крышку или уходите из дома, сбор останавливается. Классический выход — арендовать сервер, но тогда придётся ставить Chrome и драйвер, разбираться, почему браузер не стартует без рабочего стола, добавлять шрифты, прописывать автозапуск и следить, чтобы скрипт не умер тихо. Ниже — как запустить браузерную автоматизацию на Dockbox и на что смотреть по ходу.

Почему Selenium по умолчанию тащат на VPS

Привычный сценарий — длинный чек-лист, и почти каждый пункт придётся отлаживать вручную.

Браузер и драйвер нужно ставить самому. Автоматическая сборка ставит язык и библиотеки из requirements.txt, но браузера в ней нет, а версии Chrome и chromedriver должны совпадать — иначе скрипт падает при старте.

Нет экрана — браузер отказывается запускаться. Обычный оконный режим на сервере не работает вовсе, приходится разбираться с headless и флагами контейнера.

Не хватает системных библиотек и шрифтов. Без них Chrome либо падает, либо рендерит страницы так, что селекторы не находят элементы.

Браузер съедает память. Это самый прожорливый процесс на машине, и на слабом сервере он умирает сразу после запуска.

За скриптом нужно присматривать. Он должен подниматься после падения и перезагрузки — значит, systemd, логи и слежение за процессом.

Платформа деплоя снимает эту часть: вы отдаёте папку с кодом и своим Dockerfile, платформа собирает проект из него, запускает и показывает логи в панели.

Проверьте, нужен ли вам вообще браузер

Примерно для половины задач по сбору данных браузер не нужен. Откройте нужную страницу и посмотрите исходный код: если данные уже есть в разметке, хватит обычного запроса через requests или httpx и HTML-парсера. Такой скрапер проще запускать, он работает в разы быстрее и почти не ест ресурсы. Selenium оправдан, когда контент дорисовывается скриптами внутри браузера, когда нужно залогиниться через форму с кликами или когда страница без настоящего браузера возвращает пустоту.

Добавьте Dockerfile, который ставит браузер

Автосборка отвечает только за язык и библиотеки, поэтому Selenium на сервере обычно жалуется, что не находит Chrome. Лечится своим Dockerfile — обычным текстовым файлом в корне проекта, где построчно написано, от какого образа отталкиваться, что поставить и как запускать приложение. Если такой файл лежит рядом с кодом, платформа собирает проект по нему, а не по автоматическому рецепту.

FROM python:3.12-slim
RUN apt-get update && apt-get install -y --no-install-recommends chromium chromium-driver
RUN pip install --no-cache-dir -r requirements.txt
CMD ["python", "main.py"]

Если не хочется ставить браузер вручную, возьмите готовый образ, где Chromium и драйвер уже внутри, — итоговый Dockerfile станет ещё короче.

Запускайте браузер в headless с правильными флагами

На сервере нет экрана, поэтому браузер обязан работать headless — без окна. В Selenium это режим --headless, а внутри контейнера к нему добавляют --no-sandbox и --disable-dev-shm-usage: без них браузер стартует и мгновенно умирает. Полезно задать и --window-size, иначе сайт решит, что перед ним крошечный экран, и отдаст мобильную вёрстку.

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
opts = Options()
opts.add_argument("--headless=new")
opts.add_argument("--no-sandbox")
opts.add_argument("--disable-dev-shm-usage")
opts.add_argument("--window-size=1920,1080")
driver = webdriver.Chrome(options=opts)

И обязательно закрывайте браузер, когда задача закончена: забытые экземпляры съедают память быстрее, чем кажется.

Пароли и токены уберите в переменные окружения

Если скрипт заходит в аккаунт, дергает платный API или отправляет результаты в другой сервис, пароли и токены не должны лежать в коде. Читайте их из переменных окружения — платформа хранит значения зашифрованными, подставляет при запуске и не показывает никому, включая вас. Так секреты не попадают ни в архив, ни в GitHub, а менять их можно из панели без правки кода.

import os
LOGIN = os.environ["SITE_LOGIN"]
PASSWORD = os.environ["SITE_PASSWORD"]

Результаты пишите в постоянную папку /data

Файлы, сохранённые рядом с кодом, пересоздаются при следующей публикации, поэтому таблицы, выгрузки и скриншоты складывайте в папку /data — её содержимое переживает и обновления кода, и перезапуски. В панели есть вкладка с файлами, откуда их можно скачать, загрузить или удалить без всякой настройки. Если данных много и по ним нужны запросы, положите рядом файл SQLite или подключите внешнюю базу: управляемой базы отдельным сервисом здесь нет.

Загрузите проект и посмотрите первый запуск в логах

Проект попадает на платформу архивом или импортом репозитория GitHub, включая приватный. Платформа подхватывает ваш Dockerfile, собирает проект и запускает скрипт; логи и статус сборки видны в панели в реальном времени, поэтому первая же ошибка браузера проявляется сразу, а не через сутки.

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

Chrome — самый прожорливый процесс в контейнере. Один экземпляр браузера с открытой страницей занимает несколько сотен мегабайт, а два параллельных браузера вместе с Python легко перевалят за гигабайт. Считайте тариф по числу одновременных окон, а не по количеству скриптов.

Starter — 990 ₽/мес, первый месяц бесплатно. 1 vCPU, 2 GB RAM, 20 GB SSD, один проект. Для одного браузера, который закрывается после каждой задачи, этого хватает.

Pro — 2 490 ₽/мес. 2 vCPU, 4 GB RAM, до пяти проектов — вариант, если браузеров несколько или они работают параллельно.

Team — 4 990 ₽/мес — запас ресурсов и SLA для команд.

Главное отличие от VPS: контейнеры работают постоянно, без «засыпания» и без ограничения по времени, а упавший контейнер платформа перезапускает сама. Лимита по времени работы у тарифа нет, и отдельного счёта за сборки и трафик тоже.

Частые вопросы

Почему Selenium пишет, что не нашёл Chrome или chromedriver?

Браузера в контейнере действительно нет: автоматическая сборка ставит язык и библиотеки, но не Chrome. Добавьте в корень проекта Dockerfile, который ставит Chromium вместе с драйвером, и опубликуйте заново — платформа соберёт проект по вашему файлу. Заодно проверьте, что версии браузера и драйвера совпадают.

Обязательно ли запускать браузер в headless-режиме?

Да. Экрана на сервере нет, поэтому оконный режим просто не стартует. Добавьте флаг --headless, а рядом --no-sandbox и --disable-dev-shm-usage: в контейнере без них браузер часто падает сразу после запуска.

Хватит ли 2 ГБ памяти, чтобы гонять браузер?

Для одного экземпляра, который закрывается после задачи, — да, с запасом. Если открываете несколько окон параллельно или оставляете браузер висеть сутками, памяти начнёт не хватать, и это выглядит как падение сразу после старта. Здесь помогает Pro с 4 ГБ.

Можно ли использовать Playwright вместо Selenium?

Можно, правило то же: Playwright тоже требует браузер, которого в автоматической сборке нет. Возьмите официальный образ Playwright с уже установленными браузерами или добавьте команду установки браузера в свой Dockerfile — дальше проект публикуется как обычно.

Где хранить собранные данные и скриншоты?

В постоянной папке /data: всё, что туда записано, переживает обновления кода и перезапуски. Забрать файлы можно из панели, по одному или папкой. Файлы рядом с кодом при следующей публикации пересоздаются с нуля.