MoreLogin をヘッドレス Ubuntu サーバーにデプロイし、ローカル API 経由でブラウザ プロファイルを自動化します。デスクトップ環境は必要ありません。
このガイドを終えると、次のことができるようになります。
- Ubuntu 24.04 ヘッドレス サーバー上で実行中の MoreLogin インスタンス
- 外部マシンが CDP (Chrome DevTools プロトコル) 経由で接続できるように構成されたネットワーク転送
- ブラウザー プロファイルを作成、起動、制御、クリーンアップする、動作する Python 自動化スクリプト
┌──────────────────────────────────────────────────────────┐
│ Ubuntu 24.04 Server │
│ │
│ ┌──────────────┐ ┌───────────────────────────────┐ │
│ │ xvfb │───▶│ MoreLogin AppImage │ │
│ │ (virtual │ │ Local API :40000 │ │
│ │ display) │ │ CDP debug :<dynamic> │ │
│ │ │ │ (127.0.0.1, per profile) │ │
│ └──────────────┘ └───────────────────────────────┘ │
│ │ │
│ socat forwarding │
│ │ │
│ 0.0.0.0:40001 → 127.0.0.1:40000 │
│ 0.0.0.0:<N+1> → 127.0.0.1:<N> │
└──────────────────────────────────────────────────────────┘
│
External machine
(Playwright / Puppeteer / Selenium)[!NOTE] CDP デバッグ ポートは 動的 です。各ブラウザ プロファイルは、
/api/env/startエンドポイントによって返される独自のポートを取得します。上の図では、プレースホルダーとして<N>を使用しています。
| 要件 | 詳細 |
|---|---|
| オペレーティング システム | Ubuntu 24.04 サーバー (x86_64) |
| 推奨スペック | 8 vCPU、8 GB RAM (最大 5 つの同時プロファイルをサポート) |
| ネットワーク | アウトバウンドインターネットアクセス。受信ポート 40001 と選択した転送 CDP ポートを開くか、代わりに SSH トンネルを使用します |
| Python (オプション) | サンプル スクリプトを実行するための Python 3.8 以降と pip |
SSH 経由でサーバーに接続し、必要なパッケージをインストールします。
# FUSE support (required for AppImage)
sudo apt install -y libfuse2t64
# GTK / accessibility / display libraries
sudo apt install -y libatk1.0-0 libatk-bridge2.0-0 libatspi2.0-0
sudo apt install -y libcups2
sudo apt install -y libgtk-3-0 libgdk-pixbuf2.0-0
sudo apt install -y libgbm1 libxkbcommon0 libasound2t64
# Virtual framebuffer (headless display)
sudo apt install -y xvfb
# TCP forwarder
sudo apt install -y socatブラウザ ページにテキストが表示されない場合、または文字が欠落している場合は、対応するフォント パッケージをインストールします。
# CJK (Chinese, Japanese, Korean)
sudo apt install -y fonts-noto-cjk fonts-noto-cjk-extra
# Arabic
sudo apt install -y fonts-noto-color-emoji fonts-noto-extra他の言語の場合は、対応する Noto フォント ファミリー パッケージをインストールしてください。
wget https://get.morelogin.com/client/prod/linux/x64/2.54.0/MoreLogin_x86_64_2.54.0.AppImage
chmod +x MoreLogin_x86_64_2.54.0.AppImage
2.54.0を、MoreLogin アカウントまたは ダウンロード ページ から入手できる最新バージョンに置き換えます。
xvfb-run を使用して仮想ディスプレイを提供し、AppImage を実行します。
nohup xvfb-run -a ./MoreLogin_x86_64_2.54.0.AppImage --no-sandbox > morelogin.log 2>&1 &正常に開始されたことを確認します。
# Check the process is running
ps aux | grep MoreLoginプロセスが完全に初期化されるまでに 5 ~ 10 秒かかる場合があります。
[!CAUTION] 他のローカル API エンドポイントを呼び出す前にログインする必要があります。 ヘッドレス サーバーには手動でログインするための GUI がないため、API 経由で認証する必要があります。この手順を行わないと、すべての API 呼び出しは次の値を返します。
{"status": "error", "code": 401, "message": "ログインステータスの有効期限が切れています。再度ログインしてください"}
MoreLogin デスクトップ クライアント (ログインしている任意のマシン上) を開き、設定 → API と MCP に移動します。 Open API セクションから APP ID と API Key をコピーします。

