Difyのワークスペースの名前を変更したい！

![1042c03735a1e3ef5a740fa23e7024b7.webp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3734397/15904ee7-0c25-b3b6-b2ef-87bf9cb578fc.png)

Difyをローカル環境にインストールしました。
ワークスペースの名前が、 "自分's Workspace"になっていて、これを変更したかったので調べて自分の手順をまとめておきます。

## 公式ドキュメントを探してみた

ワークスペースの名前変更について調べたところ、FAQに１行だけ記述がありました。

https://docs.dify.ai/v/ja-jp/learn-more/faq/install-faq

```text
7. ローカル展開バージョンでスペースの名前を変更する方法は？
データベースのtenantsテーブルを直接修正してください。
```

？？？えーと？？？

たぶんDockerとかデータベースに詳しい人なら、これだけで出来るんでしょうか？
素人な自分にはハードル高めです。

色々調べてみた結果をまとめておきます。

## Difyの環境を見てみよう

既にDifyをインストールした人ならわかっているはずですが、Difyは複数のDockerイメージで動いています。その中にデータベースがあるはず？
まず、何が動いているのか確認します。コマンドは`docker ps`です。

```bash
user@ub24x01 $ docker ps
CONTAINER ID   IMAGE                              COMMAND                   CREATED       STATUS                 PORTS                                                                      NAMES
092be184da5b   nginx:latest                       "sh -c 'cp /docker-e…"   2 hours ago   Up 2 hours             0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   docker-nginx-1
7158a9594e63   langgenius/dify-api:0.7.3          "/bin/bash /entrypoi…"   2 hours ago   Up 2 hours             5001/tcp                                                                   docker-worker-1
ea36e9a10336   langgenius/dify-api:0.7.3          "/bin/bash /entrypoi…"   2 hours ago   Up 2 hours             5001/tcp                                                                   docker-api-1
1d9735fce8d2   semitechnologies/weaviate:1.19.0   "/bin/weaviate --hos…"   2 hours ago   Up 2 hours                                                                                        docker-weaviate-1
399d57ebf89f   redis:6-alpine                     "docker-entrypoint.s…"   2 hours ago   Up 2 hours (healthy)   6379/tcp                                                                   docker-redis-1
fa16051a2f2a   postgres:15-alpine                 "docker-entrypoint.s…"   2 hours ago   Up 2 hours (healthy)   5432/tcp                                                                   docker-db-1
b743515ea1f3   ubuntu/squid:latest                "sh -c 'cp /docker-e…"   2 hours ago   Up 2 hours             3128/tcp                                                                   docker-ssrf_proxy-1
3e3841206725   langgenius/dify-sandbox:0.2.6      "/main"                   2 hours ago   Up 2 hours                                                                                        docker-sandbox-1
eddd625cb248   langgenius/dify-web:0.7.3          "/bin/sh ./entrypoin…"   2 hours ago   Up 2 hours             3000/tcp                                                                   docker-web-1
```

## Difyのデータベースへ接続するには？

postgresっていうイメージがありますね。おそらくこれが"データベース"でしょう。おそらくそこに"tenants"テーブルがあるはずです。

postgresのテーブルを操作するには、psqlコマンドが一般的です。

```bash
user@ub24x01 $ psql
コマンド 'psql' が見つかりません。次の方法でインストールできます:
sudo apt install postgresql-client-common
```

うん、インストールされてない。でも、余計なパッケージは入れたくない。普通はpostgresが動いている環境にはpsqlがあるはず。だから、このpostgresイメージに行けばpsqlがあるはずです。

さて、postgresイメージに行くには？ docker素人が調べて参考にしたのは下記のページ

https://qiita.com/gold-kou/items/44860fbda1a34a001fc1

dockerイメージに接続するには、`docker container exec`です。`docker container attach`はダメです。接続した後でシェルは動いてないし、Ctl+P,Ctl+Qでも抜けられなくなりました。

さっきの、`docker ps`で表示されたpostgresイメージの"CONTAINER ID"を使って接続します。

```bash
user@ub24x01 $ docker container exec -it fa16051a2f2a /bin/ash
/ # ls
bin                         etc                         media                       proc                        sbin                        tmp
dev                         home                        mnt                         root                        srv                         usr
docker-entrypoint-initdb.d  lib                         opt                         run                         sys                         var
/ # psql
psql (15.8)
Type "help" for help.

postgres=# \q
/ # 
```

よし！ psqlコマンドはあるぞ！ 

## データベースの中身を見てみよう
![a22a3a6d30c1b78f700534f8d59c5603.webpのコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3734397/57f10ab9-9c7a-91a3-1d58-0bb4aa483d69.png)

postgresは多少の経験があります。psqlコマンドで接続するには、ユーザ名とデータベース名が必要だったはず。これを確認します。

```bash
user@ub24x01 $ docker container exec -it fa16051a2f2a /bin/ash
/ # psql
psql (15.8)
Type "help" for help.

postgres=# \l
                                                List of databases
   Name    |  Owner   | Encoding |  Collate   |   Ctype    | ICU Locale | Locale Provider |   Access privileges   
-----------+----------+----------+------------+------------+------------+-----------------+-----------------------
 dify      | postgres | UTF8     | en_US.utf8 | en_US.utf8 |            | libc            | 
 postgres  | postgres | UTF8     | en_US.utf8 | en_US.utf8 |            | libc            | 
 template0 | postgres | UTF8     | en_US.utf8 | en_US.utf8 |            | libc            | =c/postgres          +
           |          |          |            |            |            |                 | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.utf8 | en_US.utf8 |            | libc            | =c/postgres          +
           |          |          |            |            |            |                 | postgres=CTc/postgres
(4 rows)

postgres=# 
```

データベース名"dify"があります。これしかないのでコレですね。
Ownerが"postgres"のデフォルトのままなので、特に指定しなくても良さそうです。このままデータベース"dify"に接続します。

```bash
postgres=# \c dify
You are now connected to database "dify" as user "postgres".
dify=# 
```

接続できたので、とりあえずテーブルの一覧を見てみましょう。

```bash
dify=# \dt
                       List of relations
 Schema |               Name                | Type  |  Owner   
--------+-----------------------------------+-------+----------
 public | account_integrates                | table | postgres
 public | accounts                          | table | postgres
 public | alembic_version                   | table | postgres
   ：
 public | tenant_preferred_model_providers  | table | postgres
 public | tenants                           | table | postgres
 public | tool_api_providers                | table | postgres
   ：
 public | workflow_node_executions          | table | postgres
 public | workflow_runs                     | table | postgres
 public | workflows                         | table | postgres
(68 rows)
         
dify=# 
```

テーブル"tenants"がありました。きっとコレだ！ 中身を見てみましょう。

```bash
dify=# select * from tenants;
                  id                  |       name        |                        encrypt_public_key                        | plan  | status |     created_at      |     updated_at      | custom_config 
--------------------------------------+-------------------+------------------------------------------------------------------+-------+--------+---------------------+---------------------+---------------
 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | 自分's Workspace | -----BEGIN PUBLIC KEY-----                                      +| basic | normal | 2024-09-05 03:01:00 | 2024-09-05 03:01:00 | 
                                      |                   | MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyn0cgPw7yGSQe2Dh9Dm1+|       |        |                     |                     | 
                                      |                   | 省略
                                      |                   | TQIDAQAB                                                        +|       |        |                     |                     | 
                                      |                   | -----END PUBLIC KEY-----                                         |       |        |                     |                     | 
(1 row)

dify=# 
```

ここだな。これに違いない。たぶん・・・

## ワークスペース名を変更しよう！

:::note warn
これ以降の操作は、postgresとpsqlとSQLをそれなりに理解していないと危険です。自信のない方は詳しい人にやってもらってください。
:::
nemeを変更する方法について、自分はChatGPTに聞いてみました。`select *`の結果を貼り付けて、"nameを変更するSQLコマンド教えて"

<table>
<tr><th>ChatGPTさん</th></tr>
<tr><td>
name列を書き換えるためのSQLコマンドは、UPDATE文を使用して実行できます。以下は、特定のidを持つ行のnameを新しい値に更新するSQLコマンドです。例えば、idが「xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx」で、nameを「new Workspace」に変更したい場合、以下のようにコマンドを実行します。<br/>
```sql<br/>
UPDATE tenants<br/>
SET name = 'new Workspace'<br/>
WHERE id = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx';<br/>
```<br/>
これにより、指定した行のnameが更新されます。
</td></tr>
</table>

では修正してみましょう。

```bash
dify=# UPDATE tenants SET name = 'みんなのワークスペース'  WHERE id = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx';
UPDATE 1
dify=#
```

テーブルは変更できたみたいです。`select`で確認してみましょう。

```bash
dify=# select * from tenants;
                  id                  |       name        |                        encrypt_public_key                        | plan  | status |     created_at      |     updated_at      | custom_config 
--------------------------------------+-------------------+------------------------------------------------------------------+-------+--------+---------------------+---------------------+---------------
 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | みんなのワークスペース | -----BEGIN PUBLIC KEY-----                                      +| basic | normal | 2024-09-05 03:01:00 | 2024-09-05 03:01:00 | 
                                      |                   | MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyn0cgPw7yGSQe2Dh9Dm1+|       |        |                     |                     | 
                                      |                   | 省略
                                      |                   | TQIDAQAB                                                        +|       |        |                     |                     | 
                                      |                   | -----END PUBLIC KEY-----                                         |       |        |                     |                     | 
(1 row)

dify=# 
```

できてますね。最後に `\q`でpsqlを終了します。

```bash
dify=# \q
/ # 
```

最後に、dockerイメージからexitします。Ctl+D 又は exitコマンドで。

```bash
/ # exit
user@ub24x01 $
```

これで、Difyにログインしてワークスペースの名前を確認したら、ちゃんと変更できていました。

![fcd31dbb8d4b632d98474507f39b62b1.webpのコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3734397/2f16c1bc-d081-6ce6-6fe3-be830b3bb712.png)

## 最後に

管理メニューから変更できるようにして欲しいなあ・・・

## 追記2025/05/09
メニューから変更できるようになったらしいです!
https://qiita.com/ntrlmt/items/760684054763bde436b7#_reference-c594895cafde79442cf9