Closed8

Difyを構築してみたい(DockerでTailscaleを使って)

tabehoudaitabehoudai

環境

  • PC: N100でRAM16GBなミニPC
  • OS: Ubuntu 24.04.1 LTS(Proxmox上のVM)

Tailscale導入済み

tabehoudaitabehoudai

Dockerコンテナの中でTailscaleを動かしていきたい。

Dockerを動かしてるホストマシンからtailnetに参加すると、tailscale serve --https=443できるのはとうぜんひとつだけなので、セルフホスティングするサービスが増えるごとにhttps://[ホスト名].[tailnet name]:[ポート番号]みたいなURLが増えて、これがちょっと覚えにくい。tailscaleだけ使って楽したいけど、ポート番号は覚えたくないしなるべく管理もしたくない。

Tailscale公式のDockerイメージを使うと、比較的簡単にDockerコンテナ内でtailscaleが使える。
Dockerでホスティングするサービスごとにtailnetに参加させて、https://dify.[tailnet name]のようにサービス名がわかりやすく、ポート指定不要なURLにする。

TailscaleのDockerイメージ、パラメータなど:
https://tailscale.com/kb/1282/docker
Tailscaleコンテナ利用compose.ymlのサンプルリポジトリ:
https://github.com/tailscale-dev/docker-guide-code-examples
チュートリアル。詳細な手順はこれを見よう:
https://www.youtube.com/watch?v=tqvvZhGrciQ

tabehoudaitabehoudai

difyのdocker-compose.ymlをtailscaleに対応させる準備

httpsに対応させる設定(cliだとtailscale serveで設定するやつ):

  • docker-compose.ymlと同じ階層にディレクトリを作成して、tailscaleのserve設定jsonファイルを置く
    • これをdocker-compose.ymlから参照する
    • 今回はTailscaleのチュートリアルのまんまconfig/dify.jsonにしてる
  • Difyの公開ポートは80みたいです、443へ
  • ${TS_CERT_DOMAIN}の変数の中身はtailscaleが勝手に用意してくれるので気にしない
config/dify.json
{
  "TCP": {
    "443": {
      "HTTPS": true
    }
  },
  "Web": {
    "${TS_CERT_DOMAIN}:443": {
      "Handlers": {
        "/": {
          "Proxy": "http://127.0.0.1:80"
        }
      }
    }
  }
}

servicesのnginxを変更と追記:

  • portsをコメントアウト
    • 設定したままだと、config/dify.jsonで設定したポート番号と衝突してdocker compose up -dするときコケました
    • コンテナの中に閉じ込めておく
  • network_mode: service:dify-tsを追記
docker-compose.yml
     depends_on:
       - api
       - web
-    ports:
-      - '${EXPOSE_NGINX_PORT:-80}:${NGINX_PORT:-80}'
-      - '${EXPOSE_NGINX_SSL_PORT:-443}:${NGINX_SSL_PORT:-443}'
+    # ports:
+    #   - '${EXPOSE_NGINX_PORT:-80}:${NGINX_PORT:-80}'
+    #   - '${EXPOSE_NGINX_SSL_PORT:-443}:${NGINX_SSL_PORT:-443}'
+    network_mode: service:dify-ts

servicesにtailscale追加:

  • 公式サンプルを真似して追加しただけ
  • TS_AUTHKEYの値の後ろに?ephemeral=falseを付けるとAdmin consoleのマシン一覧からEphemeralラベルが消える
  • TS_AUTHKEYのkeyの取得方法やtagの設定方法はチュートリアル動画を見る
docker-compose.yml
+  dify-ts:
+    image: tailscale/tailscale:latest
+    container_name: dify-ts
+    hostname: dify
+    environment:
+      - TS_AUTHKEY=${TS_AUTHKEY}?ephemeral=false
+      - TS_EXTRA_ARGS=--advertise-tags=tag:container --reset
+      - TS_SERVE_CONFIG=/config/dify.json
+      - TS_STATE_DIR=/var/lib/tailscale
+      - TS_USERSPACE=false
+    volumes:
+      - ./config:/config
+      - dify-ts:/var/lib/tailscale
+      - /dev/net/tun:/dev/net/tun
+    cap_add:
+      - net_admin
+      - sys_module
+    restart: unless-stopped
+

volumesに追記:

  • 公式サンプルを真似して追加しただけ
docker-compose.yml
 volumes:
   oradata:
   dify_es01_data:
+  dify-ts:
+    driver: local
tabehoudaitabehoudai

.env

  • TS_AUTHKEYを環境変数にしたので.envに追記する
  • チュートリアル動画を参考にOAuth clientsでkeyを作りましょう
.env
+ # Tailscale OAuth Key: https://login.tailscale.com/admin/settings/oauth
+ TS_AUTHKEY=
tabehoudaitabehoudai

起動します
コンテナ作成に結構時間がかかるね

sudo docker compose up -d

https://dify.[tailnet name]/installにアクセス:
うまくいきました
dify初回起動画面

TailscaleのAdmin consoleにも出てきた:
やったね
tailscaleのmachinesにdifyが表示される

ひとまずデブロイはこれでおしまい。

このスクラップは18日前にクローズされました