ComfyUIヘッドレスモード・CLI実行ガイド|GUIなしでバッチ処理を自動化する方法
ComfyUIは高機能なノードベースのUIが魅力ですが、実運用ではGUIを使わずコマンドラインから動かしたい場面が少なくありません。サーバー上で大量の画像をバッチ生成するとき、ブラウザを開く必要はないでしょう。クラウドGPUインスタンスやCI/CDパイプラインでの利用も同様です。
ComfyUIのヘッドレスモードを使えば、GUIなしでワークフローをAPIから送信し、コマンドライン操作だけで画像生成を完結できます。サーバーリソースの節約にもつながる実用的な運用手法です。
この記事では、ComfyUIをヘッドレスモードで起動する方法から、公式comfy-cliの活用、API経由でのワークフロー実行、cronやタスクスケジューラとの連携、さらにサーバーでの常時稼働設定まで、段階的に解説します。
ヘッドレスモードとは|ComfyUIをGUIなしで動かすメリット
GUIレスで動作させる3つの利点
ComfyUIのヘッドレスモードとは、ブラウザのGUIを起動せずにバックエンドサーバーだけを稼働させる運用方法です。通常はブラウザが自動で開きますが、ヘッドレスモードではこの動作を抑制します。
厳密には、ヘッドレス運用は3つの層に整理できます。1層目が起動オプションによるブラウザ自動起動抑止、2層目が公式comfy-cliでのCLI完結運用、3層目がComfyUIサーバーを立ち上げないスタンドアロンスクリプト化です。この記事では1層目と2層目を中心に、3層目には簡単に触れます。
GUIを使わない運用には、主に3つのメリットがあります。
1つ目はリソースの節約です。ブラウザを起動しないため、GPUメモリやCPUリソースを画像生成に集中できます。特にVRAMが限られるクラウドGPU環境では大きな差になるでしょう。
2つ目は自動化との親和性です。コマンドラインから起動・実行できるため、スクリプトやスケジューラとの組み合わせが容易になります。人手を介さない完全自動のパイプライン構築。
3つ目はリモート運用のしやすさです。SSHでサーバーに接続し、CLIだけで操作できるため、デスクトップ環境がないLinuxサーバーでも問題なく動かせます。
想定される活用シーン
ヘッドレス実行が役立つシーンは多岐にわたります。代表的なものを挙げてみましょう。
- 数百枚の画像を夜間にまとめて生成するバッチ処理
- GitHub ActionsなどのCI/CDで画像アセットを自動生成するワークフロー
- クラウドGPUサーバー上での常時稼働サービス
- cronやタスクスケジューラによる定時実行
実務では、建築パースのバリエーションを大量に生成する場面でヘッドレスモードが重宝します。設定ファイルを用意しておけば、就業後に自動で処理を回せるからです。
ComfyUIヘッドレス起動の基本設定
–disable-auto-launchオプションで起動する
ComfyUIをヘッドレスモードで起動する最もシンプルな方法は、--disable-auto-launchオプションを付けることです。このオプションを指定すると、起動時にブラウザが自動で開かなくなります(2026年4月現在)。
python main.py --disable-auto-launch
起動後もAPIサーバーはデフォルトでhttp://127.0.0.1:8188で待ち受けます。ブラウザが開かないだけで、サーバー機能はすべて利用可能です。
公式comfy-cliでCLIを一本化する
Comfy-Orgが提供する公式CLIツールcomfy-cliを使うと、環境構築から起動までコマンド一本で完結できます。
pip install comfy-cli
# ComfyUI本体のインストール
comfy install
# モデルのダウンロード
comfy model download --url <モデルURL>
# カスタムノードの追加
comfy node install <ノード名>
# ヘッドレス起動
comfy launch -- --disable-auto-launch
comfy launchに続く--以降の引数は、内部でComfyUI本体に渡されます。モデルやカスタムノードの管理もGUIを開かずに進められるため、サーバー環境での構築作業が大幅に簡略化されます。
–listenと–portでネットワーク設定する
ローカルマシン以外からAPIにアクセスしたい場合は、--listenオプションでリッスンアドレスを変更します。
python main.py --disable-auto-launch --listen 0.0.0.0 --port 8188
--listen 0.0.0.0を指定すると、すべてのネットワークインターフェースからの接続を受け付けます。--portでポート番号の変更も可能です。
セキュリティの観点から、外部公開する場合はファイアウォールやリバースプロキシの設定を必ず併用してください。認証なしでAPIが公開されると、第三者に不正利用されるリスクがあります。
そのほかの主要な起動オプション
ヘッドレス運用で知っておきたいオプションをまとめます(2026年4月時点で提供されている主要オプション)。
| オプション | 効果 |
|---|---|
--cpu | GPUを使わずCPUのみで実行 |
--highvram | VRAM使用量の上限を引き上げ |
--lowvram | VRAM使用量を抑えて実行 |
--disable-api-nodes | APIノードの読み込みを無効化 |
--preview-method none | プレビュー生成を無効化し速度を優先 |
--quick-test-for-ci | CI向けのミニマム起動(動作確認用) |
サーバー運用では--preview-method noneを併用すると、プレビュー画像の生成をスキップできます。GUIで確認しないなら不要な処理のため、わずかですが速度向上が見込めるでしょう。CI環境で軽く疎通だけ取りたい場合は、--quick-test-for-ciが役立ちます。
API経由でワークフローを実行する手順
主要なAPIエンドポイント5種
ComfyUIが提供する主なAPIエンドポイントは次の5種類です(公式DocsのComfyUI Routes参照、2026年4月現在)。
| エンドポイント | 役割 |
|---|---|
POST /prompt | ワークフローをキューに投入して実行 |
GET /ws | WebSocketで進捗・結果をリアルタイム受信 |
GET /history/{prompt_id} | 実行結果とメタデータを取得 |
GET /view | 生成画像をHTTPで取得 |
POST /upload/{image_type} | 入力画像をサーバーへアップロード |
本番運用では、/viewによる画像取得と/uploadによる入力画像POSTまで押さえておくと、img2imgやControlNetを含む実用ワークフローを組める幅が広がります。
ワークフローJSONをAPIフォーマットで書き出す
ヘッドレス実行の核心は、ワークフローをJSON形式でAPIに送信することです。まずは実行したいワークフローをAPIフォーマットで書き出しましょう。
ComfyUIのGUI上で次の手順を実行します。
- 設定画面で「Dev Mode Options」を有効にする
- ワークフローを構築・テストする
- メニューから「Save (API format)」を選択して保存する
書き出されたJSONファイルには、各ノードのID、クラス名、入力値がすべて含まれます。このJSONをAPIリクエストのボディとして使います。
curlやPythonスクリプトでワークフローを送信する
ワークフローJSONが用意できたら、POST /promptエンドポイントにリクエストを送信します。curlを使った最もシンプルな例は次のとおりです。
curl -X POST http://127.0.0.1:8188/prompt
-H "Content-Type: application/json"
-d '{"prompt": <ワークフローJSON>}'
Pythonスクリプトで送信する場合は、requestsライブラリを使います。
import json
import requests
with open("workflow_api.json", "r") as f:
workflow = json.load(f)
response = requests.post(
"http://127.0.0.1:8188/prompt",
json={"prompt": workflow}
)
prompt_id = response.json()["prompt_id"]
print(f"送信完了: {prompt_id}")
レスポンスに含まれるprompt_idは、実行状況の確認や結果の取得に使う重要な値です。
編集部では、複数のワークフローJSONをリスト化し、forループで連続送信するバッチスクリプトを推奨しています。シード値やプロンプトだけを変えながら数十枚を一括生成する方法が効率的です。
結果取得は2パターン|/view取得かWebSocketストリーミングか
生成結果を受け取る方法は、大きく2パターンあります。どちらを選ぶかは運用要件で決めましょう。
パターン1: SaveImageノード+/viewでHTTP取得
標準のSaveImageノードで画像をサーバーのoutputディレクトリに保存し、/history/{prompt_id}でファイル名を取得したうえで/viewから画像をダウンロードする流れです。永続ファイルが残るためデバッグしやすく、運用側で履歴を追いやすい利点があります。
# 履歴から出力ファイル名を確認
curl http://127.0.0.1:8188/history/<prompt_id>
# /view で画像を取得
curl "http://127.0.0.1:8188/view?filename=<ファイル名>&type=output"
-o result.png
パターン2: SaveImageWebsocketノード+WebSocketストリーミング
SaveImageWebsocketノードを使うと、画像バイナリがWebSocket経由で直接送られてきます。ディスクに書き出さずメモリで処理できるため、短命タスクを大量に捌くAPIサービス用途や、ストレージ容量を節約したい場面に向きます。
WebSocketで進捗を監視する
実行の進捗をリアルタイムで追跡するには、/wsエンドポイントへのWebSocket接続を利用します。
import websocket
import json
ws = websocket.WebSocket()
ws.connect("ws://127.0.0.1:8188/ws")
while True:
message = json.loads(ws.recv())
if message["type"] == "executing":
node = message["data"].get("node")
if node is None:
print("実行完了")
break
print(f"実行中: ノード {node}")
executingメッセージのnodeがNoneになったタイミングが実行完了の合図。長時間バッチでも進捗をログに残しやすい構造です。
サーバーを立てずワークフロー単独実行する(上級)
ComfyUIサーバーを立ち上げず、Pythonスクリプト単体でワークフローを実行するパターンも存在します。内部APIのWorkflowExecutorやExecutionCacheを直接呼び出してコードから実行する手法で、HTTPオーバーヘッドを排除できる点が魅力。
ただし、内部APIはバージョンアップで仕様が変わる可能性があり、更新追従の手間が発生します。長期運用ではサーバー+API方式のほうが安定することが多く、本格導入の前にメンテナンスコストを見積もっておきましょう。
cronやタスクスケジューラで定時バッチ実行する
Linuxのcronで定期実行を設定する
ComfyUIサーバーが常時起動している前提で、cronからAPIリクエストを定期送信する方法を紹介します。
まず、ワークフローを送信するシェルスクリプトを作成します。
#!/bin/bash
# generate.sh
curl -s -X POST http://127.0.0.1:8188/prompt
-H "Content-Type: application/json"
-d @/path/to/workflow_api.json
このスクリプトをcronに登録すれば、指定時刻に自動で画像生成が走ります。
# 毎日午前2時に実行
0 2 * * * /path/to/generate.sh >> /var/log/comfyui-batch.log 2>&1
ログをファイルに出力しておくと、実行結果の確認やエラーの追跡に役立ちます。
Windowsタスクスケジューラで自動化する
Windows環境では、タスクスケジューラを使って同様の定時実行が可能です。
PowerShellスクリプトを用意します。
# generate.ps1
$workflow = Get-Content "C:ComfyUIworkflow_api.json" -Raw
$body = @{ prompt = ($workflow | ConvertFrom-Json) } | ConvertTo-Json -Depth 100
Invoke-RestMethod -Uri "http://127.0.0.1:8188/prompt" -Method Post -Body $body -ContentType "application/json"
タスクスケジューラで「基本タスクの作成」からこのスクリプトを登録すれば、指定したスケジュールで自動実行されます。実務では、業務終了後の20時に建築パースのバリエーション生成を仕込んでおくといった使い方が考えられるでしょう。
CI/CDパイプラインやサーバー常時稼働に組み込む
GitHub Actionsでの活用とcm-cliによるノード同期
ComfyUIのヘッドレス実行は、CI/CDパイプラインにも組み込めます。GitHub Actionsでリポジトリにプッシュされたワークフローを自動実行し、生成画像をアーティファクトとして保存する構成が代表例です。
基本的な流れは次のとおり。
- GPU対応のセルフホストランナーを用意する
- ComfyUI-Manager付属の
cm-cliでカスタムノードを宣言的にセットアップする - ComfyUIをヘッドレスモードで起動する
- ワークフローJSONをAPIに送信する
- 生成結果をアーティファクトとしてアップロードする
cm-cliはComfyUI本体を起動せずカスタムノードの一括インストール・更新・無効化を実行できるため、ヘッドレスCI環境での依存関係セットアップに最適。snapshot saveとsnapshot restoreでノード構成をファイルにバージョン管理でき、ランナーごとの環境差分を抑えられます。
GPU対応のCI環境が必要なため、セルフホストランナーやクラウドGPUサービスとの組み合わせが現実的な選択肢。ComfyUIのDocker運用については、ComfyUI Docker・クラウドGPU活用ガイドで詳しく解説しています。
systemdサービスとして常時稼働させる
LinuxサーバーでComfyUIを常時稼働させるには、systemdのサービスファイルを作成するのが確実です。
[Unit]
Description=ComfyUI Headless Server
After=network.target
[Service]
Type=simple
User=comfyui
WorkingDirectory=/opt/ComfyUI
Environment=PATH=/opt/ComfyUI/venv/bin:/usr/bin
ExecStart=/opt/ComfyUI/venv/bin/python main.py --disable-auto-launch --listen 0.0.0.0 --preview-method none
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
このファイルを/etc/systemd/system/comfyui.serviceに配置し、次のコマンドで有効化します。
sudo systemctl daemon-reload
sudo systemctl enable comfyui
sudo systemctl start comfyui
Restart=on-failureにより、異常終了した場合も自動で再起動されます。ログはjournalctl -u comfyuiで確認できます。
編集部では、ComfyUI自動化ガイドで自動化の全体像を整理しています。ヘッドレス実行はその中核となる運用手法です。
まとめ
ComfyUIのヘッドレスモードとCLI実行は、画像生成の自動化に必要な基本知識です。
ポイントを振り返ります。--disable-auto-launchオプションでGUIなしの起動が可能です。公式のcomfy-cliを使えば、環境構築から起動までコマンド一本で完結します。API経由で/promptにワークフローJSONを送信し、/viewや/upload、WebSocketまで組み合わせれば、スクリプトだけで画像生成を完結できます。cronやタスクスケジューラと組み合わせれば定時バッチ処理も実現します。systemdサービス化すれば、サーバーでの常時稼働も安定して運用できます。
まずは--disable-auto-launchを付けて起動し、curlでワークフローを1回送信するところから試してみてください。ヘッドレス実行の感覚がつかめたら、バッチスクリプトや定時実行へと段階的に拡張していきましょう。
あわせて読みたい
- ComfyUI自動化ガイド:ヘッドレス実行を含むComfyUI自動化の全体像を整理
- ComfyUI API活用ガイド:APIエンドポイントの詳細仕様やPythonラッパーの実装例を解説
- ComfyUIフォルダ監視で自動生成:特定フォルダへのファイル追加をトリガーに画像を自動生成する方法
- ComfyUI Docker・クラウドGPU活用ガイド:Docker環境でのヘッドレス運用やクラウドGPUの活用方法を紹介

