【Dify】DSL自動バックアップ設定

はじめに

Difyを使ううえで便利なネタを紹介します。
本記事投稿後にGitHub上のコードが勝手に変わったりして手順通りにインストール出来なくなってたらすんません。

実行環境(2025年10月3日時点)

Dify 1.9.1

ソースコードを持ってくる

ホームディレクトリに今回のツールを格納する用のディレクトリを作ってからそこで作業します。

Bash
# ホームディレクトリに移動
cd

# ツール用ディレクトリ作成
mkdir custom_tools
cd custom_tools

# ソースコードclone
git clone https://github.com/sattosan/dify-apps-dsl-exporter.git

### ↓ 出力結果参考 ###

Cloning into 'dify-apps-dsl-exporter'...
remote: Enumerating objects: 44, done.
remote: Counting objects: 100% (44/44), done.
remote: Compressing objects: 100% (31/31), done.
remote: Total 44 (delta 20), reused 35 (delta 12), pack-reused 0 (from 0)
Receiving objects: 100% (44/44), 16.47 KiB | 106.00 KiB/s, done.
Resolving deltas: 100% (20/20), done.

カレントディレクトリにdify-apps-dsl-exporterというのが出来てたらOKです。
そこに移動しておきます。

poetryインストール・依存ライブラリダウンロード

この作業をやったのがちょっと前で、当時はデフォルトでpoetryというのが入ってなかったか何かで苦戦した履歴がありました。

Poetry is a tool for dependency management and packaging in Python. It allows you to declare the libraries your project depends on and it will manage (install/update) them for you. Poetry offers a lockfile to ensure repeatable installs, and can build your project for distribution.

(ジャパニーズ)
PoetryはPythonの依存関係管理とパッケージングのためのツールです。プロジェクトが依存するライブラリを宣言するだけで、Poetryが自動的に管理(インストール/アップデート)してくれます。Poetryは繰り返しインストールを可能にするロックファイルを提供し、プロジェクトをビルドして配布することも可能です。

https://python-poetry.org/docs/

よく分からんけどrubyのgemみたいな感じか?(これも違う気がする)


とりあえずhistoryコマンドのログを自分用にメモっときます。

Bash
cd
curl -sSL https://install.python-poetry.org | python3 -
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
poetry --version


で、依存ライブラリをダウンロードします。

Bash
cd /root/custom_tools/dify-apps-dsl-exporter

poetry install

### ↓ 出力結果参考 ###

The currently activated Python version 3.10.12 is not supported by the project (^3.13).
Trying to find and use a compatible version.
Using python3.13 (3.13.0)
Creating virtualenv src-mvVKanIw-py3.13 in /root/.cache/pypoetry/virtualenvs
Installing dependencies from lock file

Package operations: 8 installs, 0 updates, 0 removals

  - Installing certifi (2025.1.31)
  - Installing h11 (0.14.0)
  - Installing idna (3.10)
  - Installing sniffio (1.3.1)
  - Installing anyio (4.8.0)
  - Installing httpcore (1.0.7)
  - Installing httpx (0.28.1)
  - Installing python-dotenv (1.0.1)

Installing the current project: src (0.1.0)


.envファイル編集

設定ファイルを編集します。
デフォルトのサンプルファイルをコピーして編集しましょう。

Bash
cp .env.example .env
vim .env

### ↓のように記述して保存 ###

DIFY_ORIGIN=https://example.com  #Difyのドメイン
EMAIL=*****@example.com  # Difyにログインするときのメールアドレス
PASSWORD=*****  # Difyにログインするときのパスワード


実行してみる

ではやってみましょう。

Bash
poetry run python ./src/export.py

### ↓ 出力結果参考 ###

