Телеграм бот для упрощения процесса по сбору заявок на самомывоз и доставку готовых обедов.
Бот работает по умолчанию в режиме webhook. Сменить режим на polling возможно, прописав переменные в .env файлах. Для режима webhook телеграм требует свой домен с выпущенным ssl сертификатом (подробнее расписано на https://core.telegram.org/bots/webhooks).
Данный проект является проверкой полученных знаний и писался во время прохождения Яндекс Практикума, в то же время создавался для решения конкретной задачи и был внедрен в бизнес-процессы реальной компании. Возможно содержит ошибки в логике программы и исполняемом коде.
- Регистрация пользователя через telegram с добавлением в БД
- База для хранения данных django - postgresql, для хранения состояний aiogram - redis
- Администрирование через telegram или админку django
- примерная логика работы бота и схема БД тут (xmind): https://disk.yandex.ru/d/f0JdQp4kFanXIQ
- Добавление блюд (Название, описание, фото/без фото)
- Составление меню на определенный день (добавление блюд в меню)
- Удаление/исправление блюд и меню
- Рассылка меню на конкретную дату пользователям
- Выгрузка списка заказов на выборанную дату в csv-файле
- Ежедневное напоминание о заполнении меню
- Регистрация (имя, фамилия, телефон)
- Форма заказа (количество порций, доставка/самовывоз, форма оплаты и т.д.)
- Возможность согласиться, отказаться от заказа на конкретную дату
Предполагается, что есть готовый настроенный vps сервер с установленным docker, docker-compose и nginx.
- Перейти в каталог sites-available
cd /etc/nginx/sites-available/
- Создать файл с именем вашего домена
nano example.com
- Внутри написать
server {
listen 80;
server_name example.com;
location /static/ {
# Абсолютный до каталога с django_files
root /var/www/aiogram-food-bot/django_files/;
}
location /media/ {
# Абсолютный до каталога с django_files
root /var/www/aiogram-food-bot/django_files/;
}
location /api/ {
allow 127.0.0.1;
deny all;
}
location /webhook/main/ {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://127.0.0.1:7771;
}
location / {
include proxy_params;
proxy_pass http://127.0.0.1:8000;
}
}
- Создать ярлык в каталоге sites-enabled
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
- Проверить что нет ошибок в конфигурации nginx
sudo nginx -t
- Перезапустить службу nginx
sudo systemctl restart nginx
- Установить https соединение, выпустив ssl сертификат с помощью certbot для вашего домена
sudo certbot --nginx
- Cкопировать этот гит на сервер любым удобным способом
- Создать .env файл в /backend со следующим содержанием:
SECRET_KEY=<секретный_ключ_django>
IS_POSTGRES_DB=True
DB_ENGINE=django.db.backends.postgresql
DB_NAME=postgres
POSTGRES_USER=<ваше_имя_пользователя>
POSTGRES_PASSWORD=<ваш_пароль>
DB_HOST=db
DB_PORT=5432
- Создать .env файл в /bot со следующим содержанием:
TELEGRAM_TOKEN=<токен_телеграм_бота>
USERS_URL=http://web:8000/api/users/
DISHES_URL=http://web:8000/api/dishes/
MENUS_URL=http://web:8000/api/menus/
ORDERS_URL=http://web:8000/api/orders/
ADMIN_IDS=<ваш_id_телеграм>
IS_REDIS_STORAGE=True
IS_WEBHOOK=True
REDIS_DSN=redis://redis:6379/0
BASE_URL=https://<ваш_домен>.<доменная_зона>
WEB_SERVER_HOST = "0.0.0.0"
WEB_SERVER_PORT = 7771
WEBHOOK_PATH = "/webhook/main/"
- В django, файле settings.py добавить ваш домен в ALLOWED_HOSTS в формате example.com и CSRF_TRUSTED_ORIGINS в формате https://example.com
- Изменить права доступа к каталогу, если нужно(nginx использует по умолчанию пользователя www-data)
- Удалить файл .gitkeep из папки postgres (postgres ругается, если каталог не пустой)
- Запустить установку из файла docker-compose.
sudo docker-compose up -d --build
- Сделать миграции в базе данных
sudo docker-compose exec backend python manage.py migrate
- Создать суперпользователя
sudo docker-compose exec backend python manage.py createsuperuser
- Скопировать файлы статики
sudo docker-compose exec backend python manage.py collectstatic
Нижеприведенная инструкция написана не совсем корректно, как и, возможно, вышеприведенная. Когда-нибудь я ее перепишу, а пока записал видос с запуском на локалке в винде. https://www.youtube.com/watch?v=SzVwEmaOzYA
в файле ./bot/.env переменную IS_WEBHOOK заменить на False или 0
IS_WEBHOOK=True
- Запустить виртуальное окружение, установить зависимости из . /bot/requirements.txt и ./backend/requirements.txt
- Перевести бота в режим polling
- В файле ./backend/.env заменить базу данных на sqlite3:
IS_POSTGRES_DB=False
- В файле ./bot/.env заменить хранилище redis на оперативную память:
IS_REDIS_STORAGE=False
-
В файле ./backend/tgbot/settings.py
-
Запустить локальный сервер из каталога ./backend командой
python manage.py runserver
-
В ./bot/.env файле для переменных USERS_URL, DISHES_URL, MENUS_URL, ORDERS_URL заменить значения
http://web:8000
на соответствующиеhttp://127.0.0.1:8000
-
Запустить .bot/main.py в исполнение
-
Готово
dvkonstantinov telegram: https://t.me/Dvkonstantinov