# Что взять из 36 репозиториев, а что нет

Первые 27 проектов разобраны по одному: подробные файлы лежат в
`/home/o1/REST/rev/analysis/` (`01-...md` … `27-...md`, сводка —
`00-comparison.md`). Проекты 28–36 добавлены позже и разобраны прямо здесь;
их исходники скачаны в `/home/o1/REST/rev/repos/`. Ни один репозиторий не
отброшен: ниже по каждому сказано, что полезно, что опасно и под какой
лицензией это лежит.

Код в `rebuild/` оригинальный. Из репозиториев взяты **идеи, значения и
проверенные последовательности действий**, а не текст скриптов.

## 1. Лицензионная карта

| Лицензия | Номера | Что можно |
|---|---|---|
| MIT | 01, 02, 03, 05, 06, 07, 10, 12, 13, 14, 15, 16, 17, 19, 21, 22, 24, 25, 30, 32, 33, 34, 35 | брать код с сохранением copyright-уведомления |
| MPL-2.0 | 28 | файлы можно менять и распространять, изменённые файлы остаются под MPL; в отличие от GPL не заражает соседний код |
| GPL-3.0 | 20, 31 | использовать и менять; распространять только под GPL-3.0, в закрытый продукт встраивать нельзя |
| AGPL-3.0 | 29 | как GPL-3.0, плюс сетевое использование считается распространением |
| MIT + Additional Restrictions (non-commercial) | 08, 11 | нельзя использовать в коммерческом продукте; условия шире обычного MIT |
| LICENSE отсутствует | 04, 09, 18, 23, 26, 27, 36 | права не выданы: по умолчанию «все права сохранены». README-бейдж «MIT» не заменяет текст лицензии |

У 35 собственный код под MIT, но внутри `vendor/b4` лежит под GPL-3.0,
а `vendor/wpp-front` — отдельный MIT-архив со сторонними бинарниками.
Дистрибутив целиком поэтому де-факто GPL-3.0: из 35 берём только идеи,
код и вендорные файлы не копируем.

Почему это не мешает нам: sysctl-значения, порядок проверок, поведение
протоколов и устройство REALITY — функциональные факты, они не охраняются
авторским правом. Охраняется выражение: текст, структура и оформление
скриптов. Поэтому идеи переписаны самостоятельно, а код GPL,
non-commercial и «без лицензии» не копировался вообще.

## 2. Разбор по репозиториям

Нумерация совпадает с `analysis/`.

### 01. CraftStick/node-installer-cdn — MIT

Установщик ноды на Python с тремя ролями сертификата: панель, origin для
CDN, клиентский домен.

- **Взять:** per-name HTTP-01 как базовый режим; wildcard — отдельный
  DNS-01; переиспользование годного сертификата; проверка SAN и срока
  после выпуска, а не только кода возврата; reload вместо restart.
- **Не брать:** монолитность и предположения о CDN как обязательном
  слое. Ограничение повторов после ошибки LE — идея хорошая, но в нашем
  менеджере достаточно `--staging` и понятной диагностики.

### 02. FrI3nd7/skipit-vps-node — MIT

Большой Bash-установщик ноды (около 12 тысяч строк) с selfsteal и CDN.

- **Взять:** раздельные линии сертификатов для панели, подписки и ноды;
  переиспользование по покрытию и остатку срока (30 дней); временное
  открытие 80 с маркером «это открыл я»; `checkhost` перед активацией;
  понятная причина отказа из `letsencrypt.log`.
- **Не брать:** standalone-режим на 80 как единственный путь; общий
  wildcard-ключ для панели и нод; гигантский один файл, который тяжело
  проверять.

### 03. win64exe/remnawave-server-protect — MIT

Защита сервера: nftables, SSH, fail2ban. Сертификатов нет.

- **Взять:** принцип «не трогать чужое» — отдельная nft-таблица,
  отдельный `jail.d`, бэкап перед изменением; проверка фактического
  результата (`test_dns`), а не «служба запущена»; явный отказ от
  рискованной настройки с записанной причиной.
- **Не брать:** готовые drop-правила без анализа: можно случайно
  отрезать ICMP или служебный трафик.

### 04. limbo-wh/audit_node_remnawave — без LICENSE

Аудит ноды: сертификаты, порты, firewall, уведомления.

- **Взять идеи:** читать mTLS-сертификат ноды из `SECRET_KEY` и проверять
  `enddate` без обращения к панели; пороги 7/30 дней; хеш ключа для
  обнаружения ротации без логирования самого ключа; подсказка
  «перевыпустить в панели», а не пытаться выпустить mTLS через ACME.
- **Не брать:** код (прав не выдано) и попытки управлять публичным TLS
  из аудита.

### 05. qwe8nxtroud/HUBTune — MIT

Тюнинг уже запущенной ноды: память, логи, swap, sysctl, firewall.

- **Взять:** идею запаса памяти `RAM − clamp(192 MiB, 20%, 1 GiB)`,
  минимальный лимит 256 MiB, проверку лимита против наблюдаемого пика;
  `copytruncate` для логов Xray, который не переоткрывает файл; разделение
  безопасного и «полного» режимов; `sshd -T` перед правкой firewall.
