Difyのアップデートに失敗

ここ、1週間ほどDifyで試行錯誤して遊んでいます。

0.6.7から0.6.8にバージョンアップすると、OpenAIのGTP-4oが利用できるようになりました。

早速、Dockerで起動しているDifyをdocker-compose downして、アップデート

リポジトリを更新

git checkout main
git pull origin main

Dify起動

cd docker
docker compose up -d

これで更新されたDifyが起動するはずなのですが、docker-compose起動時に下記のエラーが発生

Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: process_linux.go:545: container init caused: rootfs_linux.go:76: mounting "/home/user/docker/compose/dify/docker/volumes/ssrf_proxy/squid.conf" to rootfs at "/etc/squid/squid.conf" caused: mount through procfd: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type

squid.confのマウントが失敗している模様

調査

dify/docker/volumes/ssrf_proxy 内を見てみると、squid.confと言うディレクトリとしてマウントされてました。

原因

difi/docker/volumesディレクトリの所有者がrootとなっており、一般ユーザーでgit pullした際に、パーミッションエラーでリポジトリが取得できてなかったのが原因でした。

解決

sudo で git pullするか、Githubからsquid.confを持ってくるなどして、squid.confのファイルを置くことで、無事起動した。

0.6.8 → 0.6.9

  • docker停止し、リポジトリ取得
$ docker-compose down
$ git checkout main
$ git pull origin main
…
Please move or remove them before you merge.
Aborting

いろいろ変更点や修正したファイルがあるので取得できない。

  • スタッシュを利用する
$ git add docker/docker-compose.yaml
$ git commit -m "my customize"
$ git pull origin main

$ git stash
$ git pull --rebase
$ git stash pop

  • 強制的に取得する場合
    (カスタマイズや修正したファイルがあればバックアップを取っておきましょう)
$ git fetch origin
$ git reset --hard origin/main
error: unable to create file docker/volumes/sandbox/dependencies/python-requirements.txt: 許可がありません
error: unable to unlink old 'docker/volumes/ssrf_proxy/squid.conf': 許可がありません
fatal: Could not reset index file to revision 'origin/main'.

Linux上のdockerで起動していた場合、volumesがroot権限になっていたので、一般ユーザーで実行するとパーミッションエラーが出ます。

$ sudo git reset --hard origin/main
HEAD is now at e60350d95 version to 0.6.9 (#4692)

sudoで取得した場合は、ファイルやディレクトリがroot権限になるので、望まない方は、chownで適宜変更しましょう。(ただし、Difyが正常に起動しなくなる可能性もあるのでご注意を!)

$ cd docker
$ docker-compose up -d

無事、0.6.9へ更新できました。

0.6.11 → 0.6.12

公式でのマイグレーション

  1. Back up your customized docker-compose YAML file (optional)
    cd docker
    cp docker-compose.yaml docker-compose.yaml.$(date +%s).bak
  2. Get the latest code from the main branch
    git checkout tags/0.6.12
  3. Stop the service,Command, please execute in the docker directory
    docker compose down
  4. Back up data
    tar -cvf volumes-$(date +%s).tgz volumes
  5. Upgrade services
    docker compose up -d

    この通りに作業すると、下記のエラーとなった

    $ git checkout tags/0.6.12
    error: pathspec 'tags/0.6.12' did not match any file(s) known to git

    2.の項目が修正されてました。

    git checkout main
    git pull origin main

    結局、いつものように下記のコマンドを実行

    $ pwd
    Dify
    $ cd docker
    $ docker compose down
    
    $ git stash
    $ git pull --rebase
    $ git stash pop

    0.6.12より、docker-compose.yaml内の環境変数が、.envに集約されたので、.envが必須となります。

    (もしくは、非.env環境のDify/docker-legacy内のdocker-compose.yamlを利用する)

    $ pwd
    Dify/docker
    $ cp .env.example .env

    $ docker compose up -d

    git stash popで変更があった場合は、docker-compose.yamlに下記のような変更箇所の記述が入るので、削除しないと起動時にエラーが出る

    <<<<<<< Updated upstream
          - "${NGINX_PORT:-80}:80"
          - "${NGINX_SSL_PORT:-443}:443"
          - opensearch
    =======
          - "80:80"
    >>>>>>> Stashed changes

    バックアップ

    公式ではtarによるバックアップだけど、afio派なので、afioでバックアップ

    find volumes -depth -print | afio -o -z -v volumes-$(date +%s).afio