【Windows】Docker DifyとパソコンインストールOllamaでハマったことと解決策

※ 当サイトではアフィリエイト広告を利用しています。リンクは広告リンクも含みます。

この記事は約12分で読めます。

【2026年7月最新情報に更新済み】
初版執筆(2024年)から2年が経過したため、現在の最新環境(Dify v1.x系 / Ollama v0.5+ / Windows 11 + WSL2)における接続トラブル解消法および最新の動作検証内容へ全面的にアップデートしました!

パソコンはWindows。有料の言語モデルAPIキーを使わず、完全無料でローカルLLM環境を構築しました。
構成は DifyはDocker(Docker Desktop)OllamaはWindowsパソコン本体に直接インストール という組み合わせです。
RAG(検索拡張生成)を使ったナレッジ検索付きチャットボットを作成するところまで動作確認しています。

しかし、順調にはいかず右往左往しました。
一番ハマった症状は、ワークフローのオーケストレーション画面(/app/{app_id}/workflow)の右側パネルで、ポインタが砂時計のまま固まって何も操作できなくなる / 接続エラーになる現象 です。
もともとはモデルの登録できないから、チャットボット作成に進んで起きました。モデル登録方法にかんしては、何も作らない状態で設定できるのかはなぞのままですが、とりあえず、登録ができてチャットボットも作れました。(セキュリティ的な判断は自己責任でお願いします)、ナレッジに登録したtxtファイルをもとにローカルLLMが正確に回答することを確認できました!

追加したナレッジ(test.txt)
私の名前はイチゲです
イチゲブログをやっています。
女です
年齢は20歳です

上記、ナレッジは脳内設定です。

バージョン情報(2026年最新動作確認済)

【最新環境(2026/7/30確認)】
・Ollama Version(ollama --version): 0.32.5
・Dify Version: 1.16.1 (Docker Compose版)

【旧環境(2024年執筆時)】
・Ollama: v0.1.44
・Dify: v0.6.11

Ollama単体で動かすよりも、以下のUIツールを組み合わせるのもおすすめです。

DifyとGemini API(無料枠)を使ってみた。どちらも無料!
初版執筆(2024年)から2年が経過したため、2026/7/31に全面リニューアルいたしました。この記事はDifyにGemini APIのAPIキーを無料で取得して設定できるのか確認するのが目的です。私はGoogleアカウントは持っています…
広告
MINISFORUM日本公式ストア

Ollamaと推奨モデルのインストール(2026年最新版)

Ollama本体およびモデルのインストール手順については、以下もご参照ください。

Windows11(Nvidia GPUなし)で無料言語モデル(Phi-4-mini)をOllamaで動かせた!APIも。Pythonも。
2026/7/29、2年前に書いた本記事を最新版に全面リニューアルしました。ollamaに限った話ではないですが、パソコンに何かをインストールするときは自己責任でお願いします。以下のようなことがあったようです。↓注意喚起から始まりましたが、…

その他、DockerDesktopとgitが必要です。

推奨モデル(2024年 → 2026年のアップデート)

2024年当時は phi3 や llama3 が主流でしたが、現在のローカルLLMはさらに進化しており、以下の軽量モデルを使いました。

  • LLM (推論モデル):
    • phi4-mini
  • Embedding (埋め込みモデル):
    • embeddinggemma (Googleが提供するオープンウェイトモデル)
# LLMの取得
ollama run phi4-mini
立ち上がったら>>>という表示のチャットモードになってるので、
/bye : チャットモードの終了(バックグラウンドで動いてます。)

# 埋め込みモデルの取得
ollama pull embeddinggemma

※ 実行場所はWindowsのコマンドプロンプトやPowerShellならどこでも大丈夫です。
2回目、ollamaが立ち上がってないとき(タスクトレイにollamaがないとき)はollama run phi4-miniでollamaを立ち上げる。


DockerでのDify起動手順

公式ドキュメント:https://docs.dify.ai/getting-started/install-self-hosted/docker-compose

まず、Docker Desktopを立ち上げます。立ち上がった後にDockerDesktopのUIはメモリ節約のために閉じても大丈夫です。バックグラウンド実行されてます。
PowerShellを開き、以下の手順でDifyを起動します。

# Difyの取得と起動

上記公式に出てる以下を実行するために「This command requires git, curl, and jq」と書いてありますが、私のWindows11はcurlとjqが入ってません。このコードの目的は、最新リリースのタグ名を抽出して先頭にくっつけています。
git clone --branch "$(curl -s https://api.github.com/repos/langgenius/dify/releases/latest | jq -r .tag_name)" https://github.com/langgenius/dify.git

