Актуальная версия переехала в официальный репозиторий примеров Yandex Cloud

Текст ниже описывает, как развернуть serverless-приложение, собирающее статистику диалогов в группах Telegram в clickhouse. Развернутое приложение доливает статистику непрерывано.

Пререквизиты

  1. Развернутый кластер yandex managed clickhouse с публичным доступом
  2. Python 3.11 на ноутбуке
  3. terraform v1.3.0 или выше на ноутбуке

Если вы испытываете проблемы с установкой или использованием terraform - изучите инструкцию в документации Яндекс Облака.

Notes

Здесь показано использование CH с публичным доступом. При наличии на облаке флага для запуска функций в VPC - можно все провернуть без публичного доступа, но мы сталкиваемся с ограничениями tf для функций. В итоге можно развернуть функцию tf-рецептом, а потом воткнуть ее в VPC уже через web ui.

В этом рецепте предполагается, что все действие происходит в одном фолдере - в том же самом, в котором развернут кликхаус. Это не какое-то принципиальное ограничение, просто так проще писать рецепт.

Готовим БД

  1. Создаем БД в кластере CH (или используем существующую)
  2. Заводим в CH пользователя с правами на нашу БД
  3. Креды пользователя (логин и пароль) складываем в lockbox-секрет в ключи user и pass
  4. Создаем в БД таблички по schema.sql

Разбираемся с телегой

  1. Создаем telegram app по инструкции - нам нужны api_id и api_hash

  2. Устанавливаем питонячьи зависимости на ноут: pip install -r ./src/requirements.txt

  3. Запускаем логин: python src/login.py с флагами:

    • --tg-api-id и --tg-api-hash - получаем от телеги в шаге 1
    • --yc-folder-id - id фолдера
    • --yc-oauth - OAuth-токен к облаку

    На этом этапе клиент телеги пытается в ней авторизоваться. Он интерактивно попросит все, что ему нужно - номер телефона (вводить через +7 для рф), код подтверждения, пароль (если настроена 2fa). В случае успеха скрипт напечатает secret id - идентификатор свежесозданного секрета в lockbox, в котором лежит все для авторизации в телеге. Этот идентификатор в дальнейшем потребуется для выбора групп для анализа и для настройки функции сбора аналитики.

  4. Выбираем группы, для которых хотим собирать статистику. Для этого запускаем python ./src/list_groups.py с флагами:

    • --yc-oauth - OAuth-токен к облаку
    • --tg-secret-id - id секрета, полученного на предыдущем шаге

    Скрипт печатает названия доступных групп и их числовые идентификаторы. Чтобы "рассказать" функции, какие группы нам нужно анализировать - нужно собрать числовые идентификаторы в строчку через запятые (без пробелов). Полученная строка потребуется на следующих шагах для настройки функции сбора аналитики.

  5. Инициализируем tf-проект: terraform init

  6. Строим план terraform plan -out plan.out, с флагами:

    • -var folder-id=<ID фолдера>
    • -var yc-token=<OAuth-токен облака>
    • -var ch-host=<FQDN хоста CH с публичным доступом>
    • -var ch-db-name=<Имя БД из шага 1 раздела "готовим БД">
    • -var dialog-ids=<Список id групп из шага 4>
    • -var tg-secret-id=<ID секрета из шага 3>
    • -var ch-secret-id=<ID секрета из шага 3 раздела "готовим БД">

    Смотрим план глазами, убеждаемся, что все ок (например, что tf не собирается ничего удалять)

  7. Применяем план terraform apply plan.out

При успешном развертывании данные начнут наливаться через 5-10 минут, и будут обновляться каждые 5 минут