Dify を Docker Desktop+WSL2 上で運用している環境を、バックアップを取りながら安全に1.7.2 へアップデートした手順をまとめました。なお、Dify1.2.0からDify 1.7.2にバージョンアップしています。
環境
- Windows 11 + Docker Desktop
- WSL2 (Ubuntu) 上に Dify 配置
- Dify のディレクトリ構成(例):
/home/XXXXXX/docker/dify/
├── .env
├── docker-compose.yaml
├── nginx/
├── certbot/
└── volumes/
├── db/
├── weaviate/
├── redis/
├── ...
バックアップ
1. コンテナを停止
$ cd /home/XXXXXX/docker/dify
$ docker compose down
2. volumes ディレクトリをアーカイブ
Dify は ./volumes/ に Postgres や Weaviate などのデータをマウントしているため、ここをバックアップします。
$ sudo tar czfv volumes_$(date +%Y%m%d).tgz volumes
3. 設定ファイルも保存
以下も必ずバックアップしておきます。
- .env
- docker-compose.yaml
- nginx/, certbot/(カスタマイズしている場合)
$ sudo cp .env .env_$(date +%Y%m%d)
$ sudo cp docker-compose.yaml docker-compose.yaml_$(date +%Y%m%d)
$ sudo tar czfv nginx$(date +%Y%m%d).tgz nginx
$ sudo tar czfv certbot$(date +%Y%m%d).tgz certbot
バージョンアップ
1. docker-compose.yaml のイメージタグ更新
services:
api:
image: langgenius/dify-api:1.7.2
web:
image: langgenius/dify-web:1.7.2
worker:
image: langgenius/dify-api:1.7.2
- docker-compose.yamlで
worker:
image: langgenius/dify-worker:1.X.X
の場合があります。この場合も1.7.2を指定すればOKです。
補足:dify-worker がない場合 にジャンプを参照ください。
2. 新しいイメージを取得
$ sudo docker compose pull
3. コンテナを再起動
$ sudo docker compose up -d
4. マイグレーション確認
DB マイグレーションが自動で走るのでログを確認します。
$ sudo docker compose logs -f api
api-1 | /bin/bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
api-1 | /entrypoint.sh: line 7: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
api-1 | Running migrations
api-1 | 2025-08-23 08:45:59.971 INFO [MainThread] [utils.py:164] - NumExpr defaulting to 8 threads.
api-1 | Preparing database migration...
api-1 | Database migration skipped
api-1 | [2025-08-23 08:46:15 +0000] [1] [INFO] Starting gunicorn 23.0.0
api-1 | [2025-08-23 08:46:15 +0000] [1] [INFO] Listening at: http://0.0.0.0:5001 (1)
api-1 | [2025-08-23 08:46:15 +0000] [1] [INFO] Using worker: gevent
api-1 | [2025-08-23 08:46:15 +0000] [28] [INFO] Booting worker with pid: 28
api-1 | 2025-08-23 08:46:30.390 INFO [MainThread] [utils.py:164] - NumExpr defaulting to 8 threads.
エラーがなければアップデート完了です。
ロールバック(失敗時)
万一アップデートが失敗したら、以下で戻せます。
$ sudo docker compose down
$ sudo rm -rf volumes
$ sudo tar xzf volumes_YYYYMMDD.tgz
その後、旧バージョンの docker-compose.yaml に戻して再起動します。
ポイント
- 最重要データは volumes/db/(Postgres)。ここを失うとユーザーや知識ベースが消えるので必ずバックアップ。
- weaviate/(ベクトルDB)や app/(アップロードファイル)も実運用では重要。
- Redis や Sandbox はキャッシュ系なので、必須ではないがまとめて tar にしておくと安心。
-アップデート後は必ず Web UI にログインしてバージョンが 1.7.2 になっているか確認。
まとめ
- 設定ファイル+volumes/ をバックアップすれば安全にアップデートできる
- docker-compose.yaml のイメージタグを 1.7.2 に変更して pull → up -d するだけ
- 失敗しても tar バックアップからリストア可能
これで WSL2 上の Docker Desktop 環境でも安心して Dify を 1.7.2 にアップデートできます。
補足:dify-worker がない場合
Dify を Docker で運用していると、docker-compose.yaml の中に dify-worker コンテナが無い場合があります。
dify-worker とは?
Dify には以下の2種類の処理があります。
- API サーバー処理(REST/GraphQL 経由でフロントや外部と通信)
- バックグラウンド処理(Embedding 生成、メール送信、ジョブキューなど非同期処理)
このバックグラウンド処理を担うのが worker サービス です。
一部の構成では dify-worker という名前で定義されています。
dify-api イメージで兼用できる
実は worker 用の専用イメージは存在せず、dify-api イメージを兼用しています。
コンテナの役割は 起動コマンド (command) の違いで切り替えます。
典型的な docker-compose.yaml はこうなります:
services:
api:
image: langgenius/dify-api:1.7.2
command: api # API サーバーを起動
worker:
image: langgenius/dify-api:1.7.2
command: worker # バックグラウンド処理を担当
つまり 同じイメージを二役で使う構成になっています。
メリット
- ビルドや更新が楽
→ dify-api イメージひとつを pull すれば OK。 - 役割を分けてスケール可能
→ API は2コンテナ、Workerは4コンテナ…のように独立してスケールアウトできる。 - 安定運用
→ API が重くても Worker を別コンテナで走らせるので、レスポンス遅延を回避できる。
まとめ
- dify-worker という専用コンテナは存在しない
- 実際は dify-api イメージを API と Worker の2役に使っている
- command: api でAPIサーバー、command: worker でバックグラウンド処理
- スケールアウトや負荷分散も柔軟にできる
補足:困ったときは?
-
docker compose config --services
でサービス一覧を確認する -
docker compose logs -f worker
でバックグラウンドジョブが流れているかを確認する - Embedding 処理が詰まるようなら Worker コンテナを増やすと改善する
補足:
バージョンアップ後に、プラグインをインストールしようと思い、プラグイン画面を表示すると下記のようなエラーが画面右上に表示され、インストールができませんでした
Failed to parse response from plugin daemon to PluginDaemonBasicResponse [PluginListResponse], url: plugin/acafe0f8-81f2-42fe-a806-abef95d33ff3/management/list
いろいろと探してみたところ、下記記事にあるように、difyの1.7.2ではplugin_daemonを0.2.0に変更することが必要ということだった。
下記のようにdocker-compose.yamlを更新し
plugin_daemon:
# image: langgenius/dify-plugin-daemon:0.0.7-local
image: langgenius/dify-plugin-daemon:0.2.0-local
pluginとapiを立ち上げ直せばOK
$ docker compose pull plugin_daemon && docker compose up -d plugin_daemon api