Обзор
Загружаем состояние…
Развёрнута базовая часть Hub: схема, авторизация и аудит.
Бот, приложения и очередь подключаются на следующих этапах.
{{ ov.schema.tables }}
таблиц в базе
{{ ov.schema.migrations }}
миграций применено
{{ ov.recipients.users_total }}
Telegram-пользователей
{{ ov.alerts }}
открытых тревог
🤖 Telegram-бот
Токен
{{ ov.telegram.token_configured ? 'задан' : 'не задан' }}
Бот
{{ ov.telegram.bot_username || '—' }}
Webhook
{{ ov.telegram.webhook_url || '—' }}
Отправка
{{ ov.telegram.sending_enabled ? 'включена' : 'выключена' }}
Последняя ошибка
{{ ov.telegram.webhook_last_error }}
🔌 Приложения
Ни одно приложение не подключено
| Ключ | Название | Состояние |
|---|---|---|
| {{ a.app_key }} | {{ a.name }} | {{ a.state }} |
📨 Очередь Telegram
Событий принято
{{ ov.queue.events_total }}
Ожидают отправки
{{ ov.queue.pending }}
В обработке
{{ ov.queue.processing }}
Отложены тишиной
{{ ov.queue.deferred }}
Отправлено
{{ ov.queue.sent }}
Ошибок
{{ ov.queue.failed }}
👥 Получатели
Пользователей активно
{{ ov.recipients.users_active }}
Ждут одобрения
{{ ov.recipients.users_pending }}
Чатов и групп
{{ ov.recipients.chats_total }}
Групп ждут одобрения
{{ ov.recipients.chats_pending }}
Заблокировали бота
{{ ov.recipients.chats_blocked }}
💾 Система
Размер базы
{{ humanSize(ov.schema.size_bytes) }}
Последняя копия
{{ ov.backup ? ov.backup.created_at : 'ещё не создавалась' }}
Время сервера
{{ ov.server_time }}
Приложения
Ни одно приложение не подключено
Подключите NP Switcher и Drop Platform, чтобы Hub начал принимать их события
{{ a.icon || '🔌' }}
{{ a.name }}
{{ a.app_key }}
{{ a.state }}
отключено
{{ a.last_error }}
Базовый адрес
{{ a.base_url }}
Проверка состояния
{{ a.health_url }}
Манифест
{{ a.manifest_url }}
Версия манифеста
{{ a.manifest_version || 'не получен' }}
Версия приложения
{{ a.app_version || '—' }}
Последняя связь
{{ a.last_success_at || 'ещё не было' }}
Приём событий
{{ a.accepts_events ? 'разрешён' : 'запрещён' }}
Действующих секретов
{{ a.active_secrets }}
идёт перевыпуск
Событий пока не было
| Получено | Тип | Важность | Состояние | Заданий |
|---|---|---|---|---|
| {{ e.received_at }} | {{ e.event_type }} | {{ e.severity }} |
{{ e.status }}
{{ e.error }}
|
{{ e.jobs_created }} |
Telegram-бот
{{ bot.last_error }}
Telegram сообщает об ошибке webhook: {{ bot.webhook_last_error }}
🔑 Токен
{{ bot.token_configured ? 'задан' : 'не задан' }}
Бот
@{{ bot.bot_username }} · {{ bot.bot_name }}
Токен сначала проверяется у Telegram и ничего не меняет. Хранится зашифрованным и обратно не показывается.
Новый бот
@{{ botCheck.bot.username }} · {{ botCheck.bot.name }} · ID {{ botCheck.bot.id }}
Сейчас
@{{ botCheck.current.username }}
Это тот же бот — токен будет обновлён, получатели не затронуты.
Люди и группы сохранятся (они привязаны к Telegram ID), но новый бот сможет писать в личку только тем,
кто откроет @{{ botCheck.bot.username }} и нажмёт «Start», а в группы — только после того, как его туда добавят.
Ожидаемый бот на странице «Запуск» — @{{ botCheck.expected }}, а это @{{ botCheck.bot.username }}.
Webhook этого бота сейчас указывает на {{ botCheck.webhook_url }} — команды принимает другое приложение.
После смены их будет принимать Hub, а прежний обработчик перестанет получать сообщения.
Готово: @{{ botSwitchResult.bot.username }}
• {{ st }}
Попросите {{ botSwitchResult.private_chats }} сотрудников открыть @{{ botSwitchResult.bot.username }} и нажать «Start»,
добавьте бота в {{ botSwitchResult.groups }} групп(ы).
🔗 Webhook
{{ bot.webhook_configured ? 'установлен' : 'не установлен' }}
Текущий адрес
{{ bot.webhook_url || '—' }}
Установлен
{{ bot.webhook_set_at || '—' }}
Ожидающих обновлений
{{ bot.pending_updates }}
Только HTTPS. Секрет генерируется заново при каждой установке,
накопившиеся обновления отбрасываются.
📤 Отправка
{{ bot.sending_enabled ? 'включена' : 'выключена' }}
Последняя отправка
{{ bot.last_sent_at || 'ещё не было' }}
Выключение останавливает очередь, но не теряет сообщения:
они останутся ожидать отправки.
🧪 Тестовое сообщение
Ни один чат ещё не зарегистрирован.
Напишите боту /start, чтобы он появился здесь.
Напишите боту /start, чтобы он появился здесь.
Пользователи
Никто ещё не написал боту
Как только человек отправит /start,
он появится здесь и будет ждать одобрения
{{ u.first_name || 'Без имени' }} {{ u.last_name || '' }}
@{{ u.username }}
{{ stateLabel(u.state) }}
Telegram ID
{{ u.tg_user_id }}
Первое обращение
{{ u.first_seen_at }}
Последняя активность
{{ u.last_seen_at || '—' }}
Роль
Действующих прав
{{ u.permissions.length }}
ФОП
{{ u.fops.all ? 'все, включая будущие' : (fopNames(u.fops.ids) || 'нет') }}
Дропы
{{ u.drops.all ? 'все, включая будущие' : (u.drops.ids.join(', ') || 'нет') }}
Группы и чаты
Чатов пока нет
{{ c.title || c.username || c.chat_id }}
{{ c.chat_type }}
{{ stateLabel(c.state) }}
заблокировал бота
Chat ID
{{ c.chat_id }}
Тестовый чат
Владелец
{{ c.owner }}
Участников известно
{{ c.members }}
Последняя ошибка
{{ c.last_error }}
Права и область назначаются всей группе: автоматические сообщения и ответы кнопок в общий
чат не выходят за них. Финансовые события — только с разрешением «Финансы в группе».
Очередь Telegram
{{ n }}
{{ stateLabel(st) }}
Заданий нет
| # | Получатель | Текст | Состояние | Попыток | Создано | |
|---|---|---|---|---|---|---|
| {{ j.id }} |
{{ j.title || j.username || j.chat_id }}
{{ j.chat_type }}
|
{{ j.preview }}
часть {{ j.part_no }} из {{ j.part_total }}
|
{{ stateLabel(j.status) }}
{{ j.last_error }}
|
{{ j.attempts }} | {{ j.created_at }} |
Шаблоны
Шаблонов пока нет
Шаблон описывает, как событие приложения превращается в сообщение
| Ключ | Название | Приложение | Событие | Версия | Состояние | |
|---|---|---|---|---|---|---|
| {{ t.key }} | {{ t.name }} | {{ t.app_name || 'Hub' }} | {{ t.event_type || '—' }} | {{ t.version_no || '—' }} | {{ t.is_enabled ? 'включён' : 'выключен' }} |
Уведомления
⛔ Нет действующего получателя обязательного события
{{ m.app_key }}:{{ m.event_type }} — {{ m.note }}.
Отметьте его в профиле владельца (Пользователи → Уведомления).
🔔 Профили получателей
Галочки событий настраиваются в карточке человека или группы: «Пользователи» / «Группы» → «Уведомления».
Подписка не даёт права просмотра: без нужного разрешения событие не приходит.
Профилей нет — события принимаются, но никому не рассылаются
| Получатель | Профиль | Итог | Состояние | |
|---|---|---|---|---|
|
{{ p.subject_title }}
{{ p.subject_type === 'telegram_chat' ? 'группа' : 'личный чат' }}
|
{{ p.name }} |
{{ p.summary }}
⏸ {{ s.event_type }}: {{ s.reason }}
нет рабочего чата
|
{{ p.is_enabled ? 'включён' : 'выключен' }} |
🌙 Тихие часы — общее правило
Время — по Киеву ({{ quiet.timezone || 'Europe/Kyiv' }}). Индивидуальное правило получателя,
если задано, важнее общего — и при постановке, и при выпуске отложенного.
📦 Перенос прежних подписок
Каждая старая подписка и профиль, куда она перенесена. Ни фильтр, ни шаблон, ни режим не теряются:
отличающиеся настройки стали отдельными профилями или исключениями события.
| # | Событие | Было | Стало |
|---|---|---|---|
| {{ r.subscription_id }} | {{ r.app_key }}:{{ r.event_type }} | {{ r.before_json }} | {{ r.after_json }} |
ФОП
Drop называет ФОП кодом (2168705441), NP — номером своей базы (3). Одинаковые числа разных
приложений — разные ФОП. Здесь каждому ФОП Hub сопоставляются его идентификаторы в приложениях.
Ограниченный по ФОП сотрудник не получит событие с несопоставленным ФОП.
ФОП Hub
| # | Название | В приложениях | |
|---|---|---|---|
| {{ f.id }} | {{ fopReg.refs.filter(r => r.hub_fop_id === f.id).map(r => r.app_key + ': ' + r.ref).join(', ') || '—' }} |
ФОП ещё не заведены
Идентификаторы в приложениях
| Приложение | Идентификатор | Название из событий | ФОП Hub | |
|---|---|---|---|---|
| {{ r.app_name }} | {{ r.ref }} | {{ r.label || '—' }}
последнее событие {{ r.last_seen_at }}
|
Идентификаторы появятся, когда приложения пришлют события с ФОП
Добавить вручную
События
Событий не найдено
| # | Событие | Объект | Hub принял | Маршрутизация | Telegram | |
|---|---|---|---|---|---|---|
| {{ e.id }} |
{{ e.app_key }}:{{ e.event_type }}
{{ e.severity }}
|
{{ e.subject_type }}{{ e.subject_id ? ':' + e.subject_id : '' }} | {{ e.received_at }} |
{{ routeLabel(e) }}
{{ e.error || e.route_note }}
|
✅ {{ e.jobs_sent }} ⏳ {{ e.jobs_waiting }} ✖ {{ e.jobs_failed }} ❓ {{ e.jobs_uncertain }} — |
Запуск и готовность
{{ launch.ready ? '✅ Всё готово к рабочей доставке' : '⚠ Есть препятствия к запуску — см. список ниже' }}
Проверка
{{ i.status === 'ok' ? '✅' : (i.status === 'warning' ? '⚠️' : '⛔') }} {{ i.title }}
{{ i.detail }}
Режим рассылки
Пока приложение в режиме hub_test, оно рассылает само, а Hub шлёт копии только в тестовые чаты:
рабочие подписчики не получают сообщения дважды. Переключение приложения в режим hub — в его настройках.
Сейчас подключён: @{{ launch.settings.bot_username || '—' }}. Если токен другого бота — проверка покажет ошибку.
Сквозная проверка
Сообщение проходит очередь Hub и подтверждается Telegram. Тестовые чаты отмечаются в разделе «Группы».
Открытые проблемы и напоминания
Открытых проблем нет
| # | Проблема | Объект | Открыта | Проверка источника | Получателей |
|---|---|---|---|---|---|
| {{ i.id }} | {{ i.incident_type }}
{{ i.kind === 'unpaid' ? 'напоминание через 4 ч' : 'напоминание через 1 ч' }} |
{{ i.object_id }} | {{ i.opened_at }} | {{ i.last_check_status || '—' }} {{ i.last_check_reason || '' }} | {{ i.recipients }} |
Меню бота
Меню ещё не создано
Пока меню нет, бот отвечает на /menu подсказкой про /help
{{ menuDetail.menu.name }}
{{ menuDetail.is_draft ? 'черновик' : 'опубликовано' }}
• {{ e }}
Опубликованная версия защищена от правок. Первое изменение создаст черновик,
который не влияет на бота до публикации.
Максимальная глубина — {{ menuMaxDepth }} уровня. Кнопки «Назад» и «Главное меню»
добавляются автоматически.
Пунктов нет
| Пункт | Тип | Действие | Право | Чаты | Порядок | |
|---|---|---|---|---|---|---|
| {{ n.emoji }} {{ n.title }} | {{ nodeTypeLabel(n.action_type) }} | {{ n.action_key || n.url || '—' }} | {{ n.required_permission || '—' }} | {{ chatTypesLabel(n.chat_types) }} | {{ n.sort_order }} |
Так увидит {{ menuPreviewUser }}
Доступных пунктов нет
{{ b.text }}
Версии
| № | Состояние | Пунктов | Опубликована | Комментарий | |
|---|---|---|---|---|---|
| {{ v.version_no }} | {{ v.status }} | {{ v.nodes }} | {{ v.published_at || '—' }} | {{ v.comment || '' }} |
Команды
В списке бота публикуются только /start, /menu и /help. Остальные команды
работают, но основной интерфейс — кнопки.
| Команда | Псевдоним | Приложение | Действие | Право | В списке бота | |
|---|---|---|---|---|---|---|
| /{{ c.command }} | {{ c.aliases ? '/' + c.aliases : '—' }} | {{ c.app_name || 'Hub' }} | {{ c.action_key || '—' }} | {{ c.required_permission || '—' }} | {{ c.publish_to_bot ? 'да' : 'нет' }} | встроенная |
Состояние системы
🚨 Открытые тревоги
{{ a.message }}
{{ a.kind }} · повторов {{ a.occurrences }} · с {{ a.first_seen_at }}
🤖 Telegram
{{ healthLabel(health.telegram.status) }}
{{ p }}
Бот
{{ health.telegram.bot_username ? '@' + health.telegram.bot_username : '—' }}
Ожидает обновлений
{{ health.telegram.pending_updates }}
Последняя отправка
{{ health.telegram.last_sent_at || 'не было' }}
Ошибка
{{ health.telegram.last_error }}
💾 База и копии
{{ healthLabel(health.database.status) }}
Размер
{{ humanSize(health.database.size_bytes) }}
Таблиц и миграций
{{ health.database.tables }} / {{ health.database.migrations }}
Последняя копия
{{ health.backups.last_at || 'не было' }}
устарела
Копий хранится
{{ health.backups.total }}
🔌 Приложения
Ни одно приложение не подключено
| Приложение | Состояние | Манифест | Отклик | Событий за сутки | Последнее событие |
|---|---|---|---|---|---|
| {{ a.name }} {{ a.app_key }} |
{{ a.state }}
{{ a.last_error }}
|
{{ a.manifest_version || 'нет' }}
{{ a.app_version || '' }}
|
{{ a.latency_ms !== null ? a.latency_ms + ' мс' : '—' }} | {{ a.events_day }} | {{ a.last_event_at || '—' }} |
📨 Очередь
{{ healthLabel(health.queue.status) }}
{{ p }}
{{ stateLabel(st) }}
{{ n }}
⚙️ Фоновые задачи
{{ healthLabel(health.cron.status) }}
{{ p }}
Проверка приложений
{{ health.cron.last_health_check_at || 'не было' }}
Последняя отправка
{{ health.cron.last_sent_at || 'не было' }}
Последняя копия
{{ health.cron.last_backup_at || 'не было' }}
Снято {{ health.checked_at }} · время в UTC
Аудит
Найдено записей: {{ auditTotal }}
Записей нет
| Время | Кто | Действие | Объект | Результат | Подробности |
|---|---|---|---|---|---|
| {{ e.created_at }} |
{{ e.admin_login || e.actor_external_id || e.actor_type }}
{{ e.actor_type }}
|
{{ e.action }} | {{ e.object_type }}{{ e.object_id ? ' #' + e.object_id : '' }} | {{ e.result === 'success' ? 'успех' : 'отказ' }} |
{{ e.message }}
{{ e.new_value }}
{{ e.correlation_id }}
|
Резервные копии
{{ backupSummary.total }}
копий хранится
{{ backupSummary.failed }}
не прошли проверку
{{ backupSummary.age_hours !== null ? backupSummary.age_hours + ' ч' : '—' }}
возраст последней
{{ backupKeep }}
хранить копий
Последняя копия старше полутора суток. Проверьте, работает ли задача
cron/backup.php.
Каждая копия сразу проверяется: открывается отдельно, сверяется целостность
и число таблиц. Копии лежат вне веб-каталога и снаружи недоступны.
Копий пока нет
| Файл | Создана | Тип | Размер | Проверка | |
|---|---|---|---|---|---|
| {{ b.filename }} | {{ b.created_at }} | {{ backupKindLabel(b.kind) }} | {{ humanSize(b.bytes) }} |
{{ b.verify_status === 'ok' ? 'годна'
: (b.verify_status === 'failed' ? 'негодна' : 'не проверена') }}
{{ b.verify_error }}
|
Восстановление
Копия — обычный файл SQLite. Порядок восстановления: остановить фоновые задачи,
сохранить текущую базу под другим именем, положить копию на место
hub.db, выставить владельца
www-data, проверить
migrate.php --check и вернуть задачи.
Файлы -wal и -shm от старой базы
при этом нужно удалить, иначе SQLite попытается применить их к новой.
Роли и разрешения
Доступ настраивается каждому человеку и группе отдельно. Набор прав — необязательный шаблон:
назначили сотруднику — он получил эти разрешения, а «разрешить/запретить» в его карточке действует поверх набора.
Право администрировать Hub само по себе не открывает данные Drop и NP.
{{ roleForm.id ? 'Набор: ' + roleForm.name : 'Новый набор прав' }}
Состав набора «Администратор» задаёт Hub: настройка Hub без доступа к данным приложений.
{{ app || 'Telegram Hub' }}
Наборы прав
| Набор | Разрешения | Назначен | |
|---|---|---|---|
| {{ r.name }} {{ r.description }} |
{{ r.permissions.join(', ') || '—' }} | {{ r.members }} |
Кто что может
✓ — разрешено (набором или точечно), ✗ — точечный запрет.
| Получатель | Набор | Дропы | ФОП | Уведомл. | {{ p.key }} | |
|---|---|---|---|---|---|---|
| {{ s.title }}
{{ s.subject_type === 'telegram_chat' ? 'группа' : s.handle }} · {{ stateLabel(s.state) }} |
{{ s.drops }} | {{ s.fops }} | {{ s.profiles }} | ✗ ✓ |
Настройки
Время
В сообщениях, карточках бота и сводках. Переход на летнее и зимнее время учитывается.
Тихие часы используют свой пояс в правиле.
Меню и оповещения
от {{ hubSettings.limits[k][0] }} до {{ hubSettings.limits[k][1] }}
Сроки хранения, дней
от {{ hubSettings.limits[k][0] }} до {{ hubSettings.limits[k][1] }}
Очистка выполняется ежедневно в 04:20. Вместе с событием удаляется журнал его доставки.
{{ current.title }}
Раздел ещё не реализован
{{ current.note }}