Dify で複数ユーザーを一括登録するツールを作ってみた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764962/59927f8d-46b4-4b28-a1ca-c94b1053899e.png)
作成日：2025年6月22日(日)

## １．はじめに

私は社内で生成AI活用プロジェクトを推進しており、その一環としてDifyやn8nなどのローコード開発ツールのワークショップを開催しています。

ワークショップでは多数の参加者のユーザ登録が必要です。Difyのユーザ招待機能は便利ですが、招待リンクの生成・配布やワークショップ中のユーザ登録作業に課題がありました。

特に100名規模のワークショップでは、ユーザ登録に時間がかかり進行の妨げとなります。前回は40名分を事前に手作業で登録し、参加者にはサインインのみをしてもらう方式を採用。ワークショップ自体はスムーズでしたが、事務局の準備負担が大きくなりました。

この経験から、Playwright test for VSCodeとPlaywrightを使用して、ユーザ登録を一括で行えるツールを開発しましたので、紹介します。

- [potofo/dify-admin-automator](https://github.com/potofo/dify-admin-automator)

## ２．運用上の課題（ユーザ招待機能）

Dify（v1.4.3）のユーザ招待機能は、あらかじめ準備したユーザのメールアドレスを「チームメンバーを招待する」のメールアドレス欄にコピー＆ペーストすると、招待リンクがユーザに送付される仕組みです。

社内でSMTPサーバを利用できれば、この方式でサインイン用のアカウントを発行できますが、私の会社ではシステムからのSMTPメール送信が禁止されているため利用できません。

過去には、生成された招待リンクを一人ずつExcelに貼り付けて、各自の招待リンクから入ってもらう運用も試みましたが、セキュリティ上の観点から好ましくありませんでした。

また、招待リンクを個別にメール送付する方式でも、作業ミスやワークショップまでにユーザ登録を完了しない参加者が出てくるため、ワークショップの進行に支障をきたす可能性があります。

| No | 招待リンク運用の事例 | 課題 |
| --- | --- | --- |
| 1 | 招待リンクのメール送信 | システムからのSMTPメール送信が禁止されている |
| 2 | 事務局側での招待リンク一覧の作成 | Excelへの手作業での転記ミスのリスク、招待リンクの閲覧権限によるセキュリティ上の問題 |
| 3 | 事務局が招待リンクを個別に送付 | メール作成時の転記ミス、ワークショップ開始までにユーザ登録が完了しないケースの発生 |
| 4 | 招待リンクの有効期限 | INVITE_EXPIRY_HOURS環境変数（デフォルト72時間）で延長可能も設定可能だが、欠席者への個別対応が必要 |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764962/8ec69a4d-c687-45e8-9ba7-50895db7c9d7.png)

### 3.1. ツール要件

- **ツール動作のための個別設定は.envファイルで設定する**
`.env.example`をコピーして`.env`を作成し、以下の項目を設定します
    
    ```
    BASE_URL=http://localhost          # DifyサーバーのベースURL
    OWNER_EMAIL=hogehoge@gmail.com    # Dify所有者のメールアドレス
    OWNER_PASSWORD=hogehoge           # Dify所有者のパスワード
    ADMIN_LISTCSV=admin_list.csv     # 管理者リストのCSVファイル名
    ADMIN_PASSWORD=password          # 管理者アカウントのデフォルトパスワード（*1)
    REGISTRATION_URL=registration_url.csv  # 登録URLの保存先ファイル名
    REMOVE_SQL=remove_sql.txt       # ユーザー削除用SQLファイル名
    ```
    

　(*1) admin_list.csvのパスワード列が空の場合に設定されるパスワード

- **ツールで登録できるのはDifyの管理者のみ**
閲覧者や編集者には現状対応していません。また所有者は登録できません。

　　

- **管理者リスト(CSV)には以下の項目を含める**
登録する管理者リストには管理者毎の個別パスワードを登録できるようにしています。
ツールを実行すると管理者アカウント情報を以下のフォーマットで記載します
    
    
    | **列名** | **説明** | **例** |
    | --- | --- | --- |
    | E-Mail | 管理者のメールアドレス | user1@gmail.com |
    | name | 管理者の表示名 | User1 |
    | password | 管理者のパスワード | "user1_passwd" |
    
    ```
    E-Mail,name,password
    user1@gmail.com,User1,"user1_passwd"
    user2@gmail.com,User2,"user2_passwd"
    ```
    
- **ツール動作時に取得した招待リンクは招待リンクファイルに格納する**
ツールを実行すると管理者アカウント登録時に生成される招待用URLが**registration_url.csvファイルに**保存されます
    
    ```
    E-Mail,registration_url
    user1@gmail.com,http://localhost/activate?email=user1%40gmail.com&token=xxxxx
    user2@gmail.com,http://localhost/activate?email=user2%40gmail.com&token=xxxxx
    ```
    
- **docker-db-1コンテナでのユーザ削除用SQL文を生成してファイルに格納する**
管理者アカウント削除用のSQLコマンドが生成されます

    ```
    delete from accounts WHERE email = 'user1@gmail.com';
    delete from accounts WHERE email = 'user2@gmail.com';
    ```

## ４．ツールの前提条件

ツールはPlaywright test for VSCodeで作成し、内部でPlaywrightのTypeScript版を呼び出しています従って以下の前提アプリケーションが必要です。
今回はWindows上のNode.jsでPlaywrightを動かしています。

