PassNAT LogoPassNAT

Cronicle Edge 定时任务:NAS 上 Docker 部署,网页排期、执行日志一眼看

作者

小编

发布时间

Curving abstract shapes with an orange and blue gradient

项目介绍

Cronicle Edge 是一个自托管的定时任务面板(Cronicle 的社区分支)。它把「什么时候跑、跑什么、跑得怎么样」这三件事放进一个网页里:任务、时间、脚本都在浏览器里写,不用去碰系统里的定时任务表;任务列表里一眼看到每个任务的时间、状态和耗时,点进去就是完整的执行日志。

任务用插件执行,常见的有 Shell Script、HTTP Request、SSH、Docker 等。一个任务可以设成每天、每周、每月、按间隔,或者干脆只手动跑;还能设超时、失败重试、日志保留天数、资源上限。跑完的记录都在 Completed 里,按事件筛、按时间翻。项目地址:点我跳转

部署安装

只要能跑 Docker 的 NAS 都能装,下面用飞牛 NAS 演示:先用 帕斯内网穿透 拿到一个公网地址,再把 Cronicle Edge 用 Docker Compose 装起来,以后在外面也能打开面板、改任务、看日志。

一、先用帕斯内网穿透拿到公网地址

飞牛的「应用中心」里搜 PassNAT,装上这个穿透插件,打开它,点「创建隧道」。隧道名字随便起(不超过 12 个字符),接入节点和传输协议留默认,本地 IP 留默认的 127.0.0.1,本地端口填 3012(就是下面编排里冒号左边那个端口)。

建好之后点开这条隧道,按一下电源,状态变成运行中,详情里就能看到分配好的公网地址(形如 IP:端口),先记下来。

不是飞牛的系统,PassNAT 文档的「连接使用」里有其他系统的连接教程:点我跳转。

二、新建 Compose 项目

打开飞牛的「Docker」应用,切到「Compose」标签,点右上角的新增项目。项目名称填 cronicle,路径在「我的文件」下面挑一个空文件夹,没有就当场新建一个。来源选「创建 docker-compose.yml」,把下面这段整个贴进去:

1services:
2 cronicle:
3 image: ghcr.io/cronicle-edge/cronicle-edge:main
4 command: manager
5 hostname: cronicle
6 restart: unless-stopped
7 ports:
8 - "3012:3012"
9 environment:
10 CRONICLE_secret_key: 换成你自己的密钥
11 TZ: Asia/Shanghai
12 volumes:
13 - cronicle_data:/opt/cronicle/data
14
15volumes:
16 cronicle_data:

这段编排里要改的只有密钥:

CRONICLE_secret_key:换成你自己的、长一点的字符串。它用来签名登录会话,换掉之后原来的登录会失效,重新登一次就行。

command: manager:官方镜像的启动参数。manager 是主节点,单机部署就它一个;多机才需要另起 worker。

hostname: cronicle:这一行别删。容器重建(换镜像、改编排)之后 hostname 会变,面板会一直停在「Waiting for manager server...」,加一个固定 hostname 就没事。

端口 3012 被占用的话,把冒号左边的数字换一个,隧道里的本地端口也跟着改。勾上「创建项目后立即启动」,镜像拉下来之后十几秒就起来了。

三、第一次打开:管理员账号

数据目录是空的,第一次启动时容器会自己建一个管理员账号,用户名 admin、密码 admin。用公网地址打开就是登录页,用它登进去,第一件事是到右上角的「My Account」把密码改掉——这个面板能在 NAS 上执行脚本,别留着默认口令。

数据都在 cronicle_data 这个具名卷里,包括任务、运行历史、日志和账号。备份这一个卷就够了;重启、升级镜像都不会丢。

四、建一个定时任务

点顶部的「Schedule」,再点「Add Event」。表单从上往下:Event Name 写任务名;Category 选 General;Target 选 All Servers;Plugin 选「Shell Script」,下面就会出现脚本编辑器,直接把命令写进去。

再往下是 Timing:选 Daily,在 Timing Details 里勾上几点跑、几分跑(演示里用的是每天 12:00)。同一个面板里还能设 Timeout 超时、Retries 失败重试、Expire Days 日志保留天数。保存之后任务就出现在列表里,到点自动跑。

演示用的脚本只操作容器里挂进来的演示目录,比如把下载目录里的文件按日期归档:

1#!/usr/bin/env bash
2cd /demo/downloads || exit 1
3count=$(ls -1 | wc -l)
4echo "扫描下载目录,共 $count 个文件"
5target="/demo/sorted/$(date +%Y-%m-%d)"
6mkdir -p "$target"
7for f in *; do
8 [ -e "$f" ] || continue
9 mv "$f" "$target/" && echo " 已归档:$f"
10done
11echo "整理完成,归档到 $(date +%Y-%m-%d)"

脚本是在容器里跑的,容器里只能看到你挂进去的目录。要让它整理 NAS 上真实的某个文件夹,得在编排的 volumes 里把这个目录挂进容器,再在脚本里用容器内的路径。

五、跑一次,看日志

不用等到点,点任务行里的「Run」就立刻跑一次。跑完回到列表,状态一栏是绿色的 Success;点任务名进「Job Details」,上面是开始/结束时间、耗时、CPU 和内存,下面「Console Output」黑底的那一块就是执行日志,脚本打印的每一行都在,出没出错一眼就能看到。

想看全部历史,点顶部的「Completed」;按事件筛出来,每次运行一行,点 Job ID 进去还是同一份日志。

几点说明

数据在哪。 任务、历史、日志都在 cronicle_data 卷里,备份这个卷就行;想搬到别的机器,把卷导出来带走。

升级。 镜像标签用的是 main,升级前先把卷备份一份,再到 Docker 里重新拉取镜像、重启项目。编排里固定了 hostname,重建后不会卡在等待主节点。

明文 HTTP 访问。 内网穿透给的是 http 地址,面板本身不需要 HTTPS 就能用;但它能在 NAS 上执行脚本,公网地址别到处发,用完可以在插件里把隧道关掉,口令也一定改掉。

脚本权限。 容器里的任务默认以 root 身份跑,写脚本时留意别误删文件;只操作专门挂进去的目录,别把 NAS 的系统目录整个挂进来。