import { grafanaDashboardJson, prometheusScrapeConfig } from './prometheus.js'; export function instructionBlocks({ isGateway, host, port, controlHost }) { const httpProxy = `http://${host}:${port}`; const socksProxy = `socks5://${host}:${port}`; return [ { id: 'about', label: 'Основы', title: isGateway ? 'Gateway и прокси' : 'Что такое прокси', summary: isGateway ? 'Два способа направить трафик через это устройство.' : 'Способ направить трафик выбранного приложения через VPN.', paragraphs: isGateway ? [ `Gateway (${host}) заменяет основной шлюз устройства и проводит через VPN весь его интернет-трафик.`, `Gateway Proxy (${host}:${port}) работает точечно: его указывают в браузере, редакторе или другом приложении. Если приложение не умеет работать с прокси, можно использовать ProxyBridge.`, ] : [ `Локальный прокси (${host}:${port}) не перенаправляет приложения автоматически. Каждое приложение должно использовать этот адрес само — напрямую или через ProxyBridge.`, 'HTTP обычно проще для браузеров и редакторов. SOCKS5 подходит приложениям и инструментам, которым нужен более универсальный транспорт.', ], }, { id: 'proxybridge', label: 'Приложения', title: 'ProxyBridge', summary: 'Направляет через прокси отдельные приложения, даже если у них нет своей настройки.', steps: [ { link: ['Установите ProxyBridge', 'https://interceptsuite.com/download/proxybridge'], after: ' с официальной страницы проекта.', }, `Добавьте прокси типа SOCKS5: сервер ${host}, порт ${port}.`, 'Создайте правило, выберите нужное приложение и действие Proxy.', 'Включите ProxyBridge и запустите приложение заново.', ], note: 'Не добавляйте в правило сам ProxyBridge и VPN-клиент: это может создать прокси-цикл.', }, { id: 'switchyomega', label: 'Браузер', title: 'SwitchyOmega', summary: 'Переключает прокси-профили только для браузера.', steps: [ { link: ['Установите расширение', 'https://chromewebstore.google.com/detail/proxy-switchyomega/padekgcemlokbadohgkifijomclgjgif'], after: ' и откройте его настройки.', }, 'Создайте профиль Proxy Profile.', `Выберите HTTP, укажите сервер ${host} и порт ${port}.`, 'Создайте профиль Auto Switch, выберите созданный прокси для нужных сайтов, а для остальных оставьте Direct.', 'Если сайт не загрузился, откройте SwitchyOmega: расширение покажет проблемные ресурсы. Добавьте домен текущего сайта в Auto Switch и назначьте ему прокси-профиль.', ], note: 'Проект больше не поддерживается. Используйте его только если расширение уже подходит вашему браузеру.', }, { id: 'vscode', label: 'Редактор', title: 'Visual Studio Code', summary: 'VS Code использует системный прокси или адрес, переданный при запуске.', steps: [ 'Если прокси уже настроен в системе, полностью перезапустите VS Code — обычно он подхватит настройку автоматически.', 'Для отдельного запуска через SOCKS5 используйте команду ниже.', { link: ['Документация VS Code', 'https://code.visualstudio.com/docs/setup/network'], after: ' описывает также системный прокси, HTTP и параметры исключений.', }, ], code: `code --proxy-server="${socksProxy}"`, note: `VS Code не поддерживает логин и пароль для SOCKS5. Здесь прокси ${host}:${port} локальный и без авторизации, поэтому этот вариант подходит. HTTP-адрес ${httpProxy} остаётся альтернативой.`, }, ...(isGateway ? [{ id: 'router', label: 'Вся сеть', title: 'Заменить Gateway в роутере', summary: 'Роутер будет выдавать этот Gateway устройствам как основной шлюз.', steps: [ `Закрепите за Gateway постоянный адрес ${host} в настройках DHCP роутера.`, 'Откройте настройки локальной сети или DHCP. Не меняйте шлюз WAN/интернет-подключения.', `В поле Default Gateway, Router или Основной шлюз укажите ${host}.`, 'Сохраните настройки и переподключите устройства к сети, чтобы они получили новый маршрут.', `Для отката верните в это поле локальный адрес самого роутера вместо ${host}.`, ], note: 'Gateway и устройства должны находиться в одной локальной сети. Сначала проверьте настройку на одном устройстве вручную.', }, { id: 'prometheus', label: 'Мониторинг', title: 'Prometheus и Grafana', summary: 'Готовые traffic и domain metrics для Gateway и отдельных устройств.', paragraphs: [ `Prometheus забирает накопленные Harbor counters с http://${controlHost}/metrics. Ручка читает готовый snapshot и не запускает новый сбор трафика.`, 'Harbor обновляет traffic snapshot раз в 15 секунд, поэтому начальный scrape interval и refresh dashboard в 30 секунд не создают лишних одинаковых выборок.', 'Единый фильтр «Устройства» управляет скоростью, накопленным трафиком, сервисами и доменами для всех или одного устройства. Отдельный график показывает текущую скорость каждого активного устройства; нулевые series скрыты.', ], steps: [ 'Добавьте блок ниже в prometheus.yml и перезагрузите Prometheus.', 'В Grafana добавьте этот Prometheus как data source.', 'Скопируйте dashboard JSON, откройте Dashboards → New → Import и вставьте его.', ], code: prometheusScrapeConfig(controlHost), multilineCode: true, copies: [ { id: 'prometheus-config', label: 'prometheus.yml', text: prometheusScrapeConfig(controlHost) }, { id: 'grafana-dashboard', label: 'Grafana dashboard', text: grafanaDashboardJson }, ], note: 'Domain counters снимаются с активных соединений sing-box раз в 2 секунды. Историю хранит Prometheus; соединения между снимками, устройства с policy Direct и трафик без распознанного домена в domain series не входят.', }] : []), ]; }