- **Не брать:** заявленные «123 проверки» без подтверждения; слепой
  `swappiness=100` без гарантии ZRAM. Наши профили консервативнее
  формулы HUBTune: на 2 ГБ ставим лимит 1024M, а не ~1600M.

### 06. DenFiord/remnascripts — MIT

Модульный набор для selfsteal/ноды с большим количеством bats-тестов.
Самый качественный MIT-референс по сертификатам.

- **Взять:** SAN + цепочка + совпадение ключа; релизы и атомарный
  симлинк вместо записи поверх `live`; откат при неудачном reload;
  проверка, что таймер/хук реально включён; транзакционный подход к
  firewall с журналом и точным откатом.
- **Не брать:** объём и связность (266 файлов) для парка из нескольких
  нод; перезапись чужих deploy-hook без бэкапа.

### 07. princeofscale/ru-remna-utils — MIT

Python-набор сервисов для подготовки VPS.

- **Взять:** архитектуру `BaseService` + `Executor(dry_run)` +
  `is_configured`: каждый шаг можно показать, пропустить и повторить;
  единый конфиг; разделение «установить» и «применить».
- **Не брать:** SSH-hardening без проверки запасного входа; UFW с ранним
  выходом; fail2ban на `auth.log`; Docker-репозиторий Debian на Ubuntu.

### 08. PEDZEO/xray-balancer-mw — MIT + non-commercial

Middleware-балансировщик. Сертификатами не управляет.

- **Взять идею:** TLS должен терминироваться на edge-прокси, а не на
  middleware; readiness и stale-кэш при недоступном upstream.
- **Не брать:** код — лицензия запрещает коммерческое использование;
  также не ставить middleware на 443.

### 09. prasx/vless-manager-proxy — без LICENSE

Менеджер VLESS-подписок и прокси.

- **Взять:** только отрицательный пример — нельзя отключать проверку TLS
  при импорте (`CERT_NONE`) и нельзя выставлять панель на все интерфейсы.
- **Не брать:** код (прав нет), самописную авторизацию и `CERT_NONE`.

### 10. kuzoVS/kuzrelay — MIT

Go-релей/балансировщик с собственным служебным API.

- **Взять:** пиннинг служебного API по SHA-256 fingerprint;
  self-signed ECDSA P-256 с IP SAN; разделение публичного TLS и
  служебного туннеля; понимание, что pinning — не замена PKI.
- **Не брать:** pinning как единственную защиту: ротация сертификата
  требует новой join-команды, автоматического продления нет.

### 11. celestialhq/remnawave-hosts-balancer — MIT + non-commercial

Балансировщик хостов, TLS не терминирует.

- **Взять идею:** отдельный `default_server` с `ssl_reject_handshake`,
  TLS 1.2/1.3, edge терминирует TLS, backend слушает только внутреннюю
  сеть.
- **Не брать:** код из-за non-commercial; саму балансировку в схему
  панель+нода не тащить.

### 12. distillium/warp-native — MIT

Установщик Cloudflare WARP.

- **Взять:** WARP — это WireGuard-секреты, а не X.509; `warp.conf`
  хранить `0600` и не класть в общие бэкапы; WARP — вторичный интерфейс и
  не должен менять default route.
- **Не брать:** попытки связать WARP с сертификатным контуром. Наш
  `lib/warp.sh` написан отдельно, но проверяет те же вещи: `Table = off`,
  отсутствие default route через warp, реальный egress.

### 13. Naviz31/remnawave-node-installer — MIT

Python-установщик ноды с тестами.

- **Взять:** preflight — DNS, занятость 80/443, чужие managed-файлы;
  ровно один FQDN в SAN; `renew --dry-run` как обязательная ошибка, а не
  warning; точные идентификаторы для отката firewall; тесты-инварианты
  (никаких `-F`, SSH не открывается, частичное применение оставляет
  запись для отката).
- **Не брать:** проверку сертификата только по наличию двух файлов;
  перезапись hook без бэкапа; отсутствие default-SNI reject;
  `--register-unsafely-without-email`.

### 14. nuvrion-kvn/Nuvrion-Vision-Installer — MIT

Очень большой установщик (около 87 тысяч строк вместе с вложенным
сайтом).

- **Взять:** per-domain HTTP-01 по умолчанию; проверка SAN и срока до
  объявления успеха; dry-run продления после выпуска; временное правило
  80 с owned comment и lease; идемпотентные fail-safe хуки; reload, а не
  restart, если сервис умеет перечитывать файл.
- **Не брать:** монолит и вложенный сайт; wildcard без DNS-01; общий
  DNS-токен на всех нодах. Важно: Xray в некоторых версиях не
  перечитывает сертификат, поэтому у нас restart — явная опция, а не
  поведение по умолчанию.

### 15. nuvrion-kvn/Nuvrion-Auto-Tuning — MIT

Тюнер хоста, около 5 тысяч строк.

