{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-@l10n/uk/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 та автоматизуйте профілі браузера через локальний 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 Protocol)"]},{"$$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 vCPU, 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-завантажте-appimage","__idx":7},"children":["2.1 Завантажте AppImage"]},{"$$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-запустіть-morelogin-у-фоновому-режимі","__idx":8},"children":["2.2 Запустіть MoreLogin у фоновому режимі"]},{"$$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":"{\"status\": \"помилка\", \"code\": 401, \"message\": \"Ваш статус входу минув, увійдіть знову\"}\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.b25c25ba.png","alt":"Більше налаштувань API входу — скопіюйте ідентифікатор APP і ключ API із розділу Open 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 працює повністю. Перейдіть до ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#step-4--configure-network-forwarding-socat"},"children":["кроку 4"]}," для віддаленого доступу або перейдіть безпосередньо до ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#step-5--quick-automation-example"},"children":["кроку 5"]},", якщо сценарії запущено на тому самому сервері."]}]},{"$$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":["За замовчуванням і локальний 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":["Ризик безпеці — не піддавайте ці порти загальнодоступному Інтернету."]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Локальний API не має ",{"$$mdtype":"Tag","name":"strong","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":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","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"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Якщо вам потрібно використовувати socat, обмежте доступ за допомогою правил брандмауера до ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["лише певних IP-адрес"]}]},{"$$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>"]}," зі своїх локальних сценаріїв Playwright / Puppeteer, ніби сервер локальний."]}]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["[!TIP]"," ","Ви можете поєднати обидва тунелі в одній команді, якщо заздалегідь знаєте діапазон портів, наприклад:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"баш","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 користувач@<ip-сервер>\n","lang":"баш"},"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":["Варіант A — тунель 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":["Варіант B — socat на сервері:"]}," ","На ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["сервері"]}," запустіть переадресацію socat для порту API та для кожного порту CDP:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"баш","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","lang":"баш"},"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":"/uk/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 vCPU, 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":["systemd service"]},", щоб отримати автоматичний запуск під час завантаження, перезапуск у разі збою та централізоване журналювання."]},{"$$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":"не-вдається-запустити-morelogin","__idx":30},"children":["Не вдається запустити MoreLogin"]},{"$$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-до-локального-api-повертає-відмовлено-в-підключенні","__idx":33},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["curl"]}," до локального 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":"/uk/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":"/uk/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":"/uk/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":"/uk/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 Завантажте AppImage","id":"21-завантажте-appimage","depth":3},{"value":"2.2 Запустіть MoreLogin у фоновому режимі","id":"22-запустіть-morelogin-у-фоновому-режимі","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":"Не вдається запустити MoreLogin","id":"не-вдається-запустити-morelogin","depth":3},{"value":"На сторінках веб-переглядача відображається порожній текст/пропущені символи","id":"на-сторінках-веб-переглядача-відображається-порожній-текстпропущені-символи","depth":3},{"value":"Зовнішній комп’ютер відмовив у з’єднанні CDP","id":"зовнішній-компютер-відмовив-у-зєднанні-cdp","depth":3},{"value":"curl до локального API повертає \"Відмовлено в підключенні\"","id":"curl-до-локального-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":"/uk/linux-server/overview","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}