build 2026-09-21 03:18 UTC (6cd10434a3)
This commit is contained in:
@@ -0,0 +1,300 @@
|
||||
# ipcheck-domains
|
||||
|
||||
Список доменов сервисов, которые определяют и проверяют IP-адрес: «какой у меня IP»,
|
||||
тесты утечек DNS/WebRTC, GeoIP-базы и скоринг прокси/VPN.
|
||||
|
||||
Собирается в несколько форматов. Основной — `geosite.dat` (protobuf v2ray/Xray) для 3x-ui.
|
||||
CI на Gitea Actions пересобирает всё при каждом изменении `data/` и раз в сутки по расписанию.
|
||||
|
||||
> Если форкнули к себе — поменяйте `gitea.hsrv.site/mrleo1nid/ipcheck-domains` в примерах
|
||||
> ниже и в `BASE_URL` внутри [`tools/update-geosite.sh`](tools/update-geosite.sh).
|
||||
|
||||
## Категории
|
||||
|
||||
| Категория | Что внутри |
|
||||
| --- | --- |
|
||||
| `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://gitea.hsrv.site/mrleo1nid/ipcheck-domains/raw/branch/release/<путь>
|
||||
```
|
||||
|
||||
| Файл | Для чего |
|
||||
| --- | --- |
|
||||
| `ipcheck.dat` | Xray / v2ray / 3x-ui — кладётся рядом со штатным `geosite.dat` |
|
||||
| `geosite.dat` | то же самое, но именем по умолчанию — если хотите заменить штатный файл |
|
||||
| `ipcheck.dat.sha256sum` | контрольная сумма, по ней работает автообновление |
|
||||
| `update-geosite.sh` | скрипт обновления для cron (см. ниже) |
|
||||
| `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`, `SHA256SUMS` | время сборки, счётчики, суммы по всем файлам |
|
||||
|
||||
Плюс каждая сборка публикуется как релиз Gitea с датой в теге — там же лежит
|
||||
`ipcheck-domains-all.tar.gz` со всем содержимым `dist/` разом.
|
||||
|
||||
## 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://gitea.hsrv.site/mrleo1nid/ipcheck-domains/raw/branch/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**).
|
||||
|
||||
## Автообновление на сервере
|
||||
|
||||
Xray читает `.dat` только при старте, поэтому обновление — это «скачать файл и
|
||||
перезапустить сервис». Этим занимается [`update-geosite.sh`](tools/update-geosite.sh):
|
||||
|
||||
- сначала тянет `.sha256sum` и, если сумма совпала с локальным файлом, **молча выходит** —
|
||||
ни лишней закачки, ни лишнего перезапуска Xray;
|
||||
- проверяет контрольную сумму скачанного файла **до** подмены;
|
||||
- подменяет файл атомарно (`mv` в пределах каталога), старый сохраняет в `.bak`;
|
||||
- перезапускает сервис только если файл действительно изменился;
|
||||
- пишет в stdout только когда что-то произошло, так что cron не будет слать письма впустую.
|
||||
|
||||
### Установка
|
||||
|
||||
```bash
|
||||
curl -fsSL -o /usr/local/bin/update-geosite.sh https://gitea.hsrv.site/mrleo1nid/ipcheck-domains/raw/branch/release/update-geosite.sh
|
||||
chmod +x /usr/local/bin/update-geosite.sh
|
||||
```
|
||||
|
||||
`BASE_URL` и `DEST` уже прописаны в скрипте по умолчанию, так что задать нужно только
|
||||
команду перезапуска. Проверьте вручную — первый запуск скачает файл и перезапустит панель:
|
||||
|
||||
```bash
|
||||
RESTART_CMD='x-ui restart' /usr/local/bin/update-geosite.sh
|
||||
```
|
||||
|
||||
Второй запуск подряд должен отработать молча и мгновенно — значит сравнение сумм работает.
|
||||
|
||||
### Вариант 1: cron
|
||||
|
||||
`crontab -e` от root, одна строка (04:17 ночи, чтобы не совпадать с чужими крон-джобами):
|
||||
|
||||
```cron
|
||||
17 4 * * * RESTART_CMD='x-ui restart' /usr/local/bin/update-geosite.sh >> /var/log/ipcheck-update.log 2>&1
|
||||
```
|
||||
|
||||
Если путь до `.dat` другой или репозиторий свой, добавьте в ту же строку `DEST=…`
|
||||
и `BASE_URL=…`. Когда переменных много, вынесите их в `/etc/default/ipcheck`:
|
||||
|
||||
```bash
|
||||
export BASE_URL=https://gitea.hsrv.site/mrleo1nid/ipcheck-domains/raw/branch/release
|
||||
export DEST=/usr/local/x-ui/bin/ipcheck.dat
|
||||
export RESTART_CMD='x-ui restart'
|
||||
```
|
||||
|
||||
```cron
|
||||
17 4 * * * . /etc/default/ipcheck && /usr/local/bin/update-geosite.sh >> /var/log/ipcheck-update.log 2>&1
|
||||
```
|
||||
|
||||
`export` здесь обязателен: скрипт читает переменные из окружения, а не из своего шелла.
|
||||
|
||||
### Вариант 2: systemd timer
|
||||
|
||||
Точнее cron: `Persistent=true` догоняет пропущенный запуск после перезагрузки,
|
||||
`RandomizedDelaySec` размазывает нагрузку, а логи идут в journald.
|
||||
|
||||
`/etc/systemd/system/ipcheck-geosite.service`:
|
||||
|
||||
```ini
|
||||
[Unit]
|
||||
Description=Обновление ipcheck.dat для Xray
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
Environment=BASE_URL=https://gitea.hsrv.site/mrleo1nid/ipcheck-domains/raw/branch/release
|
||||
Environment=DEST=/usr/local/x-ui/bin/ipcheck.dat
|
||||
Environment=RESTART_CMD=x-ui restart
|
||||
ExecStart=/usr/local/bin/update-geosite.sh
|
||||
```
|
||||
|
||||
`/etc/systemd/system/ipcheck-geosite.timer`:
|
||||
|
||||
```ini
|
||||
[Unit]
|
||||
Description=Ежедневное обновление ipcheck.dat
|
||||
|
||||
[Timer]
|
||||
OnCalendar=daily
|
||||
RandomizedDelaySec=1h
|
||||
Persistent=true
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target
|
||||
```
|
||||
|
||||
```bash
|
||||
systemctl daemon-reload
|
||||
systemctl enable --now ipcheck-geosite.timer
|
||||
systemctl start ipcheck-geosite.service # разовая проверка
|
||||
journalctl -u ipcheck-geosite.service -n 20
|
||||
```
|
||||
|
||||
### Если 3x-ui в Docker
|
||||
|
||||
Путь указывайте внутрь примонтированного тома, а перезапуск делайте через docker:
|
||||
|
||||
```bash
|
||||
DEST=/var/lib/x-ui-bin/ipcheck.dat RESTART_CMD='docker restart 3x-ui' /usr/local/bin/update-geosite.sh
|
||||
```
|
||||
|
||||
### Переменные скрипта
|
||||
|
||||
| Переменная | По умолчанию | Значение |
|
||||
| --- | --- | --- |
|
||||
| `BASE_URL` | `https://gitea.hsrv.site/mrleo1nid/ipcheck-domains/raw/branch/release` | база, откуда качать |
|
||||
| `DEST` | `/usr/local/x-ui/bin/ipcheck.dat` | куда положить файл |
|
||||
| `NAME` | имя файла из `DEST` | имя файла в репозитории |
|
||||
| `RESTART_CMD` | пусто | что выполнить после успешного обновления |
|
||||
| `TIMEOUT` | `30` | таймаут curl, секунды |
|
||||
|
||||
Коды возврата: `0` — обновлено или уже актуально, `1` — ошибка (не скачалось,
|
||||
не совпала сумма, не удался перезапуск).
|
||||
|
||||
## sing-box
|
||||
|
||||
```json
|
||||
{
|
||||
"route": {
|
||||
"rules": [{ "rule_set": "ipcheck", "outbound": "proxy" }],
|
||||
"rule_set": [
|
||||
{
|
||||
"type": "remote",
|
||||
"tag": "ipcheck",
|
||||
"format": "binary",
|
||||
"url": "https://gitea.hsrv.site/mrleo1nid/ipcheck-domains/raw/branch/release/sing-box/ipcheck.srs",
|
||||
"download_detour": "direct",
|
||||
"update_interval": "1d"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Здесь cron не нужен — sing-box обновляет rule-set сам.
|
||||
|
||||
## Clash / mihomo
|
||||
|
||||
```yaml
|
||||
rule-providers:
|
||||
ipcheck:
|
||||
type: http
|
||||
behavior: domain
|
||||
format: yaml
|
||||
url: "https://gitea.hsrv.site/mrleo1nid/ipcheck-domains/raw/branch/release/clash/ipcheck.yaml"
|
||||
path: ./ruleset/ipcheck.yaml
|
||||
interval: 86400
|
||||
|
||||
rules:
|
||||
- RULE-SET,ipcheck,PROXY
|
||||
```
|
||||
|
||||
Для `.mrs` укажите `behavior: domain` и `format: mrs`. Обновление тоже своё, по `interval`.
|
||||
|
||||
## Как добавить домен
|
||||
|
||||
Правьте файлы в `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
|
||||
python3 tools/build.py
|
||||
```
|
||||
|
||||
Результат — в `dist/`. Проверка исходников без сборки (синтаксис, дубликаты,
|
||||
домены, уже покрытые родительским суффиксом, циклические `include`):
|
||||
|
||||
```bash
|
||||
python3 tools/build.py --check
|
||||
```
|
||||
|
||||
Тесты сборщика:
|
||||
|
||||
```bash
|
||||
python3 -m unittest discover -s tools -t tools
|
||||
```
|
||||
|
||||
`.srs` и `.mrs` собираются, только если в `PATH` есть `sing-box` и `mihomo` —
|
||||
без них остальные форматы всё равно соберутся. Скачать их вместе с `xray`:
|
||||
|
||||
```bash
|
||||
sh tools/fetch-tools.sh ./bin
|
||||
```
|
||||
|
||||
Сборщик проверяет сам себя: после записи `geosite.dat` он разбирает файл обратно
|
||||
и сверяет с исходником. В CI дополнительно поднимается настоящий Xray с правилом
|
||||
`ext:ipcheck.dat:ipcheck` — если файл не читается, сборка падает.
|
||||
|
||||
## CI
|
||||
|
||||
[`.gitea/workflows/build.yml`](.gitea/workflows/build.yml): проверка → тесты →
|
||||
сборка → валидация настоящими Xray и sing-box → публикация в ветку `release` →
|
||||
релиз в Gitea.
|
||||
|
||||
Раннеру нужен образ с `python3`, `curl`, `unzip`, `tar`, `git` (например
|
||||
`catthehacker/ubuntu:act-latest`); если чего-то нет, первый шаг доставит пакеты сам.
|
||||
|
||||
Публикация идёт под автоматическим токеном `${{ github.token }}`. Если у раннера
|
||||
нет прав на push в репозиторий или на создание релизов — заведите секрет
|
||||
`RELEASE_TOKEN` с правами `repo:write`, workflow предпочтёт его.
|
||||
|
||||
## Лицензия
|
||||
|
||||
[MIT](LICENSE). Список доменов — общедоступные факты, используйте как угодно.
|
||||
Reference in New Issue
Block a user