Управление конвейером собранных команд
Используйте это руководство после того, как вы уже включили функцию из раздела Собрание команды.
Эта страница опровергает: - операторские CLI-потоки - рутинное обслуживание подписок - устранение неисправностей -проверка перед запуском - развертывание рабочего стола
Основные команды оператора
Проверка снимка конфигурации
hermes teams-pipeline validate
Используйте эту команду после любых изменений конфигурации.
Проверка состояния токена
hermes teams-pipeline token-health
hermes teams-pipeline token-health --force-refresh
Используйте --force-refresh, если подозреваете, что режим аутентификации более открытый.
Проверка подписок
hermes teams-pipeline subscriptions
Продление подписки с одобренным сроком
hermes teams-pipeline maintain-subscriptions
hermes teams-pipeline maintain-subscriptions --dry-run
Автоматизация продления подписки (ОБЯЗАТЕЛЬНО для продакшена)
Подписки Microsoft Graph истекают максимум через 72 часа. Если их никто не продлевает, уведомления о собраниях бесшумно прекращаются через 3 дня, и конвейер выглядит «сломанным». Это базовая основа защиты сбоев для любого компонента на основе График.
Вы ОБЯЗАНЫ запустить «поддержание подписки» по расписанию. Выберите один из трех вариантов:
Вариант 1: Hermes cron (рекомендуется, если вы уже запускаете шлюз Hermes)
Гермес подключился к планировщику cron. Режим --no-agent запускает скрипт как задание (вместо использования LLM), --script должен быть в файле ~/.hermes/scripts/. Сначала создайте скрипт:
mkdir -p ~/.hermes/scripts
cat > ~/.hermes/scripts/maintain-teams-subscriptions.sh <<'EOF'
#!/usr/bin/env bash
exec hermes teams-pipeline maintain-subscriptions
EOF
chmod +x ~/.hermes/scripts/maintain-teams-subscriptions.sh
Затем зарегистрируйте задание cron только для скрипта, который запускает работу 12 часов (даёт 6-кратный запас на время 72-часового истечения окна):
hermes cron create "0 */12 * * *" \
--name "teams-pipeline-maintain-subscriptions" \
--no-agent \
--script maintain-teams-subscriptions.sh \
--deliver local
Проверьте, что оно зарегистрировано, и запишите время следующего запуска:
hermes cron list
hermes cron status # статус планировщика
Вариант 2: таймер systemd (рекомендуется для продакшен-развертывания в Linux)
Создайте /etc/systemd/system/hermes-teams-pipeline-maintain.service:
[Unit]
Description=Hermes Teams pipeline subscription maintenance
After=network-online.target
[Service]
Type=oneshot
User=hermes
EnvironmentFile=/etc/hermes/env
ExecStart=/usr/local/bin/hermes teams-pipeline maintain-subscriptions
И /etc/systemd/system/hermes-teams-pipeline-maintain.timer:
[Unit]
Description=Run Hermes Teams pipeline subscription maintenance every 12 hours
[Timer]
OnBootSec=5min
OnUnitActiveSec=12h
Persistent=true
[Install]
WantedBy=timers.target
Включите:
sudo systemctl daemon-reload
sudo systemctl enable --now hermes-teams-pipeline-maintain.timer
systemctl list-timers hermes-teams-pipeline-maintain.timer
Вариант 3: Обычный кронтаб
0 */12 * * * /usr/local/bin/hermes teams-pipeline maintain-subscriptions >> /var/log/hermes/teams-pipeline-maintain.log 2>&1
Убедитесь, что окружение cron содержит учетные данные MSGRAPH_*. Самый простой способ: подключить ~/.hermes/.env в начале скрипта-обертки, который вызывает crontab.
Проверка работы продления
После настройки расписания проверьте продление активности после первого запланированного запуска:
hermes teams-pipeline subscriptions # должно показывать, что expirationDateTime увеличилось
hermes teams-pipeline maintain-subscriptions --dry-run # должно показывать "0 expiring soon" большую часть времени
Если вы когда-нибудь заметите, что ваш график вебхука «перестал работать» ровно через ~72 часа, это первое, что нужно проверить: действительно ли запускалось продление задания?
Просмотр последних заданий
hermes teams-pipeline list
hermes teams-pipeline list --status failed
hermes teams-pipeline show <job-id>
Повторный запуск сохраненного задания
hermes teams-pipeline run <job-id>
Пробное получение документов
hermes teams-pipeline fetch --meeting-id <meeting-id>
hermes teams-pipeline fetch --join-web-url "<join-url>"
Рутинный Runbook
После первоначальной настройки
Выполните в указанном порядке:
hermes teams-pipeline validate
hermes teams-pipeline token-health --force-refresh
hermes teams-pipeline subscriptions
Затем инициируйте или дождитесь возникновения событий и подтвердите:
hermes teams-pipeline list
hermes teams-pipeline show <job-id>
Ежедневные или периодические проверки
- выполните
hermes teams-pipeline maintain-subscriptions --dry-run - проверьте
hermes teams-pipeline list --status failed - убедитесь, что целевой канал доставки Teams по-прежнему является правильным чатом или каналом
Перед изменением URL вебхуков или целевых каналов доставки
- обновите публичный URL уведомлений или конфигурацию целевого канала Teams
- выполните
hermes teams-pipeline validate - продлите или пересоздайте затронутые подписки
- подтвердите, что новые события попадают в ожидаемый приемник
Устранение неисправностей
Задания не создаются
Проверьте:
- включен ли msgraph_webhook
- указывает ли публичный URL уведомлений на /msgraph/webhook
- совпадает ли состояние клиента в подписке с MSGRAPH_WEBHOOK_CLIENT_STATE
- существуют ли подписки удаленно и не истекли ли они
Задания остаются в состоянии повторной попытки или завершаются ошибкой до обобщения
Проверьте:
- разрешения на расшифровку и доступность
- разрешения на запись и доступность артефактов
- доступность ffmpeg, если включен резервный вариант записи
- состояние токена Graph
Сводки созданы, но не доставлены в Teams
Проверьте:
- platforms.teams.enabled: true
- delivery_mode
- incoming_webhook_url для режима вебхука
- chat_id или team_id плюс channel_id для режима Graph
- конфигурацию аутентификации Teams, если используется отправка через Graph
Дублирующиеся или неожиданные повторные запуски
Проверьте:
- не запускали ли вы вручную задание с помощью hermes teams-pipeline run
- существует ли уже запись приемника для этого собрания
- не включили ли вы намеренно путь повторной отправки в локальной конфигурации
Контрольный список запуска
- [ ] Учетные данные Graph присутствуют и корректны
- [ ]
msgraph_webhookвключен и доступен из публичного интернета - [ ]
MSGRAPH_WEBHOOK_CLIENT_STATEустановлен и соответствует подпискам - [ ] Создана подписка на расшифровку
- [ ] Создана подписка на запись, если требуется резервный вариант STT
- [ ]
ffmpegустановлен, если включен резервный вариант записи - [ ] Целевой канал исходящей доставки Teams настроен и проверен
- [ ] Приемники Notion и Linear настроены только в случае реальной необходимости
- [ ]
hermes teams-pipeline validateвозвращает OK-снимок - [ ]
hermes teams-pipeline token-health --force-refreshвыполняется успешно - [ ]
maintain-subscriptionsзапланирован (Hermes cron, systemd timer или crontab — см. Автоматизация продления подписок). Без этого подписки Graph бесшумно истекают в течение 72 часов. - [ ] Реальное сквозное событие собрания создало сохраненное задание
- [ ] По крайней мере одна сводка достигла целевого приемника доставки
Руководство по выбору режима доставки
| Режим | Когда использовать | Компромисс |
|---|---|---|
incoming_webhook |
вам нужна только простая отправка в Teams | самая простая настройка, меньше контроля |
graph |
вам нужна отправка в канал или чат через Graph | больше контроля, больше настроек аутентификации и целевого канала |
Рабочая таблица оператора
Заполните перед развертыванием:
| Пункт | Значение |
|---|---|
| Публичный URL уведомлений | |
| Идентификатор клиента Graph (tenant ID) | |
| Идентификатор приложения Graph (client ID) | |
| Состояние клиента вебхука | |
| Подписка на ресурс расшифровки | |
| Подписка на ресурс записи | |
| Режим доставки Teams | |
| Идентификатор чата Teams или команды/канала | |
| Идентификатор базы данных Notion | |
| Идентификатор команды Linear | |
| Путь к хранилищу (если переопределен) | |
| Ответственный за ежедневные проверки |
Рабочая таблица проверки изменений
Используйте перед изменением развертывания:
| Вопрос | Ответ |
|---|---|
| Меняем ли мы публичный URL вебхука? | |
| Меняем ли мы учетные данные Graph? | |
| Меняем ли мы режим доставки Teams? | |
| Переходим ли мы на новый чат или канал Teams? | |
| Нужно ли пересоздать или продлить подписки? | |
| Нужен ли нам новый сквозной проверочный запуск? |