最近 Open WebUI をメインの LLM フロントエンドにしようとしているのですが、起動が遅いのが残念ポイントの一つ。とりあえずlaunchctl
で macOS にログインしたときに自動で起動するようサービス化したら「起動待ち」ストレスがなくなりました。
Open WebUI に限らず CLI で動くものは全て同様の方法でサービスとして追加できるはずです。簡単かと思ったら微妙にハマったのでやりかたを共有します。ログローテーションの自動化も行っています。
環境の準備
pip
でインストールした Open WebUI (または何らかの CLI ツールなど) がある方は次に進んでください。
こらから構築する方は、何らかの Python 仮想環境を作り、pip install open-webui
でインストールしてください。何でもいいから仮想環境の作り方をもっと詳しく教えてくれ、という方はこちら (↓) の記事を参考に、OpenWebUI
フォルダにpipenv
環境を作ると、以降の作業がちょっと楽かもしれません (↓が英語ページが開いたらこちらの日本語ページをどうぞ)。
Docker で Open WebUI を動かしている場合にどうするのかは知りませんごめんなさい。
Open WebUI の簡単な実行方法などはこちら (↓が英語ページが開いたらこちらの日本語ページをどうぞ):
設定ファイル (plist)
まず、本記事では自分がログインしたときにのみ実行するようにするので、ファイルの保存先は~/Library/LaunchAgents/
になります。
以下に設定ファイルの例を貼っておきますのでご自身の環境に合わせて書き換え、com.openwebui.plist
みたいな名前で保存してください。
変更が必要なところはハイライトしています。主にユーザ名 (handsome
のところ) やコマンドまでのパス、変更していればポート番号等ですかね。その他はコメントを見てもらえれば分かるかと思います。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!-- ラベル(サービス名) -->
<key>Label</key>
<string>com.openwebui</string>
<!-- 実行するコマンド -->
<key>ProgramArguments</key>
<array>
<!-- ここは open‑webui があるパスに合わせて変更 -->
<string>/Users/handsome/Documents/Python/OpenWebUI/.venv/bin/open-webui</string>
<!-- 必要に応じてオプションを追加 -->
<string>serve</string>
<string>--host</string>
<string>0.0.0.0</string>
<string>--port</string>
<string>8080</string>
</array>
<!-- 実行するディレクトリ -->
<key>WorkingDirectory</key>
<string>/Users/handsome/Documents/Python/OpenWebUI</string>
<!-- ログイン時に自動起動 -->
<key>RunAtLoad</key>
<true/>
<!-- 失敗したら自動再起動 -->
<key>KeepAlive</key>
<true/>
<!-- 標準出力・エラーをログファイルに書き込む -->
<key>StandardOutPath</key>
<string>/Users/handsome/Library/Logs/openwebui/openwebui.log</string>
<key>StandardErrorPath</key>
<string>/Users/handsome/Library/Logs/openwebui/openwebui.err</string>
</dict>
</plist>
ちなみにここでボクがハマったポイントは、全てフルパス (absolute path) で書く必要があったというところと、WorkingDirectory
が必要だった、というところです。
ログローテーションの準備
ログの書き出し・ローテーションは不要、という方は、上の設定ファイルの 34-38行を削除し、このセクションを飛ばして大丈夫です。
ログローテーション (たまったログを自動でアーカイブしたり削除したりという処理) は、macOS 標準のnewsyslog
の力を借ります。ここでの作業は一部管理者権限が必要なのでご注意ください。
まずは、ログの保存先ディレクトリを作りましょう。
mkdir -p ~/Library/Logs/openwebui
次にローテーションの定義ファイルを書きます。管理者権限でお好きなエディタで書いてください。vi
を使う場合は以下の様な感じす。最後の行だけあれば OK ですが、少なくとも上記で作ったフォルダのパスと、その後の owner (handsome
をご自身のユーザ名に) だけは書き換えてください。
sudo vi /etc/newsyslog.d/com.openwebui.conf
# logfilename [owner:group] mode count size when flags [/pid_file] [sig_num]
/Users/handsome/Library/Logs/openwebui/openwebui.* handsome:staff 644 7 * $D03 JG
※こちらの情報を大いに参考にさせていただきました: ログローテート / newsyslog (メモとかメモのようなものとか (By ルーキーの中のひと) 様、ありがとうございます!
設定している内容としては、以下となります:
/Users/handsome/Library/Logs/openwebui/openwebui.*
で対象のファイルを指定- ログファイルのオーナーとグループを指定 (
ユーザ名:staff
) ← ここを間違うとエラーコード 78 で起動に失敗します! - パーミッションは
644
7
世代残す- サイズは考慮しない (
*
) - 毎日 (
$D
) 03:00 時 AM (03
) に実行 - bzip2 で圧縮
(上に太字で書た通り、オプションとなっていますがowner:group
を書かなかったり間違えたりするとパーミッションの問題が発生しサービスが起動しません。ボクはハマりました)
構文のチェックと次回のローテーションの内容などは以下で確認できます:
newsyslog -nv
ログをリアルタイムで表示するには当然、tail -f
が使えます:
tail -f /Library/Logs/openwebui/openwebui.log
サービスの追加、確認、停止
先ほど書いた設定をユーザサービスとして追加 (ロード) します。永続的に設定する-w
を忘れずに。
launchctl load -w ~/Library/LaunchAgents/com.openwebui.plist
設定にKeepAlive
を付けてあるのでロードした瞬間 Open WebUI が起動を始めるはずですが、試しにログアウト・ログインして確認しても良いでしょう。
サービスが動いているかどうかは以下のコマンドで確認できます:
launchctl list | grep openwebui
以下は実行例です。一つ目がプロセス ID または-
(停止中)で、次がステータスコード、最後がラベル名になります。この例では無事動いている状況が分かりますが、-
の後に0
以外の数字があると何らかの理由でサービスが起動に失敗しているということですので、ステータス (終了) コードをググって解決してください。
% launchctl list | grep openwebui
5932 0 com.openwebui
Open WebUI をアップデート (pip install -U open-webui
) するときなどは、サービスを一端停止 (アンロード) します:
launchctl unload ~/Library/LaunchAgents/com.openwebui.plist
アップデート後は再度ロードするなりログアウト・ログインでサービスが起動します。
永続的に解除する場合は-w
を付けてあげます:
launchctl unload -w ~/Library/LaunchAgents/com.openwebui.plist
以上でございます!
【雑記】で、Open WebUI はどうか
今のところ、あんまし良くないなーという感想です。全部の機能を使ったわけじゃないのであれですけど。
中でも特に良くないのは、LLM からのレスポンスが長いとブラウザでの表示がどんどん遅くなり、LLM の生成が終わっているのにまだトロトロと表示を続け、最悪のケースではそのうち表示が全くされなくなっちゃうことがある、ってところですね。LLM 側 (MLX-LM で実行) は生成がとっくに終わってるので、ブラウザへの描画が遅いのかな、と思います (Safari が顕著、Chrome でも発生)。
あと、なぜか gpt-oss で顕著なのですが、同じ文章のリピートが頻発します。Dify だとほぼ問題無いので、Open WebUI で「デフォルト」となっている設定のどれかが原因になっているのか、ちょっとまだ分かっていません。
モデルのデフォルト設定をいじる画面に行くまでが遠いのもちょっと面倒です。チャット画面でデフォルト設定が反映されているかどうかも分かりづらいし。例えばモデルの設定で max_tokens に数値を入れていたとしても、チャットコントロールで「デフォルト」をクリックすると 128 になっていて混乱します。
また、gpt-oss は reasoning/thinking の頭とケツに決まったタグが入るのでそこを隠すことができるのですが (別記事に書きました)、Qwen3-30B-A3B Thinking なんかだと思考の頭にはタグがありません。Reasoning Tags の End Tag だけに </think> を入れると、なぜか推論の後の生成部分も思考として隠されてしまいます。当然開かないと中身は見れません。

Issue をあげれば直してもらえそうですが、まだあまり Open WebUI にハマりきっておらず、ちょっと二の足を踏んでいる感じです。
Image by Stable Diffusion (Mochi Diffusion)
家事代行サービスは女性にお願いしたい、と思うのは差別的な考えでしょうか。せめて批判を避けようと、エプロンがアンミラのようになっていないのを選択。
Date:
2025年9月13日 0:29:40
Model:
realisticVision-v51VAE_original_768x512_cn
Size:
768 x 512
Include in Image:
house-keeping service lady
Exclude from Image:
Seed:
2859808184
Steps:
23
Guidance Scale:
20.0
Scheduler:
DPM-Solver++
ML Compute Unit:
CPU & GPU