这是一个轻量级、私有化的定时任务管理面板,模仿 GitHub Actions 的体验。支持 Python 和 Node.js 脚本,内置 Playwright 环境,适合运行各类自动化签到、爬虫及定时维护脚本。
- 多语言运行时:支持 Python 3 (含 venv 隔离) 和 Node.js 20。
- 全能环境:内置 Chromium 内核和 Playwright,轻松处理浏览器自动化任务。
- Web 可视化:基于 Vue 3 + Naive UI 的现代化管理界面,支持在线编辑代码。
- Crontab 调度:支持标准的 Cron 表达式,精确控制任务运行时间。
- 日志实时查看:支持任务运行日志的实时查看与持久化存储。
- Secrets 管理:支持环境变量(Secrets)管理,敏感信息不硬编码。
- New! 外部数据库支持:支持 SQLite(默认)及 MariaDB/MySQL 外部数据库连接。
创建一个目录(例如 my-actions),并在其中创建 docker-compose.yml 文件:
version: '3.8'
services:
github-actions:
image: ghcr.io/workerspages/github-actions:github-actions-mariadb-secrets
container_name: github-actions
restart: unless-stopped
ports:
- "8000:8000"
volumes:
- ./data:/app/data # 数据库(SQLite)及虚拟环境存储
- ./scripts:/app/scripts # 脚本文件存储
environment:
- TZ=Asia/Shanghai
# 管理员账号设置
- ADMIN_USER=admin
- ADMIN_PASSWORD=admin
# JWT 密钥 (建议修改为随机字符串)
- JWT_SECRET=your_secret_key_change_me
# === 数据库配置 (可选) ===
# 默认使用内置 SQLite,无需配置
# - DATABASE_URL=sqlite:////app/data/github-actions.db
# 如需连接外部 MariaDB/MySQL,请取消下方注释并修改参数:
# - DATABASE_URL=mysql+pymysql://root:password@192.168.1.100:3306/github_actionsdocker-compose up -d浏览器访问 http://你的IP:8000,默认账号密码均为 admin(或你在 yaml 中配置的值)。
| 变量名 | 默认值 | 说明 |
|---|---|---|
ADMIN_USER |
admin |
面板登录用户名 |
ADMIN_PASSWORD |
admin |
面板登录密码 |
JWT_SECRET |
随机生成 | 用于 Token 加密,生产环境务必修改固定,否则重启后需重新登录 |
DATABASE_URL |
sqlite:////app/data/github-actions.db |
数据库连接字符串 |
TZ |
Asia/Shanghai |
容器时区 |
本项目基于 SQLAlchemy,支持多种数据库后端。
无需任何配置,数据文件存储在 /app/data/github-actions.db。适合单机、轻量级使用。
如果你希望数据存储在外部数据库,或者需要更高的并发性能,可以使用 MariaDB 或 MySQL。
在 docker-compose.yml 中添加以下环境变量:
DATABASE_URL=mysql+pymysql://<用户名>:<密码>@<主机地址>:<端口>/<数据库名>示例:
DATABASE_URL=mysql+pymysql://root:123456@192.168.1.10:3306/my_task_db注意:使用外部数据库前,请确保对应的数据库(如
my_task_db)已在 MySQL 中创建。表结构会自动初始化。
直接编写 Python 代码即可。依赖包请在编辑页面的 "依赖" 标签页中填写 requirements.txt 内容。
import os
from loguru import logger
# 获取 Secrets
token = os.getenv("MY_TOKEN")
logger.info("任务开始运行...")本项目内置 GitHub API 代理层,让原本为 GitHub Actions 设计的脚本无需任何修改即可运行。
如果你的脚本使用 REPO_TOKEN + GitHub API 更新 Secrets(如签到脚本的自动更新 Cookie 功能),无需任何配置,系统会自动:
- 注入
REPO_TOKEN和GITHUB_REPOSITORY环境变量 - 拦截对
api.github.com的请求 - 将 Secret 更新转发到本地内部 API
原脚本调用 GitHub API → 代理拦截 → 更新到任务独享 Secrets
如果你在编写新脚本,可以直接使用内部 API:
import os
import requests
def update_task_secret(key: str, value: str):
"""更新当前任务的独享 Secret"""
script_id = os.getenv('FLUX_SCRIPT_ID')
resp = requests.put(
f"{os.getenv('FLUX_API_URL')}/api/scripts/{script_id}/secrets/{key}",
json={"value": value},
headers={"Authorization": f"Bearer {os.getenv('FLUX_TOKEN')}"}
)
resp.raise_for_status()
return resp.json()
# 示例:更新 GH_SESSION
new_session = "abc123..." # 从登录流程获取
update_task_secret("GH_SESSION", new_session)运行时自动注入的环境变量:
| 变量名 | 说明 |
|---|---|
FLUX_TOKEN |
内部 API 授权 Token |
FLUX_API_URL |
内部 API 地址 |
FLUX_SCRIPT_ID |
当前脚本 ID |
REPO_TOKEN |
自动注入(供兼容 GitHub Actions 脚本) |
GITHUB_REPOSITORY |
自动注入(供兼容 GitHub Actions 脚本) |
如果脚本使用其他变量名检查配置(如 GH_PAT、GH_TOKEN 等),只需在任务的 Secrets 管理 中添加同名变量,值可以随意填写:
GH_PAT = 任意值
因为代理拦截的是 API 请求,变量值不会被真正使用,只是让脚本通过配置检查。
在代码的第一行添加魔法注释 // runtime: node,系统会自动切换为 Node.js 运行时。
// runtime: node
const axios = require('axios');
console.log("Node.js 任务开始...");.
├── backend/ # FastAPI 后端源码
├── frontend/ # Vue3 + NaiveUI 前端源码
├── checkin/ # 内置示例脚本 (签到脚本等)
├── data/ # (自动生成) 数据存储目录
├── scripts/ # (自动生成) 脚本文件存储目录
├── Dockerfile # 构建文件
└── docker-compose.yml # 部署文件
- 后端:
cd backend pip install -r requirements.txt uvicorn app.main:app --reload - 前端:
cd frontend npm install npm run dev
MIT