- **Взять:** определять HTTP-01 по renewal-конфигам, включая `dns-*` с
  `preferred_challenges=http`; закрывать 80 после проверки даже при
  падении certbot; dry-run по умолчанию; не перезапускать ноду ради
  продления.
- **Не брать:** «всё в одном файле»; отношение к постоянно открытому 80
  как к норме.

### 16. nuvrion-kvn/Nuvrion-XHTTP-Installer — MIT

Установщик XHTTP (около 313 тысяч строк).

- **Взять:** один домен — один ECDSA-сертификат; проверка A-записи до
  ACME; останавливать только известного владельца 80 и возвращать его;
  `nginx -t` перед reload; диагностика SAN/срока/таймера после выпуска.
- **Не брать:** сгенерированный монолит; `kill` неизвестного процесса на
  80. Стандартные пути LE мы не используем: контейнерам нужен свой
  каталог `/opt/remnawave/tls`.

### 17. atyonekilla/torrent-block-rw — MIT

Блокировка торрентов через nftables.

- **Взять:** сначала собрать и проверить полный набор правил, потом
  применять; сохранять намерение до изменения состояния; не сокращать
  уже действующий ресурс; обратимые правила.
- **Не брать:** готовые страновые списки как дефолт — это политика, а не
  техническая необходимость.

### 18. detective-noir-dev/Remnawave-Scripts — без LICENSE

Административное меню и установщик.

- **Взять идеи:** не совмещать ACME и административное меню; хук — на
  конкретный сертификат, а не глобальный; монтировать сертификаты
  read-only; генерировать compose-override и проверять
  `docker compose config`; после изменения проверять, что сервис поднялся.
- **Не брать:** код (прав нет); глобальный restart; регулярку, которая
  не принимает wildcard; проверку «файл существует».

### 19. goji-app/goji-node-setup — MIT

Установщик XHTTP/TLS-ноды.

- **Взять:** readiness-gate перед захватом 443 — backend должен уже
  слушать loopback; переиспользование сертификата по трём условиям
  (`live`, renewal-конфиг, webroot); перенос orphaned `live/archive` в
  датированный бэкап вместо удаления; `ssl_reject_handshake` + `return
  444`; снятие устаревшего широкого правила для `NODE_PORT`.
- **Не брать:** монтирование всего `/etc/letsencrypt`; `swappiness=100`
  без ZRAM; отсутствие SAN/срока; `--force-renewal` при каждом запуске.

### 20. syvlech/remnawave-limiter — GPL-3.0

Go-сервис ограничения числа устройств. Работает рядом с панелью, на ноды
не ставится.

- **Взять идеи:** проверка достижимости условия (конфиг, при котором
  защита никогда не сработает, не принимается); подписанный webhook с
  timestamp; health, различающий «жив» и «работает»; очередь повторов.
- **Не брать:** код — GPL-3.0. Если лимитер нужен, это отдельный сервис
  со своей лицензией, а не часть установщика.

### 21. alekvol/remnanode-bootstrap — MIT

Bootstrap ноды. Ближе всего к нашей последовательности.

- **Взять:** проверка SAN и срока перед установкой; сохранение способа
  выпуска (не ломать acme.sh переходом на webroot); reload вместо
  restart; настоящий e-mail; «временный конфиг на 80 → выпуск → полный
  конфиг на 443»; проверка фактического состояния; очистка мёртвого
  unix-сокета; `access_log off` для decoy.
- **Не брать:** безусловную смену TLS-профиля без отката; установку
  пакетов без фиксации версий.

### 22. HikaruApps/remnanode-antiscan — MIT

Антискан и защита ноды.

- **Взять:** safety timer + подтверждение доступности из другого канала,
  иначе автоматический откат; проверка эффективного состояния
  (`nginx -t` + реальный TLS-handshake), а не факта записи; staged-файлы
  и атомарная замена; shrink-guard для внешних списков (внезапно
  укороченный список SAN/доменов не принимается).
- **Не брать:** автоматическое применение внешних блок-листов без
  ревью — можно отрезать живых клиентов.

### 23. Mrvibecodic/remnawave-subscription-middleware — без LICENSE

PHP-посредник подписок.

- **Взять идеи:** один домен — один сертификат; автоматический выбор
  HTTP-01/DNS-01; reload вместо restart; проверка TLS upstream;
  `chmod 600` для Cloudflare-токена; закрытие лишних путей в
  `/.well-known`.
- **Не брать:** код (прав нет); самописную криптографию без аудита;
  публичный доступ к административным страницам.

### 24. juhnsooqa/meridian — MIT

Установщик панели/ноды с Psiphon.

- **Взять:** временно убирать vhost, ссылающийся на отсутствующий
  сертификат, и возвращать при ошибке — ровно то, из-за чего падает
  `nginx -t` при первом выпуске; `certonly` + отдельный vhost вместо
  `--nginx`; один сертификат на 443 и 9443; проверка AAAA перед выпуском;
  явный reload после продления; отказ от wildcard по умолчанию.
- **Не брать:** оставленный без firewall 9443; Psiphon как обязательную
  часть установки.

### 25. mtvworks/psiphon-egress — MIT

Psiphon как egress-интерфейс.

- **Взять:** проверять пригодность, а не liveness — «сертификат на диске»
  не равно «nginx отдаёт новый сертификат», нужен реальный handshake;
  окно неудач вместо серии подряд; cooldown/grace после смены; проверка
  всех слушателей и SNI; один алерт на причину.
- **Не брать:** egress-логику в сертификатный менеджер — это разные
  задачи.

### 26. dimastrum/Remnawave-node-manager — без LICENSE

Менеджер ноды.

- **Взять идеи:** не открывать 80 «на всякий случай» — только на время
  HTTP-01, с owned comment и lease; не блокировать ICMP
  `destination-unreachable` и `time-exceeded` (нужны для PMTU); 2222 —
  только IP панели; бэкап перед правкой UFW/Compose; не привязывать
  SSH/Fail2Ban к 22.
- **Не брать:** код (прав нет); `latest` без digest; отсутствие
  бэкапа/отката; постоянный открытый 80.

### 27. ezhikdev/ezhik-torrent-guard — без LICENSE

Самый сильный технический референс: torrent guard + агент сертификатов.

- **Взять идеи:** модель `normalize_domain`/`covers`/`analyze` — wildcard
  только ведущей меткой, один уровень покрытия, явные подсказки про apex
  и второй уровень, лимит SAN; двухфазный manual DNS (сохранить заказ и
  записи, подтвердить видимость, только потом продолжать); финальная
  проверка «все имена в SAN + ключ совпадает»; версионированная доставка
  bundle; агентская схема backup → замена → применение → rollback →
  fingerprint; проверка распространения по публичным и авторитативным NS
  с отдельной веткой для CNAME.
- **Не брать:** код (прав нет); `bundle()` без проверки статуса, срока и
  покрытия; `update()` без перевыпуска; acme-dns с несколькими
  значениями; открытый ACME-ключ в БД; «mTLS», которого нет; передачу
  готового приватного ключа вместо CSR.

### 28. Jolymmiles/Xray-core — MPL-2.0

Форк ядра Xray. Собран из upstream плюс собственные патчи; версии
отстают от официальных на дни-недели.

- **Что добавлено:** singmux (мультиплексирование), доработки sniffing
  QUIC, исправления REALITY и uTLS, учёт присутствия клиентов. Для ноды
  это может дать более стабильный XHTTP/REALITY, но набор патчей
  небольшой и проверяется одним человеком.
- **Взять:** саму возможность подменить ядро образом ноды
  (`NODE_IMAGE`) без правки панели. Это уже поддержано в
  `node_setup.sh` и `config/node.env.example`.
- **Не брать:** код в свой репозиторий (MPL-2.0 требует оставлять
  изменённые файлы под MPL) и форк как обязательный компонент. Пока
  upstream-ядро работает, лишняя зависимость от одного мейнтейнера не
  нужна: при отставании от upstream в нём могут жить уже исправленные
  уязвимости.

### 29. legiz-ru/remnanode-smux — AGPL-3.0

Готовый образ ноды с Xray + smux. Собирается автоматически каждые
несколько часов, тег вида `v<версия-ноды>-<версия-ядра>`, публикуется
только в GHCR.

- **Взять:** идею фиксированного тега «нода + ядро» вместо `latest`:
  обновление становится осознанным, а откат — сменой одной строки.
  Образ можно указать через `NODE_IMAGE`, не меняя панель.
- **Не брать:** как единственный источник образа (GHCR-зависимость,
  AGPL-3.0) и `latest`. Внутри образа есть загрузчик ядра, который
  может скачать другую версию при старте — это ломает
  воспроизводимость и сетевую изоляцию. Если брать, то только
  конкретный тег и с проверкой, что панель оставляет поле `core`
  пустым, иначе панель подменит ядро сама.

### 30. jestivald/node-accelerator — MIT

Меню-установщик из трёх частей: optimizer (XanMod/BBRv3, RPS/RFS,
reserved ports, logrotate), protect (nftables/CrowdSec), diagnose.

- **Взять:** идею единого меню и разделения «оптимизировать / защитить
  / диагностировать» — из неё вырос `remna.sh`. Также идею
  диагностики как отдельного действия, а не побочного эффекта
  установки.
- **По умолчанию не ставим:** стороннее ядро XanMod и BBRv3.
  На VPS 2 ГБ это лишний риск: ядро провайдера может не совместиться с
  модулями, а выигрыш против BBRv1+fq мал. Опционально — `remna.sh` →
  Kernel (`lib/xanmod.sh`), с preflight и откатом. RPS/RFS на 10+ Гбит/с,
  не на слабой ноде. CrowdSec — отдельный сервис со своей памятью; для
  одной ноды хватает UFW и nftables.

### 31. xVRVx/autoXRAY — GPL-3.0

Личный односерверный установщик Xray: порт 443 целиком у Xray, сайт-обманка
за ним.

- **Взять:** подтверждение топологии «один 443»: Xray слушает 443, fallback
  отдаёт сырой TLS в unix-сокет nginx (`proxy_protocol`), XHTTP живёт на
  loopback и проксируется nginx. Две полезные детали: `trustedXForwardedFor`
  перечисляет имена заголовков (у них `X-Real-IP`), а для XHTTP `stream-up`
  nginx умеет `grpc_pass` — он сохраняет h2-поток, тогда как `proxy_pass`
  переводит соединение в HTTP/1.1.
- **Не брать:** код (GPL-3.0) и TLS-сертификат на 443 вместо REALITY: для
  панельных нод REALITY удобнее, клиенту не нужен валидный серт, fallback
  работает так же. Hysteria2 на том же 443/udp мы убрали. Их
  `X-Real-IP $remote_addr` на unix-сокете пустой — реальный адрес там только
  в `$proxy_protocol_addr`. Мост RU→EU и страница подписки — отдельный
  продукт, не часть установщика ноды.

### 32. DigneZzZ/remnawave-scripts — MIT

Самый полный MIT-набор после 06: панель, нода, selfsteal (Caddy/Nginx),
NetBird, WARP+Tor, бэкапы. Около 34 тысяч строк.

- **Взять:** selfsteal как отдельный слой с двумя режимами — unix-сокет и
  TCP; явное соответствие `xver`: nginx понимает proxy_protocol (`xver: 1`),
  Caddy нет (`xver: 0`, только loopback-TCP). Проверку сертификата через
  `acme.sh --checkhost` (SAN/wildcard, доверенный или self-signed, дни до
  конца). Уникализацию шаблонов заглушки, чтобы все ноды не выглядели
  одинаково. На ноде — автопоиск сокета selfsteal и подключение `/dev/shm`
  к контейнеру. В панели — снимок перед обновлением и проверку
  совместимости версий при восстановлении.
- **Не брать:** монолит и `curl | bash`. Выпуск TLS-ALPN через
  `iptables REDIRECT 443 → 8443`: на время выпуска весь живой 443 уходит в
  acme, клиенты рвутся; у нас HTTP-01 на 80 и DNS-01. OCSP stapling —
  Let's Encrypt закрыл OCSP в 2025. Caddy по умолчанию не берём:
  Go-отпечаток TLS у него не меняется, nginx на OpenSSL «тише» — это пишут
  и авторы. Ручной wildcard — опция, а не режим по умолчанию. Бэкапы
  панели, NetBird и WARP+Tor — другие продукты, не часть нашей задачи.

### 33. x1roko/node-setup — MIT

Короткий установщик ноды, который уже реализует схему с одним 443:
REALITY на 443 → `/dev/shm/nginx.sock`, nginx терминирует TLS, XHTTP уходит
в `/dev/shm/xrxh.socket`, заглушка — на `127.0.0.1:8080`.

- **Взять:** практическое подтверждение XHTTP на unix-сокете
  (`proxy_pass http://unix:/dev/shm/xrxh.socket`) и REALITY-fallback через
  сокет. Учёт источника сертификата: certbot или acme.sh — и правильный
  renewal-hook для каждого; `--ecc` при установке сертификата из ECC-каталога
  acme.sh. DNS-01 через Cloudflare как путь без открытого 80.
- **Не брать:** 2222/tcp открыт всему миру (у нас только IP панели);
  `remnawave/node:latest`; SECRET_KEY через `environment` — виден в
  `docker inspect`, у нас файл или скрытый ввод; `$remote_addr` на
  unix-сокете и `$proxy_add_x_forwarded_for` (клиент подставляет первый
  XFF) — нужен `$proxy_protocol_addr` с перезаписью; restart вместо reload
  после продления. README всё ещё говорит про 9443, а профиль панели должен
  сам содержать XHTTP-инбаунд на сокете — это нигде не сказано.

### 34. hteppl/sh — MIT

Не про Remnawave: набор коротких хостовых скриптов. `node_install.sh` здесь —
это **node_exporter** для Prometheus, а не нода.

- **Взять:** аккуратный swapfile (создание, `chmod 600`, запись в fstab,
  корректное выключение) и сохранение модуля BBR в
  `/etc/modules-load.d`; при желании — node_exporter как лёгкий агент
  мониторинга. Идеи уже покрыты `lib/sysctl.sh` и ZRAM, поэтому код не
  нужен.
- **Не брать:** Prometheus + Grafana + Alertmanager + blackbox на ноде
  2 ГБ — это сотни мегабайт и лишние сервисы; мониторинг должен жить на
  панели или отдельном хосте. GitHub-runners и `curl | bash` тоже мимо.

### 35. inferno1978/Chimera-Project — MIT, но `vendor/b4` под GPL-3.0

Многопротокольный установщик (VLESS/REALITY, xHTTP+TLS, Hysteria2,
AmneziaWG, MTProto, NaiveProxy, Mieru, TrustTunnel) со своим Python-TUI,
веб-панелью и REST API. К Remnawave отношения не имеет: собственные
пользователи, подписки и панель. 71 МБ, 1633 файла, 293 модуля,
`chimera/_core.py` — 10,5 тыс. строк, 305 тестовых файлов.

