Разверните MoreLogin на автономном сервере Ubuntu и автоматизируйте профили браузера с помощью Local API — среда рабочего стола не требуется.
К концу этого руководства вы будете иметь:
- Работающий экземпляр MoreLogin на автономном сервере Ubuntu 24.04.
- Сетевая переадресация настроена так, чтобы внешние машины могли подключаться через CDP (протокол Chrome DevTools).
- Рабочий скрипт автоматизации Python, который создает, запускает, контролирует и очищает профили браузера.
┌──────────────────────────────────────────────────────────┐
│ Ubuntu 24.04 Server │
│ │
│ ┌──────────────┐ ┌───────────────────────────────┐ │
│ │ xvfb │───▶│ MoreLogin AppImage │ │
│ │ (virtual │ │ Local API :40000 │ │
│ │ display) │ │ CDP debug :<dynamic> │ │
│ │ │ │ (127.0.0.1, per profile) │ │
│ └──────────────┘ └───────────────────────────────┘ │
│ │ │
│ socat forwarding │
│ │ │
│ 0.0.0.0:40001 → 127.0.0.1:40000 │
│ 0.0.0.0:<N+1> → 127.0.0.1:<N> │
└──────────────────────────────────────────────────────────┘
│
External machine
(Playwright / Puppeteer / Selenium)[!NOTE] Порт отладки CDP является динамическим — каждый профиль браузера получает свой собственный порт, возвращаемый конечной точкой
/api/env/start. На диаграмме выше в качестве заполнителя используется<N>.
| Требование | Подробности |
|---|---|
| Операционная система | Сервер Ubuntu 24.04 (x86_64) |
| Рекомендуемые характеристики | 8 виртуальных ЦП, 8 ГБ ОЗУ (поддерживает ~5 одновременных профилей) |
| Сеть | Исходящий доступ в Интернет; откройте входящий порт 40001 и выбранные вами перенаправленные порты CDP или вместо этого используйте SSH-туннели. |
| Python (необязательно) | Python 3.8+ с pip для запуска примера скрипта |
Подключитесь к вашему серверу через SSH и установите необходимые пакеты:
# FUSE support (required for AppImage)
sudo apt install -y libfuse2t64
# GTK / accessibility / display libraries
sudo apt install -y libatk1.0-0 libatk-bridge2.0-0 libatspi2.0-0
sudo apt install -y libcups2
sudo apt install -y libgtk-3-0 libgdk-pixbuf2.0-0
sudo apt install -y libgbm1 libxkbcommon0 libasound2t64
# Virtual framebuffer (headless display)
sudo apt install -y xvfb
# TCP forwarder
sudo apt install -y socatЕсли страницы браузера отображаются без текста или содержат пропущенные символы, установите соответствующие пакеты шрифтов:
# CJK (Chinese, Japanese, Korean)
sudo apt install -y fonts-noto-cjk fonts-noto-cjk-extra
# Arabic
sudo apt install -y fonts-noto-color-emoji fonts-noto-extraДля других языков установите соответствующий пакет семейство шрифтов Noto.
wget https://get.morelogin.com/client/prod/linux/x64/2.54.0/MoreLogin_x86_64_2.54.0.AppImage
chmod +x MoreLogin_x86_64_2.54.0.AppImageЗамените
2.54.0последней версией, доступной в вашей учетной записи MoreLogin или на странице загрузки.
Используйте xvfb-run, чтобы предоставить виртуальный дисплей, затем запустите AppImage:
nohup xvfb-run -a ./MoreLogin_x86_64_2.54.0.AppImage --no-sandbox > morelogin.log 2>&1 &Убедитесь, что все началось успешно:
# Check the process is running
ps aux | grep MoreLoginДля полной инициализации процесс может занять 5–10 секунд.
[!CAUTION] Вы должны войти в систему перед вызовом любой другой конечной точки локального API. На автономном сервере нет графического интерфейса для входа в систему вручную, поэтому вам необходимо пройти аутентификацию через API. Без этого шага все вызовы API вернут результат:
{"статус": "ошибка", "код": 401, "сообщение": "Срок действия вашего статуса входа истек, пожалуйста, войдите снова"}
Откройте настольный клиент MoreLogin (на любом компьютере, где вы вошли в систему) и перейдите в Настройки → API и MCP. Скопируйте APP ID и API Key из раздела Open API:

Вызовите конечную точку входа, используя свои учетные данные:
curl -X POST http://127.0.0.1:40000/api/user/login \
-H "Content-Type: application/json" \
-d '{
"apiId": "YOUR_APP_ID",
"apiKey": "YOUR_API_KEY"
}'Успешный ответ выглядит так:
{"code": 0, "msg": null, "data": true}Подтвердите готовность API, перечислив профили браузера:
curl -s -X POST http://127.0.0.1:40000/api/env/page \
-H "Content-Type: application/json" \
-d '{"pageNo": 1, "pageSize": 1}'Ответ
{"code":0, ...}означает, что вы вошли в систему и API готов.
Проверка: Ваш сервер MoreLogin полностью работоспособен. Перейдите к [Шагу 4] (#step-4--configure-network-forwarding-socat) для удаленного доступа или сразу перейдите к [Шагу 5] (#step-5--quick-automation-example), если сценарии выполняются на том же сервере.
[!NOTE] Сеанс входа в систему сохраняется до тех пор, пока работает процесс MoreLogin. Если вы перезапустите AppImage, вам нужно будет снова войти в систему.
По умолчанию порты отладки Local API (:40000) и CDP привязаны к 127.0.0.1. Если вам нужен доступ к ним с внешнего компьютера (например, вашего ноутбука для разработки), используйте socat для пересылки трафика.
[!WARNING] Угроза безопасности — не предоставляйте доступ к этим портам общедоступному Интернету. – Локальный API не имеет встроенной аутентификации для большинства конечных точек.
- Порт отладки CDP обеспечивает полное удаленное управление экземпляром браузера (чтение файлов cookie, внедрение сценариев, создание снимков экрана).
Рекомендации: – Для удаленного доступа используйте SSH-туннель вместо socat:
ssh -L 40000:127.0.0.1:40000 user@server. – Если вам необходимо использовать socat, ограничьте доступ с помощью правил брандмауэра только определенными IP-адресами.
- Используйте VPN или группы безопасности облачного провайдера, чтобы ограничить входящий трафик.
- Никогда не открывайте порты
40001/порты CDP на0.0.0.0на общедоступном сервере без ограничений по IP.
nohup socat TCP-LISTEN:40001,fork,reuseaddr,bind=0.0.0.0 TCP:127.0.0.1:40000 &Внешние машины теперь могут обращаться к API по адресу
http://<server-ip>:40001.
Когда вы запускаете профиль браузера через API, ответ включает динамический debugPort (например, 9222). Каждый профиль может получить другой порт. Перешлите его, чтобы внешние инструменты автоматизации (Playwright, Puppeteer, Selenium) могли подключиться:
# Example: if debugPort=9222, forward to external port 9223 (debugPort + 1)
# Adjust both ports to match the actual debugPort returned by /api/env/start
nohup socat TCP-LISTEN:9223,fork,reuseaddr,bind=0.0.0.0 TCP:127.0.0.1:9222 &[!WARNING] При одновременном запуске нескольких профилей убедитесь, что перенаправленные порты не конфликтуют с портами отладки других профилей. Например, если профиль A получает
debugPort=9222и вы пересылаете его на9223, а профиль B получаетdebugPort=9223, произойдет конфликт портов. Рассмотрите возможность использования большего смещения или выделенного диапазона портов.
[!TIP] В рабочей среде создавайте переадресацию socat динамически после каждого вызова
/api/env/start, используя возвращенныйdebugPort. См. рабочую реализацию в примере Python.
Если сценарии автоматизации выполняются на том же сервере, вы можете пропустить socat и подключиться напрямую к
127.0.0.1.
Если вы используете socat, ограничьте доступ только доверенным IP-адресам:
# Allow only a specific IP (recommended)
sudo ufw allow from <YOUR_IP> to any port 40001 proto tcp
sudo ufw allow from <YOUR_IP> to any port 9223 proto tcp
# Or allow from any IP (NOT recommended for production)
# sudo ufw allow 40001/tcp
# sudo ufw allow 9223/tcpДля наиболее безопасного удаленного доступа используйте SSH-туннель — никаких изменений в брандмауэре или socat не требуется.
Поскольку порт CDP является динамическим (назначается при запуске профиля), рабочий процесс выглядит следующим образом:
Сначала туннелируйте порт API:
# Run this on your local machine ssh -L 40000:127.0.0.1:40000 user@<server-ip>Запустите профиль через туннелированный API (
http://127.0.0.1:40000/api/env/start) и прочитайте возвращенныйdebugPort.Откройте второй туннель для порта CDP:
# Replace <debugPort> with the actual port returned by the API ssh -L <debugPort>:127.0.0.1:<debugPort> user@<server-ip>Подключитесь к
http://127.0.0.1:<debugPort>из локальных сценариев драматурга/кукловода, как если бы сервер был локальным.
[!TIP] Вы можете объединить оба туннеля в одной команде, если заранее знаете диапазон портов, например:
ssh -L 40000:127.0.0.1:40000 -L 9222:127.0.0.1:9222 -L 9223:127.0.0.1:9223 user@<IP-сервера>Но на практике проще сначала запустить туннель API, а затем при необходимости добавлять туннели для каждого профиля.
Ниже приведен минимальный пример Python, показывающий полный жизненный цикл профиля браузера. Полный готовый к использованию сценарий с параллелизмом и обработкой ошибок см. в полный пример на GitHub.
pip install requests playwrightPlaywright используется здесь только для своего клиента CDP (
connect_over_cdp). Вам не нужно запускатьplaywright install— MoreLogin предоставляет собственный браузер.
На Linux Server браузерный движок должен запускаться с флагом --no-sandbox. Этот параметр передаётся через поле startupParams при создании или обновлении профиля браузера.
[!CAUTION] Без
--no-sandboxбраузер не сможет запуститься в большинстве серверных сред Linux (особенно при работе подrootили без полноценного десктопного сеанса).
Используйте /api/env/create/advanced для создания профиля с startupParams (эндпоинт /api/env/create/quick не поддерживает это поле):
curl -X POST http://127.0.0.1:40000/api/env/create/advanced \
-H "Content-Type: application/json" \
-d '{
"browserTypeId": 1,
"operatorSystemId": 5,
"startupParams": ["--no-sandbox"]
}'[!TIP] Если вы использовали
/api/env/create/quickдля создания профиля, вызовите/api/env/updateдля добавления--no-sandboxперед запуском — см. ниже.
Если у вас уже есть профили браузера, созданные без --no-sandbox, обновите их перед запуском:
curl -X POST http://127.0.0.1:40000/api/env/update \
-H "Content-Type: application/json" \
-d '{
"envId": "YOUR_ENV_ID",
"startupParams": ["--no-sandbox"]
}'[!NOTE] Поле
startupParamsпринимает массив строк. Вы также можете добавить другие флаги Chrome (например,["--no-sandbox", "--disable-gpu"]). Флаг--no-sandboxнеобходим только на Linux — профили Windows и macOS не нуждаются в нём.
В этом примере предполагается, что сценарий выполняется на том же сервере, что и MoreLogin. Для удаленных сценариев см. примечания после кода.
import requests
from playwright.sync_api import sync_playwright
# ── Configuration ──────────────────────────────────────────
# Local: script runs on the SAME server as MoreLogin
# Remote: script runs on a DIFFERENT machine — see notes below
API_BASE = "http://127.0.0.1:40000"
# ① Create a browser profile
resp = requests.post(f"{API_BASE}/api/env/create/quick", json={
"browserTypeId": 1,
"operatorSystemId": 5,
"quantity": 1
})
resp_data = resp.json()
assert resp_data["code"] == 0, f"Create failed: {resp_data}"
env_id = resp_data["data"]["envIds"][0]
print(f"✅ Created profile: {env_id}")
# ①-b Add --no-sandbox (required on Linux Server)
resp = requests.post(f"{API_BASE}/api/env/update", json={
"envId": env_id,
"startupParams": ["--no-sandbox"]
})
resp_data = resp.json()
assert resp_data["code"] == 0, f"Update failed: {resp_data}"
print(f"✅ Set --no-sandbox for profile: {env_id}")
# ② Start the profile (headless)
resp = requests.post(f"{API_BASE}/api/env/start", json={
"envId": env_id
})
resp_data = resp.json()
assert resp_data["code"] == 0, f"Start failed: {resp_data}"
debug_port = resp_data["data"]["debugPort"] # Dynamic — different for each profile
print(f"✅ Started — debug port: {debug_port}")
# ③ Build the CDP URL
cdp_url = f"http://127.0.0.1:{debug_port}"
# ④ Connect via CDP and automate
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp(cdp_url)
page = browser.contexts[0].pages[0]
page.goto("https://www.google.com")
page.screenshot(path=f"screenshot_{env_id}.png")
print(f"✅ Screenshot saved")
# Use disconnect() — not close() — to detach without killing the browser.
# The profile will be stopped cleanly via the API in step ⑤.
browser.disconnect()
# ⑤ Stop the profile
requests.post(f"{API_BASE}/api/env/close", json={"envId": env_id})
print(f"✅ Profile stopped")
# ⑥ Delete the profile
requests.post(f"{API_BASE}/api/env/remove", json={"envIds": [env_id]})
print(f"✅ Profile deleted")[!NOTE] Запуск с удаленного компьютера? Два подхода:
Вариант А — SSH-туннель (рекомендуется): Настройте SSH-туннели от вашего локального компьютера к серверу (см. § 4.4), затем сохраните
API_BASE = "http://127.0.0.1:40000"иcdp_url = f"http://127.0.0.1:{debug_port}"— SSH делает удаленные порты локальными.Вариант Б — socat на сервере: На сервере запустите пересылку socat для порта API и для каждого порта CDP:
# Запускайте их на СЕРВЕРЕ, а не на локальном компьютере. socat TCP-LISTEN:40001,fork,reuseaddr,bind=0.0.0.0 TCP:127.0.0.1:40000 & socat TCP-LISTEN:$((debug_port+1)),fork,reuseaddr,bind=0.0.0.0 TCP:127.0.0.1:$debug_port &Затем в своем скрипте установите
API_BASE = "http://<server-ip>:40001"иcdp_url = f"http://<server-ip>:{debug_port + 1}". ⚠️ Ограничьте доступ с помощью правил брандмауэра — см. § 4.3.
[!IMPORTANT] Структура
resp.json()["data"]["envIds"]соответствует текущему формату ответа/api/env/create/quick. Если вы столкнулись с другой формой (например,data: ["id1", ...]), проверьте Справочник по API для вашей версии — форматы ответов могут различаться в зависимости от версии.
Следующие результаты были получены на виртуальной машине сервера Ubuntu 24.04 (8 виртуальных ЦП, 8 ГБ ОЗУ) с использованием [скрипта полного стресс-теста] (https://github.com/MoreLoginBrowser/MoreLogin-API-Demos/blob/main/MoreLogin-Python/linux_server_test.py):
| Метрика | Значение |
|---|---|
| Всего пробегов | 100 |
| Параллелизм | 4 (одновременно) |
| Успех | 100,0% |
| Общее время | 604,06 с |
| Среднее время на задачу | 6,04 с |
| Пропускная способность | 0,17 задач/с |
Эти цифры служат базой. Фактическая производительность зависит от характеристик сервера, условий сети и сложности страницы.
Для производственных серверов запустите MoreLogin как системную службу, чтобы обеспечить автоматический запуск при загрузке, перезапуск при сбое и централизованное ведение журнала.
sudo tee /etc/systemd/system/morelogin.service > /dev/null <<'EOF'
[Unit]
Description=MoreLogin Browser (headless)
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/morelogin
ExecStart=/usr/bin/xvfb-run -a /opt/morelogin/MoreLogin_x86_64_2.54.0.AppImage --no-sandbox
Restart=on-failure
RestartSec=10
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
EOFНастройте пути
WorkingDirectoryиExecStartтак, чтобы они соответствовали тому месту, где вы разместили AppImage.
[!TIP] Для рабочей среды рассмотрите возможность создания выделенного пользователя (например,
morelogin) вместоrootи соответствующим образом настройте владельца файла и разрешения. Если AppImage в настоящее время требуются права root, вы можете сохранитьUser=root, но лучше всего изолировать процесс под учетной записью без полномочий root.
sudo systemctl daemon-reload
sudo systemctl enable morelogin # Auto-start on boot
sudo systemctl start morelogin # Start nowsudo systemctl status morelogin # Check status
sudo journalctl -u morelogin -f # Stream logs
sudo systemctl restart morelogin # Restart
sudo systemctl stop morelogin # Stop[!NOTE] После перезапуска необходимо снова вызвать конечную точку входа — сеанс API не сохраняется при перезапуске процесса. Для автоматического восстановления рассмотрите возможность добавления сценария
ExecStartPostили задания cron проверки работоспособности, которое вызывает конечную точку входа после запуска службы.
AppImages require FUSE to run.Исправление: Установите поддержку FUSE:
sudo apt install -y libfuse2t64Исправление: установите пакет шрифтов для целевого языка (см. Шаг 1. Установка шрифтов).
Причина: Порты отладки CDP по умолчанию привязаны к 127.0.0.1.
Исправление. Настройте переадресацию socat (см. Шаг 4) и убедитесь, что правила брандмауэра разрешают пересылаемый порт.
Причина: Запуск MoreLogin еще не завершился, или процесс завершился сбоем.
Исправлено:
- Подождите 5–10 секунд после запуска.
- Проверьте
morelogin.logна наличие ошибок - Убедитесь, что процесс запущен:
ps aux | grep MoreLogin.
{"status": "error", "code": 401, "message": "Your login status has expired, please log in again"}Причина: Вы не вошли в систему через API, или процесс MoreLogin был перезапущен.
Исправление: Вызовите конечную точку входа перед любым другим вызовом API (см. Шаг 3).
| Цель | Ссылка |
|---|---|
| Полная справка по API браузера | API браузера |
| Настройка аутентификации | Руководство по аутентификации |
| Примеры драматурга/Селена/Кукловода | Примеры автоматизации |
| Полный сценарий стресс-теста Linux | GitHub — linux_server_test.py |
| Быстрый старт через CLI | Руководство по CLI |