管理1panel的编排模板和计划任务脚本库,从 Git 仓库自动同步到 1Panel 数据库的脚本工具。
1Panel 是一款现代化的 Linux 服务器运维管理面板,支持通过 Web UI 管理 Docker Compose 模板和脚本库。 虽然官方也提供构建自己的本地应用商店,但制作本地应用商店比较麻烦,个人习惯最简单的方式便剩下手动维护compose与脚本文件,然而官方并不提供这些同步,收费版未知。
痛点:
- 手动维护困难:模板和脚本分散在各个仓库,手动复制粘贴效率低下且容易出错
- 版本管理缺失:无法追踪模板和脚本的变更历史,难以回滚到稳定版本
- 团队协作困难:多人维护时缺乏统一的同步机制,容易出现数据不一致
- 更新流程繁琐:每次更新都需要手动登录面板操作,无法自动化
本工具通过 Git 仓库作为单一数据源,自动将模板和脚本同步到 1Panel 数据库,实现:
- ✅ 版本化管理:所有配置文件通过 Git 管理,支持版本追踪和回滚
- ✅ 自动化同步:配合 Cron 定时任务,实现无人值守自动更新
- ✅ 灵活配置:通过 JSON 配置文件轻松扩展新的同步目录
| 特性 | 说明 |
|---|---|
| 零外部依赖 | 仅使用 Python 标准库,无需安装额外包 |
| 配置驱动 | 通过 JSON 配置文件管理同步规则,扩展新目录无需改代码 |
| 多文件类型支持 | 单个目录支持匹配多种文件类型(如 *.yaml + *.yml) |
| 多数据库支持 | 不同内容可写入不同数据库文件(如 core.db、agent.db) |
| 智能 UPSERT | 自动判断插入或更新,避免重复数据 |
| 本地仓库支持 | 支持使用本地 Git 仓库,适合离线环境或自托管场景 |
| 自更新能力 | Cron 脚本支持自动拉取本项目最新代码 |
panel_hub/
├── __init__.py # 包初始化
├── __main__.py # 支持 python -m panel_hub
├── main.py # 入口、CLI 参数解析
├── config.py # 配置管理
├── git_syncer.py # Git 仓库同步器
├── db_manager.py # 数据库管理器
└── hub_syncer.py # Hub 同步器
.env.example # 环境变量示例,提炼自script-libraries目录下的脚本
sync-config.example.json # 配置文件示例
sync-task.sh # Cron 定时任务脚本
requirements.txt # 依赖说明
- Python 3.8+
- Git(如需从远程仓库同步)
- 1Panel 已安装(用于数据库写入)
# 方式一:克隆项目
git clone https://github.com/jurnlee/1panel-scripts.git
cd 1panel-scripts
# 方式二:下载压缩包
wget https://github.com/jurnlee/1panel-scripts/archive/main.tar.gz
tar -xzf main.tar.gz
cd 1panel-scripts-main复制示例配置并修改:
cp sync-config.example.json sync-config.json编辑 sync-config.json:
{
"git_repo_url": "https://github.com/your-org/1panel-hub.git",
"git_branch": "main",
"db_base_path": "/opt/1panel/db",
"repo_path": "/opt/scripts/1panel-hub",
"sync_configs": [
{
"source_dir": "compose-templates",
"db_file": "agent.db",
"table": "compose_templates",
"columns": {"name": "name", "content": "content"},
"file_pattern": ["*.yaml", "*.yml"]
},
{
"source_dir": "script-libraries",
"db_file": "core.db",
"table": "script_libraries",
"columns": {"name": "name", "content": "script"},
"file_pattern": "*.sh"
}
]
}脚本库中的部分脚本需要环境变量支持。创建 .env 文件:
cp .env.example .env编辑 .env:
# Docker 镜像同步配置
TARGET_REGISTRY=registry.cn-hangzhou.aliyuncs.com/your-mirrors/
DOCKER_PREFIXES_TO_REMOVE=docker.xuyan.run/:dockerhub.azk8s.cn/:registry.docker-cn.com/
# 其他配置
# PYTHON=python3
# LOG_LEVEL=INFOsync-task.sh 会自动加载 .env 文件到环境变量,脚本库中的脚本即可直接使用。
| 字段 | 必填 | 说明 |
|---|---|---|
git_repo_url |
否 | Git 仓库地址,用于自动克隆 |
git_branch |
否 | Git 分支,默认 main |
db_base_path |
否 | 数据库基础路径,默认 /opt/1panel/db |
repo_path |
否 | 本地仓库路径,指定后跳过 Git 操作 |
sync_configs |
是 | 同步配置列表 |
sync_configs 子项说明:
| 字段 | 说明 |
|---|---|
source_dir |
Git 仓库中的目录名 |
db_file |
目标数据库文件名 |
table |
目标数据库表名 |
columns |
列名映射,name 对应名称列,content 对应内容列 |
file_pattern |
文件匹配模式,支持字符串或数组 |
# 使用配置文件(推荐)
python3 -m panel_hub
## 等同于
python3 -m panel_hub --config sync-config.json
# 预览模式(不写入数据库)
python3 -m panel_hub --config sync-config.json --dry-run
# 使用本地仓库
python3 -m panel_hub --config sync-config.json --repo /path/to/local/repo
# 指定数据库路径(覆盖配置文件)
python3 -m panel_hub --config sync-config.json --db-base /custom/db/path
# 详细日志
python3 -m panel_hub --config sync-config.json -v| 参数 | 简写 | 说明 |
|---|---|---|
--config |
-c |
配置文件路径 |
--db-base |
数据库基础路径 | |
--repo |
本地仓库路径 | |
--repo-url |
Git 仓库地址 | |
--branch |
Git 分支 | |
--dry-run |
预览模式 | |
--verbose |
-v |
详细日志 |
# 编辑 crontab
crontab -e添加定时任务:
# 每小时执行一次
0 * * * * /opt/scripts/sync-cron.sh -c /opt/scripts/sync-config.json >> /var/log/panel-hub-sync.log 2>&1
# 每天凌晨 3 点执行
0 3 * * * /opt/scripts/sync-cron.sh -c /opt/scripts/sync-config.json >> /var/log/panel-hub-sync.log 2>&1添加新的同步目录只需在 sync_configs 中添加配置:
{
"sync_configs": [
{
"source_dir": "app-templates",
"db_file": "core.db",
"table": "app_templates",
"columns": {"name": "name", "content": "template"},
"file_pattern": ["*.json", "*.json5"]
}
]
}Git 仓库(repo_path 或自动克隆的仓库)应包含与配置对应的目录:
your-1panel-hub/
├── compose-templates/
│ ├── nginx.yaml
│ ├── mysql.yml
│ └── redis.yaml
├── script-libraries/
│ ├── backup.sh
│ └── monitor.sh
└── app-templates/
└── wordpress.json
文件命名规则:
- 文件名(不含扩展名)将作为数据库中的
name字段 - 文件内容将作为数据库中的内容字段
- 注意:同名文件会自动更新而非重复插入
- 数据库文件:读写权限(1Panel 默认数据库位于
/opt/1panel/db/) - 仓库目录:读写权限(用于 git clone/pull)
- 日志目录:写权限(用于记录日志)
-
备份优先:首次运行前备份数据库
cp /opt/1panel/db/core.db /opt/1panel/db/core.db.bak cp /opt/1panel/db/agent.db /opt/1panel/db/agent.db.bak
-
先预览后执行:使用
--dry-run确认无误后再正式执行 -
合理设置定时频率:建议每天同步一次,避免过于频繁
-
监控日志:定期检查日志文件,关注同步失败的情况
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| Git 克隆失败 | 网络问题或仓库地址错误 | 检查网络连接和仓库地址 |
| 数据库不存在 | 路径错误或 1Panel 未安装 | 确认 db_base_path 路径正确 |
| 权限不足 | 运行用户无读写权限 | 检查文件权限或使用 sudo |
| 找不到目录 | 仓库结构与配置不匹配 | 确认 source_dir 存在 |
| 数据未更新 | 名称冲突或文件未匹配 | 检查 file_pattern 和文件扩展名 |
修改 panel_hub/hub_syncer.py 中的 _sync_config 方法,添加自定义处理逻辑。
配置文件中的 columns 支持灵活映射:
{
"columns": {
"name": "template_name",
"content": "template_body"
}
}MIT License