From 0bc524e867d2c8034a8a622de0772859a21ff779 Mon Sep 17 00:00:00 2001 From: ms Date: Tue, 14 Apr 2026 10:17:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=91=E5=B8=83=20=E7=99=BD=E8=99=8E?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/renovate.json | 11 ++- apps/baihu-panel/README.md | 70 ++++++++++++++++++ apps/baihu-panel/data.yml | 17 +++++ apps/baihu-panel/logo.png | Bin 0 -> 29148 bytes apps/baihu-panel/logo.svg | 1 + apps/baihu-panel/version/data.yml | 24 ++++++ apps/baihu-panel/version/docker-compose.yml | 34 +++++++++ apps/baihu-panel/version/envs/default.env | 2 + apps/baihu-panel/version/envs/global.env | 2 + apps/baihu-panel/version/scripts/init.sh | 17 +++++ apps/baihu-panel/version/scripts/uninstall.sh | 10 +++ apps/baihu-panel/version/scripts/upgrade.sh | 17 +++++ 12 files changed, 202 insertions(+), 3 deletions(-) create mode 100644 apps/baihu-panel/README.md create mode 100644 apps/baihu-panel/data.yml create mode 100644 apps/baihu-panel/logo.png create mode 100644 apps/baihu-panel/logo.svg create mode 100644 apps/baihu-panel/version/data.yml create mode 100644 apps/baihu-panel/version/docker-compose.yml create mode 100644 apps/baihu-panel/version/envs/default.env create mode 100644 apps/baihu-panel/version/envs/global.env create mode 100644 apps/baihu-panel/version/scripts/init.sh create mode 100644 apps/baihu-panel/version/scripts/uninstall.sh create mode 100644 apps/baihu-panel/version/scripts/upgrade.sh diff --git a/.github/renovate.json b/.github/renovate.json index d2bf6bb41..02e1042d2 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -30,8 +30,11 @@ "**/rustfs/1.0.0-alpha.86/**" ], "packageRules": [ - { - "matchUpdateTypes": ["patch", "minor"], + { + "matchUpdateTypes": [ + "patch", + "minor" + ], "automerge": true, "automergeType": "pr", "platformAutomerge": true, @@ -39,7 +42,9 @@ "prCreation": "immediate" }, { - "matchUpdateTypes": ["major"], + "matchUpdateTypes": [ + "major" + ], "automerge": false }, { diff --git a/apps/baihu-panel/README.md b/apps/baihu-panel/README.md new file mode 100644 index 000000000..decb90eee --- /dev/null +++ b/apps/baihu-panel/README.md @@ -0,0 +1,70 @@ +# 白虎面板 + +🐯轻量级定时任务管理系统 + +![白虎面板](https://file.lifebus.top/imgs/baihu-panel_cover.png) + +![](https://img.shields.io/badge/%E6%96%B0%E7%96%86%E8%90%8C%E6%A3%AE%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E5%B7%A5%E4%BD%9C%E5%AE%A4-%E6%8F%90%E4%BE%9B%E6%8A%80%E6%9C%AF%E6%94%AF%E6%8C%81-blue) + +## 安装说明 + +> 默认用户名:admin +> +> 默认密码:首次安装后在日志中打印 12位随机密码 + +## 简介 + +白虎面板 (Baihu Panel) 是一款极致轻量、高性能的自动化任务调度平台。采用 Go + Vue3 架构,专注于高性能与低系统开销。通过深度集成 +Mise 运行时管理,它原生支持 Python、Node.js、Go、Rust、PHP 等所有主流语言环境的动态安装(几乎所有的版本)与统一依赖管理。支持 +Docker/Docker-Compose 一键部署,开箱即用,是您理想的轻量化脚本托管与任务调度解决方案。 + +## 特色 + +### 轻量级 + +docker/compose部署,无需复杂配置,开箱即用 + +### 任务调度 + +支持标准 Cron 表达式,常用时间规则快捷选择。日志不落文件,没有磁盘频繁io的问题 + +### 脚本管理 + +在线代码编辑器,支持文件上传、压缩包解压 + +### 在线终端 + +WebSocket 实时终端,命令执行结果实时输出 + +### 消息推送 + +内置强大消息推送与通知引擎,无缝兼容主流渠道,支持系统级事件告警 + +### 机密管理 + +(New) 类似 GitHub Secrets 的安全存储,支持 AES-GCM 加密,日志自动打码,仅在调度时注入 + +### 环境变量 + +存储普通配置,任务执行时自动注入 + +### 现代UI + +响应式设计,深色/浅色主题切换 + +### 移动端 + +适配移动小屏样式 + +### 远程执行 + +支持远程agent执行任务,展示执行结果 + +### 多语言支持 + +深度集成 Mise,支持几乎所有主流编程语言的动态安装、多版本切换及依赖管理 + +--- + +![Ms Studio](https://file.lifebus.top/imgs/ms_blank_001.png) +![Ms Studio](https://analytics.lifebus.top/p/wJix5nI1W) diff --git a/apps/baihu-panel/data.yml b/apps/baihu-panel/data.yml new file mode 100644 index 000000000..bf1939daa --- /dev/null +++ b/apps/baihu-panel/data.yml @@ -0,0 +1,17 @@ +additionalProperties: + key: baihu-panel + name: 白虎面板 + tags: + - WebSite + - Local + shortDescZh: 轻量级定时任务管理系统 + shortDescEn: Lightweight Timed Task Management System + type: website + crossVersionUpdate: true + limit: 0 + website: https://github.com/engigu/baihu-panel/ + github: https://github.com/engigu/baihu-panel/ + document: https://github.com/engigu/baihu-panel/ + architectures: + - amd64 + - arm64 diff --git a/apps/baihu-panel/logo.png b/apps/baihu-panel/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1af3b4feacb608581de120e8ec3585ba872f3394 GIT binary patch literal 29148 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 mFbty#nFhcx48t(0(EkG}keOwl!!w)!0000 \ No newline at end of file diff --git a/apps/baihu-panel/version/data.yml b/apps/baihu-panel/version/data.yml new file mode 100644 index 000000000..6d9a7fc90 --- /dev/null +++ b/apps/baihu-panel/version/data.yml @@ -0,0 +1,24 @@ +additionalProperties: + formFields: + - default: "/home/baihu-panel" + edit: true + envKey: BAIHU_ROOT_PATH + labelZh: 数据持久化路径 + labelEn: Data persistence path + required: true + type: text + - default: 8052 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelZh: WebUI 端口 + labelEn: WebUI port + required: true + rule: paramPort + type: number + - default: "" + edit: true + envKey: BH_SECRET + labelZh: 密钥 + labelEn: Secret + required: true + type: text diff --git a/apps/baihu-panel/version/docker-compose.yml b/apps/baihu-panel/version/docker-compose.yml new file mode 100644 index 000000000..dc61f3869 --- /dev/null +++ b/apps/baihu-panel/version/docker-compose.yml @@ -0,0 +1,34 @@ +networks: + 1panel-network: + external: true + +services: + baihu-panel: + image: ghcr.io/engigu/baihu:1.0.43 + container_name: ${CONTAINER_NAME} + labels: + createdBy: "Apps" + restart: always + networks: + - 1panel-network + ports: + - ${PANEL_APP_PORT_HTTP}:8052 + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + volumes: + - ${BAIHU_ROOT_PATH}/data:/app/data + - ${BAIHU_ROOT_PATH}/envs:/app/envs + environment: + - TZ=Asia/Shanghai + - BH_SERVER_PORT=8052 + - BH_SERVER_HOST=0.0.0.0 + - BH_DB_TYPE=sqlite + - BH_DB_PATH=/app/data/baihu.db + - BH_DB_TABLE_PREFIX=baihu_ + - BH_DB_NAME=baihu + logging: + driver: json-file + options: + max-size: "10m" + max-file: "3" diff --git a/apps/baihu-panel/version/envs/default.env b/apps/baihu-panel/version/envs/default.env new file mode 100644 index 000000000..cd05f46e6 --- /dev/null +++ b/apps/baihu-panel/version/envs/default.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +ENV_FILE=.env diff --git a/apps/baihu-panel/version/envs/global.env b/apps/baihu-panel/version/envs/global.env new file mode 100644 index 000000000..e10989fe4 --- /dev/null +++ b/apps/baihu-panel/version/envs/global.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +TZ=Asia/Shanghai diff --git a/apps/baihu-panel/version/scripts/init.sh b/apps/baihu-panel/version/scripts/init.sh new file mode 100644 index 000000000..07fb8c3fe --- /dev/null +++ b/apps/baihu-panel/version/scripts/init.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + # setup-1 add default values + CURRENT_DIR=$(pwd) + sed -i '/^ENV_FILE=/d' .env + sed -i '/^GLOBAL_ENV_FILE=/d' .env + echo "ENV_FILE=${CURRENT_DIR}/.env" >> .env + echo "GLOBAL_ENV_FILE=${CURRENT_DIR}/envs/global.env" >> .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/baihu-panel/version/scripts/uninstall.sh b/apps/baihu-panel/version/scripts/uninstall.sh new file mode 100644 index 000000000..c86c4fbca --- /dev/null +++ b/apps/baihu-panel/version/scripts/uninstall.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/baihu-panel/version/scripts/upgrade.sh b/apps/baihu-panel/version/scripts/upgrade.sh new file mode 100644 index 000000000..07fb8c3fe --- /dev/null +++ b/apps/baihu-panel/version/scripts/upgrade.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + # setup-1 add default values + CURRENT_DIR=$(pwd) + sed -i '/^ENV_FILE=/d' .env + sed -i '/^GLOBAL_ENV_FILE=/d' .env + echo "ENV_FILE=${CURRENT_DIR}/.env" >> .env + echo "GLOBAL_ENV_FILE=${CURRENT_DIR}/envs/global.env" >> .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi