Вместо GitHub Actions — .gitea/workflows/build.yml: проверка, тесты, сборка, валидация настоящими Xray и sing-box, публикация в ветку release и релиз через Gitea API (tools/gitea-release.sh). Ни gh CLI, ни GitHub-only экшенов. Для серверов — tools/update-geosite.sh: сверяет sha256 до закачки и выходит молча, если файл не менялся, проверяет сумму до подмены, подменяет атомарно и дёргает перезапуск только когда файл реально обновился. Едет в dist/, поэтому на сервере нужен один базовый URL. В README — cron и systemd timer. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
13 KiB
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:
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-конфиге:
{
"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:
- сначала тянет
.sha256sumи, если сумма совпала с локальным файлом, молча выходит — ни лишней закачки, ни лишнего перезапуска Xray; - проверяет контрольную сумму скачанного файла до подмены;
- подменяет файл атомарно (
mvв пределах каталога), старый сохраняет в.bak; - перезапускает сервис только если файл действительно изменился;
- пишет в stdout только когда что-то произошло, так что cron не будет слать письма впустую.
Установка
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
Проверьте вручную — первый запуск скачает файл и перезапустит панель:
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 ночи, чтобы не совпадать с чужими крон-джобами):
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:
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
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:
[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:
[Unit]
Description=Ежедневное обновление ipcheck.dat
[Timer]
OnCalendar=daily
RandomizedDelaySec=1h
Persistent=true
[Install]
WantedBy=timers.target
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:
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
{
"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
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+, зависимостей нет:
python3 tools/build.py
Результат — в dist/. Проверка исходников без сборки (синтаксис, дубликаты,
домены, уже покрытые родительским суффиксом, циклические include):
python3 tools/build.py --check
Тесты сборщика:
python3 -m unittest discover -s tools -t tools
.srs и .mrs собираются, только если в PATH есть sing-box и mihomo —
без них остальные форматы всё равно соберутся. Скачать их вместе с xray:
sh tools/fetch-tools.sh ./bin
Сборщик проверяет сам себя: после записи geosite.dat он разбирает файл обратно
и сверяет с исходником. В CI дополнительно поднимается настоящий Xray с правилом
ext:ipcheck.dat:ipcheck — если файл не читается, сборка падает.
CI
.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. Список доменов — общедоступные факты, используйте как угодно.