GithubHelp home page GithubHelp logo

ivan-meer / aiogram-food-bot Goto Github PK

View Code? Open in Web Editor NEW

This project forked from dvkonstantinov/aiogram-food-bot

0.0 0.0 0.0 42 KB

Телеграм бот для сбора заявок на самомывоз и доставку готовых обедов (Django + Aiogram).

Python 99.62% Dockerfile 0.38%

aiogram-food-bot's Introduction

Django Aiogram Telegram Bot - бот по доставке готовых обедов

Телеграм бот для упрощения процесса по сбору заявок на самомывоз и доставку готовых обедов.

Описание проекта

Бот работает по умолчанию в режиме 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 сервере

Настройка Nignx

Предполагается, что есть готовый настроенный vps сервер с установленным docker, docker-compose и nginx.

  1. Перейти в каталог sites-available
cd /etc/nginx/sites-available/
  1. Создать файл с именем вашего домена
nano example.com
  1. Внутри написать
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;
    }

}
  1. Создать ярлык в каталоге sites-enabled
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
  1. Проверить что нет ошибок в конфигурации nginx
sudo nginx -t
  1. Перезапустить службу nginx
sudo systemctl restart nginx
  1. Установить https соединение, выпустив ssl сертификат с помощью certbot для вашего домена
sudo certbot --nginx 

Настройка бота

  1. Cкопировать этот гит на сервер любым удобным способом
  2. Создать .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
  1. Создать .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/"
  1. В django, файле settings.py добавить ваш домен в ALLOWED_HOSTS в формате example.com и CSRF_TRUSTED_ORIGINS в формате https://example.com
  2. Изменить права доступа к каталогу, если нужно(nginx использует по умолчанию пользователя www-data)
  3. Удалить файл .gitkeep из папки postgres (postgres ругается, если каталог не пустой)
  4. Запустить установку из файла docker-compose.
sudo docker-compose up -d --build
  1. Сделать миграции в базе данных
sudo docker-compose exec backend python manage.py migrate
  1. Создать суперпользователя
sudo docker-compose exec backend python manage.py createsuperuser
  1. Скопировать файлы статики
sudo docker-compose exec backend python manage.py collectstatic

Разворачивние на локальной машине, режим разработки и другое

Запуск в режиме polling

в файле ./bot/.env переменную IS_WEBHOOK заменить на False или 0

IS_WEBHOOK=True

Локальный запуск (не в docker-контейнере) с базой данных sqlite

  1. Запустить виртуальное окружение, установить зависимости из . /bot/requirements.txt и ./backend/requirements.txt
  2. Перевести бота в режим polling
  3. В файле ./backend/.env заменить базу данных на sqlite3:
IS_POSTGRES_DB=False
  1. В файле ./bot/.env заменить хранилище redis на оперативную память:
IS_REDIS_STORAGE=False
  1. В файле ./backend/tgbot/settings.py

  2. Запустить локальный сервер из каталога ./backend командой python manage.py runserver

  3. В ./bot/.env файле для переменных USERS_URL, DISHES_URL, MENUS_URL, ORDERS_URL заменить значения http://web:8000 на соответствующие http://127.0.0.1:8000

  4. Запустить .bot/main.py в исполнение

  5. Готово

Автор

dvkonstantinov telegram: https://t.me/Dvkonstantinov

aiogram-food-bot's People

Contributors

dvkonstantinov avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.