починил работу при мультисписках + вернул readme & install script

This commit is contained in:
yandexru45
2026-03-08 13:04:47 +03:00
parent 617080e0bc
commit 5c7e3dce31
3 changed files with 89 additions and 21 deletions

View File

@@ -1,3 +1,11 @@
# Podkop Evolution
> **Podkop's fork with HWID and Subscription URL support**
>
> Этот форк добавляет поддержку ссылок подписки (subscription URL) с кастомными заголовками (HWID, Device-OS, Device-Model) и автоматическим обновлением. Основан на [itdoginfo/podkop](https://github.com/itdoginfo/podkop).
---
# Вещи, которые вам нужно знать перед установкой
- Это бета-версия, которая находится в активной разработке. Из версии в версию что-то может меняться.
@@ -16,12 +24,45 @@
# Документация
https://podkop.net/
# Установка Podkop
# Установка Podkop Evolution
Полная информация в [документации](https://podkop.net/docs/install/)
Вкратце, достаточно одного скрипта для установки и обновления:
```
sh <(wget -O - https://raw.githubusercontent.com/itdoginfo/podkop/refs/heads/main/install.sh)
sh <(wget -O - https://raw.githubusercontent.com/yandexru45/podkop-evolution/refs/heads/main/install.sh)
```
## Новое в этом форке: Подписки (Subscription)
Добавлена поддержка subscription URL — ссылки подписки от провайдера прокси. При выборе типа конфигурации **Subscription** в LuCI:
- Введите URL подписки от вашего провайдера
- Выберите интервал автообновления (от 30 минут до 1 дня)
- Все серверы из подписки автоматически появятся в дашборде
- Автоматический выбор лучшего сервера по задержке (URLTest)
- Ручное переключение между серверами через дашборд
При скачивании подписки отправляются заголовки:
- `User-Agent: singbox/<версия>`
- `X-HWID` — уникальный идентификатор роутера
- `X-Device-OS: OpenWrt Linux`
- `X-Device-Model` — модель роутера
- `X-Ver-OS` — версия ядра
Пример конфигурации через UCI:
```
uci set podkop.my_sub=section
uci set podkop.my_sub.connection_type='proxy'
uci set podkop.my_sub.proxy_config_type='subscription'
uci set podkop.my_sub.subscription_url='https://your-provider.com/api/sub'
uci set podkop.my_sub.subscription_update_interval='1h'
uci add_list podkop.my_sub.community_lists='russia_inside'
uci commit podkop
```
Ручное обновление подписки:
```
/usr/bin/podkop subscription_update
```
## Изменения 0.7.0
@@ -38,7 +79,7 @@ mv /etc/config/podkop /etc/config/podkop-070
```
2. Стянуть новый дефолтный конфиг:
```
wget -O /etc/config/podkop https://raw.githubusercontent.com/itdoginfo/podkop/refs/heads/main/podkop/files/etc/config/podkop
wget -O /etc/config/podkop https://raw.githubusercontent.com/yandexru45/podkop-evolution/refs/heads/main/podkop/files/etc/config/podkop
```
3. Настроить заново ваш Podkop через Luci или UCI.
@@ -48,14 +89,12 @@ wget -O /etc/config/podkop https://raw.githubusercontent.com/itdoginfo/podkop/re
> PR принимаются только по issues, у которых стоит label "enhancement". Либо по согласованию с авторами в ТГ-чате. Остальные PR на данный момент не рассматриваются.
## Будущее
- [ ] [Подписка](https://github.com/itdoginfo/podkop/issues/118). Здесь нужна реализация, чтоб для каждой секции помимо ручного выбора, был выбор фильтрации по тегу. Например, для main выбираем ключевые слова NL, DE, FI. А для extra секции фильтруем по RU. И создаётся outbound c urltest в которых перечислены outbound из фильтров.
- [x] [Подписка](https://github.com/itdoginfo/podkop/issues/118)**реализовано в этом форке!**
- [ ] Весь трафик в sing-box и маршрутизация полностью на его уровне.
- [ ] При успешном запуске переходит в фоновый режим и следит за состоянием sing-box. Если вдруг идёт exit 1, выполняется dnsmasq restore и снова следит за состоянием. Вопрос в том, как это искусственно провернуть. Попробовать положить прокси и посмотреть, останется ли работать DNS в этом случае. И здесь, вероятно, можно обойтись триггером в init.d. [Issue](https://github.com/itdoginfo/podkop/issues/111)
- [ ] При успешном запуске переходит в фоновый режим и следит за состоянием sing-box. Если вдруг идёт exit 1, выполняется dnsmasq restore и снова следит за состоянием. [Issue](https://github.com/itdoginfo/podkop/issues/111)
- [ ] Галочка, которая режет доступ к doh серверам.
- [ ] IPv6. Только после наполнения Wiki.
## Тесты
- [ ] Unit тесты (BATS)
- [ ] Интеграционные тесты бекенда (OpenWrt rootfs + BATS)
[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/itdoginfo/podkop)

View File

@@ -1,7 +1,7 @@
#!/bin/sh
# shellcheck shell=dash
REPO="https://api.github.com/repos/itdoginfo/podkop/releases/latest"
REPO="https://api.github.com/repos/yandexru45/podkop-evolution/releases/latest"
DOWNLOAD_DIR="/tmp/podkop"
COUNT=3
@@ -66,7 +66,7 @@ update_config() {
printf "\033[48;5;196m\033[1m║ ! Обнаружена старая версия podkop. ║\033[0m\n"
printf "\033[48;5;196m\033[1m║ Если продолжите обновление, вам потребуется настроить Podkop заново. ║\033[0m\n"
printf "\033[48;5;196m\033[1m║ Старая конфигурация будет сохранена в /etc/config/podkop-070 ║\033[0m\n"
printf "\033[48;5;196m\033[1m║ Подробности: https://github.com/itdoginfo/podkop ║\033[0m\n"
printf "\033[48;5;196m\033[1m║ Подробности: https://github.com/yandexru45/podkop-evolution ║\033[0m\n"
printf "\033[48;5;196m\033[1m║ Точно хотите продолжить? ║\033[0m\n"
printf "\033[48;5;196m\033[1m╚══════════════════════════════════════════════════════════════════════╝\033[0m\n"
@@ -76,7 +76,7 @@ update_config() {
printf "\033[48;5;196m\033[1m║ ! Detected old podkop version. ║\033[0m\n"
printf "\033[48;5;196m\033[1m║ If you continue the update, you will need to RECONFIGURE podkop. ║\033[0m\n"
printf "\033[48;5;196m\033[1m║ Your old configuration will be saved to /etc/config/podkop-070 ║\033[0m\n"
printf "\033[48;5;196m\033[1m║ Details: https://github.com/itdoginfo/podkop ║\033[0m\n"
printf "\033[48;5;196m\033[1m║ Details: https://github.com/yandexru45/podkop-evolution ║\033[0m\n"
printf "\033[48;5;196m\033[1m║ Are you sure you want to continue? ║\033[0m\n"
printf "\033[48;5;196m\033[1m╚══════════════════════════════════════════════════════════════════════╝\033[0m\n"
@@ -88,7 +88,7 @@ update_config() {
yes|y|Y)
mv /etc/config/podkop /etc/config/podkop-070
wget -O /etc/config/podkop https://raw.githubusercontent.com/itdoginfo/podkop/refs/heads/main/podkop/files/etc/config/podkop
wget -O /etc/config/podkop https://raw.githubusercontent.com/yandexru45/podkop-evolution/refs/heads/main/podkop/files/etc/config/podkop
msg "Podkop config has been reset to default. Your old config saved in /etc/config/podkop-070"
break
;;
@@ -115,7 +115,7 @@ main() {
fi
if command -v curl >/dev/null 2>&1; then
check_response=$(curl -s "https://api.github.com/repos/itdoginfo/podkop/releases/latest")
check_response=$(curl -s "https://api.github.com/repos/yandexru45/podkop-evolution/releases/latest")
if echo "$check_response" | grep -q 'API rate limit '; then
msg "You've reached the GitHub rate limit. Repeat in five minutes."

View File

@@ -568,6 +568,23 @@ add_subscription_cron_job() {
} | crontab -
log "The subscription cron job has been created: $cron_job"
}
ensure_nft_ready_for_list_update() {
if nft list table inet "$NFT_TABLE_NAME" > /dev/null 2>&1; then
return 0
fi
log "NFT table '$NFT_TABLE_NAME' is missing before lists update, recreating nft rules" "warn"
route_table_rule_mark
create_nft_rules
if ! nft list table inet "$NFT_TABLE_NAME" > /dev/null 2>&1; then
log "Failed to recreate NFT table '$NFT_TABLE_NAME'" "error"
return 1
fi
return 0
}
list_update() {
echolog "🔄 Starting lists update..."
@@ -600,7 +617,7 @@ list_update() {
local service_proxy_address
service_proxy_address="$(get_service_proxy_address)"
if [ -n "$http_proxy_address" ]; then
if [ -n "$service_proxy_address" ]; then
if curl -s -x "http://$service_proxy_address" -m $curl_timeout https://github.com > /dev/null; then
echolog "✅ GitHub connection check passed (via proxy)"
break
@@ -624,16 +641,23 @@ list_update() {
return 1
fi
if ! ensure_nft_ready_for_list_update; then
echolog "❌ NFT table is unavailable, cannot update lists"
return 1
fi
echolog "📥 Downloading and processing lists..."
config_foreach import_community_subnet_lists "section"
config_foreach import_domains_from_remote_domain_lists "section"
config_foreach import_subnets_from_remote_subnet_lists "section"
local update_failed=0
config_foreach import_community_subnet_lists "section" || update_failed=1
config_foreach import_domains_from_remote_domain_lists "section" || update_failed=1
config_foreach import_subnets_from_remote_subnet_lists "section" || update_failed=1
if [ $? -eq 0 ]; then
if [ "$update_failed" -eq 0 ]; then
echolog "✅ Lists update completed successfully"
else
echolog "❌ Lists update failed"
return 1
fi
}
@@ -1570,9 +1594,14 @@ import_community_service_subnet_list_handler() {
;;
"discord")
URL=$SUBNETS_DISCORD
nft_create_ipv4_set "$NFT_TABLE_NAME" "$NFT_DISCORD_SET_NAME"
nft add rule inet "$NFT_TABLE_NAME" mangle iifname "@$NFT_INTERFACE_SET_NAME" ip daddr \
"@$NFT_DISCORD_SET_NAME" udp dport '{ 50000-65535 }' meta mark set "$NFT_FAKEIP_MARK" counter
if ! nft list set inet "$NFT_TABLE_NAME" "$NFT_DISCORD_SET_NAME" > /dev/null 2>&1; then
nft_create_ipv4_set "$NFT_TABLE_NAME" "$NFT_DISCORD_SET_NAME"
fi
if ! nft list chain inet "$NFT_TABLE_NAME" mangle 2> /dev/null | \
grep -Fq "@$NFT_DISCORD_SET_NAME udp dport { 50000-65535 }"; then
nft add rule inet "$NFT_TABLE_NAME" mangle iifname "@$NFT_INTERFACE_SET_NAME" ip daddr \
"@$NFT_DISCORD_SET_NAME" udp dport '{ 50000-65535 }' meta mark set "$NFT_FAKEIP_MARK" counter
fi
;;
"roblox")
URL=$SUBNETS_ROBLOX