Kubernetes に Dify をインストールして、Cloudflare Tunnel でインターネット経由で見られるようにしたときの備忘録

Jun 6, 2024, 7:23 AM
Dify が話題でしたので、インストールして使ってみました。結論、「やばい」です。世界を変えるレベルですね。これがオープン・ソースで提供されているのが本当に驚きです。
今後も色々と使ってみたいと思いますが、まずは、Kubernetes にデプロイしたときのメモを残しておきます。



Kubernetes クラスター

Jun 6, 2024, 7:23 AM 現在、microAI のクラスターは、
  • master-01 (Raspberry Pi 5)
  • worker-01 (Raspberry Pi 5)
  • worker-02 (Raspberry Pi 5)
  • jetson-01 (Jetson Orin Nano NX 16G)
  • jetson-02 (Jetson Orin Nano NX 16G)
の合計5台です。すべて arm64 です。Dify が arm64 用にもイメージを用意してくれています。感謝。

helm

https://github.com/douban/charts/tree/master/charts/dify
こちらを利用させていただいてデプロイしていきます。

設定ファイル作成

https://github.com/douban/charts/blob/master/charts/dify/values.yaml
をベースに必要な箇所を書き換えていきます。
sandbox が、なぜか、Raspberry Pi ではエラーを起こしたので、jetson にデプロイするように設定しました。

# nano dify-values.yaml

volumes: []
volumeMounts: []
nameOverride: ""
fullnameOverride: ""

global:
host: "xxx.xxxx.com"
enableTLS: false
image:
tag: "0.6.10"
extraBackendEnvs:
- name: SECRET_KEY
value: "xxxxxxxxxxxxxxxx"
- name: LOG_LEVEL
value: "DEBUG"
- name: VECTOR_STORE
value: "milvus"

ingress:
enabled: true
className: "nginx"
annotations:
nginx.ingress.kubernetes.io/proxy-body-size: 20m

serviceAccount:
annotations: {}
name: ""

frontend:
replicaCount: 1
podAnnotations: {}
nodeSelector:
dify: "true"
affinity: {}

api:
replicaCount: 1
podAnnotations: {}
nodeSelector:
dify: "true"
affinity: {}

worker:
replicaCount: 1
podAnnotations: {}
nodeSelector:
dify: "true"
affinity: {}

sandbox:
replicaCount: 1
podAnnotations: {}
nodeSelector:
jetson: "true"
affinity: {}

redis:
embedded: true
nodeSelector:
dify: "true"

postgresql:
embedded: true
nodeSelector:
dify: "true"

minio:
embedded: true

設定詳細

  • host: "xxx.xxxx.com" : ドメインの設定。ご自身の環境にあわせてください。後にcloudflare で設定してインタネット越しに見えるようにします。
  • tag: "0.6.10"https://github.com/langgenius/dify/releases に記載の最新バージョンを指定します。
  • value: "xxxxxxxxxxxxxxxx" : 自由にシークレットキーを設定してください。ランダムなテキストを入れればOKです。
  • nginx.ingress.kubernetes.io/proxy-body-size: 20m : ファイルアップロードを1ファイル20Mbyte まで許可しています。Dify は 15Mまでなので、それ以上であればよいです。
  • dify: "true" : デプロイしたいノードにラベルを設定し、そのラベルを指定
  • jetson: "true" : こちらも同じです

インストール実行

# helm repo add douban https://douban.github.io/charts/
# helm upgrade dify douban/dify -f dify-values.yaml --install --debug

初期設定

インストール後に1度だけ初期化をする必要があります。
# kubectl get pod | grep dify-worker
dify-worker-54c47b94d7-nhggf 1/1 Running 0 9h
このコマンドででてくる pod 名を使って
# kubectl exec -it dify-worker-54c47b94d7-nhggf -- flask db upgrade
このようなコマンドを作って初期化します。

ローカルからアクセス

インストールが完了したので、自分のPCの hosts などに ingress-nginx-controller の EXTERNAL-IP を設定するとローカルで見られるようになります。
ingress-nginx          service/ingress-nginx-controller                         LoadBalancer   11.1.49.172    10.0.1.0      80:31496/TCP,443:31784/TCP      9d      app.kubernetes.io/component=controller,app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/name=ingress-nginx
の場合、hostsに
10.0.1.0  xxx.xxxx.com
と記載して、ブラウザで http://xxx.xxxx.com にアクセスすれば見ることができます。
あとは、画面に従って初期設定などを行ってください。

Cloudflare Tunnel でインターネット経由で見られるようにする

ここから、おそらく、間違ったやり方ですが、Cloudflare Tunnel を使って、インターネット経由で見られるようにします。
通信は暗号化したいので、https でアクセスしたいのですが、上記で enableTLS: false と設定していると、うまく動いてくれませんでした。

このような流れになるのですが、Dify が、HTML上に http://xxx.xxxx.com のように、プロトコルをハードコーディングしてくるので、https と http が混在してしまいエラーになります。
なので、これを無理やり直していきます。

設定ファイルを変更して無理やり修正

# helm get manifest dify > dify-custome.yaml
# sed -i 's|http://xxx.xxxxx.com|https://xxx.xxxxx.com|g' dify-custome.yaml
# kubectl apply -f dify-custome.yaml
一度、現在の設定ファイルを出力して、ハードコーディングされたURL部分を書き換えて、適用します。
これで、Cloudflare Tunnel 経由でアクセスできるようになります。
※Cloudflare では、ingress-nginx-controller のホストかIPを指定します。 

おまけ

dify-values.yaml の修正を適用する方法

# helm upgrade dify douban/dify -f dify-values.yaml --debug
 

アンインストール方法

# helm uninstall dify
このコマンド1発でアンインストールできます。

Jetson Orin Nano NX 16G で faster-whisper をインストールして文字起こし
Dify で使うためにベクトルDBの Milvus を Kubernetes のクラスターにデプロイして、高品質インデックス化を行うDify で使うためにベクトルDBの Milvus を Kubernetes のクラスターにデプロイして、高品質インデックス化を行う