Текст ниже описывает, как развернуть 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