https://github.com/yandex-cloud-examples/yc-serverless-telegram-stats
Развертывание Serverless приложения в Yandex Cloud для сбора статистики диалогов в группах Telegram. Приложение использует БД ClickHouse для своей работы.
https://github.com/yandex-cloud-examples/yc-serverless-telegram-stats
clickhouse python3 serverless serverless-application terraform yandex-cloud yandex-function yandexcloud yc-cli
Last synced: 7 months ago
JSON representation
Развертывание Serverless приложения в Yandex Cloud для сбора статистики диалогов в группах Telegram. Приложение использует БД ClickHouse для своей работы.
- Host: GitHub
- URL: https://github.com/yandex-cloud-examples/yc-serverless-telegram-stats
- Owner: yandex-cloud-examples
- License: apache-2.0
- Created: 2024-03-13T20:11:20.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2025-02-16T06:04:25.000Z (8 months ago)
- Last Synced: 2025-02-16T07:17:58.075Z (8 months ago)
- Topics: clickhouse, python3, serverless, serverless-application, terraform, yandex-cloud, yandex-function, yandexcloud, yc-cli
- Language: Python
- Homepage:
- Size: 36.1 KB
- Stars: 2
- Watchers: 6
- Forks: 1
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
Текст ниже описывает, как развернуть serverless-приложение, собирающее статистику диалогов
в группах Telegram в clickhouse в двух моделях. Развернутое приложение доливает статистику непрерывано.# Пререквизиты
1. Консольный [клиент Yandex Cloud](https://cloud.yandex.com/en-ru/docs/cli/quickstart)
2. Python 3.11
3. terraform v1.3.0 или выше_Если вы испытываете проблемы с установкой или использованием terraform - изучите [инструкцию](https://cloud.yandex.ru/docs/tutorials/infrastructure-management/terraform-quickstart) в документации Яндекс Облака._
_Самостоятельная загрузка terraform_
```
wget "https://hashicorp-releases.yandexcloud.net/terraform/1.5.1/terraform_1.5.1_linux_amd64.zip"
unzip terraform_1.5.1_linux_amd64.zip
sudo mv ~/terraform /usr/local/bin/
```
и делаем настройки описанные [тут](https://cloud.yandex.ru/docs/tutorials/infrastructure-management/terraform-quickstart#configure-provider)_Все переменные terraform можно передавать в явном виде, либо заранее определять переменные вида `TF_VAR_`, где NAME - имя переменной_
# Notes
Здесь показано использование CH с публичным доступом. При наличии на облаке [флага](https://cloud.yandex.ru/docs/functions/concepts/networking#polzovatelskaya-set) для запуска функций в VPC - можно все провернуть без публичного доступа, но мы сталкиваемся с ограничениями tf для функций.
В итоге можно развернуть функцию tf-рецептом, а потом воткнуть ее в VPC уже через web ui.В этом рецепте предполагается, что все действие происходит в одном фолдере - в том же самом, в котором развернут кликхаус. Это не какое-то принципиальное ограничение, просто так проще писать рецепт.
Все чувствительные данные, которые нужны на вход скриптам / терраформу будут прокидываться через переменные окружения, их можно выставить так (с пробелом в начале): ` export SENSITIVE_VAR=value`, чтобы не записывать их в историю командной строки.
# Генерируем секреты и выставляем переменные
1. Устанавливаем зависимости python: `pip install -r ./src/requirements.txt`
2. Создаем telegram app по [инструкции](https://core.telegram.org/api/obtaining_api_id#obtaining-api-id) - нам нужны api_id и api_hash, выставляем их значения в переменные `TG_API_ID` и `TG_API_HASH`
3. Выставляем OAuth-токен в переменную окружения `YC_TOKEN`. [Как получить OAuth токен](https://cloud.yandex.ru/docs/iam/concepts/authorization/oauth-token)
4. Запускаем скрипт с генерацией всех секретов: `python3 secrets/create_secrets.py --yc-folder-id `. Теперь api_id, api_hash, сессия telegram, пароль от clickhouse и ключ для вебхука telegram хранятся в секретах lockbox. В явном виде доставать их можно через UI или консольный клиент Yandex Cloud. На этом этапе клиент телеги пытается в ней авторизоваться. Он интерактивно попросит все, что ему нужно - номер телефона (вводить через +7 для рф), код подтверждения, пароль (если настроена 2fa). Доставать секреты можно с помощью скрипта `get_secret_payload.py`
5. Выставляем id созданных секретов в переменные окружения `TF_VAR_CH_SECRET_ID` и `TF_VAR_TG_SECRET_ID`
6. Выставляем пароль кликхауса в переменную окружения: `export TF_VAR_CH_PASSWORD=$(python3 secrets/get_lockbox_payload.py --secret-id $TF_VAR_CH_SECRET_ID --key ch_cluster_password)`
7. Регистрируем telegram бота по [инструкции](https://core.telegram.org/bots/tutorial)
8. Помещаем токен бота в переменную окружения `TG_BOT_API_TOKEN`
9. Выставляем переменную окружения с ключом для вебхука телеграм-бота: `export TG_WEBHOOK_KEY=$(python3 secrets/get_lockbox_payload.py --secret-id $TF_VAR_TG_SECRET_ID --key tg-webhook-key)`# Выбираем чаты
1. Выбираем группы, для которых хотим собирать статистику. Для этого запускаем скрипт: `python3 src/list_groups.py --tg-secret-id $TF_VAR_TG_SECRET_ID`
2. Определяем `TF_VAR_DIALOG_IDS` - id чатов, с которых можно собирать статистику, указанные через запятую: `export TF_VAR_DIALOG_IDS=,,,...`# Создаем БД в кластере CH (директория clickhouse)
1. Инициализируем terraform: `terraform init`
2. Применяем спецификацию: `terraform apply -var "folder_id="`
3. Определяем переменные окружения `TF_VAR_CH_HOST`, `TF_VAR_CH_USER_NAME`, `TF_VAR_CH_DB_NAME`
4. Создаём нужные таблицы: `./create_tables.sh`
5. Проверяем, что таблицы создались: `./select_message_count.sh` - должен вывестись `0`, как количество записей в таблице сообщений# Подключаем datalens к clickhouse
1. Заходим в маркетплейс datalens, находим [шаблон проекта](http://datalens.yandex.ru/marketplace/f2ee0o8n467tk2avv39n) и нажимаем "Развернуть"
2. Заходим в подключения и вводим имя хоста, имя пользователя и пароль к clickhouse из предыдущих шагов и сохраняем изменения
3. Теперь можно смотреть на датасет, чарты и дашборд с данными из clickhouse# Разворачиваем модель pull (директория pull)
1. Инициализируем terraform: `terraform init`
2. Применяем спецификацию: `terraform apply -var "folder_id="`# Разворачиваем модель push (директория push)
1. Инициализируем terraform: `terraform init`
2. Применяем спецификацию: `terraform apply -var "folder_id="`
3. Определяем переменную окружения `APIGW_URL` со значением из предыдущего шага
4. Подписываемся на вебхук: `./set_webhook.sh`