Проект REG.RU Control v1.0.0 — первый публичный релиз самостоятельной панели для аккаунта REG.RU: домены, хостинги, VPS, выделенные серверы, лицензии, DNS-зоны, баланс и журнал действий в одном интерфейсе вместо десятков разрозненных команд API v2. Релиз вышел 22 октября 2026 года и является не переносом старого кода, а переписыванием: исходный проект daloman/regru-api-go умел три операции с DNS, здесь — каталог из 116 документированных команд, 61 HTTP-маршрут и 38 автотестов. Стек намеренно скучный: PHP 8.5 и SQLite, без Composer, Node и MySQL, установка сводится к клонированию репозитория и трём командам. Для администратора важны две вещи: всё, что делает интерфейс, доступно через JSON API, и поверх того же API работает MCP-сервер из 13 инструментов, так что агент и человек видят одно и то же состояние аккаунта.

TL;DR
- REG.RU Control v1.0.0 — первый публичный релиз панели для аккаунта REG.RU, лицензия MIT, PHP 8.5 + SQLite.
- Ставится без Composer, Node и MySQL:
git clone,key:generate,migrate,user:create. - Внутри: инвентарь услуг, продление и делегирование доменов, редактор DNS, шифрованное хранилище доступов, биллинг, аудит.
- Для агентов — JSON API с Bearer-токенами и scopes плюс MCP-сервер (stdio), по умолчанию только чтение.
- Главный риск: потеря
APP_KEYделает сохранённые пароли нерасшифровываемыми, а SQLite рассчитан на один узел.
Что нового
Панель закрывает полный цикл работы с аккаунтом: инвентарь услуг с датами оплаты и остатком дней, продление и автопродление доменов, смену NS, снятие с делегирования, сертификат владения и DNSSEC, редактор зон с типами от A до CAA и SOA/TTL, хостинги с IP и ссылками на панели, баланс и неоплаченные счета. Синхронизация идёт тремя этапами — услуги, детали, DNS-зоны, — и ошибка одного этапа не отменяет остальные: запуск помечается статусом partial, причина сохраняется в истории. Полная синхронизация стоит около 15 запросов к REG.RU.
Отдельная тема — доступы. Пароли хостингов и пароль API хранятся зашифрованными libsodium secretbox, ключ шифрования лежит в .env с правами 0600 вне базы и git, а ключ выводится отдельно для каждой записи, поэтому шифротекст нельзя переставить в другую строку. Раскрытие пароля — это отдельное право secrets:read и событие журнала: видно, кто, когда и с какого адреса его открыл. Если REG.RU не отдаёт пароль для какого-то типа услуги, панель честно пишет «API не вернул» вместо пустого поля.
Для интеграций отданы три поверхности сразу. HTTP API v1 работает с Bearer-токенами и scopes read, write, dns:write, secrets:read, admin, regru:raw, к каждому ответу прилагается request_id, совпадающий со строкой в журнале. MCP-сервер mcp/server.php говорит по stdio JSON-RPC 2.0 и отдаёт 13 инструментов: инвентарь, домены, DNS, хостинги, доступы, биллинг, синхронизацию, продление и raw-вызов REG.RU. Интерфейс — SPA без шага сборки, с тёмной и светлой темой, строгим CSP без inline-скриптов и шестью языками: английский по умолчанию, русский, китайский, хинди, немецкий, испанский.
| Поверхность | Значение |
|---|---|
| PHP-файлы / строки | 128 / 11 368 |
| JavaScript / CSS | 18 файлов, 3 554 строки / 552 строки |
| HTTP-маршруты | 61 |
| Команды REG.RU API v2 в каталоге | 116 |
| Инструменты MCP | 13 |
| Автотесты | 38 |
| Runtime-зависимости | 0 |
Что исправлено относительно исходного проекта
Сравнение идёт с daloman/regru-api-go, из которого проект вырос:
- ошибки API больше не проглатываются: транспортные сбои отличаются от бизнес-ошибок, у каждой есть код и человекочитаемое сообщение;
- добавлены таймауты, повторы только для сетевых сбоев и защита от двойного списания при продлении;
- учтён лимит REG.RU в 1200 запросов в час: локальный предохранитель останавливает панель на 1100;
- параметры ответа нормализуются, поэтому список записей не теряется при смене типа поля вроде
prio; - секреты не попадают в логи и в списки API.
Ключевые изменения
| Что | Было (исходный проект) | Стало |
|---|---|---|
| Язык и объём | Go, три функции DNS | PHP 8.5, панель целиком: 128 файлов, 61 маршрут |
| Ошибки REG.RU | проглатывались | разделение транспортных и бизнес-ошибок, коды и request_id |
| Лимит API | не учитывался | предохранитель 1100 запросов в час при официальных 1200 |
| Интерфейс | отсутствовал | SPA без сборки, две темы, адаптив до 390 px, шесть языков |
| Доступ для агентов | не предусмотрен | JSON API со scopes плюс MCP-сервер на 13 инструментов |
| Хранение | — | SQLite (WAL), две миграции, шифрованное хранилище паролей |
Как обновиться
Обновляться не с чего: это первый релиз, установка равна первой настройке. Локально хватает клонирования и трёх команд — панель поднимается на встроенном сервере PHP.
git clone https://github.com/paulmann/regru-control.git
cd regru-control
cp .env.example .env
php backend/bin/regru key:generate
php backend/bin/regru migrate
php backend/bin/regru user:create --login=admin
php backend/bin/regru serve --port=8099
На сервере порядок другой: сначала собирается дерево публикации без .git, var/ и тестов, затем deploy/ копируется в каталог сайта, а веб-корнем становится каталог с index.php. В nginx PHP разрешается только для index.php, а каталоги backend/, frontend/, var/, docs/ и dotfiles закрываются через deny all.
php tools/build.php --target=../deploy
php backend/bin/regru migrate
Дальше создаётся администратор, подключается аккаунт REG.RU и выполняется первая синхронизация. Пароль API создаётся в личном кабинете REG.RU отдельно от пароля входа, и API разрешается только с IP сервера — иначе первый же запрос вернёт ACCESS_DENIED_FROM_IP. Пароль передаётся через stdin, чтобы не попасть в список процессов и историю команд.
php backend/bin/regru account:set --login=<логин> --password-stdin
php backend/bin/regru sync --scope=all
php backend/bin/regru doctor --online
Что проверить после обновления
php backend/bin/regru doctor
curl -s https://example.com/regru/api/v1/health
curl -s -H "Authorization: Bearer <токен>"
https://example.com/regru/api/v1/inventory | jq '.data.counts'
Критерий «работает»: doctor не находит проблем с окружением и расширениями PHP; health отдаёт status: ok, версию 1.0.0 и db.ok: true; в инвентаре видны домены и хостинги аккаунта с датами и остатком дней; sync завершился без статуса partial. Если DNS-зона пуста, первым делом смотрите, делегирован ли домен на ns1.reg.ru/ns2.reg.ru: через API REG.RU управляются только эти зоны, и на чужой зоне вернётся DOMAIN_IS_NOT_USE_REGRU_NSS.
Совместимость и требования
| Параметр | Значение |
|---|---|
| ОС | Linux (Debian/Ubuntu проверены), Windows — для разработки |
| PHP | 8.5, CLI и FPM |
| Расширения PHP | curl, json, mbstring, openssl, pdo_sqlite, sodium |
| Веб-сервер | nginx или Apache с rewrite |
| База данных | SQLite (PDO), режим WAL |
| Обязательно | HTTPS и IP сервера в белом списке REG.RU API |
| Не требуются | Composer, Node, MySQL |
| Лицензия | MIT |
Одна оговорка перед установкой: панель задумана как приватный административный инструмент. Публиковать её в открытый интернет без списка разрешённых сетей и HTTPS не стоит — она держит доступы ко всему аккаунту регистратора.
Кому это нужно
Первый сценарий — небольшой хостинг или студия с десятками доменов у REG.RU: вместо таблицы в блокноте и ручного продления появляется инвентарь с остатком дней, историей платежей и журналом, кто что менял. Второй — эксплуатация с агентами: токен со scope read даёт ассистенту компактный JSON об инвентаре без секретов, а MCP-сервер подключает панель к Claude Desktop, DSH или Cursor без единой строки кода; изменения при этом закрыты флагом REGRU_MCP_ALLOW_WRITE=1.
Подводные камни
APP_KEY— единственный ключ к паролям. Он живёт в.envс правами0600; резервная копия файла обязательна и хранится отдельно от базы. При потере ключа сохранённые пароли не восстанавливаются никаким способом.- SQLite — один узел. Несколько экземпляров панели на общей базе не поддерживаются, внешняя СУБД в версии 1.0.0 не предусмотрена. Для отказоустойчивости остаётся
regru backup(VACUUM INTOс ротацией 14 копий) и восстановление из снимка. - DNS только для зон REG.RU. Домен на Cloudflare или собственном сервере имён через этот API не настраивается: вернётся
DOMAIN_IS_NOT_USE_REGRU_NSS, и это не дефект панели. - Лимит расходуется синхронизацией. Предохранитель стоит на 1100 запросов в час при официальных 1200; полная синхронизация — около 15 запросов, но raw-консоль со scope
regru:rawпозволяет выкрутить лимит вручную. - Опечатка в инструкции для агентов. В
AGENTS.mdкоманда клонирования записана какhttps://github.com//regru-control.git— с пустым владельцем. Адрес из README рабочий, а инструкцию стоит поправить, иначе агент упрётся в ошибку клонирования и начнёт искать причину не там.
FAQ
Нужны ли Composer, Node.js или отдельная СУБД?
Нет. В composer.json только autoload, сборка фронтенда не требуется — SPA состоит из ES-модулей, а данные лежат в SQLite с режимом WAL. Установка — клонирование, .env, миграции и создание пользователя.
Где хранятся пароли хостингов и пароль API REG.RU?
В SQLite, зашифрованными libsodium secretbox с ключом APP_KEY из .env. Ключ выводится отдельно для каждой записи, а каждое раскрытие пароля через панель или API требует scope secrets:read и попадает в журнал.
Может ли AI-агент что-то изменить через MCP?
Только если выполнены два условия: у токена есть права write, dns:write или regru:raw, и на стороне MCP явно включён REGRU_MCP_ALLOW_WRITE=1. По умолчанию сервер работает только на чтение, а все действия видны в журнале.
Можно ли поставить панель в подкаталог вида /regru/?
Да. Базовый путь вычисляется из SCRIPT_NAME автоматически; нужно лишь, чтобы nginx передавал корректные SCRIPT_NAME и SCRIPT_FILENAME, а статика отдавалась по /regru/assets/....
Итог
Первый релиз получился крупнее, чем ожидаешь от «панельки для регистратора»: 61 маршрут, 116 команд в каталоге, 38 тестов и MCP-сервер поверх того же API. Главное достоинство — отсутствие зависимостей: PHP 8.5 и SQLite дают установку без сборки и без риска, что обновление транзитивного пакета однажды сломает доступ к доменам. Главное ограничение честно записано в документации: один узел, только зоны REG.RU, никакого публичного демо. Если в хозяйстве есть аккаунт REG.RU на десятки доменов, панель стоит развернуть рядом и сверить инвентарь с тем, что вы держите в голове или в таблице.
Цитата: Панель над регистратором полезна не тем, что рисует кнопки, а тем, что лимит API, коды ошибок и журнал изменений перестают быть знанием одного человека.
Связанные материалы
- REG.RU Control v1.0.0 — релиз на GitHub — заметки к релизу; приложенных файлов нет, ставится из репозитория.
- AGENTS.md — установка и управление для агентов — требования, установка, CLI, cron, MCP и раздел безопасности.
- docs/MCP.md — протокол для AI-агентов — 13 инструментов, клиенты, ограничения и подключение.
- Wiki проекта — установка, API, безопасность, эксплуатация и разработка отдельными страницами.
LLM Summary
- Тема:
REG.RU Control— самостоятельная панель управления доменами, DNS и хостингами аккаунта REG.RU на PHP 8.5 и SQLite. - Версия:
v1.0.0, опубликована 22 октября 2026 года, первый публичный релиз, лицензия MIT. - Что изменилось: проект переписан с Go (
daloman/regru-api-go, три функции DNS) в панель: инвентарь услуг, управление доменами, редактор DNS, шифрованное хранилище доступов, биллинг, JSON API v1 и MCP-сервер. - Ключевые команды:
php backend/bin/regru key:generate,php backend/bin/regru migrate,php backend/bin/regru account:set --login=<логин> --password-stdin,php backend/bin/regru sync --scope=all,php backend/bin/regru doctor --online. - Требования: PHP 8.5 с расширениями
curl,json,mbstring,openssl,pdo_sqlite,sodium; nginx или Apache с rewrite; HTTPS; IP сервера в белом списке REG.RU API; Composer, Node и MySQL не нужны. - Основные риски: потеря
APP_KEYделает пароли нерасшифровываемыми; SQLite рассчитан на один узел; DNS управляется только для зон наns1.reg.ru/ns2.reg.ru; лимит REG.RU 1200 запросов в час с локальным предохранителем 1100. - Проверка результата:
php backend/bin/regru doctorбез ошибок,GET /api/v1/healthотдаётstatus: okиdb.ok: true, в инвентаре видны домены и хостинги, синхронизация без статусаpartial. - Кому полезно: администраторам и студиям с десятками доменов у REG.RU, а также тем, кто подключает агентов к инвентарю через MCP с правом только на чтение.
- Ссылки: https://github.com/paulmann/regru-control/releases/tag/v1.0.0, https://github.com/paulmann/regru-control
Промт для агента (установка)
Готовый промт для AI-агента: скопируйте блок целиком кнопкой и отдайте своему ассистенту. Шаги и команды взяты из файла AGENTS.md в репозитории проекта — это инструкция, которую автор написал для агентов, а не пересказ.
Задача: установить REG.RU Control 1.0.0, подключить аккаунт REG.RU и доказать, что панель видит инвентарь.
Материалы:
- релиз: https://github.com/paulmann/regru-control/releases/tag/v1.0.0
- репозиторий: https://github.com/paulmann/regru-control
- инструкция для агентов (прочитать первой): https://github.com/paulmann/regru-control/blob/main/AGENTS.md
- дополнительно: docs/API.md, docs/MCP.md, docs/DEPLOY.md в репозитории
Требования (AGENTS.md §3): PHP 8.5 CLI + FPM; расширения curl, json, mbstring, openssl, pdo_sqlite, sodium; nginx (рекомендуется) или Apache с rewrite; TLS обязателен для продакшена; IP сервера в белом списке REG.RU API. Composer, Node и MySQL не нужны.
Проверка окружения:
php backend/bin/regru doctor
Скачивание (§2) — адрес берём из README, в AGENTS.md в нём пропущен владелец репозитория:
git clone https://github.com/paulmann/regru-control.git
cd regru-control
Проверка целостности после клонирования:
php tools/lint.php
php backend/tests/run.php
php tools/secret-scan.php --repo=.
Установка локально (§4.1):
cp .env.example .env
php backend/bin/regru key:generate
php backend/bin/regru migrate
php backend/bin/regru user:create --login=admin
php backend/bin/regru serve --port=8099
Установка на сервере (§4.2): собрать дерево публикации, скопировать deploy/ в каталог сайта (веб-корень — каталог с index.php), создать .env, применить миграции, настроить nginx: try_files, PHP только для index.php, deny all для backend/, frontend/, var/, docs/ и dotfiles, ограничить доступ allow/deny, включить HTTPS.
php tools/build.php --target=../deploy
php backend/bin/regru migrate
Аккаунт REG.RU (§5.1): пароль API создаётся в личном кабинете отдельно от пароля входа, API разрешается только с IP сервера, пароль передаётся через stdin:
php backend/bin/regru account:set --login=<логин> --password-stdin
php backend/bin/regru sync --scope=all
php backend/bin/regru doctor --online
Управление (§6.1):
php backend/bin/regru routes
php backend/bin/regru backup
php backend/bin/regru token:list
php backend/bin/regru token:revoke --id=3
php backend/bin/regru account:show
MCP для агента (§7.2): по умолчанию только чтение, изменения включаются REGRU_MCP_ALLOW_WRITE=1; проверка сервера:
php mcp/server.php --self-test
Ограничения:
- SQLite рассчитан на один узел, несколько экземпляров панели на общей базе не поддерживаются;
- APP_KEY, пароль API и токены не передавать в чаты, логи и скриншоты; .env — права 0600, бэкап отдельно от БД;
- агентам — отдельный токен с минимальными scopes, неиспользуемые отзывать;
- панель не публиковать в открытый интернет без списка разрешённых сетей и HTTPS;
- если команда падает — остановиться и показать команду, вывод и код возврата.
Что считать успехом: doctor без ошибок, sync --scope=all завершён без статуса partial, GET /api/v1/health отдаёт status ok и db.ok true, в инвентаре видны домены и хостинги аккаунта.