- **Взять (идеи):**
  - Политика **Self-SNI**: dest — локальный nginx-сокет с LE-сертификатом
    своего домена, а не чужой известный сайт. Совпадает с нашим
    `templates/node/selfsteal.conf`; подтверждает, что схема штатная.
  - `ssl_certbot`: проверка DNS до выпуска через несколько путей (локальный
    резолвер, `getaddrinfo`, внешние 1.1.1.1/8.8.8.8), распознавание уже
    годного сертификата, `--no-random-sleep-on-renew` для ручного renew,
    sanity-gate «renew упал, но серт жив ещё 14 дней — не алертить».
  - fail2ban-jail для REALITY: regex по `REALITY: processed invalid connection
    from <HOST>` + `ignoreip` для IP панели и соседних нод. Кандидат на ноду,
    если будем банить сканеры по логам Xray.
  - `node_health_monitor` (TCP-проверка нод, состояние анти-спам, Telegram)
    и `steal_monitor` (%steal гипервизора как признак оверселла) — полезные
    идеи для слабого VPS, но алерты у нас отложены вместе с логами в TG.
  - `smoke_test`/`xray_safe_apply`: проверка после apply и откат при провале.
    У нас откат релиза сертификата уже есть в `install_pair`.
  - Факт для выбора донора REALITY: авторы фиксируют, что
    `www.microsoft.com` ломается как dest — цепочка 8273 Б больше лимита
    Xray в 8192 Б на Certificate record.
- **Не брать:** монолит `_core.py` с ленивыми импортами из-за циклических
  зависимостей и дублями определений (сами документируют их удаление в
  `INTEGRATION.md`); cron вместо systemd-таймеров; UFW/iptables/ipset вместо
  nftables; протоколы и панель (AWG, Hysteria2, MTProto, NaiveProxy, Mieru,
  TrustTunnel, свои users.json/подписки); `vendor/b4` (GPL-3.0, NFQUEUE) и
  сторонние бинарники; `curl | bash`-бутстрап, даже с проверкой подписи
  Ed25519 — мы распространяем файлы, а не скачиваем и исполняем поток.
- **Проверка исходников:** живых секретов не найдено, в тестах только
  фикстуры (`deadbeef…`). Тесты исполняют `_core.py` через `exec` с моками —
  запускать их у себя не нужно, только читать.

### 36. 1atex/multi-protocol — лицензии нет

Один `remnanode-setup.sh` (694 строки) + два JSON. 27 звёзд, репозиторий
создан и обновлён в один день. Caddy с модулем `mholt/caddy-l4` (собирается
на ноде через `xcaddy`) слушает `:443` и роутит **по SNI** на четыре
локальных инбаунда: `10443` VLESS Reality+Vision, `10444` VLESS Reality+XHTTP,
`10445` Trojan TLS, Hysteria2 отдельно на `443/udp`. Неизвестный SNI
проксируется наружу — на `VISION_SNI:443`.

Важное уточнение к нашей дискуссии. Я утверждал, что развести два REALITY
транспорта на одном домене нельзя, потому что REALITY-XHTTP и REALITY-RAW
не различимы по ALPN (клиентский ClientHello приходит с `h2,http/1.1` в обоих
случаях — это подтверждено в исходниках Xray). По ALPN я не ошибся, ошибся в
выводе: **разводка возможна по SNI, и для этого не нужен отдельный DNS-name**.
SNI здесь подставляется фальшивый из ссылки клиента (`www.google.com` для
Vision, `www.gstatic.com` для XHTTP), а подключается клиент на одно и то же
`<prefix>1.<domain>`. То есть моя прежняя «схема A с тремя поддоменами» была
избыточной не только в части домена-заглушки (её не надо — это и так
подтверждено), но и в части домена под каждый транспорт: достаточно двух
разных `serverNames` и двух разных SNI в инбаундах панели. Это же снимает
главный аргумент против второго транспорта — чистый TLS/XHTTP наружу больше не
торчит голым `400/404`, обе ветки остаются REALITY.

Почему архитектуру не меняем. Проект платит за это больше, чем получает:

- **Реальные IP клиентов теряются.** На всех четырёх инбаундах
  `acceptProxyProtocol: false`, а спереди L4-прокси, значит Xray видит источник
  `127.0.0.1`. Ломаются логи IP в панели, торрент-блокировки по клиенту и
  лимит устройств. `proxy_protocol` в caddy-l4 есть, но они его не включили.
- **Trojan и Hysteria2 — ровно то, от чего мы ушли.** Trojan с TLS-in-TLS
  палится активными зондами (фикс-длина первого пакета с паролем), а
  `"fallbacks": []` у него означает, что на `<prefix>2.<domain>` вообще нет
  заглушки: сканер получает валидный TLS и пустой HTTP. Это дыра в маскировке,
  а не деталь.
