Compare commits

...
Author SHA1 Message Date
gitea-actions d82b543a14 sync: обновление списков из апстримов 2026-09-18 03:18:00 +00:00
gitea-actions 4c617e6257 sync: обновление списков из апстримов 2026-09-17 03:18:15 +00:00
gitea-actions 5a070094f7 sync: обновление списков из апстримов 2026-09-16 03:17:57 +00:00
gitea-actions ae56e2d4ac sync: обновление списков из апстримов 2026-09-15 03:17:58 +00:00
gitea-actions 92a67937f6 sync: обновление списков из апстримов 2026-09-14 03:17:54 +00:00
gitea-actions 6169ccd28d sync: обновление списков из апстримов 2026-09-13 03:17:55 +00:00
gitea-actions cc3e56e31f sync: обновление списков из апстримов 2026-09-12 03:20:05 +00:00
gitea-actions b939d562fe sync: обновление списков из апстримов 2026-09-11 03:18:01 +00:00
gitea-actions 0a3963466d sync: обновление списков из апстримов 2026-09-10 03:17:54 +00:00
gitea-actions df6508320b sync: обновление списков из апстримов 2026-09-09 03:18:01 +00:00
gitea-actions 31a1a0c385 sync: обновление списков из апстримов 2026-09-08 03:17:59 +00:00
gitea-actions f9eb078c1f sync: обновление списков из апстримов 2026-09-07 03:18:04 +00:00
gitea-actions 4ba2b74ae1 sync: обновление списков из апстримов 2026-09-06 03:17:54 +00:00
gitea-actions 3e699eac87 sync: обновление списков из апстримов 2026-09-05 03:18:49 +00:00
gitea-actions 34d9f2e2a0 sync: обновление списков из апстримов 2026-09-04 03:18:27 +00:00
gitea-actions 5613a6b044 sync: обновление списков из апстримов 2026-09-03 03:17:59 +00:00
gitea-actions 5006d5e2ee sync: обновление списков из апстримов 2026-09-01 03:17:42 +00:00
gitea-actions 0dff77fca0 sync: обновление списков из апстримов 2026-08-31 03:17:58 +00:00
gitea-actions aa5dfb451c sync: обновление списков из апстримов 2026-08-30 03:17:59 +00:00
gitea-actions de8671101d sync: обновление списков из апстримов 2026-08-29 03:18:00 +00:00
gitea-actions 6f92326d26 sync: обновление списков из апстримов 2026-08-28 03:18:02 +00:00
gitea-actions 1d66728105 sync: обновление списков из апстримов 2026-08-27 03:18:02 +00:00
gitea-actions 22d67d36f9 sync: обновление списков из апстримов 2026-08-26 03:18:03 +00:00
gitea-actions 376a460a8b sync: обновление списков из апстримов 2026-08-25 03:18:00 +00:00
gitea-actions e7ddd9d65a sync: обновление списков из апстримов 2026-08-24 03:18:00 +00:00
gitea-actions 13159e9e35 sync: обновление списков из апстримов 2026-08-23 03:18:03 +00:00
gitea-actions d3157a26a3 sync: обновление списков из апстримов 2026-08-22 03:18:04 +00:00
gitea-actions e922a8dd17 sync: обновление списков из апстримов 2026-08-21 03:18:01 +00:00
gitea-actions 221054e5b2 sync: обновление списков из апстримов 2026-08-20 03:18:00 +00:00
gitea-actions c1b9a4af57 sync: обновление списков из апстримов 2026-08-19 03:18:03 +00:00
gitea-actions edccc251ad sync: обновление списков из апстримов 2026-08-18 03:18:02 +00:00
gitea-actions 8d4f821a5a sync: обновление списков из апстримов 2026-08-17 03:17:30 +00:00
gitea-actions 7e475b72dd sync: обновление списков из апстримов 2026-08-16 03:17:32 +00:00
gitea-actions 10377ca30f sync: обновление списков из апстримов 2026-08-15 03:17:29 +00:00
gitea-actions e02fd1df80 sync: обновление списков из апстримов 2026-08-14 03:17:30 +00:00
gitea-actions dea1b421ff sync: обновление списков из апстримов 2026-08-13 03:17:39 +00:00
gitea-actions 7ad6766cdc sync: обновление списков из апстримов 2026-08-12 03:17:38 +00:00
gitea-actions 5b53aa3ab6 sync: обновление списков из апстримов 2026-08-11 03:18:01 +00:00
Leonid PershinandClaude Opus 5 e6186ba6df feat: один апдейтер на несколько репозиториев
build / build (push) Successful in 20s
update-geodata.sh теперь ходит по списку SOURCES (строка «URL-базы|имя»),
а не по одной базе: ipcheck.dat и оба discord-.dat обновляются за один
запуск и с одним перезапуском сервиса. Старый вызов с DEST продолжает
работать — каталог берётся из него.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 09:31:14 +03:00
3 changed files with 85 additions and 34 deletions
+20 -3
View File
@@ -105,7 +105,7 @@ x-ui restart
## Автообновление на сервере ## Автообновление на сервере
`update-geodata.sh` качает оба `.dat`, только если их sha256 разошлись с `update-geodata.sh` качает файлы, только если их sha256 разошлись с
удалёнными, проверяет сумму до подмены и перезапускает сервис один раз — удалёнными, проверяет сумму до подмены и перезапускает сервис один раз —
и только если что-то реально изменилось. и только если что-то реально изменилось.
@@ -122,14 +122,31 @@ cron раз в сутки:
23 4 * * * RESTART_CMD='x-ui restart' /usr/local/bin/update-geodata.sh >> /var/log/discord-geodata.log 2>&1 23 4 * * * RESTART_CMD='x-ui restart' /usr/local/bin/update-geodata.sh >> /var/log/discord-geodata.log 2>&1
``` ```
Скрипт умеет тянуть файлы из нескольких репозиториев сразу — один cron-job
вместо двух. По умолчанию это `ipcheck.dat` из
[ipcheck-domains](https://gitea.hsrv.site/mrleo1nid/ipcheck-domains) и оба
`.dat` отсюда; перезапуск при этом один на все файлы.
| Переменная | По умолчанию | Значение | | Переменная | По умолчанию | Значение |
| --- | --- | --- | | --- | --- | --- |
| `BASE_URL` | `https://gitea.hsrv.site/mrleo1nid/discord-geodata/raw/branch/release` | база, откуда качать | | `SOURCES` | три строки ниже | что качать, по строке на файл: `URL-базы\|имя-файла` |
| `BASE_URL` | `…/ipcheck-domains/raw/branch/release` | база для строк без `\|` |
| `DISCORD_URL` | `…/discord-geodata/raw/branch/release` | база для файлов этого репозитория |
| `DEST_DIR` | `/usr/local/x-ui/bin` | куда класть файлы | | `DEST_DIR` | `/usr/local/x-ui/bin` | куда класть файлы |
| `NAMES` | `discord-geosite.dat discord-geoip.dat` | что качать |
| `RESTART_CMD` | пусто | что выполнить после успешного обновления | | `RESTART_CMD` | пусто | что выполнить после успешного обновления |
| `TIMEOUT` | `30` | таймаут curl, секунды | | `TIMEOUT` | `30` | таймаут curl, секунды |
Нужны только файлы Discord — задайте `SOURCES` явно:
```sh
SOURCES='https://gitea.hsrv.site/mrleo1nid/discord-geodata/raw/branch/release|discord-geosite.dat
https://gitea.hsrv.site/mrleo1nid/discord-geodata/raw/branch/release|discord-geoip.dat' \
RESTART_CMD='x-ui restart' /usr/local/bin/update-geodata.sh
```
Старый вызов с `DEST=/путь/файл.dat` продолжает работать: каталог берётся из
него, а имя файла подставляется в первую строку `SOURCES`.
Если 3x-ui в Docker — укажите `DEST_DIR` на смонтированный каталог и Если 3x-ui в Docker — укажите `DEST_DIR` на смонтированный каталог и
`RESTART_CMD='docker restart 3x-ui'`. `RESTART_CMD='docker restart 3x-ui'`.
+24 -15
View File
@@ -1,11 +1,17 @@
# GENERATED tools/sync.py — не редактируйте вручную. # GENERATED tools/sync.py — не редактируйте вручную.
# Источник: you-oops-dev/ipranges-singbox (диапазоны сетей) # Источник: you-oops-dev/ipranges-singbox (диапазоны сетей)
# URL: https://raw.githubusercontent.com/you-oops-dev/ipranges-singbox/refs/heads/main/discord/discord.srs # URL: https://raw.githubusercontent.com/you-oops-dev/ipranges-singbox/refs/heads/main/discord/discord.srs
# Сетей: 54 # Сетей: 63
# Ограничения: без ограничений # Ограничения: без ограничений
23.227.38.74/32 23.227.38.74/32
34.3.0.27/32
34.3.1.27/32
34.126.226.51/32 34.126.226.51/32
34.144.170.27/32
34.144.171.27/32
34.153.2.27/32
34.153.3.27/32
104.17.51.93/32 104.17.51.93/32
104.17.117.93/32 104.17.117.93/32
104.18.32.174/32 104.18.32.174/32
@@ -17,20 +23,22 @@
104.21.80.173/32 104.21.80.173/32
104.21.82.160/32 104.21.82.160/32
104.21.89.187/32 104.21.89.187/32
142.251.32.187/32 104.154.124.27/32
142.251.34.91/32 104.154.125.27/32
142.251.35.91/32 142.251.108.207/32
142.251.40.123/32 142.251.121.207/32
142.251.41.27/32 142.251.214.59/32
142.251.45.1/32 142.251.218.91/32
142.251.45.27/32 142.251.218.123/32
142.251.210.155/32 142.251.218.155/32
142.251.214.123/32 142.251.218.187/32
142.251.215.91/32 142.251.218.193/32
142.251.215.187/32 142.251.218.219/32
142.251.215.219/32 142.251.218.251/32
142.251.215.251/32 142.251.219.27/32
142.251.218.27/32 142.251.219.59/32
142.251.219.155/32
142.251.219.187/32
162.159.128.232/30 162.159.128.232/30
162.159.129.232/30 162.159.129.232/30
162.159.130.232/30 162.159.130.232/30
@@ -56,5 +64,6 @@
172.67.159.89/32 172.67.159.89/32
172.67.191.5/32 172.67.191.5/32
172.67.222.182/32 172.67.222.182/32
192.178.142.207/32
216.198.53.11/32 216.198.53.11/32
216.198.54.11/32 216.198.54.11/32
+41 -16
View File
@@ -1,6 +1,5 @@
#!/bin/sh #!/bin/sh
# Обновляет локальные discord-geosite.dat и discord-geoip.dat из ветки release. # Обновляет geosite/geoip-файлы Xray из веток release. Рассчитан на cron.
# Рассчитан на запуск по cron.
# #
# Каждый файл скачивается, только если его sha256 отличается от локального, # Каждый файл скачивается, только если его sha256 отличается от локального,
# контрольная сумма проверяется до подмены, а сервис перезапускается один раз # контрольная сумма проверяется до подмены, а сервис перезапускается один раз
@@ -8,20 +7,35 @@
# cron не будет слать письма впустую. # cron не будет слать письма впустую.
# #
# ./update-geodata.sh # ./update-geodata.sh
# BASE_URL=https://gitea.hsrv.site/mrleo1nid/discord-geodata/raw/branch/release \ # RESTART_CMD='x-ui restart' ./update-geodata.sh
# DEST_DIR=/usr/local/x-ui/bin RESTART_CMD='x-ui restart' ./update-geodata.sh #
# Что качать, задаёт SOURCES — по строке на файл, формат «URL-базы|имя-файла»
# (без «|» берётся BASE_URL). По умолчанию это ipcheck.dat из ipcheck-domains
# и оба .dat из discord-geodata:
#
# SOURCES='https://example.org/raw/branch/release|my.dat' ./update-geodata.sh
# #
# NAMES задаёт список файлов; по умолчанию — оба .dat.
# Коды возврата: 0 — обновлено или уже актуально, 1 — ошибка. # Коды возврата: 0 — обновлено или уже актуально, 1 — ошибка.
set -eu set -eu
BASE_URL="${BASE_URL:-https://gitea.hsrv.site/mrleo1nid/discord-geodata/raw/branch/release}"
DEST_DIR="${DEST_DIR:-/usr/local/x-ui/bin}" DEST_DIR="${DEST_DIR:-/usr/local/x-ui/bin}"
NAMES="${NAMES:-discord-geosite.dat discord-geoip.dat}" BASE_URL="${BASE_URL:-https://gitea.hsrv.site/mrleo1nid/ipcheck-domains/raw/branch/release}"
DISCORD_URL="${DISCORD_URL:-https://gitea.hsrv.site/mrleo1nid/discord-geodata/raw/branch/release}"
RESTART_CMD="${RESTART_CMD:-}" RESTART_CMD="${RESTART_CMD:-}"
TIMEOUT="${TIMEOUT:-30}" TIMEOUT="${TIMEOUT:-30}"
# Совместимость со старым вызовом, где DEST задавал единственный файл целиком.
if [ -n "${DEST:-}" ]; then
DEST_DIR=$(dirname "$DEST")
NAME="${NAME:-$(basename "$DEST")}"
fi
SOURCES="${SOURCES:-\
$BASE_URL|${NAME:-ipcheck.dat}
$DISCORD_URL|discord-geosite.dat
$DISCORD_URL|discord-geoip.dat}"
log() { printf '%s update-geodata: %s\n' "$(date -u '+%Y-%m-%dT%H:%M:%SZ')" "$*"; } log() { printf '%s update-geodata: %s\n' "$(date -u '+%Y-%m-%dT%H:%M:%SZ')" "$*"; }
die() { log "ОШИБКА: $*" >&2; exit 1; } die() { log "ОШИБКА: $*" >&2; exit 1; }
@@ -37,15 +51,26 @@ fi
fetch() { curl -fsSL --retry 3 --retry-delay 2 --max-time "$TIMEOUT" "$1"; } fetch() { curl -fsSL --retry 3 --retry-delay 2 --max-time "$TIMEOUT" "$1"; }
tmp=""
cleanup() { [ -z "$tmp" ] || rm -f "$tmp"; }
trap cleanup EXIT INT TERM
mkdir -p "$DEST_DIR" mkdir -p "$DEST_DIR"
changed=0 changed=0
for name in $NAMES; do # Цикл читает SOURCES через here-doc, а не из конвейера: в подоболочке
# счётчик changed не пережил бы выход из цикла.
while IFS='|' read -r base name; do
[ -n "$base" ] || continue
if [ -z "$name" ]; then
name="$base"
base="$BASE_URL"
fi
dest="$DEST_DIR/$name" dest="$DEST_DIR/$name"
# Без промежуточной переменной статус вернул бы cut, а не curl. # Без промежуточной переменной статус вернул бы cut, а не curl.
remote_line=$(fetch "$BASE_URL/$name.sha256sum") || remote_line=$(fetch "$base/$name.sha256sum") ||
die "не удалось скачать $BASE_URL/$name.sha256sum" die "не удалось скачать $base/$name.sha256sum"
remote_sum=$(printf '%s' "$remote_line" | cut -d' ' -f1) remote_sum=$(printf '%s' "$remote_line" | cut -d' ' -f1)
case "$remote_sum" in case "$remote_sum" in
[0-9a-f][0-9a-f]*) [ "${#remote_sum}" -eq 64 ] || die "битая контрольная сумма: $remote_sum" ;; [0-9a-f][0-9a-f]*) [ "${#remote_sum}" -eq 64 ] || die "битая контрольная сумма: $remote_sum" ;;
@@ -56,10 +81,8 @@ for name in $NAMES; do
continue # уже актуально — тишина continue # уже актуально — тишина
fi fi
tmp=$(mktemp "${TMPDIR:-/tmp}/discord-geodata.XXXXXX") || die "не удалось создать временный файл" tmp=$(mktemp "${TMPDIR:-/tmp}/geodata.XXXXXX") || die "не удалось создать временный файл"
trap 'rm -f "$tmp"' EXIT INT TERM fetch "$base/$name" > "$tmp" || die "не удалось скачать $base/$name"
fetch "$BASE_URL/$name" > "$tmp" || die "не удалось скачать $BASE_URL/$name"
got=$(hash_of "$tmp") got=$(hash_of "$tmp")
[ "$got" = "$remote_sum" ] || die "$name: ожидалось $remote_sum, получено $got" [ "$got" = "$remote_sum" ] || die "$name: ожидалось $remote_sum, получено $got"
@@ -69,11 +92,13 @@ for name in $NAMES; do
# mv в пределах одного каталога атомарен: Xray никогда не увидит половину файла. # mv в пределах одного каталога атомарен: Xray никогда не увидит половину файла.
cat "$tmp" > "$dest.new" && mv -f "$dest.new" "$dest" || die "не удалось записать $dest" cat "$tmp" > "$dest.new" && mv -f "$dest.new" "$dest" || die "не удалось записать $dest"
rm -f "$tmp" rm -f "$tmp"
trap - EXIT INT TERM tmp=""
log "обновлён $dest (sha256 $remote_sum)" log "обновлён $dest (sha256 $remote_sum)"
changed=1 changed=1
done done <<EOF
$SOURCES
EOF
[ "$changed" -eq 1 ] || exit 0 [ "$changed" -eq 1 ] || exit 0