Текст ниже описывает, как развернуть serverless-приложение, собирающее статистику диалогов в группах Telegram в clickhouse в двух моделях. Развернутое приложение доливает статистику непрерывано.
- Консольный клиент Yandex Cloud
- Python 3.11
- terraform v1.3.0 или выше
Если вы испытываете проблемы с установкой или использованием terraform - изучите инструкцию в документации Яндекс Облака.
Самостоятельная загрузка 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/
и делаем настройки описанные тут
Все переменные terraform можно передавать в явном виде, либо заранее определять переменные вида TF_VAR_<NAME>, где NAME - имя переменной
Здесь показано использование CH с публичным доступом. При наличии на облаке флага для запуска функций в VPC - можно все провернуть без публичного доступа, но мы сталкиваемся с ограничениями tf для функций. В итоге можно развернуть функцию tf-рецептом, а потом воткнуть ее в VPC уже через web ui.
В этом рецепте предполагается, что все действие происходит в одном фолдере - в том же самом, в котором развернут кликхаус. Это не какое-то принципиальное ограничение, просто так проще писать рецепт.
Все чувствительные данные, которые нужны на вход скриптам / терраформу будут прокидываться через переменные окружения, их можно выставить так (с пробелом в начале): export SENSITIVE_VAR=value, чтобы не записывать их в историю командной строки.
- Устанавливаем зависимости python:
pip install -r ./src/requirements.txt - Создаем telegram app по инструкции - нам нужны api_id и api_hash, выставляем их значения в переменные
TG_API_IDиTG_API_HASH - Выставляем OAuth-токен в переменную окружения
YC_TOKEN. Как получить OAuth токен - Запускаем скрипт с генерацией всех секретов:
python3 secrets/create_secrets.py --yc-folder-id <ID фолдера>. Теперь api_id, api_hash, сессия telegram, пароль от clickhouse и ключ для вебхука telegram хранятся в секретах lockbox. В явном виде доставать их можно через UI или консольный клиент Yandex Cloud. На этом этапе клиент телеги пытается в ней авторизоваться. Он интерактивно попросит все, что ему нужно - номер телефона (вводить через +7 для рф), код подтверждения, пароль (если настроена 2fa). Доставать секреты можно с помощью скриптаget_secret_payload.py - Выставляем id созданных секретов в переменные окружения
TF_VAR_CH_SECRET_IDиTF_VAR_TG_SECRET_ID - Выставляем пароль кликхауса в переменную окружения:
export TF_VAR_CH_PASSWORD=$(python3 secrets/get_lockbox_payload.py --secret-id $TF_VAR_CH_SECRET_ID --key ch_cluster_password) - Регистрируем telegram бота по инструкции
- Помещаем токен бота в переменную окружения
TG_BOT_API_TOKEN - Выставляем переменную окружения с ключом для вебхука телеграм-бота:
export TG_WEBHOOK_KEY=$(python3 secrets/get_lockbox_payload.py --secret-id $TF_VAR_TG_SECRET_ID --key tg-webhook-key)
- Выбираем группы, для которых хотим собирать статистику. Для этого запускаем скрипт:
python3 src/list_groups.py --tg-secret-id $TF_VAR_TG_SECRET_ID - Определяем
TF_VAR_DIALOG_IDS- id чатов, с которых можно собирать статистику, указанные через запятую:export TF_VAR_DIALOG_IDS=<CHAT_ID_0>,<CHAT_ID_1>,<CHAT_ID_2>,...
- Инициализируем terraform:
terraform init - Применяем спецификацию:
terraform apply -var "folder_id=<ID фолдера>" - Определяем переменные окружения
TF_VAR_CH_HOST,TF_VAR_CH_USER_NAME,TF_VAR_CH_DB_NAME - Создаём нужные таблицы:
./create_tables.sh - Проверяем, что таблицы создались:
./select_message_count.sh- должен вывестись0, как количество записей в таблице сообщений
- Заходим в маркетплейс datalens, находим шаблон проекта и нажимаем "Развернуть"
- Заходим в подключения и вводим имя хоста, имя пользователя и пароль к clickhouse из предыдущих шагов и сохраняем изменения
- Теперь можно смотреть на датасет, чарты и дашборд с данными из clickhouse
- Инициализируем terraform:
terraform init - Применяем спецификацию:
terraform apply -var "folder_id=<ID фолдера>"
- Инициализируем terraform:
terraform init - Применяем спецификацию:
terraform apply -var "folder_id=<ID фолдера>" - Определяем переменную окружения
APIGW_URLсо значением из предыдущего шага - Подписываемся на вебхук:
./set_webhook.sh