Ubuntu、Docker Desktop で Dify を作成

## 開発環境

何も問題無く動作することから、 Windows 上の WSL2 などは使用せず、空いているPCに直接 Ubuntu をインストールし、そこに Docker Desktop をインストールしています。

DELL Latitude 7390
メモリ 16GB
Intel Core i7-8650U 1.9GHz 4コア 8スレッド
SSD 256GB

## Xubuntu Desktop インストール

デスクトップの使い易さのために Xubuntu を使用しています。日本語入力をセットアップしますが、画面は英語のままにしています。

xubuntu-24.04.1-desktop-amd64.iso

[Rufus](https://rufus.ie/en/) を使って起動 USB メモリを作成（DVD からだとアクセスが頻発して正常に動作しなかった）
PCの電源を入れて F12キーを押して USB から立ち上げる
デスクトップに表示される Install Xubuntu 24.04.1 LTS アイコンをダブルクリックして、PCへのインストールを開始

Language: English
Keyboard: Japanese
Connect to the internet: Connect to a Wi-Fi network  ※ 先にメニューバーから接続しておく
Your name: webmaster
Your computer's name: noble01
Your username: webmaster
Password: ******
Confirm password: ******

インストールが終わったら、USB メモリを外して起動

OS アップデート
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
再起動

SSH インストール
sudo apt update
sudo apt install openssh-server

外部から SSH で接続
ssh -l webmaster 192.168.1.26
password: ******

Xfce メニュー
メニューから Panel Profiles、Xfce 4.16、Apply Configuration ボタン押下

Application -> Settings -> Xfce Screensaver
60 minutes

Application -> Settings -> Language Support
追加のインストールのためにパスワードを入力
Install / Japanese、Password
但し、画面表示は英語のままで使用する
再起動

ログイン後、バー右上、右クリック、Preference -> Input Method -> Add
Japanese -> Mozc

Preference -> General -> Keyboard Shortcuts
＜Super＞space から ＜Control＞space に変更、Apply ボタン
バー右上、左クリックで Input Mode を Direct input から Hiragana に変更

固定IP
Wifi 接続の場合は、メニューバー右上でマウス右クリック、Edit Connections から設定する
Address: 192.168.1.9
Netmask: 255.255.255.0
Gateway: 192.168.1.1
DNS: 999.999.99.99, 888.888.888.88 ※プロバイダから入手
再起動

よく使うコマンド
pwd
ls -alF
ip addr show
mousepad .env &


## Docker Desktop

下記リンクの手順に従って、Ubuntu に Docker Desktop をインストールします。

[https://docs.docker.com/engine/install/ubuntu/](https://docs.docker.com/engine/install/ubuntu/)
１．Docker の APT レポジトリの設定
＃ Add Docker's official GPG key
＃ Add the repository to Apt sources
２．Docker パッケージのインストール
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
３．hello-world イメージの実行
sudo docker run hello-world

[https://docs.docker.com/desktop/setup/install/linux/ubuntu/](https://docs.docker.com/desktop/setup/install/linux/ubuntu/)
sudo apt install gnome-terminal
docker-desktop-amd64.deb をダウンロード
sudo apt-get update
sudo apt-get install ./docker-desktop-amd64.deb
再起動
メニューから Development > Docker Desktop で起動。または systemctl --user start docker-desktop で起動
ユーザー登録は行わず、skip、skip で Docker Containers の画面が表示される

## Dify

[https://docs.dify.ai/getting-started/install-self-hosted/docker-compose](https://docs.dify.ai/getting-started/install-self-hosted/docker-compose)

mkdir Repos
cd Repos

git clone https:\//github.com/langgenius/dify.git
cd dify/docker
cp .env.example .env
docker compose up -d
インストールが完了すると、Docker Desktop で実行中になる
　

![Screenshot_2025-01-05_11-58-50m.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956789/0c805b6e-bebd-5d17-9783-ee36f7363976.png)

　
ブラウザで  http:\//192.168.1.9/install  または  http:\//localhost/install  を表示

管理者アカウントの設定
Email address
Username
Password

ブラウザで  http:\//192.168.1.9/signin  または  http:\//localhost/signin  を表示
Email と Password でログイン

チャットボットの作成
Studio
Create from Blank
Chatbot　　※ 「初心者向けの基本的なアプリタイプ」に表示される
App Name & Icon：2022 Winter Olympics
Create

Orchestrate
　Instructions （下記）
　Context （下記）

Publish
Update
Run App

LLMモデルの設定
OpenAI
API Key：********
デフォルトのモデルは o1
テストのために gpt-3.5-turbo （カットオフ 2021年9月） に変更

Dify のアップデート
cd ~/Repos/dify/docker
＃.env を変更している場合は、バックアップして、後で戻す
cp .env ~/Documents/20250413_dify/env_20250413_bak
docker compose down
＃念のため設定ファイルをバックアップする
cp docker-compose.yaml ~/Documents/20250413_dify/docker-compose.yaml.$(date +%s).bak
＃念のためデータをバックアップする
tar -cvf ~/Documents/20250413_dify/volumes-$(date +%s).tgz volumes
cd ~/Repos/dify
#自分で変更した所をバックアップして元に戻す（コミットしていないため）
git stash -u
git pull origin main
cd docker
docker compose pull
#.env を自分の設定内容に戻す
nano .env
#docker-compose.yaml を自分の設定内容に戻す
nano docker-compose.yaml
docker compose up -d

HTTPS 化（手順は [こちら](https://github.com/langgenius/dify/blob/main/docker/certbot/README.md)）
ルーターの80と443のポートフォワードを、このPCにする
自分のドメインでこのPCの http://localhost/ が表示されることを確認する
docker/.env の編集。.env に説明にある赤字の項目を設定する
コマンドの実行（Docker Desktop が立ち上がっていること）
cd dify/docker
docker network prune
docker compose --profile certbot up --force-recreate -d
コンテナが作成された後に、
docker compose exec -it certbot /bin/sh /update-cert.sh
docker/.env の（再）編集。.env に以下を設定する
NGINX_HTTPS_ENABLED=true
コマンドの実行
docker compose --profile certbot up -d --no-deps --force-recreate nginx
外部から https://your_domain.com で見れることを確認する
SSL 証明書の更新
docker compose exec -it certbot /bin/sh /update-cert.sh
docker compose exec nginx nginx -s reload

　

![0105_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956789/f3a0a477-b529-9330-7864-2d0a994b9d15.png)


```Instruction.txt
You answer questions about the 2022 Winter Olympics. 
Use the context on the 2022 Winter Olympics to answer 
the subsequent question. If the answer cannot be found, 
write "I don't know."

```

>あなたは2022年冬季オリンピックに関する質問に答えます。2022年冬季オリンピックに関するコンテンツを使って、質問に答えてください。答えが見つからない場合は、「わかりません」と書いてください。

　

![0105_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956789/3d8f2c51-bde9-82cd-2c49-39a885a44314.png)

```Question.txt
Which athletes won the gold medal in curling at the 2022 
Winter Olympics?

```

>2022年冬季オリンピックでカーリングの金メダルを獲得した選手は誰ですか？

```Answer.txt
Niklas Edin, Oskar Eriksson, Rasmus Wran?, Christoffer Sundgren, 
and Daniel Magnusson from Team Sweden won the gold medal in 
men's curling at the 2022 Winter Olympics. Great Britain's 
team, including Bruce Mouat, Grant Hardie, Bobby Lammie, Hammy 
McMillan Jr., and Ross Whyte, won the gold medal in women's
curling. Stefania Constantini and Amos Mosaner from Team Italy
won the gold medal in mixed doubles curling.

```

>2022年冬季オリンピックの男子カーリングで金メダルを獲得したのは、スウェーデンチームのニクラス・エディン、オスカー・エリクソン、ラスムス・ヴラン、クリストファー・スンドグレン、ダニエル・マグヌソンです。女子カーリングでは、イギリスチームのブルース・モウアット、グラント・ハーディー、ボビー・ラミー、ハミー・マクミランJr.、ロス・ホワイトが金メダルを獲得しました。混合ダブルスカーリングでは、イタリアチームのステファニア・コンスタンティーニとアモス・モザナーが金メダルを獲得しました。

## コンテンツ

Dify の Knowledge にコンテンツを追加し、それをチャットボットで参照します。Dify では与えられた資料を小部分（Chunk）に分割し、かつ、部分間を重複させることができますが、今回はコンテンツは1個のファイル（CurlingAtThe2022WinterOlympics.txt）で、下記を設定して1つの文章で登録しています。

Custom
Delimiter: ===== （未使用）
Maximum chunk length: 4000文字
Chunk overlap: 400文字　（原稿用紙1枚分とする）
Embedding Model: text-embedding-3-small　（ベクトル、1536次元）
Vector Search、Top K: 2、Score Threshold: 0.4

元の文章は [こちら](https://cookbook.openai.com/examples/question_answering_using_embeddings) にあったのですが、「2024 Summer Olympics」に書き換わってしまって、参照できなくなってしまいました。

```CurlingAtThe2022WinterOlympics.txt
Curling at the 2022 Winter Olympics

Article
Talk
Read
Edit
View history
From Wikipedia, the free encyclopedia
Curling
at the XXIV Olympic Winter Games
Curling pictogram.svg
Curling pictogram
Venue	Beijing National Aquatics Centre
Dates	2?20 February 2022
No. of events	3 (1 men, 1 women, 1 mixed)
Competitors	114 from 14 nations
← 20182026 →
Men's curling
at the XXIV Olympic Winter Games
Medalists
1st place, gold medalist(s)		 Sweden
2nd place, silver medalist(s)		 Great Britain
3rd place, bronze medalist(s)		 Canada
Women's curling
at the XXIV Olympic Winter Games
Medalists
1st place, gold medalist(s)		 Great Britain
2nd place, silver medalist(s)		 Japan
3rd place, bronze medalist(s)		 Sweden
Mixed doubles's curling
at the XXIV Olympic Winter Games
Medalists
1st place, gold medalist(s)		 Italy
2nd place, silver medalist(s)		 Norway
3rd place, bronze medalist(s)		 Sweden
Curling at the
2022 Winter Olympics
Curling pictogram.svg
Qualification
Statistics
Tournament
Men
Women
Mixed doubles

... 省略 ...

Summary
Nations	Men	Women	Mixed doubles	Athletes
 Australia			Yes	2
 Canada	Yes	Yes	Yes	12
 China	Yes	Yes	Yes	12
 Czech Republic			Yes	2
 Denmark	Yes	Yes		10
 Great Britain	Yes	Yes	Yes	10
 Italy	Yes		Yes	6
 Japan		Yes		5
 Norway	Yes		Yes	6
 ROC	Yes	Yes		10
 South Korea		Yes		5
 Sweden	Yes	Yes	Yes	11
 Switzerland	Yes	Yes	Yes	12
 United States	Yes	Yes	Yes	11
Total: 14 NOCs	10	10	10	114
Competition schedule

The Beijing National Aquatics Centre served as the venue of the curling competitions.
Curling competitions started two days before the Opening Ceremony and finished on the last day of the games, meaning the sport was the only one to have had a competition every day of the games. The following was the competition schedule for the curling competitions:

RR	Round robin	SF	Semifinals	B	3rd place play-off	F	Final
Date
Event
Wed 2	Thu 3	Fri 4	Sat 5	Sun 6	Mon 7	Tue 8	Wed 9	Thu 10	Fri 11	Sat 12	Sun 13	Mon 14	Tue 15	Wed 16	Thu 17	Fri 18	Sat 19	Sun 20
Men's tournament								RR	RR	RR	RR	RR	RR	RR	RR	RR	SF	B	F	
Women's tournament									RR	RR	RR	RR	RR	RR	RR	RR	SF	B	F
Mixed doubles	RR	RR	RR	RR	RR	RR	SF	B	F												
Medal summary
Medal table
Rank	Nation	Gold	Silver	Bronze	Total
1	 Great Britain	1	1	0	2
2	 Sweden	1	0	2	3
3	 Italy	1	0	0	1
4	 Japan	0	1	0	1
 Norway	0	1	0	1
6	 Canada	0	0	1	1
Totals (6 entries)	3	3	3	9
Medalists
Event	Gold	Silver	Bronze
Men
details	 Sweden
Niklas Edin
Oskar Eriksson
Rasmus Wran?
Christoffer Sundgren
Daniel Magnusson	 Great Britain
Bruce Mouat
Grant Hardie
Bobby Lammie
Hammy McMillan Jr.
Ross Whyte	 Canada
Brad Gushue
Mark Nichols
Brett Gallant
Geoff Walker
Marc Kennedy
Women
details	 Great Britain
Eve Muirhead
Vicky Wright
Jennifer Dodds
Hailey Duff
Mili Smith	 Japan
Satsuki Fujisawa
Chinami Yoshida
Yumi Suzuki
Yurika Yoshida
Kotomi Ishizaki	 Sweden
Anna Hasselborg
Sara McManus
Agnes Knochenhauer
Sofia Mabergs
Johanna Heldin
Mixed doubles
details	 Italy
Stefania Constantini
Amos Mosaner	 Norway
Kristin Skaslien
Magnus Nedregotten	 Sweden
Almida de Val
Oskar Eriksson
Teams
Men
 Canada	 China	 Denmark	 Great Britain	 Italy
Skip: Brad Gushue
Third: Mark Nichols
Second: Brett Gallant
Lead: Geoff Walker
Alternate: Marc Kennedy

Skip: Ma Xiuyue
Third: Zou Qiang
Second: Wang Zhiyu
Lead: Xu Jingtao
Alternate: Jiang Dongxu

Skip: Mikkel Krause
Third: Mads N?rg?rd
Second: Henrik Holtermann
Lead: Kasper Wiksten
Alternate: Tobias Thune

Skip: Bruce Mouat
Third: Grant Hardie
Second: Bobby Lammie
Lead: Hammy McMillan Jr.
Alternate: Ross Whyte

Skip: Jo?l Retornaz
Third: Amos Mosaner
Second: Sebastiano Arman
Lead: Simone Gonin
Alternate: Mattia Giovanella

 Norway	 ROC	 Sweden	 Switzerland	 United States
Skip: Steffen Walstad
Third: Torger Nerg?rd
Second: Markus H?iberg
Lead: Magnus V?gberg
Alternate: Magnus Nedregotten

Skip: Sergey Glukhov
Third: Evgeny Klimov
Second: Dmitry Mironov
Lead: Anton Kalalb
Alternate: Daniil Goriachev

Skip: Niklas Edin
Third: Oskar Eriksson
Second: Rasmus Wran?
Lead: Christoffer Sundgren
Alternate: Daniel Magnusson

Fourth: Beno?t Schwarz
Third: Sven Michel
Skip: Peter de Cruz
Lead: Valentin Tanner
Alternate: Pablo Lachat

Skip: John Shuster
Third: Chris Plys
Second: Matt Hamilton
Lead: John Landsteiner
Alternate: Colin Hufman

Women
 Canada	 China	 Denmark	 Great Britain	 Japan
Skip: Jennifer Jones
Third: Kaitlyn Lawes
Second: Jocelyn Peterman
Lead: Dawn McEwen
Alternate: Lisa Weagle

Skip: Han Yu
Third: Wang Rui
Second: Dong Ziqi
Lead: Zhang Lijun
Alternate: Jiang Xindi

Skip: Madeleine Dupont
Third: Mathilde Halse
Second: Denise Dupont
Lead: My Larsen
Alternate: Jasmin Lander

Skip: Eve Muirhead
Third: Vicky Wright
Second: Jennifer Dodds
Lead: Hailey Duff
Alternate: Mili Smith

Skip: Satsuki Fujisawa
Third: Chinami Yoshida
Second: Yumi Suzuki
Lead: Yurika Yoshida
Alternate: Kotomi Ishizaki

 ROC	 South Korea	 Sweden	 Switzerland	 United States
Skip: Alina Kovaleva
Third: Yulia Portunova
Second: Galina Arsenkina
Lead: Ekaterina Kuzmina
Alternate: Maria Komarova

Skip: Kim Eun-jung
Third: Kim Kyeong-ae
Second: Kim Cho-hi
Lead: Kim Seon-yeong
Alternate: Kim Yeong-mi

Skip: Anna Hasselborg
Third: Sara McManus
Second: Agnes Knochenhauer
Lead: Sofia Mabergs
Alternate: Johanna Heldin

Fourth: Alina P?tz
Skip: Silvana Tirinzoni
Second: Esther Neuenschwander
Lead: Melanie Barbezat
Alternate: Carole Howald

Skip: Tabitha Peterson
Third: Nina Roth
Second: Becca Hamilton
Lead: Tara Peterson
Alternate: Aileen Geving

Mixed doubles
 Australia	 Canada	 China	 Czech Republic	 Great Britain
Female: Tahli Gill
Male: Dean Hewitt

Female: Rachel Homan
Male: John Morris

Female: Fan Suyuan
Male: Ling Zhi

Female: Zuzana Paulov?
Male: Tom?? Paul

Female: Jennifer Dodds
Male: Bruce Mouat

 Italy	 Norway	 Sweden	 Switzerland	 United States
Female: Stefania Constantini
Male: Amos Mosaner

Female: Kristin Skaslien
Male: Magnus Nedregotten

Female: Almida de Val
Male: Oskar Eriksson

Female: Jenny Perret
Male: Martin Rios

Female: Vicky Persinger
Male: Chris Plys

```

　

## 作成したアプリのアドレスを変える（名前を付ける）
アプリを作成して公開した際に、任意のIDが付与されたアドレスになってしまい、使用時に分かり難いため、名前が付いたアドレスに変更します。

dify フォルダの docker/nginx/conf.d にある default.conf を、docker フォルダにコピーして、例えば、以下のように編集します。
/localllm が名前で、
https://<foo>localhost</foo>/chat/3OX8aD4bq9iKkQ7F が元のID名でのアドレスです。

```text:default.conf

    ...
    
    location / {
      proxy_pass http://web:3000;
      include proxy.conf;
    }

    location /localllm/ {
        proxy_pass https://host.docker.internal/chat/3OX8aD4bq9iKkQ7F/;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_redirect off;
        proxy_ssl_verify off;
    }

```

docker フォルダの docker-compose.yaml を以下のように編集します。
（./nginx/conf.d:/etc/nginx/conf.d の行は削除）

```text:docker-compose.yaml
  nginx:
  ...
    volumes:
      - ./default.conf:/etc/nginx/conf.d/default.conf
    ...

```

以下のコマンドで、docker を停止・再開すると、設定が反映されます。

docker compose down
docker compose up -d


https://your_dify_address/localllm
にアクセスすると、

https://your_dify_address/chat/3OX8aD4bq9iKkQ7F
（作成したアプリのページ）

が表示されます。


## v0.15.1 から v1.2 へ移行

バージョンアップの方法は以下に記載がありますが、難しいので、あきらめて、新規で v1.2 をインストールします。

[https://docs.dify.ai/ja-jp/development/migration/migrate-to-v1](https://docs.dify.ai/ja-jp/development/migration/migrate-to-v1)

必要であれば、git のユーザー設定を行います（checkout や commit するのに必要）。
git config --global user.email "you@example.com"
git config --global user.name "Your Name"

オーケストレーションの［手順］の内容を、テキストファイルにバックアップします。

スタジオの［名前］もテキストファイルにバックアップし、［検索設定］についてもどこかに控えておきます。

ナレッジの［名前］もテキストファイルにバックアップします。ナレッジの元となった情報については、別途保管されているものとします。

docker compose down

Docker で Dify に関連するすべてのコンテナを削除します。
Repos/dify フォルダを .git や .env などの隠しフォルダ・ファイルも含めて、他の場所へ移動します。

始めに作業した内容と同じ作業を行います。

cd Repos

git clone https://github.com/langgenius/dify.git
cd dify/docker
cp .env.example .env
docker compose up -d

http://localhost/install
管理者アカウントの設定

http://localhost/signin
Email と Password でログイン

HTTPS 化

チャットの作成

LLMモデルの設定

各スタジオ・ナレッジの復元