Skip to content

Studio-Yandex-Practicum/Goodstart_telegram_bot

Repository files navigation

Goodstart_telegram_bot

Чат-бот в Телеграм для удобного и эффективного взаимодействия преподавателей и учеников онлайн школы. CMS для управления пользователями и расписанием.

Содержание

  1. ТЗ

    1.1. ER - диаграмма сущностей

    1.2. Схема работы бота (в разработке)

    1.3. BPMN диаграмма (кейс регистрации пользователя)

    1.4. BPMN диаграмма (кейс взаимодействия с преподавателем)

    1.5. BPMN диаграмма (кейс взаимодействия с учеником)

  2. Используемые технологий

  3. Правила работы с git

  4. Получение SSL сертификатов для разработки

  5. Конфигурация админ панели на основе django-admin-material

Используемые технологии:

Python 3.12 Poetry Pre-commit Python-telegram-bot 21.1.1 Django 5.0.4 Docker Postgres Redis

Правила работы с git:

  1. Основные ветки:
  • master - "продуктовая" версия кода.
  • dev — “предрелизная” ветка, в которой должен находиться рабочий и проверенный код.
  1. Создавая новую ветку, наследуйтесь от ветки dev:
    git checkout dev
    
    git checkout -b имя_новой_ветки
    
  2. Правила именования веток
    • разработка нового функционала:
      git checkout -b feature/название_функционала
      
    • ловля и исправление багов:
      git checkout -b bugfix/название_багфикса
      
  3. Прежде чем смержить ветку нового функционала/багфикса с веткой dev, запуште её в репозиторий и инициируйте Pull Request:
  • вкладка Pull requests репозитория на GitHub -> New pull request.
  • необходимо указать целевую ветку и исходную ветку для изменений.

Установка проекта на LINUX(на примере Ubuntu 22.04/WSL)

  1. Перейдите в свою директорию с проектами
cd ~/<path_to_dev_directory>

где <path_to_dev_directory> - название вашей директории с проектами. Либо, если у вас она расположена в ином месте, то пропишите необходимый путь

cd /path/to/dev/directory
  1. Клонируйте репозиторий с проектом
git clone [email protected]:Studio-Yandex-Practicum/Goodstart_telegram_bot.git
  1. Перейдите в домашнюю директорию
cd ~
  1. Необходимо проверить установленную версию Python.
python3 -V

Если у вас версия 3.12.*, то можно переходить к шагу 6.

  1. Если версия не 3.12.*, то необходимо её установить. Мы рекомендуем использовать pyenv, на его примере и рассмотрим установку дополнительной версии. Необходимо установить pyenv.
sudo apt update
curl https://pyenv.run | bash

Ожидайте окончания установки. Добавьте следующие строки в ваш файл ~/.bashrc (если вы используете Bash) или в ~/.zshrc (если вы используете Zsh). Если они там уже есть(или похожие), то можно пропустить шаг. Открыть файл

nano ~/.bashrc

Эти строки скопировать и добавить в конец файла

export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init --path)"

Эти строки должны работать в большинстве случаев, если же что-то пошло не так - почитайте документацию. Перезапустите ваш терминал, либо выполните команду в терминале(если используете bash)

source ~/.bashrc

чтобы изменения вступили в силу. Проверьте, что pyenv установлен правильно.

pyenv --version

Если терминал вывел в ответ 'pyenv 2.4.3'(цифры могут отличаться), то всё сделано верно. Теперь необходимо в pyenv установить нужную версию Python, например, 3.12.4

pyenv install 3.12.4

Проверяем, что нужная версия установлена

pyenv versions

Если терминал вывел список примерно такого содержания и в нём есть указанная ранее версия - всё сделано правильно.

* system (set by /home/user/.pyenv/version)
3.9.19
3.12.4
  1. Необходимо создать виртуальное окружение проекта. Перейдите в директорию проекта Goodstart.
cd ~/path/to/dir/Goodstart_telegram_bot

Если у вас была подходящая версия Python и вы пропустили шаг 5, то сразу приступайте к созданию окружения

pip install poetry
poetry shell
poetry install

Дождитесь окончания установки. Если всё прошло удачно, то ваш терминал будет ожидать ввод примерно с таким текстом '(poetry-goodstart-py3.12) user@pc:'

Если у вас не было подхлдящей версии Python и вы устанавливали pyenv, то назначьте локальную(для проекта) версию Python из pyenv

pyenv local 3.12.4

В корневой директории вашего проекта должен появиться файл '.python-version', в котором будет строка с версией. Теперь можно установить зависимости

pip install poetry
poetry shell
poetry install

Дождитесь окончания установки. Если всё прошло удачно, то ваш терминал будет ожидать ввод примерно с таким текстом '(poetry-goodstart-py3.12) user@pc:'

  1. Создайте файл с переменными окружения '.env' в корне проекта. Структура файла:
 # Название, логин и пароль для БД postgres
 POSTGRES_DB=postgres <-- это значение можно поменять
 POSTGRES_USER=postgres <-- это значение можно поменять
 POSTGRES_PASSWORD=postgres <-- это значение можно поменять
 DB_ENGINE=django.db.backends.postgresql_psycopg2
 # Данные для подключения к БД
 DB_HOST=localhost
 DB_PORT=5432

 # Переменные Django
 # Базовый URL
 BASE_URL=https://127.0.0.1:8000
 # ПРЕДУПРЕЖДЕНИЕ: Хранить секретный ключ не должен попадать в общий доступ
 SECRET_KEY=top_secret_key <-- это значение можно поменять
 # ПРЕДУПРЕЖДЕНИЕ: Debug = true использовать только при разработке
 DEBUG=false <-- это значение можно поменять
 # Список разрешенных хостов
 ALLOWED_HOSTS=localhost,127.0.0.1
 CSRF_TRUSTED_ORIGINS=https://yourdomain.org

 # Переменные бота
 # Токен для подключения к Telegram API
 TELEGRAM_TOKEN=<bot_token> <-- здесь должен быть ваш токен

 # Конфигурация superuser django
 DJANGO_SUPERUSER_USERNAME=admin <-- это значение можно поменять
 [email protected] <-- это значение можно поменять
 DJANGO_SUPERUSER_PASSWORD=admin <-- это значение можно поменять
 DJANGO_SUPERUSER_FIRSTNAME=Admin <-- это значение можно поменять
 DJANGO_SUPERUSER_LASTNAME=User <-- это значение можно поменять
 DJANGO_SUPERUSER_PHONE=+74950000000

 # Конфигурация почтового агента
 EMAIL_BACKEND=django.core.mail.backends.console.EmailBackend
 EMAIL_HOST=smtp.yandex.ru
 EMAIL_PORT=465
 # реквизиты для аутентификации в почтовом сервисе
 [email protected]
 EMAIL_PASSWORD=your_yandex_smtp_password
 # в настройках аккаунта откуда отправляется письмо подключите протокол IMAP
 # адрес по умолчанию для отправки вопросов от пользователей
 DEFAULT_EMAIL_ADDRESS=NOT_SET
 # Запустить бота
 RUN_BOT=false <-- для локального запуска значение должно быть false
  1. Pre-commit (инструмент автоматического запуска различных проверок перед выполнением коммита):
  • Убедиться, что pre-comit установлен:

    pre-commit  --version
    
  • Настроить git hook скрипт:

    pre-commit install
    

Далее при каждом коммите у вас будет происходить автоматическая проверка линтером, а так же будет происходить автоматическое приведение к единому стилю.

  1. Установите mkcert
sudo apt install mkcert

Дождитесь окончания установки. Проверьте:

mkcert --version

Если терминал ответил '1.4.3'(цифры могут отличаться), то всё сделано верно.

  1. Установите сертификаты. Из корневой директории проекта
make create-ssl

В ответе терминала, помимо прочего, должны быть строки

Created a new certificate valid for the following names 📜
- "localhost"
- "127.0.0.1"

The certificate is at "cert.pem" and the key at "key.pem" ✅

Также в директории Goodstart_telegram_bot/infra/dev/ должны появится файлы cert.pem и key.pem. Если всё так, то можно переходить к следующему шагу.

  1. Разверните проект. Из корневой директории проекта выполните команды
make start-db

Дождитесь сборки контейнера. Далее введите команду

make init-app

Дождитесь окончания всех процедур. Должны выполниться миграции и создаться superuser. Далее введите команду

make run-dev

Эта команда запустит сервис, в терминале должен быть примерно такой вывод

  export RUN_BOT=true; cd /home/user/dev/Goodstart_telegram_bot/src && poetry run uvicorn core.asgi_dev:application --reload --ssl-keyfile=../infra/dev/key.pem --ssl-certfile=../infra/dev/cert.pem --lifespan on
  INFO:     Will watch for changes in these directories: ['/home/user/dev/Goodstart_telegram_bot/src']
  INFO:     Uvicorn running on https://127.0.0.1:8000 (Press CTRL+C to quit)
  INFO:     Started reloader process [43863] using StatReload
  2024-06-25 22:29:32.964 | INFO     | bot.bot_interface:__init__:44 - Bot instance created.
  2024-06-25 22:29:32.965 | INFO     | bot.bot_interface:start:48 - Bot starting...
  2024-06-25 22:29:32.966 | INFO     | bot.bot_interface:_run:90 - Bot event loop created and started.
  2024-06-25 22:29:32.966 | INFO     | bot.bot_interface:start:52 - Bot started in a new thread.
  INFO:     Started server process [43867]
  INFO:     Waiting for application startup.
  INFO:     Application startup complete.
  /home/user/dev/Goodstart_telegram_bot/src/bot/bot_interface.py:120: PTBUserWarning: If 'per_message=False', 'CallbackQueryHandler' will not be tracked for every message. Read this FAQ entry to learn more about the per_* settings: https://github.com/python-telegram-bot/python-telegram-bot/wiki/Frequently-Asked-Questions#what-do-the-per_-settings-in-conversationhandler-do.
    return ConversationHandler
  2024-06-25 22:29:33.042 | INFO     | bot.bot_interface:_build_app:84 - Bot application built with handlers.
  2024-06-25 22:29:33.325 | INFO     | bot.bot_interface:_start_bot:104 - Bot is running.
  1. Проверьте работоспособность проекта. В браузере перейдите по адресу
