Актуальная версия переехала в официальный репозиторий примеров Yandex Cloud
Текст ниже описывает, как развернуть serverless-приложение, собирающее статистику диалогов в группах Telegram в clickhouse. Развернутое приложение доливает статистику непрерывано.
- Развернутый кластер yandex managed clickhouse с публичным доступом
- Python 3.11 на ноутбуке
- terraform v1.3.0 или выше на ноутбуке
Если вы испытываете проблемы с установкой или использованием terraform - изучите инструкцию в документации Яндекс Облака.
Здесь показано использование CH с публичным доступом. При наличии на облаке флага для запуска функций в VPC - можно все провернуть без публичного доступа, но мы сталкиваемся с ограничениями tf для функций. В итоге можно развернуть функцию tf-рецептом, а потом воткнуть ее в VPC уже через web ui.
В этом рецепте предполагается, что все действие происходит в одном фолдере - в том же самом, в котором развернут кликхаус. Это не какое-то принципиальное ограничение, просто так проще писать рецепт.
- Создаем БД в кластере CH (или используем существующую)
- Заводим в CH пользователя с правами на нашу БД
- Креды пользователя (логин и пароль) складываем в lockbox-секрет в ключи
user
иpass
- Создаем в БД таблички по
schema.sql
-
Создаем telegram app по инструкции - нам нужны api_id и api_hash
-
Устанавливаем питонячьи зависимости на ноут:
pip install -r ./src/requirements.txt
-
Запускаем логин:
python src/login.py
с флагами:--tg-api-id
и--tg-api-hash
- получаем от телеги в шаге 1--yc-folder-id
- id фолдера--yc-oauth
- OAuth-токен к облаку
На этом этапе клиент телеги пытается в ней авторизоваться. Он интерактивно попросит все, что ему нужно - номер телефона (вводить через +7 для рф), код подтверждения, пароль (если настроена 2fa). В случае успеха скрипт напечатает
secret id
- идентификатор свежесозданного секрета в lockbox, в котором лежит все для авторизации в телеге. Этот идентификатор в дальнейшем потребуется для выбора групп для анализа и для настройки функции сбора аналитики. -
Выбираем группы, для которых хотим собирать статистику. Для этого запускаем
python ./src/list_groups.py
с флагами:--yc-oauth
- OAuth-токен к облаку--tg-secret-id
- id секрета, полученного на предыдущем шаге
Скрипт печатает названия доступных групп и их числовые идентификаторы. Чтобы "рассказать" функции, какие группы нам нужно анализировать - нужно собрать числовые идентификаторы в строчку через запятые (без пробелов). Полученная строка потребуется на следующих шагах для настройки функции сбора аналитики.
-
Инициализируем tf-проект:
terraform init
-
Строим план
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 не собирается ничего удалять)
-
Применяем план
terraform apply plan.out
При успешном развертывании данные начнут наливаться через 5-10 минут, и будут обновляться каждые 5 минут