ということで、このコマンドは使わず、ここ(https://github.com/langgenius/dify/releases)で最新リリースのタグ名を調べて以下のコマンドで実行しました。
git clone --branch 1.16.1 https://github.com/langgenius/dify.git

cd dify/docker
cp .env.example .env
docker compose up -d

起動後、ブラウザで http://localhost/installにアクセスし、初回管理者アカウント(メールアドレス・ユーザー名・パスワード)を設定します。

【localhostアクセスの仕組みメモ】

 http://localhost/installlocalhost でアクセスできるのは、docker-compose.yaml にて Nginx のポートフォワーディング(80:80)が設定されており、ホストPCのポート80とコンテナのポート80がバインドされているためです。

チャットボットを作ってみる

モデル設定画面が出てこない。

モデル設定の画面が出てこないので「チャットボットを作成する」を作成まで先にやります。

チャットボットを作成する

モデルの設定が終わったら、実際に会話できるアプリ(チャットボット)を作ります。

  1. 画面上部メニューの 「スタジオ」 をクリック。
  2. 「最初から作成」 を選択。
  3. アプリタイプで 「チャットフロー」 を選択し、好きなアプリ名(例: 「マイAIアシスタント」)を入力して「作成する」をクリック。

不具合発生(オーケストレーション(設定画面)が固まる。

対策はこちら↓に書きました。

DifyをDocker(Windows/WSL2)で動かしていたらオーケストレーション画面が固まった話 〜原因はSECRET_KEY〜

モデル登録

DifyがDocker内からローカルのOllamaにアクセスできるようにモデルプロバイダーの設定を行います。

  1. LLMのブロックをクリック→AIモデル
  2. 下にある 「モデルプロバイダー設定」 を選択。
  3. 一覧から 「Ollama」 を探して「インストール」をクリック。
  4. 上の「設定中」にollamaが追加されているので「モデルを追加」
  5. それぞれ以下の内容でモデルを追加します。

LLM(phi4)の追加

  • モデル名phi4-mini(Ollamaでpullした際の正確な名前)
  • モデルタイプLLM
  • ベースURL:
    • Mac / Windows (Docker Desktop):http://host.docker.internal:11434
    • Linux:http://172.17.0.1:11434(またはホストのローカルIPアドレス)
  • 認証名は空欄
  • 最大トークン上限: (例: 4096 や 8192

埋め込みモデル(embeddinggemma)の追加

もう一度Ollamaのモデル追加を開き、埋め込みモデルとして登録します。

  • モデル名embeddinggemma
  • モデルタイプText Embedding(テキスト埋め込み)
  • ベースURL: 上記と同じURL

💡 ポイント

DifyはDockerコンテナ内で動いているため、localhost:11434 だとコンテナ自身を指してしまいエラーになります。ホストOSを指す http://host.docker.internal:11434 などを指定するのがコツです。また、Ollama側の環境変数 OLLAMA_ORIGINS=”*” や OLLAMA_HOST=”0.0.0.0″ が必要な場合があります。

オーケストレーション(設定画面)での操作

作成完了後、アプリの設定画面に移動します。

  1. モデルの選択:画面右上のモデル選択ドロップダウンから、先ほど登録した Ollamaの phi4 を選択します。
  2. プロンプト(指示文)の設定:「指示(System Prompt)」の欄に、AIに与えたい役割を入力します。 入力例: あなたは優秀で親切なAIアシスタントです。 ユーザーからの質問に対して、わかりやすく丁寧な日本語で回答してください。
  3. 動作テスト(プレビュー):プレビュー→画面右側の「Botと話す」エリアでメッセージを送信し、phi4 から返答が届くかテストします。
  4. 公開:問題なく動いたら、画面右上の 「公開する」➔「更新を公開」 をクリックして完了です。

ナレッジ(RAG)を組み込む場合

特定のPDFやテキストデータ(社内文書やマニュアル等)を読ませて回答させたい場合は、embeddinggemma を使ってナレッジを作成します。

  1. メインの画面から左メニューの 「ナレッジ」 ➔ 作成 →「すぐに使えるナレッジベースを作成」 をクリック。
  2. お手元のテキストファイルやPDFをアップロード。
  3. 埋め込みモデル(Embedding Model)の選択画面で Ollamaの embeddinggemma を選択。
  4. 「保存して処理」を押すと、文書がベクトル化(埋め込み化)されて保存されます。
  5. 「チャットフロー」の編集画面に戻って、エディタ上で「開始」と「LLM」の間などの「+」ボタンをクリックする。
  6. メニューから「知識検索」を選択してフローに挿入する。
  7. 追加した知識検索ノードの設定画面で、先ほど作成したナレッジベースを選択する。
  8. LLMノードへの変数連携。「LLM」ノードの設定を開く。
  9. プロンプトのコンテキスト欄をクリック、知識検索{x}resultをクリック。
  10. SYSTEM「あなたは優秀なアシスタントです。 以下の文脈(コンテキスト)の情報のみに基づいて、ユーザーの質問に答えてください。 # コンテキスト(ここで{x}をクリックして「コンテキスト」を選ぶ)」
  11. 自作データを参照して答えるRAGチャットボットの完成です。

個人的メモ

ログイン直後、F12のconsoleタブで見てたら、エラーが出たので
WebのClaude(Sonet5中)に聞いた。

35u0p--v_uva7.js:1 AbortError: signal is aborted without reason
    at Object.onCancel (25j2paowxz1yd.js:1:15838)
    at Object.cancel (25j2paowxz1yd.js:1:9701)
    at u.removeObserver (25j2paowxz1yd.js:1:14330)
    at l.destroy (25j2paowxz1yd.js:1:19176)
    at l.onUnsubscribe (25j2paowxz1yd.js:1:18925)
    at 25j2paowxz1yd.js:1:6629
    at 05nkzfxzmsp8l.js:1:2091
    at m.u (0g-80ofdn50-9.js:1:17166)
    at d (0g-80ofdn50-9.js:1:13135)
    at g (0g-80ofdn50-9.js:1:13366)
(anonymous) @ 35u0p--v_uva7.js:1
(anonymous) @ 2z93kp7ja6dyf.js:1
await in (anonymous)
n @ 2z93kp7ja6dyf.js:1
v @ 2z93kp7ja6dyf.js:1
(anonymous) @ 2z93kp7ja6dyf.js:9
d @ 2z93kp7ja6dyf.js:1
call @ 2z93kp7ja6dyf.js:9
call @ 35u0p--v_uva7.js:1
await in call
(anonymous) @ 35u0p--v_uva7.js:1
queryFn @ 35u0p--v_uva7.js:1
u @ 25j2paowxz1yd.js:1
g @ 25j2paowxz1yd.js:1
start @ 25j2paowxz1yd.js:1
fetch @ 25j2paowxz1yd.js:1
#I @ 25j2paowxz1yd.js:1
onSubscribe @ 25j2paowxz1yd.js:1
subscribe @ 25j2paowxz1yd.js:1
s.onMount @ 05nkzfxzmsp8l.js:1
y @ 0g-80ofdn50-9.js:1
(anonymous) @ 0g-80ofdn50-9.js:1
d @ 0g-80ofdn50-9.js:1
g @ 0g-80ofdn50-9.js:1
q @ 0g-80ofdn50-9.js:1
sub @ 0g-80ofdn50-9.js:1
(anonymous) @ 0g-80ofdn50-9.js:1
iv @ 3_g74v7txtxo3.js:1
up @ 3_g74v7txtxo3.js:1
ud @ 3_g74v7txtxo3.js:1
省略
sQ @ 3_g74v7txtxo3.js:1
sV @ 3_g74v7txtxo3.js:1
sS @ 3_g74v7txtxo3.js:1
(anonymous) @ 3_g74v7txtxo3.js:1
sv @ 3_g74v7txtxo3.js:1
fm @ 3_g74v7txtxo3.js:1
fh @ 3_g74v7txtxo3.js:1

これは基本的に無視して問題ないエラーです。

理由

スタックトレースにqueryFnonSubscribeonMountsubscribeといった関数名が見えます。これはReact Query(TanStack Query)というライブラリが使われている典型的なパターンです。

AbortError: signal is aborted without reason は、React Queryが「進行中のAPIリクエストをAbortControllerで意図的にキャンセルした」ときに出るエラーです。主に以下のようなケースで発生します。

  • ページ遷移やコンポーネントのアンマウント時に、まだレスポンスが返ってきていないリクエストを自動キャンセルする
  • 同じデータに対する新しいリクエストが発生し、古いリクエストを打ち切る(query invalidation / refetch)
  • React 18のStrict Modeによる開発時の二重実行・キャンセル(本番ビルドでは出ないこともあります)

いずれもアプリ側が意図的にリクエストを中断させた結果であり、サーバー側の障害やネットワークエラーではありません。ログイン直後は画面遷移やデータの再取得が連続して走りやすいため、このタイミングで出やすいエラーです。

気にしなくていいケース/確認すべきケース

状況対応
このエラーが出ても画面は正常に表示・操作できる無視してOK
このエラーの後、実際にデータが表示されない・機能しない箇所があるそこだけ具体的にAIに聞いてください。

今回のケースでは、profile/refresh-tokenの401とWebSocketの拒否がすでに解消済みという前提であれば、このAbortErrorは記事に含める必要のない、Dify(というよりReact Queryを使ったSPA全般によくある)無害なノイズとして扱って問題ありません。

所感

2年ぶり(2024年)に使った。この記事を最新版に合わすことが目的で使いました。しかし、実際、自分で活用する用途が思いつかないです。

イチゲをOFUSEで応援する(御質問でもOKです)Vプリカでのお支払いがおすすめです。
MENTAやってます(ichige)
目次へ

タイトルとURLをコピーしました