https://localhost:8000/admin/

Если https зачёркнуто и слева предупреждение 'Не защищено', то в центре страницы нажмите кнопку 'Дополнительные', затем ниже 'Перейти на сайт localhost (небезопасно)'. После этого вы должны увидеть форму входа в админпанель, туда можно попасть, если ввести данные админа из файла .env

Проверьте работоспособность бота. Установите десктопную версию Telegram, в нём перейдите в бот, токен которого указали в файле .env. Нажмите START. Бот должен прислать приветственное сообщение, снизу должна появиться кнопка 'Открыть форму регистрации'. Кликните по ней. Если ранее у вас было предупреждение 'Не защищено', то в боте оно тоже будет. Снизу открывшегося окошка нажмите 'Дополнительные', затем 'Перейти на сайт localhost (небезопасно)'. Должна открыться форма регистрации.

Получение SSL сертификатов для разработки:

Для начала нужно убедиться, что в .env задана переменная BASE_URL=https://127.0.0.1:8000

  1. Установить mkcert. Для прльзователей Windows используется choco.
  2. Командой make create-ssl создать сертификаты.
  3. Теперь локальный сервер имеет доверенный сертификат и никаких ошибок и предупреждений о "мошеннических" действиях не появляется.
  4. Если Браузер ругается на сертификат (при этом серификат явно присутствует) выполнить mkcert -install, а затем снова п.2

Конфигурация админ панели на основе django-admin-material:

Cписок всех настроек.

MATERIAL_ADMIN_SITE = {
'HEADER': _('Your site header'), # Admin site header
'TITLE': _('Your site title'), # Admin site title
'FAVICON': 'path/to/favicon', # Admin site favicon (path to static should be specified)
'MAIN_BG_COLOR': 'color', # Admin site main color, css color should be specified
'MAIN_HOVER_COLOR': 'color', # Admin site main hover color, css color should be specified
'PROFILE_PICTURE': 'path/to/image', # Admin site profile picture (path to static should be specified)
'PROFILE_BG': 'path/to/image', # Admin site profile background (path to static should be specified)
'LOGIN_LOGO': 'path/to/image', # Admin site logo on login page (path to static should be specified)
'LOGOUT_BG': 'path/to/image', # Admin site background on login/logout pages (path to static should be specified)
'SHOW_THEMES': True, # Show default admin themes button
'TRAY_REVERSE': True, # Hide object-tools and additional-submit-line by default
'NAVBAR_REVERSE': True, # Hide side navbar by default
'SHOW_COUNTS': True, # Show instances counts for each model
'APP_ICONS': { # Set icons for applications(lowercase), including 3rd party apps, {'application_name': 'material_icon_name', ...}
'sites': 'send',
},
'MODEL_ICONS': { # Set icons for models(lowercase), including 3rd party models, {'model_name': 'material_icon_name', ...}
'site': 'contact_mail',
}
}

Вот тут подробно показаны: https://www.youtube.com/watch?v=_ifWi-a1z6M&ab_channel=AntonMaistrenko

Деплой на сервер

  1. Создать на сервере папку /home/username/Goodstart_telegram_bot
  2. В папку Goodstart_telegram_bot положить:
  • заполненый файл .env (см. .env.example)
  • файл docker-compose.dev.yaml
  • папку infra\dev (с сохранением иерархии)
  1. Запуск проекта
sudo docker compose -f docker-compose.dev.yaml up -d```
  1. Остановка контейнера
sudo docker compose -f docker-compose.dev.yaml down
  1. Создать суперпользователя
sudo docker compose -f docker-compose.dev.yaml exec backend export RUN_BOT=false
sudo docker compose -f docker-compose.dev.yaml exec backend python manage.py createsuperuser

Настройка CD

В настройках репозитория (settings->secrets and variables->Actions->Repository secrets) настроить все переменные из .env.example