Бот для «Московской школы профессиональной филантропии». Позволяет НКО оперативно получать информацию о новых заявках в волонтёры в качестве наставников для детей-сирот.
Развернуть
Языки программирования, библиотеки и модули:
Фреймворк, расширения и библиотеки:
База данных:
CI/CD:
Облачные технологии:
Бот позволяет оформить онлайн-заявление:
- в волонтёры-наставники для детей-сирот в фондах проекта ЗНАЧИМ
- на включение местного фонда в проект ЗНАЧИМ
Удобно использовать принцип copy-paste - копировать команды из GitHub Readme и вставлять в командную строку Git Bash или IDE (например VSCode).
Развернуть
Предполагается, что пользователь:
- создал бота.
- создал сервисный аккаунт на платформе Google Cloud и получил JSON-файл с информацией о своем сервисном аккаунте, его приватный ключ, ID и ссылки для авторизации. Эти данные будет необходимо указать в файле переменных окружения.
- создал аккаунт DockerHub, если запуск будет производиться на удаленном сервере.
- установил Docker и Docker Compose на локальной машине или на удаленном сервере, где проект будет запускаться в контейнерах. Проверить наличие можно выполнив команды:
docker --version && docker-compose --version
Локальный запуск
!!! Для пользователей Windows обязательно выполнить команду: иначе файл start.sh при клонировании будет бракован:
git config --global core.autocrlf false
-
Установите ngrok.
-
Активируйте тоннель для https соединения командой:
ngrok http 80
В поле Forwarding
первым элементом будет указано значение вида https://ebd6-188-170-76-51.ngrok-free.app
- его потребуется указать в новом .env-файле в переменной окружения DOMAIN
(можно как с протоколом https://
, так и без него), (см. п.4).
-
Не закрывайте окно терминала, иначе ngrok-тоннель также закроется. Откройте новое окно bash-терминала, в нем продолжим дальнейшую установку и запуск бота.
-
Клонируйте репозиторий с GitHub и в .env-файле введите данные для переменных окружения (значения даны для примера, но их можно оставить; подсказки даны в комментариях):
git clone https://github.com/alexpro2022/Telegram-Bot-for-MSPP.git && \
cd Telegram-Bot-for-MSPP && \
cp .env_example .env && \
nano .env
Для работы бота необходимо задать значения минимум трем переменным окружения: TELEGRAM_BOT_TOKEN
, DOMAIN
, WEBHOOK_MODE
.
По умолчанию режим работы бота - polling
. Этот режим удобен для первоначальной отладки бота, но в дальнейшем придется перейти на режим работы - webhook
. Для этого задайте значение:
WEBHOOK_MODE=True
- Запуск - из корневой директории проекта выполните команду:
docker compose -f infra/local/docker-compose.yml up -d --build
Проект будет развернут в трех docker-контейнерах (db, web, nginx) по адресу http://localhost
.
- Остановить docker и удалить контейнеры можно командой из корневой директории проекта:
docker compose -f infra/local/docker-compose.yml down
Если также необходимо удалить тома базы данных и статики:
docker compose -f infra/local/docker-compose.yml down -v
При повторных запусках приложения может потребоваться реактивация ngrok-тоннеля и обновление переменной окружения DOMAIN
(см. п.2)
Запуск на удаленном сервере
-
Создайте домен и привяжите его к публичному IP-адресу вашего удаленного сервера (введите его в поле current ip и кликните кнопку update ip).
-
Сделайте форк в свой репозиторий.
-
Создайте
Actions.Secrets
согласно списку ниже (значения указаны для примера) + переменные окружения изenv_example
файла:
PROJECT_NAME=mspp-bot
SECRET_KEY
DOCKERHUB_USERNAME
DOCKERHUB_PASSWORD
# Данные удаленного сервера и ssh-подключения:
HOST # публичный IP-адрес вашего удаленного сервера
USERNAME
SSH_KEY
PASSPHRASE
DOMAIN=mspp-bot.duckdns.org # созданный домен
# Учетные данные Телеграм-бота для получения сообщения о успешном завершении workflow:
TELEGRAM_USER_ID
TELEGRAM_BOT_TOKEN
# База данных:
DB_ENGINE=django.db.backends.postgresql
DB_HOST=db
DB_NAME=postgres
DB_PORT=5432
POSTGRES_USER=postgres
POSTGRES_PASSWORD=12345
- Запустите вручную
workflow
, чтобы автоматически развернуть проект в трех docker-контейнерах (db, web, nginx) на удаленном сервере.
При первом запуске будут автоматически произведены следующие действия:
- выполнены миграции БД
- БД заполнена начальными данными
- создан суперюзер (пользователь с правами админа) с учетными данными из переменных окружения
DJANGO_SUPERUSER_USERNAME
,DJANGO_SUPERUSER_EMAIL
,DJANGO_SUPERUSER_PASSWORD
. - собрана статика
Вход в админ-зону осуществляется по адресу: http://hostname
/admin/ , где hostname
:
localhost
- Доменное имя удаленного сервера, например
mspp-bot.duckdns.org
Для удаления проекта выполните команду:
cd .. && rm -fr Telegram-Bot-for-MSPP
- написал приложение registration для отображения форм регистрации нового наставника и нового фонда, использовал HTML, CSS для отображения форм в Telegram WebApp и JavaScript для real-time валидации полей форм.
- подключил doker-образ SWAG для получения SSL-сертификата (https соединение для webapp и webhook)
- переписал функционал обработчиков беседы бота и навигации (KISS, DRY, YAGNI)
- добавил дружественный интерфейс (эмоджи) и персонифицировал беседу (бот обрашается к пользователю по нику)
- реализовал вывод информации только для фондов, представленных в регионе/городе (а не всех фондов вообще)
- написал алгоритм меню для случая, если фонды одновременно могут быть и в регионе и в городах региона (хотя сама идея регионального фонда без привязки к населенному пункту выглядит спорно, но это в ТЗ)
- сделал пагинацию меню (меню регинов состоит из нескольких страниц по 5 регионов на каждой)
- реализовал отправку данных из форм в Google-таблицы после подверждения в меню confirmation из которого можно либо вернуться к повторному заполнению формы, если обнаружена некорректность в данных, либо отправить корректные данные в соответствующую таблицу (наставников или фондов).