带有WebUI的cron替代品Dagu

什么是 Dagu ?

Dagu 是一个强大的 Cron 替代品,它带有一个 Web UI。它允许你将命令之间的依赖关系定义为有向无环图(DAG),使用声明式的 YAML 格式。Dagu 的设计易于使用、自包含且无需编码,非常适合小型项目。

安装

在群晖上以 Docker 方式安装。因为镜像发布在 ghcr.io ,所以采用命令行方式安装

需要用 SSH 客户端登录到群晖后再执行

docker cli 安装

如果你熟悉命令行,可能用 docker cli 更快捷

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 新建文件夹 dagu 和 子目录
mkdir -p /volume1/docker/dagu/{dags,data,logs}

# 进入 dagu 目录
cd /volume1/docker/dagu

# 修改目录权限
chmod a+rw {dags,data,logs}

# 运行容器
docker run -d \
--restart unless-stopped \
--name dagu \
-p 8210:8080 \
-v $(pwd)/dags:/home/dagu/.dagu/dags \
-v $(pwd)/data:/home/dagu/.dagu/data \
-v $(pwd)/logs:/home/dagu/.dagu/logs \
ghcr.io/dagu-dev/dagu:latest \
dagu start-all

docker-compose 安装

也可以用 docker-compose 安装,将下面的内容保存为 docker-compose.yml 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
version: '3'

services:
dagu:
image: ghcr.io/dagu-dev/dagu:latest
container_name: dagu
restart: unless-stopped
ports:
- "8210:8080"
volumes:
- "./dags:/home/dagu/.dagu/dags"
- "./data:/home/dagu/.dagu/data"
- "./logs:/home/dagu/.dagu/logs"
command: ["dagu", "start-all"]

然后执行下面的命令

1
2
3
4
5
6
7
8
9
10
# 新建文件夹 dagu 和 子目录
mkdir -p /volume1/docker/dagu/{dags,data,logs}

# 进入 dagu 目录
cd /volume1/docker/dagu

# 将 docker-compose.yml 放入当前目录

# 一键启动
docker-compose up -d

运行

在浏览器中输入 http://群晖IP:8210 就能看到主界面

NEW 新建 DAG

输入名称

自动跳转到 SPEC 界面

下拉会看到编辑界面

EDIT 进入编辑模式

粘贴下面的内容

mail 执行器可用于发送电子邮件。这对于发送通知或警报很有用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
smtp:
host: "smtp.88.com"
port: "25"
username: "wbsu2003@88.com"
password: "<第三方邮件客户端密码>"

steps:
- name: step1
executor:
type: mail
config:
to: wbsu2003@hotmail.com
from: wbsu2003@88.com
subject: "Dagu 测试邮件"
message: |
Hello world,send by Dagu~
- name: step2
command: echo done!
depends:
- step1

SAVE 保存

上拉,找到 START 执行

执行完成

查看日志

如果设置没问题,很快就会收到邮件

进入 FileStation 中,可以看到对应的 yaml 文件

另一种情况是调用脚本文件,举个简单的例子,通过脚本来获取 pm2.5 的值

1
2
3
steps:
- name: send_GET_request
command: /home/dagu/.dagu/dags/weather.sh

这里比较大的坑是要用容器内的路径,默认 WORKDIR/home/dagu/,所以要用完整的路径

weather.sh 的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/sh

# 设置环境变量
export CITY_ID=101020100

# 发送 GET 请求并获取响应体
response=$(curl -s -X GET "http://t.weather.itboy.net/api/weather/city/${CITY_ID}" -H "Authorization: ")

# 检查 curl 命令是否成功执行
if [ $? -eq 0 ]; then
# 使用 jq 打印 JSON 数据
# echo $response | jq .
pm25=$(echo $response | jq -r '.data.pm25')
echo "pm25: $pm25"
else
echo "Failed to fetch data"
fi

关于天气的接口,老苏在之前的文章中提过,你只要将 CITY_ID 替换成你所在的城市即可

文章传送门:用Changedetection监控网页的变化

因为是 Dagu 是通过容器安装的,所以需要让 Dagu 支持我们在
脚本中用到的 curljq

首先要用 root 身份进入容器

1
2
# 进入容器
docker exec -it -u root dagu /bin/sh

然后在容器中继续执行下面的命令

1
2
3
4
5
# 更新包索引
apk update

# 安装 curl
apk add curl

1
2
# 安装 jq
apk add jq

然后回到 DaguStart

Log 查看

没问题的话,会看到当前的 pm2.5

参考文档

GitHub - dagu-dev/dagu: Yet another cron alternative with a Web UI, but with much more capabilities. It aims to solve greater problems.
地址:https://github.com/dagu-dev/dagu

Dagu — Dagu 文档
地址:https://dagu.readthedocs.io/zh/latest/

Dagu-一个带有Web UI的cron替代品 | Noise&Blog
地址:https://www.noiseblogs.top/posts/a86216b9/