- **REALITY `target` = чужой google.com:443** вместо своего nginx-сокета:
  запросы с несовпадающим SNI уходят наружу пачками, Google видит наш IP как
  постоянного клиента, а сам dest враждебен к переиспользованию (H3/Alt-Svc,
  смены поведения LB). Наша схема (selfsteal на unix-сокете) строго лучше, и её
  независимо подтверждает 35.
- **Сборка Go на ноде 2 ГБ** (`xcaddy`, golang, build-essential) плюс замена
  системного бинарника caddy и `setcap`. На 2 ГБ это минуты свапа, и автор сам
  выводит предупреждение про RAM. nginx `stream` + `ssl_preread` делает тот же
  SNI-роутинг без компиляции вообще.
- **`ufw --force reset` по умолчанию** — сносит правила админа, сохранение
  только через `--no-reset-firewall`. Флаг есть, дефолт разрушительный.
- Единственный внешний dest по умолчанию (`proxy $VISION_SNI:443`) превращает
  ноду в открытый TLS-релей на один адрес: с неё можно ходить в google.com.

- **Взять (идеи, код не берём — лицензии нет):**
  - SNI-разводка двух REALITY-инбаундов на одном публичном `:443` без
    дополнительных A-записей — через `map $ssl_preread_server_name` в nginx
    `stream`, а не через ALPN. Единственный корректный механизм, если второго
    транспорта всё-таки захотим.
  - `xver: 0` обязателен, когда REALITY `target` — удалённый сайт (говорить
    proxy protocol он не умеет), и `xver: 1/2` только когда dest локальный
    nginx. Совпадает с нашей таблицей в `docs/certificates.md`.
  - Эксплуатационная ловушка панели: при инбаундах на локальных `1044x`
    панель подставляет в ссылку порт инбаунда, а не `443`. Клиент уходит на
    мёртвый локальный порт и ловит таймаут без единой ошибки в панели. Любой
    наш вариант «Xray за L4-форвардером» обязан это проверять.
  - Валидация до запуска сервиса: `caddy validate` → `systemctl restart` →
    `is-active`, бэкап конфига с timestamp, `apt-mark hold` после подмены
    бинарника. У нас то же в `guard.sh`, но здесь это оформлено как порядок
    шагов.
  - Гигиена сертификатов подтверждает нашу: `/etc/remna-certs/<domain>/` с
    `key.pem 0600`, `fullchain.pem 0644`, каталог только для чтения в
    контейнере.
- **Не брать:** код целиком (все права сохранены), Trojan и Hysteria2, чужой
  сайт как `target`, Caddy-L4 и сборку Go на ноде, `ufw reset` как дефолт,
  `curl | sh` docker/acme.sh, `remnawave/node:latest`, инбаунды без
  proxy protocol, схему с четырьмя транспортами в целом.
- **Проверка исходников:** секретов в репозитории нет, в JSON приватные ключи
  пустые (`"privateKey": ""`), пути к сертификатам шаблонные. `Multiselect.json`
  и `Xray_template.json` — клиентский шаблон с `injectHosts`/`selectFrom:
  HIDDEN` и `burstObservatory` (leastLoad): это рабочий рецепт клиентского
  балансировки нодами внутри подписки, альтернатива non-commercial-посредникам 08
  и 11. Оформлено как идея, не как файл.

## 3. Что из этого реально попало в rebuild

| Идея | Откуда | Где в rebuild |
|---|---|---|
| Проверка SAN, срока, ключа, цепочки | 06, 13, 19, 21, 27 | `cert_manager.sh` (`cert_pair_valid`) |
| Релизы + атомарный симлинк + откат | 06, 27 | `install_pair`, `cmd_rollback` |
| Bootstrap 80 → выпуск → полный 443 | 19, 21, 24 | `panel_setup.sh`, `node_setup.sh` |
| Per-domain по умолчанию, wildcard через DNS-01 | 01, 02, 06, 16, 24 | оба setup-скрипта, `cmd_issue` |
| Проверка A/AAAA и владельца 80 до ACME | 13, 16, 21, 24 | preflight в setup-скриптах |
| Временные firewall-правила с маркером | 14, 15, 16, 26 | UFW-блоки в setup-скриптах |
| Refresh/reload вместо restart | 01, 02, 06, 14, 19, 21 | `reload_services`, `XRAY_RESTART_ON_RENEW` |
| Лимиты памяти и логов для 2 ГБ | 05, 12 | `lib/profile.sh`, compose-шаблоны |
| WARP как вторичный интерфейс | 12 | `lib/warp.sh` |
| «Не трогать чужое», бэкап и проверка факта | 03, 21, 22 | `lib/common.sh`, `lib/firewall.sh` |
| Таймер продления и проверка automation | 06, 21 | `cmd_timer` |
| Shrink-guard и проверка эффективного состояния | 22, 25 | проверки сертификата и nginx в setup |
| Единое меню «хост / панель / нода / сертификаты» | 30 | `remna.sh` |
| Подмена образа ноды фиксированным тегом | 28, 29 | `NODE_IMAGE`, `--node-image` |
| Консервативный BBRv1 + fq вместо XanMod/BBRv3 | 30 (контрпример) | `lib/sysctl.sh` |

