作成日:2025年6月22日(日)
更新日:2025年6月29日(日) 実際に会社でやってみて足りなかった点を修正
1.はじめに
私は社内で生成AI活用プロジェクトを推進しており、その一環としてDifyやn8nなどのローコード開発ツールのワークショップを開催しています。
ワークショップでは多数の参加者のユーザ登録が必要です。Difyのユーザ招待機能は便利ですが、招待リンクの生成・配布やワークショップ中のユーザ登録作業に課題がありました。
特に100名規模のワークショップでは、ユーザ登録に時間がかかり進行の妨げとなります。前回は40名分を事前に手作業で登録し、参加者にはサインインのみをしてもらう方式を採用。ワークショップ自体はスムーズでしたが、事務局の準備負担が大きくなりました。
この経験から、Playwright test for VSCodeとPlaywrightを使用して、ユーザ登録を一括で行えるツールを開発しましたので、紹介します。
※Difyには「通常ユーザー」、「エディター」、「管理者」、「所有者」のアカウントタイプがあります。「所有者」は最初にユーザ登録したアカウントです。
「チームメンバーを招待する」機能では「通常ユーザー」、「エディター」、「管理者」の登録ができますが、このツールは「管理者」の招待を自動化することに特化しています。
2.運用上の課題(ユーザ招待機能)
Dify(v1.4.3)のユーザ招待機能は、あらかじめ準備したユーザのメールアドレスを「チームメンバーを招待する」のメールアドレス欄にコピー&ペーストすると、招待リンクがユーザに送付される仕組みです。
社内でSMTPサーバを利用できれば、この方式でサインイン用のアカウントを発行できますが、私の会社ではシステムからのSMTPメール送信が禁止されているため利用できません。
過去には、生成された招待リンクを一人ずつExcelに貼り付けて、各自の招待リンクから入ってもらう運用も試みましたが、セキュリティ上の観点から好ましくありませんでした。
また、招待リンクを個別にメール送付する方式でも、作業ミスやワークショップまでにユーザ登録を完了しない参加者が出てくるため、ワークショップの進行に支障をきたす可能性があります。
No | 招待リンク運用の事例 | 課題 |
---|---|---|
1 | 招待リンクのメール送信 | システムからのSMTPメール送信が禁止されている |
2 | 事務局側での招待リンク一覧の作成 | Excelへの手作業での転記ミスのリスク、招待リンクの閲覧権限によるセキュリティ上の問題 |
3 | 事務局が招待リンクを個別に送付 | メール作成時の転記ミス、ワークショップ開始までにユーザ登録が完了しないケースの発生 |
4 | 招待リンクの有効期限 | INVITE_EXPIRY_HOURS環境変数(デフォルト72時間)で延長可能も設定可能だが、欠席者への個別対応が必要 |
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の管理者のみ
「通常ユーザー」、「エディター」には現状対応していません。また所有者は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';
4.ツールの前提条件
ツールは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に設定します。 |
5.ツールのインストール
ツールは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 # プロジェクト依存関係
②依存関係のインストール
npm install
③Playwrightブラウザのインストール
npx playwright install msedge
④設定ファイルの準備
copy .env.example .env
copy admin_list.csv.example admin_list.csv
6.ソースコードの修正
「AddAdmin2Dify.spec.ts」の「既存の管理者アカウントでサインイン」59行目付近に以下のコードがありますが、これは、所有者を作成するときにアカウント名を「Dify」としたときに動作するコードのため、アカウント名によってソースコードを修正する必要があります。
例えば「Automator Dify」というアカウント名にした場合は'A'という文字のボタン名に変更してください。
await page.getByRole('button', { name: 'D', exact: true }).click();
7.ツールの使い方(一括登録方法)
以下の手順でツールを起動し、admin_list.csvファイルのE-MailアカウントをDifyの管理者として一括登録することができます。
① 環境変数 (.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
8.管理者アカウントの削除
Difyの「設定」機能ではアカウントの削除ができません。こちらのツールを使用して管理者アカウントを一度作成すると、2度目の追加は失敗します。
従って、自動登録した管理者アカウントを削除する方法を解説しておきます。
Difyでのアカウント削除はDifyのdocker-db-1コンテナ(デフォルト)で動作するPostgreSQLのSQL文で行うことができます。この手順では既にチャットボットなどを作成しているユーザーを削除すると、Difyのデータベースの整合性が崩れる恐れがありますので、ツールでアカウントを作成した直後以外の利用は推奨しません。
⚠️ 重要な注意事項
-
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';
9.まとめと今後の展望
本ツールを活用することで、Difyワークショップの事前準備における管理者アカウントの一括登録を効率化することができました。一括登録された管理者は、それぞれのチームメンバーを閲覧者(Viewer)や編集者(Editor)として招待することができ、段階的なユーザ展開が可能になります。
主な成果は以下の通りです
- 手作業での登録作業が自動化され、事務局の負担が大幅に軽減
- CSVファイルによる一元管理で、登録ユーザの管理が容易に
- 招待URLの自動生成・保存により、ユーザへの展開がスムーズに
今後の展望として、以下の機能追加を検討しています
- 閲覧者・編集者の一括登録機能の実装
このツールが、大規模なDifyワークショップの運営効率化に貢献することを期待しています。
10.関連リンク