資格情報を使用してログイン エンドポイントを呼び出します。
curl -X POST http://127.0.0.1:40000/api/user/login \
-H "Content-Type: application/json" \
-d '{
"apiId": "YOUR_APP_ID",
"apiKey": "YOUR_API_KEY"
}'成功した応答は次のようになります。
{"code": 0, "msg": null, "data": true}ブラウザー プロファイルを一覧表示して、API の準備ができていることを確認します。
curl -s -X POST http://127.0.0.1:40000/api/env/page \
-H "Content-Type: application/json" \
-d '{"pageNo": 1, "pageSize": 1}'
{"code":0, ...}応答は、ログインしていて API の準備ができていることを意味します。
チェックポイント: MoreLogin サーバーは完全に動作しています。リモート アクセスの場合は ステップ 4 に進むか、同じサーバー上でスクリプトを実行する場合は直接 ステップ 5 に進みます。
[!NOTE] ログイン セッションは、MoreLogin プロセスが実行されている限り継続します。 AppImage を再起動する場合は、再度ログインする必要があります。
デフォルトでは、ローカル API (:40000) と CDP デバッグ ポートの両方が 127.0.0.1 にバインドされます。外部マシン (開発用ラップトップなど) からアクセスする必要がある場合は、socat を使用してトラフィックを転送します。
[!WARNING] セキュリティ上のリスク - これらのポートを公共のインターネットに公開しないでください。
- ローカル API には、ほとんどのエンドポイントに対して 認証が組み込まれていません。
- CDP デバッグ ポートにより、ブラウザ インスタンスの 完全なリモート コントロールが許可されます (Cookie の読み取り、スクリプトの挿入、スクリーンショットのキャプチャ)。
推奨事項:
- リモート アクセスには socat の代わりに SSH トンネルを使用します:
ssh -L 40000:127.0.0.1:40000 user@server- socat を使用する必要がある場合は、ファイアウォール ルールを使用してアクセスを 特定の IP のみに制限してください
- VPN またはクラウド プロバイダーのセキュリティ グループを使用して、受信トラフィックを制限します
- IP 制限なしで、公開サーバー上でポート
40001/ CDP ポートを0.0.0.0に決して開かないでください**
nohup socat TCP-LISTEN:40001,fork,reuseaddr,bind=0.0.0.0 TCP:127.0.0.1:40000 &外部マシンは
http://<server-ip>:40001で API にアクセスできるようになりました。
API 経由でブラウザ プロファイルを開始すると、応答には 動的 debugPort (例: 9222) が含まれます。各プロファイルは異なるポートを受信する場合があります。外部自動化ツール (Playwright、Puppeteer、Selenium) が接続できるように、これを転送します。
# Example: if debugPort=9222, forward to external port 9223 (debugPort + 1)
# Adjust both ports to match the actual debugPort returned by /api/env/start
nohup socat TCP-LISTEN:9223,fork,reuseaddr,bind=0.0.0.0 TCP:127.0.0.1:9222 &[!WARNING] 複数のプロファイルを同時に実行する場合は、転送されたポートが他のプロファイルのデバッグ ポートと衝突しないようにしてください。たとえば、プロファイル A が
debugPort=9222を取得し、9223に転送するが、プロファイル B がdebugPort=9223を受信する場合、ポートの競合が発生します。より大きなオフセットまたは専用ポート範囲の使用を検討してください。
[!TIP] 運用環境では、返された
debugPortを使用して、各/api/env/start呼び出しの後に socat 転送を 動的 に作成します。動作する実装については、Python の例 を参照してください。
同じサーバー上で自動化スクリプトを実行している場合は、socat をスキップして
127.0.0.1に直接接続できます。
socat を使用する場合は、アクセスを信頼できる IP のみに制限します。
# Allow only a specific IP (recommended)
sudo ufw allow from <YOUR_IP> to any port 40001 proto tcp
sudo ufw allow from <YOUR_IP> to any port 9223 proto tcp
# Or allow from any IP (NOT recommended for production)
# sudo ufw allow 40001/tcp
# sudo ufw allow 9223/tcp最も安全なリモート アクセスを実現するには、SSH トンネルを使用します。ファイアウォールの変更や socat は必要ありません。
CDP ポートは 動的 (プロファイルの開始時に割り当てられる) であるため、ワークフローは次のようになります。
最初に API ポートをトンネルします:
# Run this on your local machine ssh -L 40000:127.0.0.1:40000 user@<server-ip>トンネル API (
http://127.0.0.1:40000/api/env/start) 経由でプロファイルを開始し、返されたdebugPortを読み取ります。CDP ポートの 2 番目のトンネルを開きます:
# Replace <debugPort> with the actual port returned by the API ssh -L <debugPort>:127.0.0.1:<debugPort> user@<server-ip>サーバーがローカルにあるかのように、ローカルの Playwright / Puppeteer スクリプトから
http://127.0.0.1:<debugPort>に 接続します。
[!TIP] ポート範囲が事前にわかっている場合は、1 つのコマンドで両方のトンネルを組み合わせることができます。例:
ssh -L 40000:127.0.0.1:40000 -L 9222:127.0.0.1:9222 -L 9223:127.0.0.1:9223 user@<サーバー IP>ただし、実際には、最初に API トンネルを開始し、次に必要に応じてプロファイルごとのトンネルを追加する方が簡単です。
以下は、ブラウザー プロファイルのライフサイクル全体を示す最小限の Python の例です。同時実行性とエラー処理を備えた完全な本番環境対応スクリプトについては、GitHub の完全な例 を参照してください。
pip install requests playwrightPlaywright は、ここでは CDP クライアント (
connect_over_cdp) にのみ使用されます。playwright installを実行する必要はありません。MoreLogin は独自のブラウザを提供します。
この例では、スクリプトが MoreLogin と 同じサーバー上で実行されることを前提としています。リモート シナリオについては、コードの後のメモを参照してください。
import requests
from playwright.sync_api import sync_playwright
# ── Configuration ──────────────────────────────────────────
# Local: script runs on the SAME server as MoreLogin
# Remote: script runs on a DIFFERENT machine — see notes below
API_BASE = "http://127.0.0.1:40000"
# ① Create a browser profile
resp = requests.post(f"{API_BASE}/api/env/create/quick", json={
"browserTypeId": 1,
"operatorSystemId": 1,
"quantity": 1
})
resp_data = resp.json()
assert resp_data["code"] == 0, f"Create failed: {resp_data}"
env_id = resp_data["data"]["envIds"][0]
print(f"✅ Created profile: {env_id}")
# ② Start the profile (headless)
resp = requests.post(f"{API_BASE}/api/env/start", json={
"envId": env_id
})
resp_data = resp.json()
assert resp_data["code"] == 0, f"Start failed: {resp_data}"
debug_port = resp_data["data"]["debugPort"] # Dynamic — different for each profile
print(f"✅ Started — debug port: {debug_port}")
# ③ Build the CDP URL
cdp_url = f"http://127.0.0.1:{debug_port}"
# ④ Connect via CDP and automate
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp(cdp_url)
page = browser.contexts[0].pages[0]
page.goto("https://www.google.com")
page.screenshot(path=f"screenshot_{env_id}.png")
print(f"✅ Screenshot saved")
# Use disconnect() — not close() — to detach without killing the browser.
# The profile will be stopped cleanly via the API in step ⑤.
browser.disconnect()
# ⑤ Stop the profile
requests.post(f"{API_BASE}/api/env/close", json={"envId": env_id})
print(f"✅ Profile stopped")
# ⑥ Delete the profile
requests.post(f"{API_BASE}/api/env/remove", json={"envIds": [env_id]})
print(f"✅ Profile deleted")[!NOTE] リモート マシンから実行しますか? 2 つのアプローチ:
オプション A — SSH トンネル (推奨): ローカル マシンからサーバーへの SSH トンネルを設定し (§ 4.4 を参照)、
API_BASE = "http://127.0.0.1:40000"とcdp_url = f"http://127.0.0.1:{debug_port}"を維持します。SSH によりリモート ポートがローカルに見えるようになります。オプション B — サーバー上の socat: サーバーで、API ポートと各 CDP ポートの socat 転送を開始します。
# これらをローカルマシンではなくサーバーで実行します socat TCP-LISTEN:40001,fork,reuseaddr,bind=0.0.0.0 TCP:127.0.0.1:40000 & socat TCP-LISTEN:$((debug_port+1)),fork,reuseaddr,bind=0.0.0.0 TCP:127.0.0.1:$debug_port &次に、スクリプトで
API_BASE = "http://<server-ip>:40001"とcdp_url = f"http://<server-ip>:{debug_port + 1}"を設定します。 ⚠️ ファイアウォール ルールを使用してアクセスを制限します。§ 4.3 を参照してください。
[!IMPORTANT]
resp.json()["data"]["envIds"]構造は、現在の/api/env/create/quick応答形式と一致します。異なる形式 (data: ["id1", ...]など) が発生した場合は、API リファレンス でお使いのバージョンを確認してください。応答形式はリリースによって異なる場合があります。
次の結果は、フル ストレス テスト スクリプト を使用して Ubuntu 24.04 サーバー VM (8 vCPU、8 GB RAM) で得られたものです。
| メトリック | 値 |
|---|---|
| 合計実行数 | 100 |
| 同時実行性 | 4(同時) |
| 成功率 | 100.0% |
| 合計時間 | 604.06秒 |
| タスクあたりの平均時間 | 6.04秒 |
| スループット | 0.17タスク/秒 |
これらの数値はベースラインとして機能します。実際のパフォーマンスは、サーバーの仕様、ネットワークの状態、ページの複雑さによって異なります。
運用サーバーの場合は、MoreLogin を systemd サービス として実行して、ブート時の自動起動、クラッシュ時の再起動、および集中ログを取得します。
sudo tee /etc/systemd/system/morelogin.service > /dev/null <<'EOF'
[Unit]
Description=MoreLogin Browser (headless)
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/morelogin
ExecStart=/usr/bin/xvfb-run -a /opt/morelogin/MoreLogin_x86_64_2.54.0.AppImage --no-sandbox
Restart=on-failure
RestartSec=10
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
EOFAppImage を配置した場所と一致するように
WorkingDirectoryパスとExecStartパスを調整します。
[!TIP] 運用環境では、
rootとして実行する代わりに専用ユーザー (moreloginなど) を作成し、それに応じてファイルの所有権と権限を調整することを検討してください。現在 AppImage に root 権限が必要な場合は、User=rootをそのまま使用できますが、非 root アカウントでプロセスを分離することがベスト プラクティスです。
sudo systemctl daemon-reload
sudo systemctl enable morelogin # Auto-start on boot
sudo systemctl start morelogin # Start nowsudo systemctl status morelogin # Check status
sudo journalctl -u morelogin -f # Stream logs
sudo systemctl restart morelogin # Restart
sudo systemctl stop morelogin # Stop[!NOTE] 再起動後、ログイン エンドポイント を再度呼び出す必要があります。API セッションはプロセスの再起動後に存続しません。自動リカバリの場合は、サービスの開始後にログイン エンドポイントを呼び出す
ExecStartPostスクリプトまたはヘルスチェック cron ジョブを追加することを検討してください。
AppImages require FUSE to run.修正: FUSE サポートをインストールします:
sudo apt install -y libfuse2t64修正: ターゲット言語のフォント パッケージをインストールします (ステップ 1 - フォントのインストール を参照)。
原因: CDP デバッグ ポートはデフォルトで 127.0.0.1 にバインドされます。
修正: socat 転送を設定し (ステップ 4 を参照)、ファイアウォール ルールで転送ポートが許可されていることを確認します。
原因: MoreLogin の開始がまだ完了していないか、プロセスがクラッシュしました。
修正:
- 起動後 5 ~ 10 秒待ちます
morelogin.logにエラーがないか確認してください- プロセスが実行されていることを確認します:
ps aux | grep MoreLogin
{"status": "error", "code": 401, "message": "Your login status has expired, please log in again"}原因: API 経由でログインしていないか、MoreLogin プロセスが再起動されました。
修正: 他の API 呼び出しの前にログイン エンドポイントを呼び出します (ステップ 3 を参照)。
| 目標 | リンク |
|---|---|
| フルブラウザ API リファレンス | ブラウザ API |
| 認証設定 | 認証ガイド |
| 劇作家 / Selenium / 人形遣いの例 | 自動化の例 |
| 完全な Linux ストレス テスト スクリプト | GitHub — linux_server_test.py |
| CLI クイック スタート | CLI ガイド |