feat(installer): add jsdelivr.net CDN as primary mirror for download failover
This commit is contained in:
+11
-4
@@ -63,7 +63,7 @@ Tachyon intercepts network flows via kernel **nftables** and dispatches requests
|
|||||||
* **Static DNS Overriding (`dns_hosts`)**: Direct mapping of domains to static IP addresses in sing-box DNS and dnsmasq without editing `/etc/hosts`.
|
* **Static DNS Overriding (`dns_hosts`)**: Direct mapping of domains to static IP addresses in sing-box DNS and dnsmasq without editing `/etc/hosts`.
|
||||||
* **Remote Hosts Lists Ingestion (`hosts_list_urls`)**: Automatic background downloading and parsing of external host lists and blocklists (AdAway, StevenBlack, custom blocklists).
|
* **Remote Hosts Lists Ingestion (`hosts_list_urls`)**: Automatic background downloading and parsing of external host lists and blocklists (AdAway, StevenBlack, custom blocklists).
|
||||||
* **Unified Cache (`combined.txt`)**: High-performance deduplication, merging, and global caching of multiple remote host sources into a single lightweight cache.
|
* **Unified Cache (`combined.txt`)**: High-performance deduplication, merging, and global caching of multiple remote host sources into a single lightweight cache.
|
||||||
* **GitHub Mirror Failover**: Resilient downloads that automatically retry via mirrors (`gh-proxy.com`, `ghproxy.net`) if direct access to github.com is blocked or throttled.
|
* **GitHub Mirror Failover**: Resilient downloads that automatically retry via mirrors (`cdn.jsdelivr.net`, `gh-proxy.com`, `ghproxy.net`) if direct access to github.com is blocked or throttled.
|
||||||
* **Hosts-Only Action Sections (`action = hosts`)**: Dedicated routing sections operating purely as DNS override engines without requiring an outbound proxy association.
|
* **Hosts-Only Action Sections (`action = hosts`)**: Dedicated routing sections operating purely as DNS override engines without requiring an outbound proxy association.
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
@@ -200,10 +200,13 @@ wget -O /tmp/tachyon-setup.sh https://raw.githubusercontent.com/Dushnilin/tachyo
|
|||||||
> [!TIP]
|
> [!TIP]
|
||||||
> **Installation Mirrors (if direct access to GitHub is blocked or throttled):**
|
> **Installation Mirrors (if direct access to GitHub is blocked or throttled):**
|
||||||
> ```bash
|
> ```bash
|
||||||
> # Mirror 1 (gh-proxy.com):
|
> # Mirror 1 (jsdelivr.net CDN):
|
||||||
|
> wget -O /tmp/tachyon-setup.sh https://cdn.jsdelivr.net/gh/Dushnilin/tachyon@main/install.sh && sh /tmp/tachyon-setup.sh
|
||||||
|
>
|
||||||
|
> # Mirror 2 (gh-proxy.com):
|
||||||
> wget -O /tmp/tachyon-setup.sh https://gh-proxy.com/raw.githubusercontent.com/Dushnilin/tachyon/main/install.sh && sh /tmp/tachyon-setup.sh
|
> wget -O /tmp/tachyon-setup.sh https://gh-proxy.com/raw.githubusercontent.com/Dushnilin/tachyon/main/install.sh && sh /tmp/tachyon-setup.sh
|
||||||
>
|
>
|
||||||
> # Mirror 2 (ghfast.top):
|
> # Mirror 3 (ghfast.top):
|
||||||
> wget -O /tmp/tachyon-setup.sh https://ghfast.top/https://raw.githubusercontent.com/Dushnilin/tachyon/main/install.sh && sh /tmp/tachyon-setup.sh
|
> wget -O /tmp/tachyon-setup.sh https://ghfast.top/https://raw.githubusercontent.com/Dushnilin/tachyon/main/install.sh && sh /tmp/tachyon-setup.sh
|
||||||
> ```
|
> ```
|
||||||
|
|
||||||
@@ -218,8 +221,12 @@ To cleanly remove Tachyon, restore stock DNS, flush nftables rules, and preserve
|
|||||||
wget -O /tmp/tachyon-uninstall.sh https://raw.githubusercontent.com/Dushnilin/tachyon/main/uninstall.sh && sh /tmp/tachyon-uninstall.sh
|
wget -O /tmp/tachyon-uninstall.sh https://raw.githubusercontent.com/Dushnilin/tachyon/main/uninstall.sh && sh /tmp/tachyon-uninstall.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
*Via mirror gh-proxy.com:*
|
*Via mirrors:*
|
||||||
```bash
|
```bash
|
||||||
|
# Mirror 1 (jsdelivr.net CDN):
|
||||||
|
wget -O /tmp/tachyon-uninstall.sh https://cdn.jsdelivr.net/gh/Dushnilin/tachyon@main/uninstall.sh && sh /tmp/tachyon-uninstall.sh
|
||||||
|
|
||||||
|
# Mirror 2 (gh-proxy.com):
|
||||||
wget -O /tmp/tachyon-uninstall.sh https://gh-proxy.com/raw.githubusercontent.com/Dushnilin/tachyon/main/uninstall.sh && sh /tmp/tachyon-uninstall.sh
|
wget -O /tmp/tachyon-uninstall.sh https://gh-proxy.com/raw.githubusercontent.com/Dushnilin/tachyon/main/uninstall.sh && sh /tmp/tachyon-uninstall.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ Tachyon перехватывает сетевой стек через ядро *
|
|||||||
* **Статический DNS-Overriding (`dns_hosts`)**: Прямое переопределение IP-адресов для доменов в DNS-модуле sing-box и dnsmasq без необходимости подмены `/etc/hosts`.
|
* **Статический DNS-Overriding (`dns_hosts`)**: Прямое переопределение IP-адресов для доменов в DNS-модуле sing-box и dnsmasq без необходимости подмены `/etc/hosts`.
|
||||||
* **Загрузка сторонних списков Hosts (`hosts_list_urls`)**: Автоматическая фоновая загрузка и интеграция внешних реестров и списков блокировок (AdAway, StevenBlack, РКН/Антизапрет списки).
|
* **Загрузка сторонних списков Hosts (`hosts_list_urls`)**: Автоматическая фоновая загрузка и интеграция внешних реестров и списков блокировок (AdAway, StevenBlack, РКН/Антизапрет списки).
|
||||||
* **Умный кэш (`combined.txt`)**: Автоматическое слияние, очистка и единое кэширование нескольких источников списков с поддержкой мгновенного переиспользования.
|
* **Умный кэш (`combined.txt`)**: Автоматическое слияние, очистка и единое кэширование нескольких источников списков с поддержкой мгновенного переиспользования.
|
||||||
* **Резервирование через зеркала (GitHub Mirror Retry)**: При сетевых блокировках github.com модули загрузки автоматически переключаются на зеркала (`gh-proxy.com`, `ghproxy.net`).
|
* **Резервирование через зеркала (GitHub Mirror Retry)**: При сетевых блокировках github.com модули загрузки автоматически переключаются на зеркала (`cdn.jsdelivr.net`, `gh-proxy.com`, `ghproxy.net`).
|
||||||
* **Секции чистого Hosts (`action = hosts`)**: Создание изолированных правил перенаправления DNS без обязательной привязки к прокси-нодам.
|
* **Секции чистого Hosts (`action = hosts`)**: Создание изолированных правил перенаправления DNS без обязательной привязки к прокси-нодам.
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
@@ -200,10 +200,13 @@ wget -O /tmp/tachyon-setup.sh https://raw.githubusercontent.com/Dushnilin/tachyo
|
|||||||
> [!TIP]
|
> [!TIP]
|
||||||
> **Зеркала установки (при блокировке или замедлении GitHub):**
|
> **Зеркала установки (при блокировке или замедлении GitHub):**
|
||||||
> ```bash
|
> ```bash
|
||||||
> # Зеркало 1 (gh-proxy.com):
|
> # Зеркало 1 (jsdelivr.net CDN):
|
||||||
|
> wget -O /tmp/tachyon-setup.sh https://cdn.jsdelivr.net/gh/Dushnilin/tachyon@main/install.sh && sh /tmp/tachyon-setup.sh
|
||||||
|
>
|
||||||
|
> # Зеркало 2 (gh-proxy.com):
|
||||||
> wget -O /tmp/tachyon-setup.sh https://gh-proxy.com/raw.githubusercontent.com/Dushnilin/tachyon/main/install.sh && sh /tmp/tachyon-setup.sh
|
> wget -O /tmp/tachyon-setup.sh https://gh-proxy.com/raw.githubusercontent.com/Dushnilin/tachyon/main/install.sh && sh /tmp/tachyon-setup.sh
|
||||||
>
|
>
|
||||||
> # Зеркало 2 (ghfast.top):
|
> # Зеркало 3 (ghfast.top):
|
||||||
> wget -O /tmp/tachyon-setup.sh https://ghfast.top/https://raw.githubusercontent.com/Dushnilin/tachyon/main/install.sh && sh /tmp/tachyon-setup.sh
|
> wget -O /tmp/tachyon-setup.sh https://ghfast.top/https://raw.githubusercontent.com/Dushnilin/tachyon/main/install.sh && sh /tmp/tachyon-setup.sh
|
||||||
> ```
|
> ```
|
||||||
|
|
||||||
@@ -218,8 +221,12 @@ wget -O /tmp/tachyon-setup.sh https://raw.githubusercontent.com/Dushnilin/tachyo
|
|||||||
wget -O /tmp/tachyon-uninstall.sh https://raw.githubusercontent.com/Dushnilin/tachyon/main/uninstall.sh && sh /tmp/tachyon-uninstall.sh
|
wget -O /tmp/tachyon-uninstall.sh https://raw.githubusercontent.com/Dushnilin/tachyon/main/uninstall.sh && sh /tmp/tachyon-uninstall.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
*Через зеркало gh-proxy.com:*
|
*Через зеркала:*
|
||||||
```bash
|
```bash
|
||||||
|
# Зеркало 1 (jsdelivr.net CDN):
|
||||||
|
wget -O /tmp/tachyon-uninstall.sh https://cdn.jsdelivr.net/gh/Dushnilin/tachyon@main/uninstall.sh && sh /tmp/tachyon-uninstall.sh
|
||||||
|
|
||||||
|
# Зеркало 2 (gh-proxy.com):
|
||||||
wget -O /tmp/tachyon-uninstall.sh https://gh-proxy.com/raw.githubusercontent.com/Dushnilin/tachyon/main/uninstall.sh && sh /tmp/tachyon-uninstall.sh
|
wget -O /tmp/tachyon-uninstall.sh https://gh-proxy.com/raw.githubusercontent.com/Dushnilin/tachyon/main/uninstall.sh && sh /tmp/tachyon-uninstall.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
+48
-3
@@ -1695,6 +1695,44 @@ download_file_once() {
|
|||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
|
github_to_jsdelivr() {
|
||||||
|
_url="$1"
|
||||||
|
case "$_url" in
|
||||||
|
*github.com*)
|
||||||
|
_path="${_url#*github.com/}"
|
||||||
|
case "$_path" in
|
||||||
|
*/releases/download/*)
|
||||||
|
_repo_owner="$(printf '%s' "$_path" | cut -d'/' -f1)"
|
||||||
|
_repo_name="$(printf '%s' "$_path" | cut -d'/' -f2)"
|
||||||
|
_tag="$(printf '%s' "$_path" | cut -d'/' -f4)"
|
||||||
|
_file="$(printf '%s' "$_path" | cut -d'/' -f5-)"
|
||||||
|
printf 'https://cdn.jsdelivr.net/gh/%s/%s@%s/%s' "$_repo_owner" "$_repo_name" "$_tag" "$_file"
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
*/raw/*)
|
||||||
|
_repo_owner="$(printf '%s' "$_path" | cut -d'/' -f1)"
|
||||||
|
_repo_name="$(printf '%s' "$_path" | cut -d'/' -f2)"
|
||||||
|
_branch="$(printf '%s' "$_path" | cut -d'/' -f4)"
|
||||||
|
_file="$(printf '%s' "$_path" | cut -d'/' -f5-)"
|
||||||
|
printf 'https://cdn.jsdelivr.net/gh/%s/%s@%s/%s' "$_repo_owner" "$_repo_name" "$_branch" "$_file"
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
*/*)
|
||||||
|
_repo_owner="$(printf '%s' "$_path" | cut -d'/' -f1)"
|
||||||
|
_repo_name="$(printf '%s' "$_path" | cut -d'/' -f2)"
|
||||||
|
_ref="$(printf '%s' "$_path" | cut -d'/' -f4)"
|
||||||
|
_file="$(printf '%s' "$_path" | cut -d'/' -f5-)"
|
||||||
|
[ -n "$_file" ] && {
|
||||||
|
printf 'https://cdn.jsdelivr.net/gh/%s/%s@%s/%s' "$_repo_owner" "$_repo_name" "$_ref" "$_file"
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
printf '%s' "$_url"
|
||||||
|
}
|
||||||
|
|
||||||
download_with_retry() {
|
download_with_retry() {
|
||||||
url="$1"
|
url="$1"
|
||||||
output_path="$2"
|
output_path="$2"
|
||||||
@@ -1702,14 +1740,21 @@ download_with_retry() {
|
|||||||
dl_num="${4:-}"
|
dl_num="${4:-}"
|
||||||
dl_total="${5:-}"
|
dl_total="${5:-}"
|
||||||
attempt=1
|
attempt=1
|
||||||
max_attempts=3
|
max_attempts=4
|
||||||
|
jsdelivr_url="$(github_to_jsdelivr "$url")"
|
||||||
|
|
||||||
while [ "$attempt" -le "$max_attempts" ]; do
|
while [ "$attempt" -le "$max_attempts" ]; do
|
||||||
current_url="$url"
|
current_url="$url"
|
||||||
if [ "$attempt" -eq 2 ]; then
|
if [ "$attempt" -eq 2 ] && [ "$jsdelivr_url" != "$url" ]; then
|
||||||
|
warn "Retrying $label via jsdelivr.net CDN..."
|
||||||
|
current_url="$jsdelivr_url"
|
||||||
|
elif [ "$attempt" -eq 2 ] || ([ "$attempt" -eq 3 ] && [ "$jsdelivr_url" = "$url" ]); then
|
||||||
warn "Retrying $label via gh-proxy.com mirror..."
|
warn "Retrying $label via gh-proxy.com mirror..."
|
||||||
current_url="https://gh-proxy.com/$url"
|
current_url="https://gh-proxy.com/$url"
|
||||||
elif [ "$attempt" -eq 3 ]; then
|
elif [ "$attempt" -eq 3 ] && [ "$jsdelivr_url" != "$url" ]; then
|
||||||
|
warn "Retrying $label via gh-proxy.com mirror..."
|
||||||
|
current_url="https://gh-proxy.com/$url"
|
||||||
|
elif [ "$attempt" -eq 4 ]; then
|
||||||
warn "Retrying $label via ghproxy.net mirror..."
|
warn "Retrying $label via ghproxy.net mirror..."
|
||||||
current_url="https://ghproxy.net/$url"
|
current_url="https://ghproxy.net/$url"
|
||||||
fi
|
fi
|
||||||
|
|||||||
Reference in New Issue
Block a user