# ipcheck-domains Список доменов сервисов, которые определяют и проверяют IP-адрес: «какой у меня IP», тесты утечек DNS/WebRTC, GeoIP-базы и скоринг прокси/VPN. Собирается в несколько форматов. Основной — `geosite.dat` (protobuf v2ray/Xray) для 3x-ui. CI на Gitea Actions пересобирает всё при каждом изменении `data/` и раз в сутки по расписанию. > Во всех примерах ниже `gitea.example.com/mrleo1nid/ipcheck-domains` — замените на адрес > своего инстанса и репозитория. ## Категории | Категория | Что внутри | | --- | --- | | `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.example.com/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.example.com/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.example.com/mrleo1nid/ipcheck-domains/raw/branch/release/update-geosite.sh chmod +x /usr/local/bin/update-geosite.sh ``` Проверьте вручную — первый запуск скачает файл и перезапустит панель: ```bash BASE_URL=https://gitea.example.com/mrleo1nid/ipcheck-domains/raw/branch/release \ DEST=/usr/local/x-ui/bin/ipcheck.dat \ RESTART_CMD='x-ui restart' \ /usr/local/bin/update-geosite.sh ``` Второй запуск подряд должен отработать молча и мгновенно — значит сравнение сумм работает. ### Вариант 1: cron `crontab -e` от root, одна строка (04:17 ночи, чтобы не совпадать с чужими крон-джобами): ```cron 17 4 * * * BASE_URL=https://gitea.example.com/mrleo1nid/ipcheck-domains/raw/branch/release DEST=/usr/local/x-ui/bin/ipcheck.dat RESTART_CMD='x-ui restart' /usr/local/bin/update-geosite.sh >> /var/log/ipcheck-update.log 2>&1 ``` Или, если не хочется длинной строки, положите настройки в `/etc/default/ipcheck`: ```bash BASE_URL=https://gitea.example.com/mrleo1nid/ipcheck-domains/raw/branch/release DEST=/usr/local/x-ui/bin/ipcheck.dat 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 BASE_URL DEST RESTART_CMD` последней строкой. ### Вариант 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.example.com/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` | ссылка на ветку `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.example.com/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.example.com/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). Список доменов — общедоступные факты, используйте как угодно.