Files
shunt-rules/README.md
T

173 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# gitea-shunt-rules
一个最小可用的规则生成器:
- 先全量拉取上游 `ios_rule_script``Surge` 规则到本地缓存
- 再在本地做合并去重并转换多渠道
- 输入按目录分类(默认读取 `upstream/rule/Surge/<Name>/...`
- 输出仅包含你要的两种格式:
- `dist/surge/<Name>.list`
- `dist/loon/<Name>.list`
- `dist/clash/<Name>.yaml`
- `dist/mihomo/<Name>.yaml`
- 当前策略:**只使用 Surge 作为上游源,Clash 由 Surge 规则转换生成**
## 为什么这个方案适合你
`ShuntRules` 公开仓库基本只留了发布索引,生成器不在仓库中。这个项目按它的输出思路重建了可控版本,并把数据源切到 Gitea,便于你自己托管。
## 运行环境
- Python 3.11+(可直接使用 TOML 配置)
- Python 3.10 也可用,但建议改用 JSON 配置(`config.example.json`
## 快速开始
仓库已内置可直接跑的默认配置文件 `config.json`(本地源模式,默认读 `upstream/`)。
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'
```
如果数据源仓库是公开的(当前默认就是公开源),可以不设置 token。
默认配置会生成约 600+ 分类(当前为 667 个可直接生成的分类)。
3.1 先同步 Surge 全量源到本地缓存:
```bash
bash scripts/sync_surge_full.sh
```
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
每个分类优先按下面三份源文件做合并去重(按顺序):
1. `<Name>.list`
2. `<Name>_Domain.list`
3. `<Name>_Resolve.list`
如果某分类不满足上述结构,会自动回退到 `_All.list` 等可用文件。
- Surge 输出:保留源规则(去重、清理空白)
- Loon 输出:基于 Surge 规则直接输出(同样去重、清理空白)
- Clash 输出:
- 自动移除注释/空行
- `USER-AGENT``URL-REGEX` 默认跳过(并在头部记录 `SKIPPED-*`
- `DEST-PORT` 自动映射为 `DST-PORT`
- `IP-CIDR`/`IP-CIDR6` 可通过 `clash_no_resolve` 控制是否追加 `no-resolve`
- Mihomo 输出:
- 使用与 Clash 相同的 provider YAML 结构
- `DEST-PORT` 自动映射为 `DST-PORT`
- `USER-AGENT``URL-REGEX` 默认跳过(并在头部记录 `SKIPPED-*`
- `IP-CIDR`/`IP-CIDR6` 可通过 `mihomo_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`
工作流会先执行 `scripts/sync_surge_full.sh` 拉取上游 Surge 全量数据,再生成多渠道规则。
### 发布到独立仓库/分支(已内置)
如果你希望“生成仓库”和“发布仓库”分离,使用:
- `/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`
- `MIHOMO_NO_RESOLVE`(默认 `false`
该工作流当前定时为 `15 3 * * *`UTC),对应北京时间每天 `11:15`,也支持手动触发。