Поддержка ссылок-подписок для podkop. Podkop переключается в режим URLTest и выбирается сервер с наименьшим пингом.
- Ссылка вставляется в LuCI, серверы уезжают в podkop по кнопке
- Подписка в base64 или обычным текстом
- Обновление раз в сутки по расписанию, с выключателем в интерфейсе
- Заголовок
x-hwidдля панелей, которые прячут список за лимитом устройств - Серверы с транспортом, который podkop не соберёт, отсеиваются — мёртвых выходов в пуле не будет
- Конфигурация podkop откатывается, если он отверг новый список
- Обновление без изменений не трогает ни podkop, ни соединение
| Пакет | Содержимое |
|---|---|
podkop-sub |
CLI (podkop-sub update), UCI-конфиг и задание в cron |
luci-app-podkop-sub |
Страница в LuCI |
ссылка подписки → base64 (или обычный текст) → строки vless:// / ss:// / trojan:// …
→ uci: podkop.<секция>.urltest_proxy_links
→ перезапуск podkop → группа urltest в sing-box
Warning
Понимается только подписка-список ссылок — обычным текстом или в base64. Конфиги-объекты не разбираются: ни JSON для xray (панели отдают его клиентам вроде Happ), ни JSON для sing-box, ни YAML для Clash.
Серверы с транспортом, которого podkop не понимает, отбрасываются: он собирает
только tcp, ws и grpc, а для остальных (например xhttp) пишет в лог
«Unknown transport» и всё равно создаёт outbound — без транспорта, то есть
заведомо нерабочий. Сколько ссылок отброшено, видно в выводе обновления.
Podkop проверяет сгенерированный конфиг sing-box и при ошибке оставляет
предыдущий. podkop-sub это отслеживает и сообщает о неудаче, а не рапортует
об успехе вслепую.
Важно, что при отказе возвращается и конфигурация podkop: запись в UCI проходит
раньше, чем podkop успевает её отвергнуть, поэтому битая подписка иначе оставила
бы конфиг, который ломается только при следующей перезагрузке. Перед перезаписью
/etc/config/podkop копируется целиком, и при неудаче копия возвращается на
место (целиком — потому что теги ссылок могут содержать пробелы, и разобрать
UCI-список обратно на элементы нельзя надёжно).
Панели на Remnawave прячут список за идентификатором устройства: без заголовка
x-hwid они отвечают 200 и одной ссылкой-заглушкой на 0.0.0.0 («App not
supported»). Заголовок отправляется всегда; значение создаётся при первом
обновлении из MAC-адреса и сохраняется в опции hwid — панель считает разные
идентификаторы разными устройствами и тратит на них лимит. Чтобы занять новый
слот, достаточно очистить опцию: id создастся заново.
User-Agent при этом остаётся своим. Формат ответа панель выбирает именно по нему, и под видом клиента придёт формат этого клиента: например, для Happ — xray-конфиг в JSON вместо списка ссылок.
Ссылки на 0.0.0.0 отбрасываются. Если после этого не осталось ни одной,
обновление прерывается с ошибкой, не трогая конфигурацию podkop, — иначе роутер
получил бы формально рабочий конфиг с мёртвым выходом.
Сам podkop должен быть установлен — дополнение только пишет в его конфигурацию.
В DEPENDS его нет намеренно: podkop распространяется через GitHub Releases, а не
через фид OpenWrt, поэтому SDK такую зависимость разрешить не может. Отсутствие
podkop CLI обнаружит сам и сообщит об этом.
Готовые пакеты прикреплены к релизам.
Скачайте оба и поставьте одной командой — тогда apk сам разрешит зависимость
luci-app-podkop-sub → podkop-sub:
apk add --allow-untrusted podkop-sub-*.apk luci-app-podkop-sub-*.apkПакеты собраны как noarch и подходят любому роутеру независимо от платформы.
После установки в LuCI появляется страница Services → Подписка Podkop.
/etc/config/podkop-sub:
config subscription 'main'
option url '' # ссылка подписки
option target 'main' # в какую секцию podkop писать
option auto_update '1' # обновлять раз в сутки
option hwid '' # id устройства, создаётся сам при первом обновлении
При включённом auto_update в crontab пользователя root появляется строка:
0 5 * * * /usr/bin/podkop-sub update >/dev/null 2>&1
Время — по часовому поясу роутера (System → System → Timezone), а не по вашему: на свежей прошивке это UTC. Вывод уходит в syslog, поэтому из cron он не нужен.
При сохранении в LuCI строка обновляется сама: /etc/init.d/podkop-sub подписан
на procd-триггер config.change, который LuCI посылает при применении настроек.
Простой uci commit такого события не создаёт, поэтому после правки из консоли
синхронизацию нужно позвать самому:
uci set podkop-sub.main.auto_update=0
uci commit podkop-sub
podkop-sub cronПока ссылка не задана, задание не создаётся: иначе каждую ночь в лог падала бы
одна и та же ошибка. Если на роутере не было ни одного задания, crond не
запущен — тогда он включается и стартует вместе с созданием строки.
Дополнение владеет ровно двумя опциями в целевой секции podkop:
proxy_config_type и urltest_proxy_links. Всё остальное — списки маршрутизации,
DNS, интерфейсы — настраивается в интерфейсе самого podkop. Эти две опции руками
нельзя трогать: они перезаписываются при каждом обновлении.
Локально нужен OpenWrt SDK под Linux — WSL или Docker. В CI собирается через
openwrt/gh-action-sdk: по тегу v* (пакеты прикрепляются к релизу) либо вручную
из вкладки Actions.
Оба пакета собираются как PKGARCH:=all, поэтому одной сборки хватает на любую
платформу. Версия SDK определяет формат пакета: 25.12 даёт .apk, 24.10 — .ipk.
Чтобы собрать под обе, достаточно добавить строку в matrix.arch.
MIT — см. LICENSE.md.
Сам podkop распространяется под GPL-2.0, но это дополнение — отдельная программа: его код не копируется и не линкуется, взаимодействие идёт через UCI-конфигурацию и вызов CLI.