## 4. Что осознанно не включено

Это не «отброшено», а оставлено отдельными задачами, потому что это другой
продукт или другая лицензия:

- **20 (лимитер устройств)** — отдельный Go-сервис, GPL-3.0;
- **23 (PHP-посредник подписок)** — без лицензии, другая роль;
- **08, 11 (балансировщики)** — non-commercial, к тому же не терминируют
  TLS;
- **27 (torrent guard)** — без лицензии, самостоятельный сервис;
- **28 (форк Xray-core)** — MPL-2.0, ядро целиком, а не наш код.
  Поддерживается подменой образа, не копированием;
- **29 (remnanode-smux)** — AGPL-3.0-образ, только как готовая сборка;
- **30 (node-accelerator)** — MIT, но устанавливает XanMod/BBRv3 и
  CrowdSec. Взято меню и диагностика, не ядро и не сервисы. XanMod теперь
  опционален: `remna.sh` → Kernel;
- **25 (Psiphon)** — egress, а не сертификаты;
- **22 (внешние блок-листы)** — зависит от политики конкретного парка;
- **26 (менеджер ноды)** — без лицензии; идеи взяты, код нет;
- **31 (autoXRAY)** — GPL-3.0 и другой продукт: личный сервер с TLS на 443,
  Hysteria2 и мостом RU→EU. Взята только топология «один 443»;
- **32 (DigneZzZ)** — MIT, но панель, бэкапы, NetBird и WARP+Tor — отдельные
  продукты. Взяты идеи selfsteal и проверки сертификата;
- **34 (hteppl/sh)** — мониторинг и тюнинг хоста, а не нода. Стек
  Prometheus/Grafana на 2 ГБ не ставим.
- **35 (Chimera-Project)** — самостоятельный продукт с собственным TUI,
  панелью и протоколами; `vendor/b4` под GPL-3.0. Берём только идеи
  (Self-SNI, проверка DNS до ACME, fail2ban для REALITY, мониторинг),
  код и вендорные файлы — нет.
- **36 (multi-protocol)** — без лицензии, и сама схема на четыре транспорта
  против нашего вывода «один инбаунд»: Trojan и Hysteria2 как раз то, что
  убрали, Caddy-L4 требует сборки Go на 2 ГБ, а инбаунды без proxy protocol
  теряют IP клиента. Взяты механизм SNI-разводки и ловушка порта в панели.

## 5. Итог

Лучший технический референс — **27 (ezhik)**, но его код брать нельзя.
Лучший MIT-референс по сертификатам — **06 (DenFiord)**, по bootstrap —
**21 (alekvol)**, по firewall/preflight — **13 (Naviz)** и **19 (Goji)**.
Из новых: **30 (node-accelerator)** дал форму меню, **28/29** — поддержку
альтернативного ядра через образ, без форка кода. **33 (x1roko)** — готовая
реализация одного 443 с XHTTP на unix-сокете, **32 (DigneZzZ)** — самый
полный референс по selfsteal, **31 (autoXRAY)** — только GPL-топология.
**35 (Chimera-Project)** — самый большой, но чужой продукт: полезен как
справочник по Self-SNI и эксплуатационным граблям (проверка DNS до ACME,
ложные алерты renew, лимит 8192 Б у REALITY dest), код не берём.
**36 (multi-protocol)** — по коду бесполезен (лицензии нет), но один факт из
него важнее всего остального в списке: два REALITY-транспорта на одном IP
разводятся по **SNI из ссылки клиента**, а не по ALPN и не по лишним
поддоменам. Это исправляет мой более ранний вывод про «три домена обязательны». Архитектуру
не меняет: один инбаунд остаётся дефолтом, а SNI-разводка — резервный механизм,
если второго транспорта всё-таки захотят.
### 37. BBR3/XanMod и шейпинг — разбор 2026-11-01

- **ivan-nginx/bbr3** — sysctl-буферы и вызов внешнего установщика BBR3.
  Взяты только размеры буферов; внешний скрипт не запускаем.
- **bear4f/netshape-manager** — HTB/CAKE-шейпинг для релеев. Для VPN-ноды
  не берём: `QDISC=cake` уже есть, а шейпинг режет скорость.
- **blantxxv/bbr3** — XanMod + Remnawave node одной командой. Взята идея
  preflight (кодовое имя, psabi, `/boot`, Secure Boot); реализовано в
  `lib/xanmod.sh`, не по умолчанию.
- **gopnikgame/Server_scripts** — XanMod и диагностика. Взяты `xanmod_psabi`
  и проверки; меню — `remna.sh` → Kernel.
- **jestivald/node-accelerator** — см. §30; XanMod/CrowdSec по-прежнему
  не ставим по умолчанию.

Всё, что вошло в `rebuild/`, переписано самостоятельно и проверяется
`tests/run.sh`; чужие тексты и файлы не копировались.
