[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-80895":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":8,"htmlUrl":8,"language":9,"languages":8,"totalLinesOfCode":8,"stars":10,"forks":11,"watchers":12,"openIssues":13,"contributorsCount":14,"subscribersCount":14,"size":14,"stars1d":14,"stars7d":14,"stars30d":14,"stars90d":14,"forks30d":14,"starsTrendScore":14,"compositeScore":15,"rankGlobal":8,"rankLanguage":8,"license":8,"archived":16,"fork":16,"defaultBranch":17,"hasWiki":18,"hasPages":16,"topics":19,"createdAt":8,"pushedAt":8,"updatedAt":20,"readmeContent":21,"aiSummary":22,"trendingCount":14,"starSnapshotCount":14,"syncStatus":13,"lastSyncTime":23,"discoverSource":24},80895,"RedRoller","gorizontniy\u002FRedRoller","gorizontniy",null,"Python",33,3,1,2,0,1.81,false,"main",true,[],"2026-06-12 02:04:08","\u003Cp align=\"center\">\n  \u003Cimg src=\"assets\u002Fredroller-hero.jpg\" alt=\"Redroller banner\" width=\"100%\">\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fstafilakok\">\n    \u003Cimg alt=\"Developer: stafilakok\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdev-stafilakok-af000c?style=for-the-badge&logo=github&logoColor=white\">\n  \u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fgorizontniy\">\n    \u003Cimg alt=\"Developer: gorizontniy\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdev-gorizontniy-281715?style=for-the-badge&logo=github&logoColor=white\">\n  \u003C\u002Fa>\n\u003C\u002Fp>\n\n# 🔴 Redroller — народная рулетка Yandex Cloud\n\n> **Локальное desktop-приложение для охоты за нужным публичным IPv4 в Yandex Cloud.**  \n> Никакой ручной сборки JSON-конфигов для обычного пользователя: аккаунты, ключи, зоны, цели, Telegram и изоляция настраиваются прямо внутри приложения.\n\n\u003Cp align=\"center\">\n  \u003Cimg alt=\"Python\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fpython-3.9%2B-blue\">\n  \u003Cimg alt=\"Platform\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fplatform-Windows-lightgrey\">\n  \u003Cimg alt=\"App\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fapp-Redroller.exe-red\">\n  \u003Cimg alt=\"Storage\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fstorage-SQLite-green\">\n  \u003Cimg alt=\"Secrets\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fsecrets-encrypted-critical\">\n  \u003Cimg alt=\"Status\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fstatus-Yandex%20Cloud%20baseline-orange\">\n\u003C\u002Fp>\n\n---\n\n## Поддержать проект\n\nЕсли Redroller оказался полезен и хочется ускорить развитие проекта, можно поддержать авторов:\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fdalink.to\u002Fgorizontniy\">\n    \u003Cimg alt=\"Поддержать через DaLink\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fsupport-DaLink-af000c?style=for-the-badge\">\n  \u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Ftonviewer.com\u002FUQAG7KAzuYJDQ96JGYyN8wD5GOkq1sCRM787IAqOgSKPyL_z\">\n    \u003Cimg alt=\"TON wallet\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FTON-wallet-0098EA?style=for-the-badge\">\n  \u003C\u002Fa>\n\u003C\u002Fp>\n\nDaLink: [dalink.to\u002Fgorizontniy](https:\u002F\u002Fdalink.to\u002Fgorizontniy)\n\nTON: `UQAG7KAzuYJDQ96JGYyN8wD5GOkq1sCRM787IAqOgSKPyL_z`\n\nСпасибо за любую поддержку. Она помогает доводить Redroller до нормального релиза, тестировать live-сценарии и двигать проект к multi-provider control center.\n\n---\n\n## Благодарности\n\nОтдельное спасибо Telegram-каналу [Whitelist RKN](https:\u002F\u002Ft.me\u002FwhitelistRKN) за поддержку и внимание к проекту.\n\n---\n\n## ✦ Идея\n\n**Redroller** превращает ручную охоту за нужным IPv4 в управляемое локальное приложение.\n\nОператору больше не нужно руками собирать `config.json`, таскать ключи по папкам и запускать длинные CLI-команды. Основной сценарий теперь такой:\n\n```text\nзапустил Redroller.exe → добавил аккаунт → вставил ключ → выбрал зоны → нажал «КРУТИТЬ БСы»\n```\n\nПроще: партия сказала «нужен адрес» — машина открыла панель и пошла крутить.\n\nПроект работает локально. Все аккаунты, ключи, база, runtime-файлы, state и логи остаются на машине пользователя.\n\n---\n\n## 🚀 Главный принцип\n\n> **Всё, что нужно для обычного запуска, настраивается прямо в приложении.**\n\nЧерез интерфейс Redroller можно настроить:\n\n- 🧾 аккаунты Yandex Cloud;\n- 🔐 JSON-ключ сервисного аккаунта;\n- 🏢 `organization_id`;\n- 💳 `billing_account_id`;\n- ☁️ `service_cloud_id`;\n- 📁 режим крутки: облака или один проект;\n- 🌍 зоны ротации;\n- 🎯 целевые `target_ips` и `target_cidrs`;\n- 🛡️ изоляцию cloud-id и folder-id;\n- 🤖 Telegram-уведомления;\n- 🎰 запуск, остановку и наблюдение за рулеткой.\n\nФайлы `config.example.json` и CLI-режим остаются для разработчиков, диагностики и ручного advanced-запуска. Для нормального пользователя точка входа — **Redroller.exe**.\n\n---\n\n## ⚙️ Что умеет\n\n- 🎲 резервировать публичные IPv4 в Yandex Cloud;\n- 🎯 проверять адреса по заданным IP\u002FCIDR;\n- 🧹 удалять неподходящие адреса и временные ресурсы;\n- 🏗️ работать через cloud\u002Ffolder\u002Fhybrid-ротацию;\n- 🛡️ защищать выбранные cloud-id и folder-id через изоляцию;\n- 🏆 автоматически изолировать cloud\u002Ffolder после успешного IP;\n- 🔐 шифровать JSON-ключи сервисных аккаунтов;\n- 📊 показывать живой статус через локальную web-панель;\n- 🤖 отправлять Telegram-уведомления;\n- 🧾 вести `state.json`, `run.log` и историю попыток;\n- 📦 собираться в Windows `.exe`;\n- 🧪 проверяться unit-тестами.\n\n---\n\n## 🧱 Архитектура\n\n```text\nRedRoller\u002F\n├── README.md\n├── Redroller.exe                         # скачивается из GitHub Releases\n├── .gitignore\n└── bin\u002F\n    ├── yc_ip_hunter.py                   # движок ротации IPv4\n    ├── web_panel.py                      # локальная web-панель (REST API + SQLite)\n    ├── web_panel_launcher.py             # desktop-лаунчер приложения\n    ├── telegram_bot.py                   # Telegram-оболочка для удалённого управления\n    ├── config.example.json               # шаблон для advanced\u002FCLI-режима\n    ├── telegram_bot_config.example.json\n    ├── requirements.txt                  # PyJWT, cryptography\n    ├── build_web_panel_exe.ps1           # сборка в .exe через PyInstaller\n    ├── test_web_panel.py                 # тесты web-панели и миграций\n    ├── test_web_panel_launcher.py        # тесты лаунчера\n    ├── test_yc_ip_hunter.py              # тесты движка\n    ├── test_telegram_bot.py              # тесты Telegram-бота\n    └── web\u002F\n        ├── index.html\n        ├── app.css\n        └── app.js\n```\n\n---\n\n## 📋 Требования и запасной запуск\n\n### Готовый `.exe`\n\nГотовый `Redroller.exe` со страницы [**Releases**](https:\u002F\u002Fgithub.com\u002Fgorizontniy\u002FRedRoller\u002Freleases) должен запускаться без установленного Python, pip, PyInstaller и Yandex Cloud CLI: веб-панель, движок ротации, `PyJWT` и `cryptography` упакованы внутрь приложения.\n\nДля обычного запуска нужно подготовить только окружение:\n\n| Что | Зачем | Ссылка |\n|---|---|---|\n| Windows 10\u002F11 | основная поддерживаемая платформа | [Microsoft Windows](https:\u002F\u002Fwww.microsoft.com\u002Fwindows) |\n| Microsoft Edge или Google Chrome | Redroller открывает локальную панель в app-окне браузера; если Edge\u002FChrome не найден, откроется браузер по умолчанию | [Edge](https:\u002F\u002Fwww.microsoft.com\u002Fedge\u002Fdownload), [Chrome](https:\u002F\u002Fwww.google.com\u002Fchrome\u002F) |\n| Yandex Cloud аккаунт с платёжным аккаунтом | Redroller создаёт временные cloud\u002Ffolder и резервирует публичные IPv4 | [Yandex Cloud Console](https:\u002F\u002Fconsole.yandex.cloud\u002F) |\n| JSON-ключ сервисного аккаунта | по нему Redroller получает IAM token и работает с Yandex Cloud API | [документация по authorized keys](https:\u002F\u002Fyandex.cloud\u002Fen\u002Fdocs\u002Fiam\u002Foperations\u002Fauthentication\u002Fmanage-authorized-keys) |\n| Права сервисного аккаунта | нужны для cloud\u002Ffolder, billing binding, VPC и reserved address операций | [справочник ролей Yandex Cloud](https:\u002F\u002Fyandex.cloud\u002Fen\u002Fdocs\u002Fiam\u002Froles-reference) |\n| Telegram bot token, опционально | только если нужны уведомления в Telegram | [BotFather](https:\u002F\u002Ft.me\u002FBotFather) |\n\nYandex Cloud CLI для обычной работы не требуется: приложение ходит в API напрямую.\n\nЕсли `.exe` не стартует, проверьте, что Windows не заблокировал скачанный файл: **Свойства файла → Разблокировать**. Логи запуска лежат в:\n\n```text\n%LOCALAPPDATA%\\Redroller\\.web-runtime\n```\n\n### Запасной способ: запуск из GitHub\n\nЕсли готовый `.exe` не работает на конкретной машине, можно запустить Redroller из исходников.\n\n**1. Установить инструменты**\n\n| Что | Зачем | Ссылка |\n|---|---|---|\n| Python 3.9+ | запуск web-панели, движка и тестов | [Python for Windows](https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fwindows\u002F) |\n| Git for Windows | клонирование репозитория и обновления | [git-scm.com\u002Fdownload\u002Fwin](https:\u002F\u002Fgit-scm.com\u002Fdownload\u002Fwin) |\n| PowerShell | запуск команд и сборочного скрипта | [документация PowerShell](https:\u002F\u002Flearn.microsoft.com\u002Fpowershell\u002F) |\n\n**2. Скачать проект**\n\n```powershell\ngit clone https:\u002F\u002Fgithub.com\u002Fgorizontniy\u002FRedRoller.git\ncd RedRoller\n```\n\n**3. Поставить Python-зависимости**\n\n```powershell\npy -3 -m venv .venv\n.\\.venv\\Scripts\\Activate.ps1\npython -m pip install --upgrade pip\npython -m pip install -r .\\bin\\requirements.txt\n```\n\nЕсли PowerShell блокирует активацию `.venv`, для текущего окна можно выполнить:\n\n```powershell\nSet-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass\n```\n\nСейчас в `requirements.txt` нужны:\n\n```text\nPyJWT\ncryptography\n```\n\n**4. Запустить приложение**\n\n```powershell\npython .\\bin\\web_panel_launcher.py\n```\n\nЗапасной запуск без desktop-окна:\n\n```powershell\npython .\\bin\\web_panel.py --host 127.0.0.1 --port 8787\n```\n\nПосле этого откройте `http:\u002F\u002F127.0.0.1:8787`.\n\n### Скрипты и сборка\n\n| Скрипт | Для чего |\n|---|---|\n| `.\\bin\\web_panel.py` | локальная web-панель |\n| `.\\bin\\web_panel_launcher.py` | desktop-лаунчер панели |\n| `.\\bin\\yc_ip_hunter.py` | CLI-движок ротации IPv4 |\n| `.\\bin\\telegram_bot.py` | отдельный Telegram-control bot |\n| `.\\bin\\build_web_panel_exe.ps1` | сборка `Redroller.exe` через PyInstaller |\n\nДля сборки `.exe` из исходников дополнительно нужен PyInstaller:\n\n```powershell\npython -m pip install pyinstaller\n.\\bin\\build_web_panel_exe.ps1\n```\n\n---\n\n## 🚀 Быстрый старт\n\n### Способ 1. Готовый `.exe` (для обычного пользователя)\n\nСкачайте последний `Redroller.exe` со страницы [**Releases**](https:\u002F\u002Fgithub.com\u002Fgorizontniy\u002FRedRoller\u002Freleases) и запустите:\n\n```powershell\n.\\Redroller.exe\n```\n\nОткроется локальная панель:\n\n```text\nhttp:\u002F\u002F127.0.0.1:8787\n```\n\n### Способ 2. Запуск из исходников (для разработчика)\n\n**1. Клонировать репозиторий**\n\n```powershell\ngit clone https:\u002F\u002Fgithub.com\u002Fgorizontniy\u002FRedRoller.git\ncd RedRoller\n```\n\n**2. Установить зависимости**\n\n```powershell\npython -m pip install -r bin\\requirements.txt\n```\n\n**3. Запустить веб-панель**\n\n```powershell\npython bin\\web_panel_launcher.py\n```\n\nИли напрямую без desktop-окна:\n\n```powershell\npython bin\\web_panel.py\n```\n\nПанель откроется по адресу `http:\u002F\u002F127.0.0.1:8787`.\n\n### Добавить аккаунт в интерфейсе\n\nВ приложении открыть вкладку **Аккаунты** и заполнить поля:\n\n| Поле | Что вставить |\n|---|---|\n| `name` | любое понятное имя аккаунта |\n| `organization_id` | ID организации Yandex Cloud |\n| `billing_account_id` | ID платёжного аккаунта |\n| `service_cloud_id` | ID служебного облака |\n| JSON-ключ | весь скачанный файл авторизованного ключа сервисного аккаунта |\n| зоны | зоны, где будет идти ротация |\n| после успеха | остановиться после первого IP или продолжать собирать несколько IP |\n| `target_cidrs` \u002F `target_ips` | нужные диапазоны или конкретные адреса |\n\n### Нажать кнопку запуска\n\n```text\nКРУТИТЬ БСы\n```\n\nПосле этого Redroller сам создаёт runtime-конфиг, кладёт его в локальную runtime-папку, запускает движок и показывает живой статус в интерфейсе.\n\n---\n\n## 🖥️ Web-панель\n\nПанель — основной пользовательский слой Redroller.\n\nЧерез неё выполняется вся настройка:\n\n- создание и редактирование аккаунтов;\n- выбор активного аккаунта;\n- загрузка JSON-ключа сервисного аккаунта;\n- выбор режима крутки;\n- выбор зон ролла;\n- настройка целевых IP\u002FCIDR;\n- включение Telegram;\n- запуск и остановка процесса;\n- просмотр текущего IP;\n- просмотр подробного лога;\n- просмотр истории попыток;\n- управление изоляцией cloud-id и folder-id.\n\nДанные панели хранятся локально в SQLite.\n\nПри запуске через `.exe` runtime лежит здесь:\n\n```text\n%LOCALAPPDATA%\\Redroller\\.web-runtime\n```\n\nТам находятся:\n\n```text\nip_rotator.sqlite3\nsecret.key\naccounts\u002F\nrunner logs\nruntime config.json\nstate.json\nrun.log\nbrowser-profile\u002F\n```\n\n> ⚠️ Если удалить `secret.key`, ранее сохранённые JSON-ключи сервисных аккаунтов нельзя будет расшифровать.\n\n---\n\n## 🔐 Работа с ключами\n\nВ Redroller нужен **авторизованный ключ сервисного аккаунта в формате JSON**.\n\nВ Yandex Cloud путь такой:\n\n```text\nIdentity and Access Management\n→ Сервисные аккаунты\n→ нужный сервисный аккаунт\n→ Создать ключ\n→ Создать авторизованный ключ\n→ Скачать файл с ключами\n```\n\nПосле создания Yandex Cloud показывает два текстовых блока:\n\n- **Ваш открытый ключ** — публичная часть, отдельно в Redroller не вставляется;\n- **Ваш закрытый ключ** — приватная часть, отдельно в Redroller тоже не вставляется.\n\nНужно нажать **Скачать файл с ключами**, открыть скачанный `.json` и вставить в поле **JSON-ключ сервисного аккаунта** весь файл целиком. Внутри JSON будут служебные поля вроде `id`, `service_account_id` и `private_key`.\n\nТакой файл содержит приватную часть ключа, поэтому обращайтесь с ним как с паролем: не отправляйте его в чат, не коммитьте в GitHub и не храните в общих папках.\n\nRedroller:\n\n- проверяет, что ключ похож на ключ сервисного аккаунта;\n- шифрует его перед сохранением в SQLite;\n- не показывает ключ обратно через API;\n- создаёт временный `sa-key.json` только в runtime-директории конкретного аккаунта;\n- использует этот ключ при запуске `yc_ip_hunter.py`.\n\nОператор не должен вручную раскладывать ключи по проекту для обычного запуска.\n\n---\n\n## 🎰 Режимы крутки\n\n### ☁️ Гибридная крутка\n\nОсновной режим.\n\nRedroller создаёт disposable cloud\u002Ffolder, привязывает billing, выдаёт права сервисному аккаунту, резервирует адреса, проверяет попадание и удаляет промахи.\n\nПодходит для массовой охоты по диапазонам.\n\nВ приложении для этого выбирается режим:\n\n```text\nГибридная крутка\n```\n\n`target_cloud_id` и `folder_id` в этом режиме очищаются автоматически.\n\n### 📁 Крутка 1 проекта\n\nРежим для работы внутри конкретного существующего cloud\u002Ffolder.\n\nВ приложении выбирается режим:\n\n```text\nКрутка 1 проекта\n```\n\nНужно указать:\n\n- `target_cloud_id`;\n- `folder_id`.\n\nПодходит, если ресурсы должны создаваться только внутри заранее выбранного проекта.\n\n---\n\n## 🎯 Целевые диапазоны\n\nЦели задаются прямо в приложении в полях `target_ips` и `target_cidrs`.\nЭто белый список: адрес считается успешным, если он совпал с конкретным IP или попал в один из CIDR.\n\nСписок можно менять двумя способами:\n\n- при создании или редактировании аккаунта;\n- во вкладке **Цели**, где можно добавить или удалить IP\u002FCIDR без изменения ключа, зон и Yandex Cloud-настроек.\n\nПустой список целей не сохраняется: нужен хотя бы один IP или CIDR.\n\nПример диапазонов:\n\n```json\n[\n  \"84.201.188.0\u002F23\",\n  \"84.201.184.0\u002F22\",\n  \"84.201.128.0\u002F18\",\n  \"158.160.0.0\u002F16\"\n]\n```\n\nЕсли выпавший адрес попадает в один из диапазонов, он считается успешным.\n\n---\n\n## 🛡️ Изоляция\n\nВкладка **Изоляция** защищает выбранные `cloud-id` и `folder-id` от удаления и участия в обычной охоте.\n\nПравила:\n\n- изоляция сохраняется отдельной кнопкой;\n- список хранится отдельно от общего редактирования аккаунта;\n- пустые строки удаляются;\n- дубли убираются;\n- некорректные cloud-id и folder-id отклоняются;\n- обновление происходит атомарно;\n- обычное сохранение аккаунта не затирает изоляцию.\n\nЭто нужно, чтобы найденные или важные cloud\u002Ffolder с рабочими машинами не были случайно уничтожены или переиспользованы роллером.\n\n---\n\n## 🏆 Поведение после успеха\n\nВ аккаунте есть настройка **После успеха**:\n\n- **Остановиться после первого найденного IP** — безопасный режим для первого запуска и обычного пользователя.\n- **Продолжать и собирать несколько IP** — режим сбора: Redroller сохраняет успех, изолирует cloud\u002Ffolder и идёт дальше за следующим адресом.\n\nКогда найден целевой IP:\n\n1. результат сохраняется;\n2. address остаётся зарезервированным;\n3. Telegram отправляет уведомление, если включён;\n4. cloud и folder автоматически добавляются в изоляцию аккаунта;\n5. если выбран безопасный режим, процесс останавливается после первого успеха;\n6. если включён режим продолжения, Redroller идёт дальше за следующим адресом.\n\nВ таблице **История IP** повторные адреса помечаются бейджем `ПОВТОР`. Первое появление адреса показывается без отдельной отметки. Успешный статус и кнопка `YC` открывают каталог результата в Yandex Cloud Console.\n\nЕсли после ручной проверки успешный IP оказался неподходящим, его можно убрать из этой же таблицы:\n\n1. остановите активную ротацию, если она ещё идёт;\n2. найдите успешную строку в **История IP**;\n3. нажмите **Удалить IP** в колонке **Действие**;\n4. подтвердите удаление.\n\nRedroller удалит зарезервированный address и снимет его `cloud-id`\u002F`folder-id` с изоляции аккаунта. Если результат был в disposable-каталоге гибридной крутки, каталог будет отправлен на удаление. После этого Redroller проверит disposable-cloud: если cloud управляется Redroller и в нём не осталось активных каталогов, cloud тоже будет отправлено на удаление. Если Yandex Cloud ещё держит каталог в статусе удаления, в истории появится кнопка **Удалить cloud** — её можно нажать позже для повторной попытки.\n\nЕсли это выбранный каталог режима **Крутка 1 проекта**, каталог и cloud останутся на месте.\n\nОбычные промахи и временные cloud\u002Ffolder Redroller чистит сам во время ротации. Ручная кнопка нужна именно для случая, когда IP сначала считался успешным и был защищён, а после ручной проверки оказался неподходящим.\n\n---\n\n## 🤖 Telegram-уведомления\n\nTelegram настраивается прямо в приложении во вкладке **Telegram**.\n\nМожно сохранить:\n\n- `chat_id`;\n- bot token;\n- статус включения уведомлений.\n\nToken шифруется тем же локальным ключом и не отдаётся обратно через API.\n\nЧерез интерфейс также можно отправить тестовое сообщение.\n\n---\n\n## 🧾 Advanced: CLI-режим\n\nCLI оставлен для диагностики, тестирования и ручного запуска.\n\nОбычному пользователю он не нужен: приложение само генерирует runtime-конфиг и запускает движок.\n\nDry-run:\n\n```powershell\npython .\\bin\\yc_ip_hunter.py --config .\\bin\\config.json --dry-run\n```\n\nБоевой запуск:\n\n```powershell\npython .\\bin\\yc_ip_hunter.py --config .\\bin\\config.json --run --yes-delete-cloud\n```\n\nФлаг `--yes-delete-cloud` нужен намеренно. Без него удаление cloud не произойдёт даже при `allow_delete_cloud: true`.\n\nЭто защита от быстрых пальцев и медленного сожаления.\n\n---\n\n## 🤖 Advanced: Telegram-бот\n\nTelegram-бот позволяет управлять ротацией удалённо: запускать\u002Fостанавливать аккаунты, смотреть живой лог, запрашивать пересоздание cloud и экспортировать цели.\n\n### Настройка\n\n1. Скопировать шаблон:\n\n```powershell\ncd bin\ncopy telegram_bot_config.example.json telegram_bot_config.json\n```\n\n2. В `telegram_bot_config.json` указать `bot_token_env` или положить токен в переменную окружения `TELEGRAM_BOT_TOKEN`, а также добавить свой `chat_id` в `allowed_chat_ids`.\n\n3. Запустить бота:\n\n```powershell\npython .\\bin\\telegram_bot.py --config .\\bin\\telegram_bot_config.json\n```\n\nБот будет слушать Telegram-команды и управлять аккаунтами, указанными в `accounts`.\n\n---\n\n## 📦 Сборка Windows EXE\n\nДля сборки нужен PyInstaller (скрипт ставит его сам, если не установлен):\n\n```powershell\npython -m pip install -r bin\\requirements.txt\n.\\bin\\build_web_panel_exe.ps1\n```\n\nСборка создаёт:\n\n```text\nRedroller.exe\ndist\u002F\n└── release\u002F\n    ├── Redroller.exe\n    └── README.txt\n```\n\nRelease-папка нужна для чистой выдачи пользователю: только `.exe` и короткая инструкция, без технического мусора.\n\n---\n\n## 🧪 Тесты\n\n```powershell\npython -m pip install -r bin\\requirements.txt\npython -m unittest discover -s .\\bin -p \"test_*.py\" -v\n```\n\nПокрываются:\n\n- web-панель;\n- миграции SQLite;\n- шифрование ключей;\n- Telegram-настройки;\n- runtime-конфиги;\n- изоляция cloud-id\u002Ffolder-id;\n- автоизоляция найденных cloud\u002Ffolder;\n- launcher-поведение;\n- CLI-логика охотника.\n\n---\n\n## 🔐 Что нельзя коммитить\n\nЛокальные секреты и runtime-файлы не должны попадать в репозиторий:\n\n```text\nconfig.json\nconfig.*.json\nsa-key.json\n*-key.json\n*.pem\n*.key\n.env\n.env.*\n*.sqlite\n*.sqlite3\nstate.json\nrun.log\n*.log\n.web-runtime\u002F\n.pyinstaller-build\u002F\ndist\u002F\nbuild\u002F\n```\n\nЕсли JSON-ключ сервисного аккаунта попал в публичный репозиторий — ключ надо немедленно удалить в Yandex Cloud и выпустить новый.\n\n---\n\n## 🧭 Что нужно подготовить в Yandex Cloud\n\nВ приложении всё настраивается через форму, но сами значения нужно взять в Yandex Cloud:\n\n| Значение | Где взять |\n|---|---|\n| `organization_id` | страница организации \u002F Cloud Center |\n| `billing_account_id` | раздел Billing |\n| `service_cloud_id` | ID облака, где живёт сервисный аккаунт |\n| JSON-ключ | IAM → сервисный аккаунт → создать авторизованный ключ → скачать файл с ключами → вставить весь JSON |\n| `target_cidrs` \u002F `target_ips` | нужные диапазоны или конкретные адреса |\n| зоны | `ru-central1-a`, `ru-central1-e` и другие доступные зоны |\n\nПосле этого всё вводится в Redroller через UI.\n\n---\n\n## 🧨 Что происходит при запуске из приложения\n\n```text\nRedroller.exe\n   ↓\nлокальная web-панель\n   ↓\nSQLite + encrypted secrets\n   ↓\nruntime config для выбранного аккаунта\n   ↓\nyc_ip_hunter.py\n   ↓\nYandex Cloud API\n   ↓\nадрес найден \u002F промах удалён \u002F cloud защищён\n```\n\nПользователь работает с кнопками и формами. Внутренний JSON и runtime-файлы приложение создаёт само.\n\n---\n\n## ⚠️ Дисклеймер\n\nRedroller — утилита для управления собственными облачными ресурсами и проверки выделяемых публичных IPv4.\n\nЗа лимиты, биллинг, квоты, удаление cloud, расходы, права сервисного аккаунта и последствия нажатия кнопки отвечает оператор.\n\nСредство производства дано. Ответственность тоже.\n","Redroller是一款用于在Yandex Cloud中寻找所需公共IPv4地址的桌面应用程序。它支持用户直接在应用内配置账户、密钥、区域、目标以及Telegram通知等，无需手动编辑JSON配置文件，极大地简化了操作流程。该应用基于Python 3.9+开发，仅适用于Windows平台，并使用SQLite作为本地存储解决方案来保存用户的设置和状态信息，同时确保所有敏感数据的安全加密。Redroller非常适合那些需要频繁更换或查找特定公网IP地址的个人开发者或小型团队，在Yandex Cloud环境下工作时尤为有用。","2026-06-11 04:02:45","CREATED_QUERY"]