The currently activated Python version 3.10.12 is not supported by the project (^3.13).
Trying to find and use a compatible version.
Using python3.13 (3.13.0)
INFO:dify_api:Using Dify API at https://*****/console/api with email *****@example.com
INFO:httpx:HTTP Request: POST https://*****/console/api/login "HTTP/1.1 200 OK"
### (略) ###
 Downloaded: ./dsl/*****.yml
 Downloaded: ./dsl/*****.yml
 Downloaded: ./dsl/*****.yml


これで、カレントディレクトリにdslというのが出てきてるはずです。
そこの中に*****.yml(DSLファイル本体)が格納されたらクリアです。
おめでとうごぜえます。

Bash
cd dsl
ls -alh

合計 92K
drwxr-xr-x 2 root root 4.0K 10  2 23:08  .
drwxr-xr-x 5 root root 4.0K 10  2 23:08  ..
-rw-r--r-- 1 root root 6.3K 10  2 23:08  *****.yml
-rw-r--r-- 1 root root 6.9K 10  2 23:08  *****.yml


cronで自動実行させる

ここまでやったらもちろん、深夜に自動実行させたいですよね。
ちょっとやってみましょう。

まず、crontab用のスクリプトを作ります。

Bash
cd /root/custom_tools/dify-apps-dsl-exporter
vim run.sh


### ↓のように記述して保存 ###


#!/bin/bash
cd /root/custom_tools/dify-apps-dsl-exporter
poetry run python ./src/export.py

# フォルダをzipにしてタイムスタンプをつけて保存
TIMESTAMP=$(date +"%Y-%m-%d_%H-%M-%S")
ZIP_DIR="/root/custom_tools/dify-apps-dsl-exporter/dsl_zip_backup"
SRC_DIR="/root/custom_tools/dify-apps-dsl-exporter/dsl"
ZIP_FILE="${ZIP_DIR}/dsl_backup_${TIMESTAMP}.zip"

mkdir -p "$ZIP_DIR"

# サブシェルを起動 こうしないとunzipしたときディレクトリが出てくる
(
  cd "$SRC_DIR"
  zip -r "$ZIP_FILE" .
)

# 30日以上前のzipファイルを削除してローテーションする
find "$ZIP_DIR" -type f -name "*.zip" -mtime +30 -exec rm {} \;

何かと言うと、dsl_zip_backupというディレクトリにzip化して保存してます。
サブシェルとかいうのを今初めて知りました。
あとは30日でローテーションしてますがここはまあお好みで。。


ファイルを作ったら、実行権限を付与してテスト実行してみましょう。

Bash
# これをしないとcrontabとかで実行できません
chmod u+x run.sh

# テスト実行
./run.sh

# ファイルが出来てるか確認
cd dsl_zip_backup
ls -alh

合計 32K
drwxr-xr-x 2 root root 4.0K 10  2 23:19 .
drwxr-xr-x 6 root root 4.0K 10  2 23:19 ..
-rw-r--r-- 1 root root  23K 10  2 23:19 dsl_backup_2025-10-02_23-19-39.zip

よさそうですね。
ではcron登録してみます。

Bash
crontab -e

# 末尾に以下を追記して保存
0 3 * * * /root/custom_tools/dify-apps-dsl-exporter/run.sh > /dev/null 2>&1

何回調べても忘れますが、この記述は毎日朝の3:00にrun.shを自動実行してます。
/dev/null 2>&1 のとこは標準出力とエラー出力を非表示にしてます。
…エラーでデータが取れなかったときは通知したいんですけどね。まあええか。
crontab -l と打って、さっきの記載が出てきたらちゃんと登録されてます。

ログイン試行上限に引っかかってロックアウトされたときの対処

Difyログインですが、何回か失敗するとなんと24時間ロックアウトされるそうな。
で、前述したシェルを作ってるときに.envファイルの記載をミスってスクリプトがログイン失敗しまくってみごとに罠にかかりました。

docker再起動したり別のブラウザからアクセスしても無理でした。
最終的に以下の方法で解除できたのでメモ。

Bash
cd /root/dify/docker/
docker exec -it docker-redis-1 redis-cli FLUSHALL

コメント