feat: initial gitea shunt rules generator

This commit is contained in:
袁震
2026-04-06 11:52:50 +08:00
commit b9ac36321a
7 changed files with 696 additions and 0 deletions
+138
View File
@@ -0,0 +1,138 @@
# gitea-shunt-rules
一个最小可用的规则生成器:
- 数据源来自 **Gitea** 仓库
- 输入按目录分类(默认读取 `rule/Surge/<Name>/<Name>.list`
- 输出仅包含你要的两种格式:
- `dist/surge/<Name>.list`
- `dist/clash/<Name>.yaml`
## 为什么这个方案适合你
`ShuntRules` 公开仓库基本只留了发布索引,生成器不在仓库中。这个项目按它的输出思路重建了可控版本,并把数据源切到 Gitea,便于你自己托管。
## 运行环境
- Python 3.11+(可直接使用 TOML 配置)
- Python 3.10 也可用,但建议改用 JSON 配置(`config.example.json`
## 快速开始
1. 复制配置:
```bash
cd /Users/yuan/Desktop/workspaces/docker/pve/gitea-shunt-rules
cp config.example.toml config.toml
```
2. 填写 `config.toml`
- `gitea.base_url`:你的 Gitea 地址,例如 `https://git.xxx.com`
- `gitea.owner` / `gitea.repo`:规则仓库
- `source.root`:源规则根目录,默认 `rule/Surge`
3. 设置 token(如果仓库私有):
```bash
export GITEA_TOKEN='your-token'
```
4. 生成全部分类:
```bash
python3 main.py --config config.toml
```
5. 只生成部分分类:
```bash
python3 main.py --config config.toml --names YouTube,Netflix
```
如果你是 Python 3.10,可用 JSON 配置:
```bash
cp config.example.json config.json
python3 main.py --config config.json --names YouTube,Netflix
```
## 目录规范(推荐)
建议你的 Gitea 仓库中按以下结构维护源数据:
```text
rule/Surge/
YouTube/
YouTube.list
Netflix/
Netflix.list
```
每个 `.list` 文件示例:
```text
# 注释会被忽略
DOMAIN-SUFFIX,youtube.com
DOMAIN-KEYWORD,youtube
IP-CIDR,172.110.32.0/21,no-resolve
USER-AGENT,*youtube*
```
## 转换规则说明
- Surge 输出:保留源规则(去重、清理空白)
- Clash 输出:
- 自动移除注释/空行
- `USER-AGENT``URL-REGEX` 默认跳过(并在头部记录 `SKIPPED-*`
- `IP-CIDR`/`IP-CIDR6` 可通过 `clash_no_resolve` 控制是否追加 `no-resolve`
## 定时更新建议
你可以在 Gitea Actions 或系统 `cron` 做定时任务:
1. 拉取源仓库
2. 执行 `python3 main.py --config config.toml`
3. 提交 `dist/` 目录到发布仓库或对象存储
### Gitea Actions(已内置)
项目已包含工作流文件:
- `/Users/yuan/Desktop/workspaces/docker/pve/gitea-shunt-rules/.gitea/workflows/generate-rules.yml`
你只需要做这几步:
1. 在仓库根目录放好 `config.toml``config.json`
2. 在 Gitea 仓库 Secrets 中添加 `GITEA_TOKEN`(私有源仓库建议必须配置)
3. 推送到 `main` 后会自动执行;也可在 Actions 页面手动触发
当前定时表达式是 `0 3 * * *`(UTC),对应北京时间(UTC+8)每天 `11:00`
### 发布到独立仓库/分支(已内置)
如果你希望“生成仓库”和“发布仓库”分离,使用:
- `/Users/yuan/Desktop/workspaces/docker/pve/gitea-shunt-rules/.gitea/workflows/publish-rules.yml`
这个工作流会:
1. 从你指定的源仓库读取规则并生成 `dist/`
2.`dist/` 内容同步到目标仓库的目标分支(可单独设为 `rules` / `gh-pages`
需要在 Gitea 仓库中配置:
- Secrets
- `GITEA_BASE_URL`:例如 `https://gitea.example.com`
- `GITEA_TOKEN`:需要有读取源仓库 + 推送目标仓库权限
- `SOURCE_OWNER`
- `SOURCE_REPO`
- `TARGET_OWNER`
- `TARGET_REPO`
- Variables(可选):
- `SOURCE_REF`(默认 `main`
- `SOURCE_ROOT`(默认 `rule/Surge`
- `TARGET_BRANCH`(默认 `main`
- `CLASH_NO_RESOLVE`(默认 `false`
该工作流当前定时为 `15 3 * * *`UTC),对应北京时间每天 `11:15`,也支持手动触发。