feat: сборка geosite для ipcheck-доменов в нескольких форматах

Собирает список сервисов проверки IP (ip-lookup, leak-test, geoip-db,
fraud-score) в geosite.dat для Xray/3x-ui, а также в sing-box, Clash/mihomo,
AdGuard, plain text и JSON.

Сборщик на чистой стандартной библиотеке: пишет protobuf вручную, после
записи разбирает .dat обратно и сверяет с исходником. Формат сверен с
настоящим geosite.dat и проверен реальным Xray 26.3.27.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Leonid Pershin
2026-08-07 14:11:06 +03:00
co-authored by Claude Opus 5
commit f905a76caf
11 changed files with 1071 additions and 0 deletions
+157
View File
@@ -0,0 +1,157 @@
# ipcheck-domains
Список доменов сервисов, которые определяют и проверяют IP-адрес: «какой у меня IP»,
тесты утечек DNS/WebRTC, GeoIP-базы и скоринг прокси/VPN.
Собирается в несколько форматов. Основной — `geosite.dat` (protobuf v2ray/Xray) для 3x-ui.
Сборка идёт автоматически при каждом изменении `data/` и раз в сутки по расписанию.
## Категории
| Категория | Что внутри |
| --- | --- |
| `ipcheck` | всё вместе — то, что обычно и нужно в роутинге |
| `ip-lookup` | «какой у меня IP»: 2ip, whoer, ipinfo, ifconfig.me, ipify… |
| `leak-test` | тесты утечек: browserleaks, ipleak, dnsleaktest |
| `geoip-db` | GeoIP-базы и справочники: maxmind, db-ip, ip2location… |
| `fraud-score` | детекторы VPN/прокси: spur, scamalytics, ipqualityscore… |
## Скачать
Ветка `release` обновляется при каждой сборке — ссылки стабильны:
```
https://raw.githubusercontent.com/mrleo1nid/ipcheck-domains/release/<путь>
```
| Файл | Для чего |
| --- | --- |
| `ipcheck.dat` | Xray / v2ray / 3x-ui — кладётся рядом со штатным `geosite.dat` |
| `geosite.dat` | то же самое, но именем по умолчанию — если хотите заменить штатный файл |
| `sing-box/<категория>.srs` | sing-box, скомпилированный rule-set |
| `sing-box/<категория>.json` | sing-box, исходный rule-set |
| `mihomo/<категория>.mrs` | mihomo, бинарный rule-provider |
| `clash/<категория>.yaml` | Clash/mihomo rule-provider, `behavior: domain` |
| `clash/<категория>.list` | Clash/mihomo rule-provider, `behavior: classical` |
| `txt/<категория>.txt` | просто домены, по одному на строку |
| `json/<категория>.json` | структурированный список с типами правил |
| `adguard/<категория>.txt` | AdGuard Home / uBlock — если нужно блокировать, а не роутить |
| `metadata.json` | время сборки, счётчики, sha256 |
Плюс каждая сборка публикуется как GitHub Release с датой в теге.
## 3x-ui
Файл кладётся туда же, где лежат `geoip.dat` и `geosite.dat` панели. Обычно это
`/usr/local/x-ui/bin` (панель, установленная скриптом) или `/usr/local/share/xray`:
```bash
curl -fsSL -o /usr/local/x-ui/bin/ipcheck.dat https://raw.githubusercontent.com/mrleo1nid/ipcheck-domains/release/ipcheck.dat
```
Дальше в панели: **Xray Settings → Routing Rules → Add Rule**, поле `domain`:
```
ext:ipcheck.dat:ipcheck
```
и нужный `outboundTag`. Тем же правилом в JSON-конфиге:
```json
{
"type": "field",
"domain": ["ext:ipcheck.dat:ipcheck"],
"outboundTag": "proxy"
}
```
Если вы заменили штатный `geosite.dat` нашим файлом, синтаксис короче — `geosite:ipcheck`.
Отдельные категории адресуются так же: `ext:ipcheck.dat:leak-test`.
После замены файла Xray нужно перезапустить (в 3x-ui — **Restart Xray**).
## sing-box
```json
{
"route": {
"rules": [{ "rule_set": "ipcheck", "outbound": "proxy" }],
"rule_set": [
{
"type": "remote",
"tag": "ipcheck",
"format": "binary",
"url": "https://raw.githubusercontent.com/mrleo1nid/ipcheck-domains/release/sing-box/ipcheck.srs",
"download_detour": "direct"
}
]
}
}
```
## Clash / mihomo
```yaml
rule-providers:
ipcheck:
type: http
behavior: domain
format: yaml
url: "https://raw.githubusercontent.com/mrleo1nid/ipcheck-domains/release/clash/ipcheck.yaml"
path: ./ruleset/ipcheck.yaml
interval: 86400
rules:
- RULE-SET,ipcheck,PROXY
```
Для `.mrs` укажите `behavior: domain` и `format: mrs`.
## Как добавить домен
Правьте файлы в `data/` — по одному домену на строку, в подходящую категорию.
Всё остальное соберётся само.
Формат строки (тот же, что у `v2fly/domain-list-community`):
```
example.com # домен и все его поддомены (тип по умолчанию)
domain:example.com # то же самое, явно
full:www.example.com # только этот хост, без поддоменов
keyword:ipcheck # подстрока в имени
regexp:^ip[0-9]+\.com$ # регулярное выражение
include:ip-lookup # подключить другую категорию целиком
example.com @ads # атрибут — попадёт в .dat как geosite:ipcheck@ads
```
Пустые строки и всё после `#` игнорируются.
## Локальная сборка
Нужен только Python 3.10+, зависимостей нет:
```bash
python tools/build.py
```
Результат — в `dist/`. Проверка исходников без сборки (синтаксис, дубликаты,
домены, уже покрытые родительским суффиксом, циклические `include`):
```bash
python tools/build.py --check
```
`.srs` и `.mrs` собираются, только если в `PATH` есть `sing-box` и `mihomo`
без них остальные форматы всё равно соберутся. Пути можно указать явно:
```bash
python tools/build.py --sing-box ./bin/sing-box --mihomo ./bin/mihomo
```
Сборщик проверяет сам себя: после записи `geosite.dat` он разбирает файл обратно
и сверяет с исходником. В CI дополнительно поднимается настоящий Xray с правилом
`ext:geosite.dat:ipcheck` — если файл не читается, сборка падает.
## Лицензия
[MIT](LICENSE). Список доменов — общедоступные факты, используйте как угодно.