Compare commits
39
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d82b543a14 | ||
|
|
4c617e6257 | ||
|
|
5a070094f7 | ||
|
|
ae56e2d4ac | ||
|
|
92a67937f6 | ||
|
|
6169ccd28d | ||
|
|
cc3e56e31f | ||
|
|
b939d562fe | ||
|
|
0a3963466d | ||
|
|
df6508320b | ||
|
|
31a1a0c385 | ||
|
|
f9eb078c1f | ||
|
|
4ba2b74ae1 | ||
|
|
3e699eac87 | ||
|
|
34d9f2e2a0 | ||
|
|
5613a6b044 | ||
|
|
5006d5e2ee | ||
|
|
0dff77fca0 | ||
|
|
aa5dfb451c | ||
|
|
de8671101d | ||
|
|
6f92326d26 | ||
|
|
1d66728105 | ||
|
|
22d67d36f9 | ||
|
|
376a460a8b | ||
|
|
e7ddd9d65a | ||
|
|
13159e9e35 | ||
|
|
d3157a26a3 | ||
|
|
e922a8dd17 | ||
|
|
221054e5b2 | ||
|
|
c1b9a4af57 | ||
|
|
edccc251ad | ||
|
|
8d4f821a5a | ||
|
|
7e475b72dd | ||
|
|
10377ca30f | ||
|
|
e02fd1df80 | ||
|
|
dea1b421ff | ||
|
|
7ad6766cdc | ||
|
|
5b53aa3ab6 | ||
|
|
e6186ba6df |
@@ -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
@@ -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
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user