{"id":34885138,"url":"https://github.com/engigu/baihu-panel","last_synced_at":"2026-05-26T04:01:35.196Z","repository":{"id":330667223,"uuid":"1118873905","full_name":"engigu/baihu-panel","owner":"engigu","description":"🐯轻量级定时任务管理系统，支持 Python, Node.js, Go, Rust, PHP 等所有主流语言的动态安装与多版本切换,，Docker/Compose 即用。A lightweight, high-performance cron panel built with Go \u0026 Vue 3.","archived":false,"fork":false,"pushed_at":"2026-04-21T09:59:35.000Z","size":3760,"stargazers_count":539,"open_issues_count":12,"forks_count":57,"subscribers_count":6,"default_branch":"main","last_synced_at":"2026-04-21T11:41:49.332Z","etag":null,"topics":["baihu","corn-panel","cron","cron-go","cron-jobs","cronjob","crontab","crontabjob","crontabtask","crontask","go-cron","go-cron-panel","gocron"],"latest_commit_sha":null,"homepage":"https://baihu-demo-site.qwapi.eu.org","language":"Vue","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/engigu.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE","maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-18T12:03:06.000Z","updated_at":"2026-04-21T10:18:11.000Z","dependencies_parsed_at":"2026-03-31T06:03:30.833Z","dependency_job_id":null,"html_url":"https://github.com/engigu/baihu-panel","commit_stats":null,"previous_names":["engigu/baihu-panel"],"tags_count":72,"template":false,"template_full_name":null,"purl":"pkg:github/engigu/baihu-panel","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/engigu%2Fbaihu-panel","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/engigu%2Fbaihu-panel/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/engigu%2Fbaihu-panel/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/engigu%2Fbaihu-panel/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/engigu","download_url":"https://codeload.github.com/engigu/baihu-panel/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/engigu%2Fbaihu-panel/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32209897,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-24T03:15:14.334Z","status":"ssl_error","status_checked_at":"2026-04-24T03:15:11.608Z","response_time":64,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["baihu","corn-panel","cron","cron-go","cron-jobs","cronjob","crontab","crontabjob","crontabtask","crontask","go-cron","go-cron-panel","gocron"],"created_at":"2025-12-26T03:36:54.741Z","updated_at":"2026-05-26T04:01:35.185Z","avatar_url":"https://github.com/engigu.png","language":"Vue","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 白虎面板 \n\n[![Hits](https://hits.sh/github.com/engigu/baihu-panel.svg?view=today-total)](https://hits.sh/github.com/engigu/baihu-panel/)\n![Version](https://img.shields.io/github/v/tag/engigu/baihu-panel?color=44cc11\u0026label=docker%20version\u0026sort=semver)\n![Image Size](https://ghcr-badge.egpl.dev/engigu/baihu/size?color=%2344cc11\u0026tag=latest\u0026label=docker+image\u0026trim=)\n![Image pulls](https://img.shields.io/badge/dynamic/json?url=https://ghcr-badge.elias.eu.org/api/engigu/baihu-panel/baihu\u0026query=downloadCount\u0026style=flat\u0026label=docker%20pulls\u0026color=44cc11)\n\n\n白虎面板 (Baihu Panel) 是一款极致轻量、高性能的自动化任务调度平台。采用 Go + Vue3 架构，专注于高性能与低系统开销。通过深度集成 Mise 运行时管理，它原生支持 Python、Node.js、Go、Rust、PHP 等所有主流语言环境的动态安装（几乎所有的版本）与统一依赖管理。支持 Docker/Docker-Compose 一键部署，开箱即用，是您理想的轻量化脚本托管与任务调度解决方案。\n\n演示站点(演示站点的服务器比较烂，见谅)  [演示站点](https://baihu-demo-site.qwapi.eu.org/)\n\n文档说明 [文档说明](https://engigu.github.io/baihu-panel/)\n\n## 更新日志 ☕\n\n### 最近更新\n\n**2026.04.16** - **内建脚本助手库 (Built-in SDK)**：新增 Python 与 Node.js 的轻量化助手库，实现脚本内 “零代码配置” 通知投递；配套新增 `baihu builtininstall` 自动化安装命令。  \n**2026.04.14** - **PWA 与通知渠道增强**：支持 PWA (Progressive Web App) 动态配置，站点标题与图标可由后端实时控制；新增 **VoceChat** 通知渠道支持；增强 **Bark** 推送，支持自建服务器配置。  \n**2026.03.27** - **安全机密管理 (GitHub Secrets 风格)**：新增系统级机密（Secret）管理功能。支持 AES-GCM 工业级加密存储，秘钥内存留存销毁；支持执行日志自动脱敏打码；支持仅在计划任务调度时按需注入，终端与测试运行物理隔离，全面提升敏感配置安全性。  \n**2026.03.19** - **仓库同步增强**：新增对青龙仓库格式指令的深度兼容，支持从远程 Git 仓库自动同步脚本并基于注释解析自动创建面板任务，支持白名单、黑名单、依赖保留等高级筛选特性。  \n**2026.03.05** - **API 文档重构** 重构 OpenAPI 认证体系，支持站点级 Token 配置与 Basic Auth 保护。  \n**2026.03.04** - 新增内置消息推送系统：全新原生支持企业微信、钉钉、飞书、Telegram、Bark、邮件等十余种主流渠道的推送，接入系统级事件通知自动捕获，告别原有必配外部推送服务的繁琐历史  \n**2026.02.13** - 重构任务执行引擎：深度集成 Mise 运行时管理，支持 Python, Node.js, Go, Rust, PHP 等几乎所有主流语言的动态安装与多版本切换，同步上线跨语言统一依赖管理系统  \n**2026.02.11** - 增强安全性：首次启动使用随机密码并打印在日志中，登录接口增加防暴力破解，文件系统操作增加路径穿越锁定  \n**2026.02.10** - 重构任务调度系统，完善并发控制，优化文件树交互体验，支持任务执行实时日志流  \n**2026.02.06** - 整理 Docker 目录结构，增加 Debian 13 (Trixie) 镜像支持  \n\n[查看完整更新日志](./CHANGELOG.md)\n\n## 项目来由\n\n多少和青龙面板有点关系，我自己也是青龙面板的使用者，但是现在的青龙面板性能我觉得有点难以接受。以我自己的使用（`机器1C2G`）为例，一个`python`的`requests`脚本每隔`30s`执行一次，有时候cpu执行的时候能跳变到`50%`以上。可以看看下面gif图片（如果不动，点击图片查看）\n\n![qinglong.gif](https://f.pz.al/pzal/2025/12/24/2d245b0a77f26.gif)\n\n我觉得一个内存和性能占用低的面板更合适自己，所以做了这个项目。\n\n如果你和我一样需要一个性能和内存占用低的定时面板，这个项目你可以体验下。\n\n同样的定时场景和代码，这个项目的情况如下（cpu执行定时跳变不超过`20%`）：\n\n![baihu.gif](https://f.pz.al/pzal/2025/12/24/f0d171f9a686d.gif)\n\n如果项目有用，请帮忙点个star。\n\n## 特色\n\n- **轻量级：** docker/compose部署，无需复杂配置，开箱即用\n- **任务调度：** 支持标准 Cron 表达式，常用时间规则快捷选择。日志不落文件，没有磁盘频繁io的问题\n- **脚本管理：** 在线代码编辑器，支持文件上传、压缩包解压\n- **在线终端：** WebSocket 实时终端，命令执行结果实时输出\n- **消息推送：** 内置强大消息推送与通知引擎，无缝兼容主流渠道，支持系统级事件告警\n- **机密管理：** **(New)** 类似 GitHub Secrets 的安全存储，支持 AES-GCM 加密，日志自动打码，仅在调度时注入\n- **环境变量：** 存储普通配置，任务执行时自动注入\n- **现代UI：** 响应式设计，深色/浅色主题切换\n- **移动端：** 适配移动小屏样式\n- **远程执行：** 支持远程agent执行任务，展示执行结果\n- **多语言支持：** 深度集成 Mise，支持几乎所有主流编程语言的动态安装、多版本切换及依赖管理\n- **内建助手库：** **(New)** 为 Python/Node.js 提供零配置助手库，简单 import 即可实现一键推信，无需手动管理 API Token 和 URL\n\n## 功能特性 \n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e点击展开查看详细功能\u003c/b\u003e\u003c/summary\u003e\n\n### 定时任务管理\n- 支持标准 Cron 表达式调度\n- 常用时间规则快捷选择\n- 任务启用/禁用状态切换\n- 手动触发执行\n- 任务超时控制\n\n### 脚本文件管理\n- 在线代码编辑器\n- 文件树形结构展示\n- 支持创建、重命名、删除文件/文件夹\n- 支持压缩包上传解压\n- 支持多文件批量上传\n\n### 在线终端\n- WebSocket 实时终端\n- 支持常用 Shell 命令\n- 命令执行结果实时输出\n\n### 执行日志\n- 任务执行历史记录\n- 执行状态追踪（成功/失败/超时）\n- 执行耗时统计\n- 日志内容压缩存储\n- 日志自动清理\n\n### 消息推送与系统通知\n- 原生内置各大主流平台渠道（钉钉、企业微信、Telegram、Server酱等）\n- 支持系统级事件条件触发通知（例如任务失败报警、服务下线提醒）\n- 自动生成跨语言调用 API 示例代码供脚本集成\n\n### 变量与机密\n- 支持普通环境变量与安全机密（Secret）分类管理\n- 机密使用 **AES-GCM** 加密存储，数据库不存明文\n- 秘钥仅在内存中留存，启动读取后立即销毁（Unset）\n- 执行日志自动搜索并**屏蔽(********)**敏感机密内容\n- 严格权限隔离：机密仅在定时任务调度时注入，终端/测试环境不可见\n\n### 仓库任务同步 (New)\n- 支持 青龙 仓库命令格式快捷导入\n- 自动解析脚本注释中的 Cron 表达式和环境变量名\n- 支持基于正则表达式的白名单、黑名单文件筛选\n- 支持脚本依赖文件的识别与保留\n- 自动同步远程 Git 仓库变更，增量更新面板任务\n\n### 系统设置\n- 站点标题、标语、图标自定义\n- 分页大小、Cookie 有效期配置\n- 调度参数热重载\n- 数据备份与恢复\n\n\u003c/details\u003e\n\n## 支持语言脚本和依赖\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e点击展开查看已支持的语言及依赖管理详情\u003c/b\u003e\u003c/summary\u003e\n\n### 脚本运行环境\n白虎面板原生支持以下脚本的定时执行：\n- **Python3**, **Node.js**, **Bash** (标准版镜像内置环境)\n- 通过 **Mise** 扩展：支持几乎所有主流编程语言的动态安装与切换。\n- **Minimal 版**：不预置 Python/Node，仅内置 Mise 底座，由用户按需安装。\n\n### 依赖管理支持\n系统内置了高度集成的跨语言依赖管理器，支持自动化安装和管理以下语言的依赖项，并确保在容器内全局可用：\n\n| 语言 | 包管理器 | 功能说明 |\n| :--- | :--- | :--- |\n| **Python** | pip | 自动使用内置虚拟环境，支持清华源 |\n| **Node.js** | npm | 全局安装模式，自动配置 npmmirror 镜像 |\n| **Go** | go install | 通过 `go install` 安装二进制工具 |\n| **Rust** | cargo | 通过 `cargo install` 安装 Rust 依赖 |\n| **Ruby** | gem | 支持 `gem install` 本地安装 |\n| **Bun** | bun | 支持 `bun add -g` 全局模式 |\n| **PHP** | composer | 支持 `composer global require` |\n| **Deno** | deno | 支持 `deno install -g` |\n| **.NET** | dotnet | 支持 `dotnet tool install -g` |\n| **Elixir/Erlang** | mix | 支持 `mix archive.install` |\n| **Lua** | luarocks | 通过 `luarocks` 管理 Lua 包 |\n| **Nim** | nimble | 支持 `nimble install` |\n| **Dart/Flutter** | pub | 支持 `pub global activate` |\n| **Perl** | cpanm | 简单的 `cpanm` 安装支持 |\n| **Crystal** | shards | `shards` 项目级别或工具安装 |\n\n### 使用方法\n1. **安装环境**：进入「编程语言」页面，使用 `mise` 一键安装所需的语言及版本。\n2. **依赖管理**：在已安装列表点击「依赖管理」，输入名称（可选版本）即可自动在对应环境内完成安装。\n3. **隔离机制**：系统基于 `mise exec` 实现了完善的环境隔离，不同版本的依赖包互不冲突。\n\n\u003c/details\u003e\n\n## 效果图 \n\n![baihu-display.gif](https://raw.githubusercontent.com/engigu/resources/refs/heads/images/baihu-display.gif)\n\u003c!-- TODO: 添加效果图 --\u003e\n\n## 快速部署 \n\n项目提供多种基础镜像，可根据具体环境选择：\n\n| 标签 (Tag) | 基础镜像 | 说明 |\n| :--- | :--- | :--- |\n| `latest` | Debian 12 | **默认推荐**：集成 Python 3.13 与 Node.js 23，开箱即用 |\n| `latest-debian13` | Debian 13 | 尝鲜版本，基于 Debian Trixie |\n| `latest-minimal` | Debian 13 | **最小化版**：不预置语言环境，由用户通过面板自主按需安装 |\n\n\u003e **提示**：下方部署示例默认使用 `latest` 标签，如需换用 Debian 13 版，只需将 `latest` 替换为 `latest-debian13` 即可。\n\n\u003e **警告**：**架构升级破坏性变更**\n\u003e \n\u003e 本版本（2026.02.13+）对底层运行时环境进行了彻底重构，弃用了原有的静态 Python/Node 环境，转为使用 **Mise** 进行动态版本管理。\n\u003e \n\u003e 1. **不再提供 Alpine 镜像**：由于 glibc 兼容性问题，Mise 无法在 Alpine 上完美运行，因此暂时取消 Alpine 镜像支持。\n\u003e 2. **环境数据不兼容**：如果您是从旧版本升级上来，原有的 Python/Node 环境数据将无法迁移。升级后您需要：\n\u003e    - 清空或备份原有的 `envs/` 挂载目录\n\u003e    - 启动新容器，让系统自动初始化新的 Mise 环境\n\u003e    - 在面板中重新安装所需的语言和依赖\n\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e方式一：环境变量部署（推荐）\u003c/b\u003e\u003c/summary\u003e\n\n通过环境变量指定配置，简单灵活，适合容器编排场景。\n\n**使用 SQLite（默认）：**\n\n```bash\ndocker run -d \\\n  --name baihu \\\n  -p 8052:8052 \\\n  -v $(pwd)/data:/app/data \\\n  -v $(pwd)/envs:/app/envs \\\n  -e TZ=Asia/Shanghai \\\n  -e BH_SERVER_PORT=8052 \\\n  -e BH_SERVER_HOST=0.0.0.0 \\\n  -e BH_DB_TYPE=sqlite \\\n  -e BH_DB_PATH=/app/data/baihu.db \\\n  -e BH_DB_TABLE_PREFIX=baihu_ \\\n  -e BAIHU_SECRET_KEY=your_secret_key_here \\\n  --restart unless-stopped \\\n  ghcr.io/engigu/baihu:latest\n```\n\n\u003e **提示**：如需通过反向代理部署在子路径（如 `/baihu`），添加环境变量：\n\u003e ```bash\n\u003e -e BH_SERVER_URL_PREFIX=/baihu\n\u003e ```\n\u003e 配置后访问地址为 `http://your-domain.com/baihu/`，详见下方「URL 前缀配置」说明。\n\n**Docker Compose（SQLite）：**\n\n```yaml\nservices:\n  baihu:\n    image: ghcr.io/engigu/baihu:latest\n    container_name: baihu\n    ports:\n      - \"8052:8052\"\n    volumes:\n      - ./data:/app/data\n      - ./envs:/app/envs\n    environment:\n      - TZ=Asia/Shanghai\n      - BH_SERVER_PORT=8052\n      - BH_SERVER_HOST=0.0.0.0\n      - BH_DB_TYPE=sqlite\n      - BH_DB_PATH=/app/data/baihu.db\n      - BH_DB_TABLE_PREFIX=baihu_\n      - BAIHU_SECRET_KEY=your_secret_key_here\n      # - BH_SERVER_URL_PREFIX=/baihu  # 可选：配置 URL 前缀用于反向代理\n    logging:\n      driver: json-file\n      options:\n        max-size: \"10m\"\n        max-file: \"3\"\n    restart: unless-stopped\n```\n\n**使用 MySQL：**\n\n```bash\ndocker run -d \\\n  --name baihu \\\n  -p 8052:8052 \\\n  -v $(pwd)/data:/app/data \\\n  -v $(pwd)/envs:/app/envs \\\n  -e TZ=Asia/Shanghai \\\n  -e BH_SERVER_PORT=8052 \\\n  -e BH_SERVER_HOST=0.0.0.0 \\\n  -e BH_DB_TYPE=mysql \\\n  -e BH_DB_HOST=mysql-server \\\n  -e BH_DB_PORT=3306 \\\n  -e BH_DB_USER=root \\\n  -e BH_DB_PASSWORD=your_password \\\n  -e BH_DB_NAME=baihu \\\n  -e BH_DB_TABLE_PREFIX=baihu_ \\\n  -e BAIHU_SECRET_KEY=your_secret_key_here \\\n  --restart unless-stopped \\\n  ghcr.io/engigu/baihu:latest\n```\n\n\u003e **提示**：如需配置 URL 前缀，添加 `-e BH_SERVER_URL_PREFIX=/baihu`\n\n**Docker Compose（MySQL）：**\n\n```yaml\nservices:\n  baihu:\n    image: ghcr.io/engigu/baihu:latest\n    container_name: baihu\n    ports:\n      - \"8052:8052\"\n    volumes:\n      - ./data:/app/data\n      - ./envs:/app/envs\n    environment:\n      - TZ=Asia/Shanghai\n      - BH_SERVER_PORT=8052\n      - BH_SERVER_HOST=0.0.0.0\n      # - BH_SERVER_URL_PREFIX=/baihu  # 可选：配置 URL 前缀\n      - BH_DB_TYPE=mysql\n      - BH_DB_HOST=mysql-server\n      - BH_DB_PORT=3306\n      - BH_DB_USER=root\n      - BH_DB_PASSWORD=your_password\n      - BH_DB_NAME=baihu\n      - BH_DB_TABLE_PREFIX=baihu_\n      - BAIHU_SECRET_KEY=your_secret_key_here\n    logging:\n      driver: json-file\n      options:\n        max-size: \"10m\"\n        max-file: \"3\"\n    restart: unless-stopped\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e方式二：配置文件部署\u003c/b\u003e\u003c/summary\u003e\n\n通过挂载 `config.ini` 配置文件来管理配置，适合需要持久化配置的场景。\n\n**Docker 命令：**\n\n```bash\ndocker run -d \\\n  --name baihu \\\n  -p 8052:8052 \\\n  -v $(pwd)/data:/app/data \\\n  -v $(pwd)/configs:/app/configs \\\n  -v $(pwd)/envs:/app/envs \\\n  -e TZ=Asia/Shanghai \\\n  -e BAIHU_SECRET_KEY=your_secret_key_here \\\n  --restart unless-stopped \\\n  ghcr.io/engigu/baihu:latest\n```\n\n**Docker Compose：**\n\n```yaml\nservices:\n  baihu:\n    image: ghcr.io/engigu/baihu:latest\n    container_name: baihu\n    ports:\n      - \"8052:8052\"\n    volumes:\n      - ./data:/app/data\n      - ./configs:/app/configs\n      - ./envs:/app/envs\n    environment:\n      - TZ=Asia/Shanghai\n      - BAIHU_SECRET_KEY=your_secret_key_here\n    logging:\n      driver: json-file\n      options:\n        max-size: \"10m\"\n        max-file: \"3\"\n    restart: unless-stopped\n```\n\n首次使用需要复制 `configs/config.example.ini` 为 `configs/config.ini`，然后根据需要修改配置。\n\n**配置文件示例（`configs/config.ini`）：**\n\n```ini\n[server]\nport = 8052\nhost = 0.0.0.0\n# 可选：配置 URL 前缀用于反向代理，例如 /baihu\nurl_prefix = \n\n[database]\ntype = sqlite\npath = ./data/baihu.db\ntable_prefix = baihu_\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e方式三：配合独立中心化消息服务部署（非必需/仅供参考）\u003c/b\u003e\u003c/summary\u003e\n\n\u003e 🎉 **好消息**：自白虎面板最新版本起，系统已**原生内置**了完整强大的消息推送功能！您可直接在面板「消息推送」菜单内绑定十余种主流渠道和系统通知事件，原配合外置的 `Message-Push-Nest` 部署方式已不再是使用面板的基础要求。您可随时直接使用上方的第一种简单命令开箱即用体验。\n\u003e  \n\u003e 以下「白虎 + 消息聚合服务」的联合部署内容被予以保留，专为仍然需要「中心化通知网关」的重度企业解耦用户作为参考：\n\n白虎面板通过系统集成也可轻松连接独立的消息聚合服务。这里推荐使用 [Message-Push-Nest](https://github.com/engigu/Message-Push-Nest) 作为分布式的统一消息推送中心。\n\n**使用 SQLite**\n\n创建 `docker-compose.yml` 文件：\n\n```yaml\nservices:\n  # 白虎面板\n  baihu:\n    image: ghcr.io/engigu/baihu:latest\n    container_name: baihu\n    ports:\n      - \"8052:8052\"\n    volumes:\n      - ./data:/app/data\n      - ./envs:/app/envs\n    environment:\n      - TZ=Asia/Shanghai\n      - BH_SERVER_PORT=8052\n      - BH_SERVER_HOST=0.0.0.0\n      - BH_DB_TYPE=sqlite\n      - BH_DB_PATH=/app/data/baihu.db\n      - BH_DB_TABLE_PREFIX=baihu_\n      - BAIHU_SECRET_KEY=your_secret_key_here\n    logging:\n      driver: json-file\n      options:\n        max-size: \"10m\"\n        max-file: \"3\"\n    restart: unless-stopped\n    depends_on:\n      - message-nest\n\n  # 消息推送服务\n  message-nest:\n    image: ghcr.io/engigu/message-nest:latest\n    # 或使用 Docker Hub 镜像\n    # image: engigu/message-nest:latest\n    container_name: message-nest\n    ports:\n      - \"8053:8000\"\n    environment:\n      - TZ=Asia/Shanghai\n      - DB_TYPE=sqlite\n    volumes:\n      - ./message-nest-data:/app/data\n    logging:\n      driver: json-file\n      options:\n        max-size: \"10m\"\n        max-file: \"3\"\n    restart: unless-stopped\n```\n\n**使用 MySQL（适合生产环境，需要已有 MySQL 服务）**\n\n创建 `docker-compose.yml` 文件：\n\n```yaml\nservices:\n  # 白虎面板\n  baihu:\n    image: ghcr.io/engigu/baihu:latest\n    container_name: baihu\n    ports:\n      - \"8052:8052\"\n    volumes:\n      - ./data:/app/data\n      - ./envs:/app/envs\n    environment:\n      - TZ=Asia/Shanghai\n      - BH_SERVER_PORT=8052\n      - BH_SERVER_HOST=0.0.0.0\n      - BH_DB_TYPE=mysql\n      - BH_DB_HOST=192.168.1.100  # 修改为你的 MySQL 地址\n      - BH_DB_PORT=3306\n      - BH_DB_USER=root\n      - BH_DB_PASSWORD=your_password  # 修改为你的 MySQL 密码\n      - BH_DB_NAME=baihu\n      - BH_DB_TABLE_PREFIX=baihu_\n      - BAIHU_SECRET_KEY=your_secret_key_here\n    logging:\n      driver: json-file\n      options:\n        max-size: \"10m\"\n        max-file: \"3\"\n    restart: unless-stopped\n    depends_on:\n      - message-nest\n\n  # 消息推送服务\n  message-nest:\n    image: ghcr.io/engigu/message-nest:latest\n    # 或使用 Docker Hub 镜像\n    # image: engigu/message-nest:latest\n    container_name: message-nest\n    ports:\n      - \"8053:8000\"\n    environment:\n      - TZ=Asia/Shanghai\n      - DB_TYPE=mysql\n      - MYSQL_HOST=192.168.1.100  # 修改为你的 MySQL 地址\n      - MYSQL_PORT=3306\n      - MYSQL_USER=root\n      - MYSQL_PASSWORD=your_password  # 修改为你的 MySQL 密码\n      - MYSQL_DB=message_nest\n      - MYSQL_TABLE_PREFIX=message_\n    logging:\n      driver: json-file\n      options:\n        max-size: \"10m\"\n        max-file: \"3\"\n    restart: unless-stopped\n```\n\n启动服务：\n\n```bash\ndocker-compose up -d\n```\n\n**访问地址：**\n- 白虎面板：http://localhost:8052\n- 消息推送服务：http://localhost:8053\n\n\u003e 注意：使用 MySQL 方式时，请先在 MySQL 中创建 `baihu` 和 `message_nest` 两个数据库，并修改配置中的 MySQL 地址和密码。也可以使用同一个数据库。\n\n**在任务中使用推送**\n\n如今你无需依赖任何外部服务，可以通过面板自身完成：\n1. 进入白虎面板「消息推送」模块，新建你需要通知的渠道。\n2. 可以在「事件绑定」中直接设定**自动化系统通知**（如监控任务失败或脚本异常中止时进行自动提醒）。\n3. 如需在自己的脚本逻辑内动态推送，可以点击「脚本调用」页面，立刻获取一键调用的 Shell / API 代码，内嵌进你的业务逻辑中即可完成推信！\n\n*(如继续使用 `Message-Push-Nest`，你可以通过其管理界面中「消息模板」的「复制推送代码」提取旧有版集成样例。)*\n\n![1768143124572.png](https://f.pz.al/pzal/2026/01/11/1360cd334ff20.png)\n\n\u003e 提示：在 Docker Compose 部署的环境中，推送服务地址使用 `http://message-nest:8000`（容器内部通信）。如果是独立部署，请使用实际的服务地址。\n\n\u003c/details\u003e\n\n\u003e 环境变量优先级高于配置文件，两种方式可以混合使用。\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e方式四：Nginx 反向代理部署（HTTPS）\u003c/b\u003e\u003c/summary\u003e\n\n如果需要通过域名和 HTTPS 访问白虎面板，可以使用 Nginx 作为反向代理。\n\n**Nginx 配置示例：**\n\n```nginx\n# 在 http 块中添加 WebSocket 升级配置\nmap $http_upgrade $connection_upgrade {\n    default upgrade;\n    '' close;\n}\n\nserver {\n    listen 443 ssl http2;\n    server_name example.com;\n    \n    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;\n    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;\n    ssl_protocols TLSv1.2 TLSv1.3;\n    ssl_prefer_server_ciphers off;\n    \n    access_log /var/log/nginx/example.access.log;\n    error_log  /var/log/nginx/example.error.log warn;\n    \n    location / {\n        proxy_pass http://172.17.0.1:8052;\n        proxy_set_header Host $http_host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto https;\n        \n        # WebSocket 支持（终端功能需要）\n        proxy_http_version 1.1;\n        proxy_set_header Upgrade $http_upgrade;\n        proxy_set_header Connection $connection_upgrade;\n        \n        proxy_buffering off;\n        proxy_read_timeout 60s;\n    }\n}\n\n# HTTP 自动跳转 HTTPS（可选）\nserver {\n    listen 80;\n    server_name example.com;\n    return 301 https://$server_name$request_uri;\n}\n```\n\n**配置说明：**\n\n1. 将 `example.com` 替换为你的域名\n2. 修改 SSL 证书路径为你的实际路径\n3. `172.17.0.1:8052` 是 Docker 容器的宿主机地址和端口，根据实际情况修改\n4. WebSocket 配置是必需的，否则在线终端功能无法使用\n\n\n**重载 Nginx 配置：**\n\n```bash\nnginx -t \u0026\u0026 nginx -s reload\n```\n\n\u003c/details\u003e\n\n\n### 访问面板\n\n启动后访问：http://localhost:8052\n\n**默认账号：** 用户名 `admin`，密码见启动日志（首次启动会自动生成 12 位随机密码并打印在日志中）\n\n\u003e **注意**：出于安全性考虑，系统不再使用固定默认密码。请在容器启动日志中搜索 `管理员账号创建成功` 找到您的随机密码，并登录后及时修改。\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e命令行工具 (CLI)\u003c/b\u003e\u003c/summary\u003e\n\n白虎面板在环境内内置了同名的 `baihu` 命令行工具。如果您在终端内需要执行系统级别的操作，可以使用以下命令：\n\n```bash\nbaihu server             # 以前台方式启动面板的后台进程服务（面板启动指令）\nbaihu reposync           # 供定时任务调用，将远程 Git 仓库的高级特性同步到本地目录中\nbaihu resetpwd           # 交互式重置系统 admin 账号密码（密码丢失时可通过进入终端重置）\nbaihu restore \u003cfile\u003e     # 使用本地的 .zip 备份压缩包文件，一条命令直接全量恢复系统数据\n```\n\n终端执行 `baihu` 会直接打印内置支持的高级命令帮助列表。\n\n\u003c/details\u003e\n\n### 数据目录\n\n```\n./\n├── baihu                 # 可执行文件\n├── data/                 # 数据目录（自动创建）\n│   ├── baihu.db          # SQLite 数据库\n│   └── scripts/          # 脚本文件存储\n├── configs/\n│   └── config.ini        # 配置文件（自动创建）\n└── envs/                 # 运行环境挂载目录（自动创建）\n    └── mise/             # Mise 运行时核心目录 (包含所有语言环境及依赖)\n```\n\n### Docker 启动流程\n\n容器启动时 `docker-entrypoint.sh` 会执行以下操作：\n\n1. **目录就绪**：检查并创建 `/app/data`、`/app/configs`、`/app/envs` 等核心目录。\n2. **Mise 环境同步**：自动从镜像内置基础环境同步初始化文件至 `/app/envs/mise`，确保持久化挂载后运行时依然可用。\n3. **运行时激活**：\n   - 自动注入 `MISE_DATA_DIR` 等环境变量，确保运行时数据指向持久化目录。\n   - 将 `mise shims` 路径加入系统 `PATH`，实现 Python、Node.js 等多版本环境的全局无感调用。\n4. **依赖管理预设**：默认配置 Python 清华源（PIP）镜像，优化 Node.js 默认内存上限。\n5. **启动应用**：运行 `baihu` 面板主进程。\n\n\u003e **提示**：通过挂载 `./envs:/app/envs`，您通过面板安装的所有编程语言运行时以及通过「依赖管理」安装的所有第三方库都会永久保留，容器升级或重启后无需重新安装。\n\n## 配置说明\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e点击展开查看配置详情\u003c/b\u003e\u003c/summary\u003e\n\n### 配置文件\n\n配置文件路径：`configs/config.ini`\n\n```ini\n[server]\nport = 8052\nhost = 0.0.0.0\nurl_prefix =\n\n[database]\ntype = sqlite\nhost = localhost\nport = 3306\nuser = root\npassword = \ndbname = bh_panel\ntable_prefix = baihu_\n```\n\n### 环境变量\n\n所有配置项都支持通过环境变量覆盖，环境变量优先级高于配置文件：\n\n| 环境变量 | 对应配置 | 说明 | 默认值 |\n|----------|----------|------|--------|\n| `BH_SERVER_PORT` | server.port | 服务端口 | 8052 |\n| `BH_SERVER_HOST` | server.host | 监听地址 | 0.0.0.0 |\n| `BH_SERVER_URL_PREFIX` | server.url_prefix | URL 前缀，用于反向代理子路径部署 | - |\n| `BH_DB_TYPE` | database.type | 数据库类型 (sqlite/mysql) | sqlite |\n| `BH_DB_HOST` | database.host | 数据库地址 | localhost |\n| `BH_DB_PORT` | database.port | 数据库端口 | 3306 |\n| `BH_DB_USER` | database.user | 数据库用户 | root |\n| `BH_DB_PASSWORD` | database.password | 数据库密码 | - |\n| `BH_DB_NAME` | database.dbname | 数据库名称 | bh_panel |\n| `BH_DB_PATH` | database.path | SQLite 文件路径 | ./data/baihu.db |\n| `BH_DB_TABLE_PREFIX` | database.table_prefix | 表前缀 | baihu_ |\n| `BAIHU_SECRET_KEY` | - | 系统加密秘钥，用于机密功能（**注：仅支持环境变量设置，不支持配置文件**） | - |\n\n### URL 前缀配置\n\n如果需要通过反向代理（如 Nginx）将白虎面板部署在子路径下，可以配置 URL 前缀。\n\n**配置方式：**\n\n```bash\n# 方式一：配置文件\n[server]\nurl_prefix = /baihu\n\n# 方式二：环境变量\n-e BH_SERVER_URL_PREFIX=/baihu\n```\n\n**配置效果：**\n\n配置 `url_prefix = /baihu` 后，访问路径变为：\n\n| 类型 | 路径示例 |\n|------|---------|\n| 前端页面 | `http://your-domain.com/baihu/` |\n| 登录页面 | `http://your-domain.com/baihu/login` |\n| 任务管理 | `http://your-domain.com/baihu/tasks` |\n| API 接口 | `http://your-domain.com/baihu/api/v1/*` |\n| WebSocket | `ws://your-domain.com/baihu/api/v1/terminal/ws` |\n\n**Nginx 反向代理配置示例：**\n\n```nginx\nlocation /baihu/ {\n    proxy_pass http://localhost:8052/baihu/;\n    proxy_http_version 1.1;\n    proxy_set_header Upgrade $http_upgrade;\n    proxy_set_header Connection \"upgrade\";\n    proxy_set_header Host $http_host;\n    proxy_set_header X-Real-IP $remote_addr;\n    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n    proxy_set_header X-Forwarded-Proto $scheme;\n}\n```\n\n**MySQL 示例：**\n\n参考上方「方式一：环境变量部署」中的 MySQL 配置示例。\n\n### 调度设置\n\n系统采用 Worker Pool + 任务队列的架构来控制任务执行，可在「系统设置 \u003e 调度设置」中配置：\n\n| 设置项 | 说明 | 默认值 |\n|--------|------|--------|\n| Worker 数量 | 并发执行任务的 worker 数量 | 4 |\n| 队列大小 | 任务队列缓冲区大小 | 100 |\n| 速率间隔 | 任务启动间隔（毫秒） | 200 |\n\n修改调度设置后立即生效，无需重启服务。\n\n\u003c/details\u003e\n\n## 免责声明 ⚠️\n\n白虎面板（Baihu Panel）仅作为一个轻量级的任务托管与调度平台，本项目及相关代码**不提供、不内置任何具有实际业务逻辑的第三方脚本**。\n\n在使用本项目时，请您务必知悉并同意以下条款：\n\n1. **脚本来源审核**：请勿轻易执行任何来源不明或不可信的外部脚本。所有在平台上运行的脚本及代码均需由用户自行添加或配置，用户必须在执行前仔细阅读并审核其源代码，确保其安全性。\n2. **安全责任自负**：本项目作为基础调度工具，**无法且不保证任何被执行任务的安全性**。因运行不安全、违规脚本带来的一切数据泄露、系统损坏、财产损失及法律责任等后果，均由使用者自行承担，与本项目及开发者无关。\n3. **软件按“原样”提供**：本项目为业余开源开发，按“原样”提供，**不保证不存在 Bug 或漏洞**。开发者不对因使用本项目而引起的任何直接或间接损失负责。\n\n## 贡献 \n\n欢迎提交 Issue 和 Pull Request！如果觉得本项目对你有帮助，不求大富大贵，只求顺手点个 Star，大家的 Star 是我持续更新的动力！\n\n\u003cimg src=\"https://f.pz.al/pzal/2026/01/07/83be93eb4e2a3.png\" width=\"200\" /\u003e\n\n## 许可证 \n\n本项目采用 [Apache License 2.0](LICENSE) 协议发布，并包含额外的 [NOTICE](NOTICE) 说明。\n\n**强制要求：** 在任何分发、修改或二次开发中，**必须完整保留原作者署名及项目名称**（详见 NOTICE 文件）。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fengigu%2Fbaihu-panel","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fengigu%2Fbaihu-panel","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fengigu%2Fbaihu-panel/lists"}