| No | 前提アプリケーション | 説明 |
| --- | --- | --- |
| 1 | Windows11 | 基本OS |
| 2 | Node.js (v22.14.0) | Playwrightの前提アプリケーションです |
| 3 | npm (10.9.2) | パッケージ導入ソフト |
| 4 | playwright (10.9.2) | Playwrightパッケージ |
| 5 | Playwright msedgeブラウザ | Playwright用Edgeブラウザ |
| 6 | VSCode (1.101.1) | Playwright Test for VSCodeを使うためのアプリケーションです（無くても動くかもしれません） |
| 7 | Playwright Test for VSCode (1.1.15) | VSCode(IDE)にPlaywrightの操作I/Fを追加するVSCodeの拡張機能です（無くても動くかもしれません） |
| 8 | Difyの所有者アカウント | .envファイルのBASE_URL、OWNER_EMAIL、OWNER_PASSWORDに設定します。 |

## ５．ツールのインストール

ツールはpotofo/dify-admin-automatorリポジトリからGitでクローンして、依存関係、Playwrightブラウザをインストールします。(PlaywrightブラウザはChroniumが推奨されていますが、インストールが制約されている会社環境での動作を考慮してMicrosoft Edgeを使うようにしています)

**①リポジトリのクローン**

```
git clone https://github.com/potofo/dify-admin-automator
cd dify-admin-automator
```

リポジトリをクローンすると以下のようにプロジェクトファイルが展開されます。

```
dify-admin-automator
├── tests/                      # テストファイル
│   ├── AddAdmin2Dify.spec.ts  # 管理者追加スクリプト
│   └── example.spec.ts        # サンプルテスト
├── playwright.config.ts        # Playwright設定
├── .env.example               # 環境変数テンプレート
├── .env                       # （注意）.env.exampleファイルをコピーして環境に合わせて編集してください。
├── admin_list.csv.example     # 管理者アカウントリストのテンプレート
├── admin_list.csv            # 管理者アカウントリスト
├── registration_url.csv      # 登録用URL保存ファイル（ツール実行時に生成されます）
├── remove_sql.txt            # ユーザ削除用SQLファイル（ツール実行時に生成されます）
└── package.json              # プロジェクト依存関係
```

- [potofo/dify-admin-automator](https://github.com/potofo/dify-admin-automator)

**②依存関係のインストール**

```
npm install
```

**③Playwrightブラウザのインストール**

```
npx playwright install msedge
```

**④設定ファイルの準備**

```
copy .env.example .env
copy admin_list.csv.example admin_list.csv
```

## ６．ツールの使い方

以下の手順でツールを起動することができます。

① **環境変数 (.env)ファイル設定**
　BASE_URL、OWNER_EMAIL、OWNER_PASSWORDの設定、必要に応じてADMIN_PASSWORDも設定してください

**②admin_list.csvファイルの編集**

　実際に管理者として登録するユーザをE-Mail、name、passwordのCSV形式で設定します。

**③ツールの実行方法**
　以下の何れかの方法でリポジトリクローンしたフォルダでツールを実行できます。

```
# すべてのテストを実行
npx playwright test

# 特定のテストファイルを実行
npx playwright test tests/AddAdmin2Dify.spec.ts

# UIモードでテストを実行
npx playwright test --ui
```

④ツール実行結果のレポート
　PlaywrightのHTMLレポート機能で実行結果のレポートが参照できます。

```
npx playwright show-report
```

## ７．管理者アカウントの削除

⚠️ **重要な注意事項**

- **Difyの管理画面ではユーザーの無効化のみサポート**
「チームから削除」をしてもユーザアカウントは消えません。これは恐らく、削除したユーザが作成したチャットボットやナレッジの整合性を保つためと考えられます。
- **データを登録していないユーザーのみ削除可能**
上記のように整合性が崩れるリスクがあるので、この手順は「保留中」のユーザまたはまだチャットボット、ワークフロー、ナレッジを作成していないユーザのみで行うことを推奨します。

**PostgreSQLでの削除手順**

**①PostgreSQLコンテナにアクセス**
Difyが動作している環境でDockerコンテナ内のBashを起動します。

```
docker exec -it docker-db-1 bash
```

**②データベースに接続**
PostgreSQLに以下のユーザで接続して、difyテーブルにアクセスします。

```
psql -U postgres -d dify
```

**③ユーザー情報の確認と削除**
ユーザ情報はaccountsテーブルにありますので、accountsテーブルを参照し、DELETE SQL文で削除します。（このツールではユーザ登録したユーザのこのDELETE SQL文をremove_sql.txtファイルに作成します。）

```
-- ユーザー情報の確認
select * from accounts;

-- 特定ユーザーの削除
delete from accounts WHERE email = 'example@gmail.com';
```

## ８．まとめと今後の展望

本ツールを活用することで、Difyワークショップの事前準備における管理者アカウントの一括登録を効率化することができました。一括登録された管理者は、それぞれのチームメンバーを閲覧者（Viewer）や編集者（Editor）として招待することができ、段階的なユーザ展開が可能になります。

主な成果は以下の通りです

- 手作業での登録作業が自動化され、事務局の負担が大幅に軽減
- CSVファイルによる一元管理で、登録ユーザの管理が容易に
- 招待URLの自動生成・保存により、ユーザへの展開がスムーズに

今後の展望として、以下の機能追加を検討しています

- 閲覧者・編集者の一括登録機能の実装

このツールが、大規模なDifyワークショップの運営効率化に貢献することを期待しています。

## ８．関連リンク

https://github.com/langgenius/dify

https://github.com/potofo/dify-admin-automator