setup-happ-subscription
Skill1 starsChanged 3 months agoMITView on GitHub
Построение своей МУЛЬТИ-КНОПОЧНОЙ Happ-подписки (паттерн OpenGate) из подписки провайдера: одна статическая HTTPS-ссылка, которая в Happ разворачивается в кнопки-политики (балансир США для нейросетей, балансир «весь мир», обход белых списков, реверс-РФ) + ручные серверы. Пайплайн: подписка провайдера → sqlite-реестр (load.py, многоформатный парсер, классификация по ролям) → генератор кнопок (generate.py, balancer+observatory, профиль-манифест для iOS-нарезки) → nginx + крон автообновления. Балансир со стабильным выходом (observatory, не burst), РФ→direct, множители трафика в подписи, эмодзи-иконки. Триггеры: «сделай мульти-кнопочную подписку», «кнопки-политики в Happ», «своя подписка из NurVPN с кнопками», «балансир США для нейросетей в Happ», «подписка где можно выбрать политику», «автообновляемая подписка с кнопками», «собери OpenGate», «подписка с кнопкой нейросети/обход/реверс». НЕ для установки панели 3X-UI — `/setup-vpn-panel`. НЕ для извлечения серверов из ЗАКРЫТОЙ (HWID/зашифрованной) подписки — `/extract-subscription-servers` (запускается ДО этого). НЕ для генерации ОДНОГО клиентского конфига/QR из своей панели — `/generate-client-config`. НЕ для маршрутизации НА панели 3X-UI — `/configure-vpn-routing`. НЕ для простого плоского зеркала подписки (без кнопок) — это `subscription-mirroring.md`.
In this repository25 other files it gives its agents.
- CLAUDE.mdCLAUDE.md
- audit-securitySkill
- bootstrap-new-serverSkill
- cleanup-existing-serverSkill
- configure-vpn-routingSkill
- deploy-serviceSkill
- devSkill
- extract-subscription-serversSkill
- finalize-vpn-routingSkill
- generate-client-configSkill
- health-checkSkill
- install-monitoring-stackSkill
- inventory-scanSkill
- migrate-server-to-serverSkill
- refresh-vpn-knowledgeSkill
- restore-from-backupSkill
- retroSkill
- rotate-secretsSkill
- second-opinionSkill
- setup-backupsSkill
- setup-secrets-vaultSkill
- setup-server-proxySkill
- setup-vpn-panelSkill
- sysadmin-initSkill
- sysadmin-meetSkill
The file
Files
setup-happ-subscription — мульти-кнопочная Happ-подписка (OpenGate)
Источник истины формата —
.claude/knowledge/networking/_reference/happ-subscription-format.md. Прочитай его перед работой: там wire-формат, заголовки, ловушки балансира, РФ→direct, иконки, схема реестра, профиль-манифест. Этот скилл — процедура + готовый код.
Что строим
Одна статическая ссылка https://<домен>/<path>/<rnd>.json, которую Happ показывает как
набор кнопок-политик. Каждая кнопка = отдельный xray-конфиг (Happ передаёт в ядро 1:1):
| Кнопка | Что делает |
| 🤖 USA | балансир leastPing+observatory по US-узлам, стабильный выход (нейросети), РФ→direct |
| 🌍 Мир | балансир по всему миру (кроме обхода/РФ), для общего веба |
| 🛡 WL | балансир по дорогим «обход/LTE» узлам (обход белых списков), множитель ×N в подписи |
| 🔁 RU | reverse: РФ-трафик через РФ-сервер, остальное напрямую (для «я за границей») |
| + ручные | по кнопке на каждый сервер (с флагом-иконкой) |
Роли/кнопки адаптируются под парк — это шаблон, не догма.
Предусловия
- Веб-сервер отдаёт статичный файл по HTTPS (nginx);
python3на сервере;qrencode(для QR — опц.). - Подписка провайдера, отдающая серверы. Если она ЗАКРЫТА (HWID/шифр) — сперва
/extract-subscription-servers. HWID-добыча —subscription-mirroring.mdч.1.
Процедура
Шаг 1 — добыть подписку провайдера (🟢 Green)
curl с заголовками Happ + X-Hwid (см. subscription-mirroring.md). Сохранить ответ во
временный файл. Проверить, что это не заглушка (grep -c '00000000-0000' = 0). Гео-блок →
запрашивать с РФ-хоста.
Шаг 2 — загрузить в реестр (🟢 Green)
python3 scripts/load.py ingest --source <provider> --db registry.db <файл-ответа>load.py сам определит формат (JSON-массив / base64 / vless), классифицирует серверы по
ролям, покажет отчёт (по ролям + «не классифицированы уверенно»). Нераспознанные роли
поправить: python3 scripts/load.py override --db registry.db --match "<имя>" --role us.
Шаг 3 — сгенерировать подписку (🟢 Green, локально)
python3 scripts/generate.py --db registry.db --out sub.json # все кнопки
python3 scripts/generate.py --db registry.db --only USA --out proto.json # прототип однойГенератор печатает routing-заголовок (профиль-манифест в base64) и набор add_header для nginx.
Прототип сначала — проверить одну кнопку на устройстве, потом разворачивать все.
Шаг 4 — опубликовать (🟡 Yellow — брифинг + правка nginx)
Создать папку вебрута (напр. /var/www/happ/), залить sub.json под СЛУЧАЙНЫМ
неугадываемым именем (внутри UUID-ключи!). Добавить в vhost location со всеми заголовками
Happ (пример — в knowledge §9 и в выводе generate.py). nginx -t → reload. Бэкап конфига до правки.
⚠ Имя файла — стабильное между прогонами (рандом ОДИН раз). Заголовки ставит nginx
add_header, не генератор.
Шаг 5 — крон автообновления (🟡 Yellow)
scripts/opengate-sync.sh.example → адаптировать (пути, env с SUB_URL/HWID), положить в
/opt/<name>/, добавить в cron. Защита: при ошибке рабочий файл не трогать + .bak.
⚠ Грабля: переменную
TARGET, которую скрипт задаёт сам, объявлять послеsource env.
Шаг 5.1 — обновление генератора на боевом (🟡 Yellow — регулярная операция)
После первичной установки generate.py/load.py живут на сервере копией в /opt/<name>/
(обычно НЕ под git, синхрон ручной). Source-of-truth — версия в репозитории инфры оператора.
Правишь генератор (новый сервис в direct, новая кнопка, смена политики) — правка живёт у тебя,
пока не доставлена на боевой; иначе крон при следующем прогоне пересоберёт подписку из старого
генератора. Процедура доставки (ровно она применяется при «добавь сайт в обход/верни в VPN»):
- Green-сверка:
sha256серверногоgenerate.pyпротив локального ДО правки — убедиться, что сервер не разошёлся и заливается строго твоё изменение (на macOSshasum -a 256, неsha256sum). - Бэкап серверного файла (
cp generate.py generate.py.bak-<reason>). scpновогоgenerate.pyна сервер.- Один прогон sync-скрипта (он сам бэкапит целевой
*.jsonи атомарно заменяет; при ошибке генератора файл не трогает). - Проверить боевой
*.json: число кнопок не упало, новое правило на месте (отдельным простым скриптом, не inline-heredoc черезssh '...'с вложенными кавычками — ломается на экранировании).
⚠ Под git серверную копию не держим по умолчанию → дрейф локального source-of-truth и боевого. Сверка sha256 на шаге 1 — обязательна, иначе можно затереть серверную правку, сделанную мимо репо.
Шаг 6 — проверка на устройстве
Добавить ссылку в Happ → проверить кнопки, балансир (выход не скачет — observatory, не burst),
РФ-сайты открываются (РФ→direct), пинг в мс. Проверять выход через ip-api.com/whois, не 2ip.
Самопроверка (Honest verdict)
load.pyраспознал формат и классифицировал (отчёт без массыneeds_review).generate.pyсобрал ≥ ожидаемого числа кнопок, JSON валиден.- Прототип одной кнопки проверен на устройстве ДО полного развёртывания.
- nginx
-tпрошёл, старыеlocationне задеты, отдача 200 + заголовки на месте. - Крон с защитой; первый прогон вручную; имя файла стабильно.
- Менял routing-политики (добавил/убрал сервис в direct, правил состав кнопок) →
обновил inventory-документ подписки/VPN. Правка генератора = изменение маршрутизации
на сервере → рефлекс §3.2 применяется: не обновил inventory — задача НЕ закрыта.
Документа подписки/VPN ещё НЕТ (или
vpn:{}пуст)? Это НЕ повод молча пропустить под C.7. Минимум: завести короткую inventory-запись о факте правки (что/когда/набор доменов) +todos/pending/на полноценное заполнение vpn-блока и описания подписки. Полное заполнение карты с нуля — отдельная задача оператора, но факт текущей правки фиксирую сразу. «Обновлять нечего» ≠ «можно ничего не делать».
Не получилось / упал парсер — STOP, честно сказать оператору, не импровизировать суррогат.
Зоны доверия
- Шаги 1-3 (добыча, реестр, генерация локально) — 🟢 Green.
- Шаги 4-5 (nginx, крон на сервере) — 🟡 Yellow: брифинг 6 пунктов, бэкап,
nginx -t, откат. - Red тут нет (ничего необратимого; всё откатывается бэкапом +
.bak). Поэтому type-to-confirm (дословная строка) здесь не нужен — это инструмент Red. Правка боевого генератора весомее обычного Yellow, но канон Yellow её закрывает: брифинг + diff до применения + бэкап + откат, подтверждение простое («ок»/«давай»). Тянуть дословную строку в Yellow = размывать сигнал Red (см..claude/agents/references/trust-zones.md, Decision Point).
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

