Difyのバージョンアップ

## はじめに
クラウド環境にてDifyをバージョンアップした際の作業内容を記載しています。
当初、Difyをアンインストールせずにバージョンアップを試みたところ、GUIの確認時に「Internal Server Error」が表示され、正常に起動しませんでした。
Difyの設定内容が未定義であったため、Helmを使用してアンインストールとインストールを行う方法を採用しています。
既に設定している場合は他の方法やバックアップ取得を推奨します。
>注意：アップグレードの前にデータベースのバックアップを行ってください。アップグレードが失敗した場合、迅速にバージョンをロールバックしてデータベースを復元することができます。

https://enterprise-docs.dify.ai/ja-jp/deployment/advanced-configuration/dify-helm-chart#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%BE%E3%81%9F%E3%81%AF%E3%82%A2%E3%83%83%E3%83%97%E3%82%B0%E3%83%AC%E3%83%BC%E3%83%89

## ツール
使用しているツールは以下です。
HelmはKubernetes上でのアプリケーション管理を支援するツールで、Difyはその上で動作するアプリケーションの一つです。
* Kubernetes
クラウド環境は[IBM Cloud Kubernetes Service（IKS）](https://cloud.ibm.com/docs/containers?topic=containers-overview)を使用しています。
>Kubernetes (K8s)は、デプロイやスケーリングを自動化したり、コンテナ化されたアプリケーションを管理したりするための、オープンソースのシステムです。

https://kubernetes.io/ja/

* Dify
>DifyはオープンソースのLLMアプリ開発プラットフォームです。RAGエンジンを使用して、エージェントから複雑なAIワークフローまでLLMアプリを編成します。

https://dify.ai/jp

* Helm
>Helm は、Kubernetes アプリケーションの管理を支援します。

https://helm.sh/ja/

## バージョンアップ
1. values.yaml取得
以下のコマンドで現在のDifyの設定をローカル環境にダウンロードします。
こちら設定ファイル（`values.yaml`）を使用して、後続の手順で新しいバージョンへ変更する設定を行います。
    ```s
    $ helm get values dify -a -o yaml > values.yaml
    ``` 

1. アンインストール
以下のコマンドを実行し、Difyをアンインストールします。
`release "dify" uninstalled`が表示されると完了です。
参考：[helm公式サイト アンインストール](https://enterprise-docs.dify.ai/ja-jp/deployment/advanced-configuration/dify-helm-chart#%E3%82%A2%E3%83%B3%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
    ```s
    $ helm uninstall dify
    release "dify" uninstalled
    ```
1.  デプロイ
以下を参考にデプロイしています。
参考：[Upgrade](https://artifacthub.io/packages/helm/douban/dify#upgrade)
    * values.yamlの編集
    上記「1.values.yaml取得」でローカル環境にダウンロードしたファイルを編集します。
    ファイル内の「global:」＞「images:」>「tags:」にバージョンを記載します。
    以下では今回適用する「1.1.3」を指定しています。
    ```yaml
    global:
        image:
            tag: 1.1.3
    ```
    * インストール
    Helmコマンドを使用して新しいバージョンをインストールします。
    以下のコマンドは、Difyがインストールされていない場合は新たにインストールされます。インストールされている場合は、指定されたvalues.yamlファイルに基づいてアップグレードされます。
    ```s
    $ helm upgrade --install dify douban/dify -f values.yaml
    Release "dify" does not exist. Installing it now.
    ```
    * 内容の反映
        以下のコマンドを実行するにより、アプリケーションが新しいバージョンのデータ構造に適応し、正常に動作する準備が整います。
    「INFO  [alembic.runtime.migration] 」が100行程表示されて終了します。
    ```s
    $ kubectl exec -it dify-pod-name -- flask db upgrade
    INFO  [alembic.runtime.migration] Context impl PostgresqlImpl.
    INFO  [alembic.runtime.migration] Will assume transactional DDL.
    INFO  [alembic.runtime.migration] Running upgrade ...
    .
    .
    .
    ```
1. 確認
    * Podの起動確認
     以下コマンドを実行し、出力の`NAME`が「dify-」で始まるものは全て起動していることを確認します。
    数分で`READY`が`1/1`、`STATUS`が`Running`になりました。
    ※kubectlコマンドのネームスペースは `<namespace>` に置き換えています。
    ※`NAME`は一部マスキングしています。
    ```s
    $  kubectl -n <namespace> get pod
    NAME                                    READY   STATUS              RESTARTS      AGE
    dify-api-****************               1/1     Running             1 (38s ago)   68s
    dify-frontend-****************          1/1     Running             0             68s
    dify-minio-****************             1/1     Running             0             68s
    dify-plugin-daemon-************         1/1     Running             0             68s
    dify-postgresql-0                       1/1     Running             0             68s
    dify-redis-master-0                     1/1     Running             0             68s
    dify-sandbox-****************           1/1     Running             0             68s
    dify-worker-****************            1/1     Running             1 (45s ago)   68s
    .
    .
    .
    ```
     * DifyのGUI確認
     初回登録、ログイン後にトップページ右上のアカウントを押下します。
     「Difyについて」の右側に今回指定したバージョン「1.1.3」が表示されていることを確認しました。
     ※ メールアドレス等はマスキングしています。
     ![dify_login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4069210/6d6c9515-2574-4ae0-8475-75fbe3e69c15.png)
以上でDifyのバージョンアップが完了しました。

## おわりに
今後Difyの整備を進める中でバージョン変更が必要になった場合は、アンインストールを行わずにアップグレードする方法の調査が求められます。その際、関連するアプリケーションとの互換性を確認し、アップグレード前に適切なバックアップの取得対象を検討することも重要になると考えます。