Difyを構築してみたい(DockerでTailscaleを使って)
はじめてスクラップ機能を使ってみがてら書いてみる。
環境
- PC: N100でRAM16GBなミニPC
- OS: Ubuntu 24.04.1 LTS(Proxmox上のVM)
Tailscale導入済み
docker-compose.ymlと.envを用意する。
公式ドキュメントをなぞる。
git clone https://github.com/langgenius/dify.git
cd dify/docker
cp .env.example .env
dockerでtailscaleコンテナを建てたいので、まだdocker compose up -d
しない。
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イメージ、パラメータなど:
Tailscaleコンテナ利用compose.ymlのサンプルリポジトリ: チュートリアル。詳細な手順はこれを見よう: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が勝手に用意してくれるので気にしない
{
"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
を追記
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の設定方法はチュートリアル動画を見る
+ 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に追記:
- 公式サンプルを真似して追加しただけ
volumes:
oradata:
dify_es01_data:
+ dify-ts:
+ driver: local
.env
- TS_AUTHKEYを環境変数にしたので.envに追記する
- チュートリアル動画を参考にOAuth clientsでkeyを作りましょう
+ # Tailscale OAuth Key: https://login.tailscale.com/admin/settings/oauth
+ TS_AUTHKEY=
起動します
コンテナ作成に結構時間がかかるね
sudo docker compose up -d
https://dify.[tailnet name]/install
にアクセス:
うまくいきました
TailscaleのAdmin consoleにも出てきた:
やったね
ひとまずデブロイはこれでおしまい。
実際にDify使ってみて問題が起きたら更新する