{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-@l10n/ru/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Развертывание Linux-сервера","llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"развертывание-linux-сервера","__idx":0},"children":["Развертывание Linux-сервера"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Разверните MoreLogin на автономном сервере Ubuntu и автоматизируйте профили браузера с помощью Local API — среда рабочего стола не требуется."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"чего-вы-достигнете","__idx":1},"children":["Чего вы достигнете"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["К концу этого руководства вы будете иметь:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Работающий экземпляр MoreLogin на автономном сервере Ubuntu 24.04."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Сетевая переадресация настроена так, чтобы внешние машины могли подключаться через CDP (протокол Chrome DevTools)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Рабочий скрипт автоматизации Python, который создает, запускает, контролирует и очищает профили браузера."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"обзор-архитектуры","__idx":2},"children":["Обзор архитектуры"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"┌──────────────────────────────────────────────────────────┐\n│                    Ubuntu 24.04 Server                   │\n│                                                          │\n│  ┌──────────────┐    ┌───────────────────────────────┐   │\n│  │   xvfb       │───▶│  MoreLogin AppImage           │   │\n│  │ (virtual     │    │  Local API :40000             │   │\n│  │  display)    │    │  CDP debug :<dynamic>         │   │\n│  │              │    │    (127.0.0.1, per profile)   │   │\n│  └──────────────┘    └───────────────────────────────┘   │\n│                              │                           │\n│                        socat forwarding                  │\n│                              │                           │\n│                     0.0.0.0:40001 → 127.0.0.1:40000      │\n│                     0.0.0.0:<N+1> → 127.0.0.1:<N>        │\n└──────────────────────────────────────────────────────────┘\n                               │\n                          External machine\n                     (Playwright / Puppeteer / Selenium)\n"},"children":[]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["[!NOTE]"," ","Порт отладки CDP является ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["динамическим"]}," — каждый профиль браузера получает свой собственный порт, возвращаемый конечной точкой ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/api/env/start"]},". На диаграмме выше в качестве заполнителя используется ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["<N>"]},"."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"предварительные-условия","__idx":3},"children":["Предварительные условия"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Требование"},"children":["Требование"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Подробности"},"children":["Подробности"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Операционная система"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Сервер Ubuntu 24.04 (x86_64)"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Рекомендуемые характеристики"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["8 виртуальных ЦП, 8 ГБ ОЗУ (поддерживает ~5 одновременных профилей)"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Сеть"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Исходящий доступ в Интернет; откройте входящий порт ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["40001"]}," и выбранные вами перенаправленные порты CDP или вместо этого используйте SSH-туннели."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Python"]}," (необязательно)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Python 3.8+ с ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pip"]}," для запуска примера скрипта"]}]}]}]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"шаг-1--установите-системные-зависимости","__idx":4},"children":["Шаг 1 — Установите системные зависимости"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Подключитесь к вашему серверу через SSH и установите необходимые пакеты:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"# FUSE support (required for AppImage)\nsudo apt install -y libfuse2t64\n\n# GTK / accessibility / display libraries\nsudo apt install -y libatk1.0-0 libatk-bridge2.0-0 libatspi2.0-0\nsudo apt install -y libcups2\nsudo apt install -y libgtk-3-0 libgdk-pixbuf2.0-0\nsudo apt install -y libgbm1 libxkbcommon0 libasound2t64\n\n# Virtual framebuffer (headless display)\nsudo apt install -y xvfb\n\n# TCP forwarder\nsudo apt install -y socat\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"установите-шрифты-необязательно","__idx":5},"children":["Установите шрифты (необязательно)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Если страницы браузера отображаются без текста или содержат пропущенные символы, установите соответствующие пакеты шрифтов:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"# CJK (Chinese, Japanese, Korean)\nsudo apt install -y fonts-noto-cjk fonts-noto-cjk-extra\n\n# Arabic\nsudo apt install -y fonts-noto-color-emoji fonts-noto-extra\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Для других языков установите соответствующий пакет ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://fonts.google.com/noto"},"children":["семейство шрифтов Noto"]},"."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"шаг-2--загрузите-и-запустите-morelogin","__idx":6},"children":["Шаг 2 — Загрузите и запустите MoreLogin"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"21-загрузите-изображение-приложения","__idx":7},"children":["2.1 Загрузите изображение приложения"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"wget https://get.morelogin.com/client/prod/linux/x64/2.54.0/MoreLogin_x86_64_2.54.0.AppImage\nchmod +x MoreLogin_x86_64_2.54.0.AppImage\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Замените ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["2.54.0"]}," последней версией, доступной в вашей учетной записи MoreLogin или на ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://www.morelogin.com/download/"},"children":["странице загрузки"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"22-запустить-большевойти-в-фоновом-режиме","__idx":8},"children":["2.2 Запустить большеВойти в фоновом режиме"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Используйте ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["xvfb-run"]},", чтобы предоставить виртуальный дисплей, затем запустите AppImage:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"nohup xvfb-run -a ./MoreLogin_x86_64_2.54.0.AppImage --no-sandbox > morelogin.log 2>&1 &\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Убедитесь, что все началось успешно:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"# Check the process is running\nps aux | grep MoreLogin\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Для полной инициализации процесс может занять 5–10 секунд."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"шаг-3--войдите-в-morelogin-через-api-обязательно","__idx":9},"children":["Шаг 3 — Войдите в MoreLogin через API (обязательно)"]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["[!CAUTION]"," ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Вы должны войти в систему перед вызовом любой другой конечной точки локального API."]}," На автономном сервере нет графического интерфейса для входа в систему вручную, поэтому вам необходимо пройти аутентификацию через API. Без этого шага все вызовы API вернут результат:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\"статус\": \"ошибка\", \"код\": 401, \"сообщение\": \"Срок действия вашего статуса входа истек, пожалуйста, войдите снова\"}\n","lang":"json"},"children":[]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"31-получите-свои-учетные-данные-api","__idx":10},"children":["3.1 Получите свои учетные данные API"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Откройте настольный клиент MoreLogin (на любом компьютере, где вы вошли в систему) и перейдите в ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Настройки → API и MCP"]},". Скопируйте ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["APP ID"]}," и ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["API Key"]}," из раздела ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Open API"]},":"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/image.cfac9a4c31ae47e8434739e42cab4601ee08d737bba4fccba40f2f3bc78e9648.bc76ff01.png","alt":"Дополнительные настройки API для входа — скопируйте идентификатор приложения и ключ API из раздела «Открытый API»"},"children":[]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"32-войти-через-curl","__idx":11},"children":["3.2 Войти через Curl"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Вызовите конечную точку входа, используя свои учетные данные:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl -X POST http://127.0.0.1:40000/api/user/login \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"apiId\": \"YOUR_APP_ID\",\n    \"apiKey\": \"YOUR_API_KEY\"\n  }'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Успешный ответ выглядит так:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\"code\": 0, \"msg\": null, \"data\": true}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"33-подтвердите-вход","__idx":12},"children":["3.3 Подтвердите вход"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Подтвердите готовность API, перечислив профили браузера:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl -s -X POST http://127.0.0.1:40000/api/env/page \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"pageNo\": 1, \"pageSize\": 1}'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Ответ ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["{\"code\":0, ...}"]}," означает, что вы вошли в систему и API готов."]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Проверка:"]}," Ваш сервер MoreLogin полностью работоспособен. Перейдите к [Шагу 4] (#step-4--configure-network-forwarding-socat) для удаленного доступа или сразу перейдите к [Шагу 5] (#step-5--quick-automation-example), если сценарии выполняются на том же сервере."]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["[!NOTE]"," ","Сеанс входа в систему сохраняется до тех пор, пока работает процесс MoreLogin. Если вы перезапустите AppImage, вам нужно будет снова войти в систему."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"шаг-4--настройка-сетевой-переадресации-socat","__idx":13},"children":["Шаг 4 — Настройка сетевой переадресации (socat)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["По умолчанию порты отладки Local API (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[":40000"]},") и CDP привязаны к ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["127.0.0.1"]},". Если вам нужен доступ к ним с внешнего компьютера (например, вашего ноутбука для разработки), используйте ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["socat"]}," для пересылки трафика."]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["[!WARNING]"," ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Угроза безопасности — не предоставляйте доступ к этим портам общедоступному Интернету."]}," ","– Локальный API ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["не имеет встроенной аутентификации"]}," для большинства конечных точек."]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Порт отладки CDP обеспечивает ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["полное удаленное управление"]}," экземпляром браузера (чтение файлов cookie, внедрение сценариев, создание снимков экрана)."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Рекомендации:"]}," ","– Для удаленного доступа используйте ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["SSH-туннель"]}," вместо socat: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ssh -L 40000:127.0.0.1:40000 user@server"]},"."," ","– Если вам необходимо использовать socat, ограничьте доступ с помощью правил брандмауэра ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["только определенными IP-адресами"]},"."]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Используйте ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["VPN"]}," или группы безопасности облачного провайдера, чтобы ограничить входящий трафик."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Никогда"]}," не открывайте порты ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["40001"]},"/порты CDP на ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["0.0.0.0"]}," на общедоступном сервере без ограничений по IP."]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"41-переадресация-локального-порта-api","__idx":14},"children":["4.1 Переадресация локального порта API"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"nohup socat TCP-LISTEN:40001,fork,reuseaddr,bind=0.0.0.0 TCP:127.0.0.1:40000 &\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Внешние машины теперь могут обращаться к API по адресу ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["http://<server-ip>:40001"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"42-перенаправление-портов-отладки-cdp","__idx":15},"children":["4.2 Перенаправление портов отладки CDP"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Когда вы запускаете профиль браузера через API, ответ включает ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["динамический"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["debugPort"]}," (например, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["9222"]},"). Каждый профиль может получить другой порт. Перешлите его, чтобы внешние инструменты автоматизации (Playwright, Puppeteer, Selenium) могли подключиться:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"# Example: if debugPort=9222, forward to external port 9223 (debugPort + 1)\n# Adjust both ports to match the actual debugPort returned by /api/env/start\nnohup socat TCP-LISTEN:9223,fork,reuseaddr,bind=0.0.0.0 TCP:127.0.0.1:9222 &\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["[!WARNING]"," ","При одновременном запуске нескольких профилей убедитесь, что перенаправленные порты не конфликтуют с портами отладки других профилей. Например, если профиль A получает ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["debugPort=9222"]}," и вы пересылаете его на ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["9223"]},", а профиль B получает ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["debugPort=9223"]},", произойдет конфликт портов. Рассмотрите возможность использования большего смещения или выделенного диапазона портов."]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["[!TIP]"," ","В рабочей среде создавайте переадресацию socat ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["динамически"]}," после каждого вызова ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/api/env/start"]},", используя возвращенный ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["debugPort"]},". См. рабочую реализацию в ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#52-create--start--automate--cleanup"},"children":["примере Python"]},"."]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Если сценарии автоматизации выполняются ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["на том же сервере"]},", вы можете пропустить socat и подключиться напрямую к ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["127.0.0.1"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"43-открытие-портов-брандмауэра","__idx":16},"children":["4.3 Открытие портов брандмауэра"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Если вы используете socat, ограничьте доступ только доверенным IP-адресам:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"# Allow only a specific IP (recommended)\nsudo ufw allow from <YOUR_IP> to any port 40001 proto tcp\nsudo ufw allow from <YOUR_IP> to any port 9223 proto tcp\n\n# Or allow from any IP (NOT recommended for production)\n# sudo ufw allow 40001/tcp\n# sudo ufw allow 9223/tcp\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"44-рекомендуется-вместо-этого-использовать-ssh-туннель","__idx":17},"children":["4.4 Рекомендуется: вместо этого использовать SSH-туннель"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Для наиболее безопасного удаленного доступа используйте SSH-туннель — никаких изменений в брандмауэре или socat не требуется."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Поскольку порт CDP является ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["динамическим"]}," (назначается при запуске профиля), рабочий процесс выглядит следующим образом:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Сначала туннелируйте порт API:"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"# Run this on your local machine\nssh -L 40000:127.0.0.1:40000 user@<server-ip>\n","lang":"bash"},"children":[]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Запустите профиль"]}," через туннелированный API (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["http://127.0.0.1:40000/api/env/start"]},") и прочитайте возвращенный ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["debugPort"]},"."]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Откройте второй туннель для порта CDP:"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"# Replace <debugPort> with the actual port returned by the API\nssh -L <debugPort>:127.0.0.1:<debugPort> user@<server-ip>\n","lang":"bash"},"children":[]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Подключитесь"]}," к ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["http://127.0.0.1:<debugPort>"]}," из локальных сценариев драматурга/кукловода, как если бы сервер был локальным."]}]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["[!TIP]"," ","Вы можете объединить оба туннеля в одной команде, если заранее знаете диапазон портов, например:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"ssh -L 40000:127.0.0.1:40000 -L 9222:127.0.0.1:9222 -L 9223:127.0.0.1:9223 user@<IP-сервера>\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Но на практике проще сначала запустить туннель API, а затем при необходимости добавлять туннели для каждого профиля."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"шаг-5--пример-быстрой-автоматизации","__idx":18},"children":["Шаг 5 — Пример быстрой автоматизации"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Ниже приведен минимальный пример Python, показывающий полный жизненный цикл профиля браузера. Полный готовый к использованию сценарий с параллелизмом и обработкой ошибок см. в ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/MoreLoginBrowser/MoreLogin-API-Demos/blob/main/MoreLogin-Python/linux_server_test.py"},"children":["полный пример на GitHub"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"51-установка-зависимостей-python","__idx":19},"children":["5.1 Установка зависимостей Python"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"pip install requests playwright\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Playwright используется здесь только для своего клиента CDP (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["connect_over_cdp"]},"). Вам ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["не"]}," нужно запускать ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["playwright install"]}," — MoreLogin предоставляет собственный браузер."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"52-установка---no-sandbox-для-профилей-браузера-обязательно-на-linux","__idx":20},"children":["5.2 Установка ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["--no-sandbox"]}," для профилей браузера (обязательно на Linux)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["На Linux Server браузерный движок ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["должен"]}," запускаться с флагом ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["--no-sandbox"]},". Этот параметр передаётся через поле ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["startupParams"]}," при создании или обновлении профиля браузера."]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["[!CAUTION]"," ","Без ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["--no-sandbox"]}," браузер не сможет запуститься в большинстве серверных сред Linux (особенно при работе под ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["root"]}," или без полноценного десктопного сеанса)."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"новые-профили--указать-startupparams-при-создании","__idx":21},"children":["Новые профили — указать ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["startupParams"]}," при создании"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Используйте ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/api/env/create/advanced"]}," для создания профиля с ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["startupParams"]}," (эндпоинт ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/api/env/create/quick"]}," ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["не поддерживает"]}," это поле):"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl -X POST http://127.0.0.1:40000/api/env/create/advanced \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"browserTypeId\": 1,\n    \"operatorSystemId\": 5,\n    \"startupParams\": [\"--no-sandbox\"]\n  }'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["[!TIP]"," ","Если вы использовали ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/api/env/create/quick"]}," для создания профиля, вызовите ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/api/env/update"]}," для добавления ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["--no-sandbox"]}," перед запуском — см. ниже."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"существующие-профили--обновить-через-apienvupdate","__idx":22},"children":["Существующие профили — обновить через ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/api/env/update"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Если у вас уже есть профили браузера, созданные без ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["--no-sandbox"]},", обновите их перед запуском:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl -X POST http://127.0.0.1:40000/api/env/update \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"envId\": \"YOUR_ENV_ID\",\n    \"startupParams\": [\"--no-sandbox\"]\n  }'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["[!NOTE]"," ","Поле ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["startupParams"]}," принимает массив строк. Вы также можете добавить другие флаги Chrome (например, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["[\"--no-sandbox\", \"--disable-gpu\"]"]},"). Флаг ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["--no-sandbox"]}," необходим только на Linux — профили Windows и macOS не нуждаются в нём."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"53-создать--пуск--автоматизировать--очистка","__idx":23},"children":["5.3 Создать → Пуск → Автоматизировать → Очистка"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["В этом примере предполагается, что сценарий выполняется ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["на том же сервере"]},", что и MoreLogin. Для удаленных сценариев см. примечания после кода."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"import requests\nfrom playwright.sync_api import sync_playwright\n\n# ── Configuration ──────────────────────────────────────────\n# Local:  script runs on the SAME server as MoreLogin\n# Remote: script runs on a DIFFERENT machine — see notes below\nAPI_BASE  = \"http://127.0.0.1:40000\"\n\n\n# ① Create a browser profile\nresp = requests.post(f\"{API_BASE}/api/env/create/quick\", json={\n    \"browserTypeId\": 1,\n    \"operatorSystemId\": 5,\n    \"quantity\": 1\n})\nresp_data = resp.json()\nassert resp_data[\"code\"] == 0, f\"Create failed: {resp_data}\"\nenv_id = resp_data[\"data\"][\"envIds\"][0]\nprint(f\"✅ Created profile: {env_id}\")\n\n\n# ①-b Add --no-sandbox (required on Linux Server)\nresp = requests.post(f\"{API_BASE}/api/env/update\", json={\n    \"envId\": env_id,\n    \"startupParams\": [\"--no-sandbox\"]\n})\nresp_data = resp.json()\nassert resp_data[\"code\"] == 0, f\"Update failed: {resp_data}\"\nprint(f\"✅ Set --no-sandbox for profile: {env_id}\")\n\n\n# ② Start the profile (headless)\nresp = requests.post(f\"{API_BASE}/api/env/start\", json={\n    \"envId\": env_id\n})\nresp_data = resp.json()\nassert resp_data[\"code\"] == 0, f\"Start failed: {resp_data}\"\ndebug_port = resp_data[\"data\"][\"debugPort\"]   # Dynamic — different for each profile\nprint(f\"✅ Started — debug port: {debug_port}\")\n\n\n# ③ Build the CDP URL\ncdp_url = f\"http://127.0.0.1:{debug_port}\"\n\n\n# ④ Connect via CDP and automate\nwith sync_playwright() as p:\n    browser = p.chromium.connect_over_cdp(cdp_url)\n    page = browser.contexts[0].pages[0]\n    page.goto(\"https://www.google.com\")\n    page.screenshot(path=f\"screenshot_{env_id}.png\")\n    print(f\"✅ Screenshot saved\")\n    # Use disconnect() — not close() — to detach without killing the browser.\n    # The profile will be stopped cleanly via the API in step ⑤.\n    browser.disconnect()\n\n\n# ⑤ Stop the profile\nrequests.post(f\"{API_BASE}/api/env/close\", json={\"envId\": env_id})\nprint(f\"✅ Profile stopped\")\n\n\n# ⑥ Delete the profile\nrequests.post(f\"{API_BASE}/api/env/remove\", json={\"envIds\": [env_id]})\nprint(f\"✅ Profile deleted\")\n","lang":"python"},"children":[]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["[!NOTE]"," ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Запуск с удаленного компьютера?"]}," Два подхода:"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Вариант А — SSH-туннель (рекомендуется):"]}," ","Настройте SSH-туннели от вашего локального компьютера к серверу (см. ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#44-recommended-use-ssh-tunnel-instead"},"children":["§ 4.4"]},"), затем сохраните ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["API_BASE = \"http://127.0.0.1:40000\""]}," и ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["cdp_url = f\"http://127.0.0.1:{debug_port}\""]}," — SSH делает удаленные порты локальными."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Вариант Б — socat на сервере:"]}," ","На ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["сервере"]}," запустите пересылку socat для порта API и для каждого порта CDP:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"# Запускайте их на СЕРВЕРЕ, а не на локальном компьютере.\nsocat TCP-LISTEN:40001,fork,reuseaddr,bind=0.0.0.0 TCP:127.0.0.1:40000 &\nsocat TCP-LISTEN:$((debug_port+1)),fork,reuseaddr,bind=0.0.0.0 TCP:127.0.0.1:$debug_port &\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Затем в своем скрипте установите ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["API_BASE = \"http://<server-ip>:40001\""]}," и ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["cdp_url = f\"http://<server-ip>:{debug_port + 1}\""]},"."," ","⚠️ Ограничьте доступ с помощью правил брандмауэра — см. ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#43-open-firewall-ports"},"children":["§ 4.3"]},"."]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["[!IMPORTANT]"," ","Структура ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["resp.json()[\"data\"][\"envIds\"]"]}," соответствует текущему формату ответа ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/api/env/create/quick"]},". Если вы столкнулись с другой формой (например, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["data: [\"id1\", ...]"]},"), проверьте ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/ru/api-reference/browser"},"children":["Справочник по API"]}," для вашей версии — форматы ответов могут различаться в зависимости от версии."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"тест-производительности","__idx":24},"children":["Тест производительности"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Следующие результаты были получены на виртуальной машине сервера Ubuntu 24.04 (8 виртуальных ЦП, 8 ГБ ОЗУ) с использованием [скрипта полного стресс-теста] (https://github.com/MoreLoginBrowser/MoreLogin-API-Demos/blob/main/MoreLogin-Python/linux_server_test.py):"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Метрика"},"children":["Метрика"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Значение"},"children":["Значение"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Всего пробегов"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["100"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Параллелизм"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["4 (одновременно)"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Успех"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["100,0%"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Общее время"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["604,06 с"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Среднее время на задачу"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["6,04 с"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Пропускная способность"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["0,17 задач/с"]}]}]}]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Эти цифры служат базой. Фактическая производительность зависит от характеристик сервера, условий сети и сложности страницы."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"производственное-развертывание-systemd","__idx":25},"children":["Производственное развертывание (systemd)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Для производственных серверов запустите MoreLogin как ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["системную службу"]},", чтобы обеспечить автоматический запуск при загрузке, перезапуск при сбое и централизованное ведение журнала."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"создайте-служебный-файл","__idx":26},"children":["Создайте служебный файл"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"sudo tee /etc/systemd/system/morelogin.service > /dev/null <<'EOF'\n[Unit]\nDescription=MoreLogin Browser (headless)\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nType=simple\nUser=root\nWorkingDirectory=/opt/morelogin\nExecStart=/usr/bin/xvfb-run -a /opt/morelogin/MoreLogin_x86_64_2.54.0.AppImage --no-sandbox\nRestart=on-failure\nRestartSec=10\nStandardOutput=journal\nStandardError=journal\n\n[Install]\nWantedBy=multi-user.target\nEOF\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Настройте пути ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["WorkingDirectory"]}," и ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ExecStart"]}," так, чтобы они соответствовали тому месту, где вы разместили AppImage."]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["[!TIP]"," ","Для рабочей среды рассмотрите возможность создания выделенного пользователя (например, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["morelogin"]},") вместо ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["root"]}," и соответствующим образом настройте владельца файла и разрешения. Если AppImage в настоящее время требуются права root, вы можете сохранить ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["User=root"]},", но лучше всего изолировать процесс под учетной записью без полномочий root."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"включить-и-запустить","__idx":27},"children":["Включить и запустить"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"sudo systemctl daemon-reload\nsudo systemctl enable morelogin    # Auto-start on boot\nsudo systemctl start morelogin     # Start now\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"управление-сервисом","__idx":28},"children":["Управление сервисом"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"sudo systemctl status morelogin    # Check status\nsudo journalctl -u morelogin -f    # Stream logs\nsudo systemctl restart morelogin   # Restart\nsudo systemctl stop morelogin      # Stop\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["[!NOTE]"," ","После перезапуска необходимо снова вызвать ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#32-log-in-via-curl"},"children":["конечную точку входа"]}," — сеанс API не сохраняется при перезапуске процесса. Для автоматического восстановления рассмотрите возможность добавления сценария ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ExecStartPost"]}," или задания cron проверки работоспособности, которое вызывает конечную точку входа после запуска службы."]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"устранение-неполадок","__idx":29},"children":["Устранение неполадок"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"подробнеевход-не-запускается","__idx":30},"children":["ПодробнееВход не запускается"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"AppImages require FUSE to run.\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Исправление:"]}," Установите поддержку FUSE:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"sudo apt install -y libfuse2t64\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"на-страницах-браузера-отображается-пустой-текстпропущенные-символы","__idx":31},"children":["На страницах браузера отображается пустой текст/пропущенные символы"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Исправление:"]}," установите пакет шрифтов для целевого языка (см. ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#install-fonts-optional"},"children":["Шаг 1. Установка шрифтов"]},")."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"соединение-cdp-отклонено-с-внешней-машины","__idx":32},"children":["Соединение CDP отклонено с внешней машины"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Причина:"]}," Порты отладки CDP по умолчанию привязаны к ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["127.0.0.1"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Исправление."]}," Настройте переадресацию socat (см. ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#step-4--configure-network-forwarding-socat"},"children":["Шаг 4"]},") и убедитесь, что правила брандмауэра разрешают пересылаемый порт."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"curl-для-local-api-возвращает-соединение-отклонено","__idx":33},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["curl"]}," для Local API возвращает «Соединение отклонено»"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Причина:"]}," Запуск MoreLogin еще не завершился, или процесс завершился сбоем."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Исправлено:"]}]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Подождите 5–10 секунд после запуска."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Проверьте ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["morelogin.log"]}," на наличие ошибок"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Убедитесь, что процесс запущен: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ps aux | grep MoreLogin"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"api-возвращает-401-статус-входа-истек","__idx":34},"children":["API возвращает 401 «Статус входа истек»"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\"status\": \"error\", \"code\": 401, \"message\": \"Your login status has expired, please log in again\"}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Причина:"]}," Вы не вошли в систему через API, или процесс MoreLogin был перезапущен."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Исправление:"]}," Вызовите конечную точку входа перед любым другим вызовом API (см. ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#step-3--log-in-to-morelogin-via-api-required"},"children":["Шаг 3"]},")."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"следующие-шаги","__idx":35},"children":["Следующие шаги"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Цель"},"children":["Цель"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Ссылка"},"children":["Ссылка"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Полная справка по API браузера"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/ru/api-reference/browser"},"children":["API браузера"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Настройка аутентификации"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/ru/api-reference/getting-started/authentication"},"children":["Руководство по аутентификации"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Примеры драматурга/Селена/Кукловода"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/ru/api-reference/examples"},"children":["Примеры автоматизации"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Полный сценарий стресс-теста Linux"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://github.com/MoreLoginBrowser/MoreLogin-API-Demos/blob/main/MoreLogin-Python/linux_server_test.py"},"children":["GitHub — linux_server_test.py"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Быстрый старт через CLI"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/ru/cli/quick-start"},"children":["Руководство по CLI"]}]}]}]}]}]}]},"headings":[{"value":"Развертывание Linux-сервера","id":"развертывание-linux-сервера","depth":1},{"value":"Чего вы достигнете","id":"чего-вы-достигнете","depth":2},{"value":"Обзор архитектуры","id":"обзор-архитектуры","depth":2},{"value":"Предварительные условия","id":"предварительные-условия","depth":2},{"value":"Шаг 1 — Установите системные зависимости","id":"шаг-1--установите-системные-зависимости","depth":2},{"value":"Установите шрифты (необязательно)","id":"установите-шрифты-необязательно","depth":3},{"value":"Шаг 2 — Загрузите и запустите MoreLogin","id":"шаг-2--загрузите-и-запустите-morelogin","depth":2},{"value":"2.1 Загрузите изображение приложения","id":"21-загрузите-изображение-приложения","depth":3},{"value":"2.2 Запустить большеВойти в фоновом режиме","id":"22-запустить-большевойти-в-фоновом-режиме","depth":3},{"value":"Шаг 3 — Войдите в MoreLogin через API (обязательно)","id":"шаг-3--войдите-в-morelogin-через-api-обязательно","depth":2},{"value":"3.1 Получите свои учетные данные API","id":"31-получите-свои-учетные-данные-api","depth":3},{"value":"3.2 Войти через Curl","id":"32-войти-через-curl","depth":3},{"value":"3.3 Подтвердите вход","id":"33-подтвердите-вход","depth":3},{"value":"Шаг 4 — Настройка сетевой переадресации (socat)","id":"шаг-4--настройка-сетевой-переадресации-socat","depth":2},{"value":"4.1 Переадресация локального порта API","id":"41-переадресация-локального-порта-api","depth":3},{"value":"4.2 Перенаправление портов отладки CDP","id":"42-перенаправление-портов-отладки-cdp","depth":3},{"value":"4.3 Открытие портов брандмауэра","id":"43-открытие-портов-брандмауэра","depth":3},{"value":"4.4 Рекомендуется: вместо этого использовать SSH-туннель","id":"44-рекомендуется-вместо-этого-использовать-ssh-туннель","depth":3},{"value":"Шаг 5 — Пример быстрой автоматизации","id":"шаг-5--пример-быстрой-автоматизации","depth":2},{"value":"5.1 Установка зависимостей Python","id":"51-установка-зависимостей-python","depth":3},{"value":"5.2 Установка --no-sandbox для профилей браузера (обязательно на Linux)","id":"52-установка---no-sandbox-для-профилей-браузера-обязательно-на-linux","depth":3},{"value":"Новые профили — указать startupParams при создании","id":"новые-профили--указать-startupparams-при-создании","depth":4},{"value":"Существующие профили — обновить через /api/env/update","id":"существующие-профили--обновить-через-apienvupdate","depth":4},{"value":"5.3 Создать → Пуск → Автоматизировать → Очистка","id":"53-создать--пуск--автоматизировать--очистка","depth":3},{"value":"Тест производительности","id":"тест-производительности","depth":2},{"value":"Производственное развертывание (systemd)","id":"производственное-развертывание-systemd","depth":2},{"value":"Создайте служебный файл","id":"создайте-служебный-файл","depth":3},{"value":"Включить и запустить","id":"включить-и-запустить","depth":3},{"value":"Управление сервисом","id":"управление-сервисом","depth":3},{"value":"Устранение неполадок","id":"устранение-неполадок","depth":2},{"value":"ПодробнееВход не запускается","id":"подробнеевход-не-запускается","depth":3},{"value":"На страницах браузера отображается пустой текст/пропущенные символы","id":"на-страницах-браузера-отображается-пустой-текстпропущенные-символы","depth":3},{"value":"Соединение CDP отклонено с внешней машины","id":"соединение-cdp-отклонено-с-внешней-машины","depth":3},{"value":"curl для Local API возвращает «Соединение отклонено»","id":"curl-для-local-api-возвращает-соединение-отклонено","depth":3},{"value":"API возвращает 401 «Статус входа истек»","id":"api-возвращает-401-статус-входа-истек","depth":3},{"value":"Следующие шаги","id":"следующие-шаги","depth":2}],"frontmatter":{"seo":{"title":"Развертывание Linux-сервера"}},"lastModified":"2026-07-13T14:51:02.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/ru/linux-server/overview","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}