{"id":25806131,"url":"https://github.com/yandex-cloud-examples/yc-serverless-telegram-stats","last_synced_at":"2026-03-12T05:31:36.522Z","repository":{"id":277793768,"uuid":"771714428","full_name":"yandex-cloud-examples/yc-serverless-telegram-stats","owner":"yandex-cloud-examples","description":"Развертывание Serverless приложения в Yandex Cloud для сбора статистики диалогов в группах Telegram. Приложение использует БД ClickHouse для своей работы.","archived":false,"fork":false,"pushed_at":"2025-02-16T06:04:25.000Z","size":37,"stargazers_count":2,"open_issues_count":1,"forks_count":1,"subscribers_count":6,"default_branch":"main","last_synced_at":"2025-04-02T08:51:13.858Z","etag":null,"topics":["clickhouse","python3","serverless","serverless-application","terraform","yandex-cloud","yandex-function","yandexcloud","yc-cli"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yandex-cloud-examples.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-03-13T20:11:20.000Z","updated_at":"2025-01-23T19:46:37.000Z","dependencies_parsed_at":"2025-02-16T07:28:08.202Z","dependency_job_id":null,"html_url":"https://github.com/yandex-cloud-examples/yc-serverless-telegram-stats","commit_stats":null,"previous_names":["yandex-cloud-examples/yc-serverless-telegram-stats"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/yandex-cloud-examples/yc-serverless-telegram-stats","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yandex-cloud-examples%2Fyc-serverless-telegram-stats","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yandex-cloud-examples%2Fyc-serverless-telegram-stats/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yandex-cloud-examples%2Fyc-serverless-telegram-stats/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yandex-cloud-examples%2Fyc-serverless-telegram-stats/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yandex-cloud-examples","download_url":"https://codeload.github.com/yandex-cloud-examples/yc-serverless-telegram-stats/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yandex-cloud-examples%2Fyc-serverless-telegram-stats/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30416310,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-12T04:41:02.746Z","status":"ssl_error","status_checked_at":"2026-03-12T04:40:12.571Z","response_time":114,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["clickhouse","python3","serverless","serverless-application","terraform","yandex-cloud","yandex-function","yandexcloud","yc-cli"],"created_at":"2025-02-27T19:59:38.498Z","updated_at":"2026-03-12T05:31:36.496Z","avatar_url":"https://github.com/yandex-cloud-examples.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"Текст ниже описывает, как развернуть serverless-приложение, собирающее статистику диалогов\nв группах Telegram в clickhouse в двух моделях. Развернутое приложение доливает статистику непрерывано. \n\n# Пререквизиты\n1. Консольный [клиент Yandex Cloud](https://cloud.yandex.com/en-ru/docs/cli/quickstart)\n2. Python 3.11\n3. terraform v1.3.0 или выше\n\n_Если вы испытываете проблемы с установкой или использованием terraform - изучите [инструкцию](https://cloud.yandex.ru/docs/tutorials/infrastructure-management/terraform-quickstart) в документации Яндекс Облака._\n\n_Самостоятельная загрузка terraform_\n```\nwget \"https://hashicorp-releases.yandexcloud.net/terraform/1.5.1/terraform_1.5.1_linux_amd64.zip\"\nunzip terraform_1.5.1_linux_amd64.zip\nsudo mv ~/terraform /usr/local/bin/\n```\nи делаем настройки описанные [тут](https://cloud.yandex.ru/docs/tutorials/infrastructure-management/terraform-quickstart#configure-provider)\n\n_Все переменные terraform можно передавать в явном виде, либо заранее определять переменные вида `TF_VAR_\u003cNAME\u003e`, где NAME - имя переменной_\n\n# Notes\nЗдесь показано использование CH с публичным доступом. При наличии на облаке [флага](https://cloud.yandex.ru/docs/functions/concepts/networking#polzovatelskaya-set) для запуска функций в VPC - можно все провернуть без публичного доступа, но мы сталкиваемся с ограничениями tf для функций.\nВ итоге можно развернуть функцию tf-рецептом, а потом воткнуть ее в VPC уже через web ui.\n\nВ этом рецепте предполагается, что все действие происходит в одном фолдере - в том же самом, в котором развернут кликхаус. Это не какое-то принципиальное ограничение, просто так проще писать рецепт.\n\nВсе чувствительные данные, которые нужны на вход скриптам / терраформу будут прокидываться через переменные окружения, их можно выставить так (с пробелом в начале): ` export SENSITIVE_VAR=value`, чтобы не записывать их в историю командной строки.\n\n# Генерируем секреты и выставляем переменные\n1. Устанавливаем зависимости python: `pip install -r ./src/requirements.txt`\n2. Создаем telegram app по [инструкции](https://core.telegram.org/api/obtaining_api_id#obtaining-api-id) - нам нужны api_id и api_hash, выставляем их значения в переменные `TG_API_ID` и `TG_API_HASH`\n3. Выставляем OAuth-токен в переменную окружения `YC_TOKEN`. [Как получить OAuth токен](https://cloud.yandex.ru/docs/iam/concepts/authorization/oauth-token)\n4. Запускаем скрипт с генерацией всех секретов: `python3 secrets/create_secrets.py --yc-folder-id \u003cID фолдера\u003e`. Теперь api_id, api_hash, сессия telegram, пароль от clickhouse и ключ для вебхука telegram хранятся в секретах lockbox. В явном виде доставать их можно через UI или консольный клиент Yandex Cloud. На этом этапе клиент телеги пытается в ней авторизоваться. Он интерактивно попросит все, что ему нужно - номер телефона (вводить через +7 для рф), код подтверждения, пароль (если настроена 2fa). Доставать секреты можно с помощью скрипта `get_secret_payload.py`\n5. Выставляем id созданных секретов в переменные окружения `TF_VAR_CH_SECRET_ID` и `TF_VAR_TG_SECRET_ID`\n6. Выставляем пароль кликхауса в переменную окружения: `export TF_VAR_CH_PASSWORD=$(python3 secrets/get_lockbox_payload.py --secret-id $TF_VAR_CH_SECRET_ID --key ch_cluster_password)`\n7. Регистрируем telegram бота по [инструкции](https://core.telegram.org/bots/tutorial)\n8. Помещаем токен бота в переменную окружения `TG_BOT_API_TOKEN`\n9. Выставляем переменную окружения с ключом для вебхука телеграм-бота: `export TG_WEBHOOK_KEY=$(python3 secrets/get_lockbox_payload.py --secret-id $TF_VAR_TG_SECRET_ID --key tg-webhook-key)` \n\n# Выбираем чаты\n1. Выбираем группы, для которых хотим собирать статистику. Для этого запускаем скрипт: `python3 src/list_groups.py --tg-secret-id $TF_VAR_TG_SECRET_ID`\n2. Определяем `TF_VAR_DIALOG_IDS` - id чатов, с которых можно собирать статистику, указанные через запятую: `export TF_VAR_DIALOG_IDS=\u003cCHAT_ID_0\u003e,\u003cCHAT_ID_1\u003e,\u003cCHAT_ID_2\u003e,...`\n\n# Создаем БД в кластере CH (директория clickhouse)\n1. Инициализируем terraform: `terraform init`\n2. Применяем спецификацию: `terraform apply -var \"folder_id=\u003cID фолдера\u003e\"` \n3. Определяем переменные окружения `TF_VAR_CH_HOST`, `TF_VAR_CH_USER_NAME`, `TF_VAR_CH_DB_NAME`\n4. Создаём нужные таблицы: `./create_tables.sh`\n5. Проверяем, что таблицы создались: `./select_message_count.sh` - должен вывестись `0`, как количество записей в таблице сообщений\n\n# Подключаем datalens к clickhouse\n1. Заходим в маркетплейс datalens, находим [шаблон проекта](http://datalens.yandex.ru/marketplace/f2ee0o8n467tk2avv39n) и нажимаем \"Развернуть\" \n2. Заходим в подключения и вводим имя хоста, имя пользователя и пароль к clickhouse из предыдущих шагов и сохраняем изменения\n3. Теперь можно смотреть на датасет, чарты и дашборд с данными из clickhouse\n\n# Разворачиваем модель pull (директория pull)\n1. Инициализируем terraform: `terraform init`\n2. Применяем спецификацию: `terraform apply -var \"folder_id=\u003cID фолдера\u003e\"`\n\n# Разворачиваем модель push (директория push)\n1. Инициализируем terraform: `terraform init`\n2. Применяем спецификацию: `terraform apply -var \"folder_id=\u003cID фолдера\u003e\"`\n3. Определяем переменную окружения `APIGW_URL` со значением из предыдущего шага\n4. Подписываемся на вебхук: `./set_webhook.sh`\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyandex-cloud-examples%2Fyc-serverless-telegram-stats","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyandex-cloud-examples%2Fyc-serverless-telegram-stats","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyandex-cloud-examples%2Fyc-serverless-telegram-stats/lists"}