FastAPI бэкенд для кондитерской с интеграцией Telegram бота и админ-панелью
- Описание
- Технологии
- Быстрый старт
- Установка
- Конфигурация
- Docker развертывание
- Разработка
- API документация
- Структура проекта
- База данных
- Миграции
CakeDina - это современный REST API для управления кондитерской, который включает:
- 🛍️ Каталог продукции - категории и товары с описаниями и ценами
- 🤖 Telegram бот - прием заказов через мессенджер
- 🔐 Админ-панель - управление каталогом через веб-интерфейс
- 📝 Обратная связь - прием отзывов и обращений клиентов
- 🔒 Авторизация - JWT токены + Telegram OAuth
- FastAPI - современный веб-фреймворк
- SQLAlchemy 2.0 - ORM для работы с БД
- Alembic - миграции базы данных
- Pydantic - валидация данных
- asyncpg - асинхронный драйвер PostgreSQL
- PostgreSQL - основная база данных
- Aiogram 3 - фреймворк для Telegram ботов
- Telegram OAuth - авторизация через Telegram
- python-jose - JWT токены
- passlib + bcrypt - хеширование паролей
- Docker - контейнеризация
- Docker Compose - оркестрация
- Nginx - reverse proxy (опционально)
- Poetry - управление зависимостями
# 1. Создать .env файл
cp .env.production.example .env
nano .env # Отредактировать настройки
# 2. Запустить
docker-compose up -d --build
# 3. Проверить
curl http://localhost:8000/health📖 Полная инструкция: QUICK_START.md
# 1. Установить зависимости
poetry install
# 2. Создать .env
cp .env.production.example .env
# Настроить подключение к БД
# 3. Применить миграции
alembic upgrade head
# 4. Запустить
poetry run uvicorn app.main:app --reload- Python 3.11+
- PostgreSQL 12+
- Poetry (для управления зависимостями)
-
Клонировать репозиторий
git clone <repository-url> cd CakeDina
-
Установить Poetry (если не установлен)
curl -sSL https://install.python-poetry.org | python3 - -
Установить зависимости
poetry install
-
Настроить .env файл
cp .env.production.example .env nano .env # Указать параметры подключения к существующей БДВажно: База данных уже развернута на VPS сервере. Просто укажите параметры подключения в
.env:PSQL_HOST=your_vps_host PSQL_DB_NAME=cakedina PSQL_USER=your_db_user PSQL_PASS=your_db_password PSQL_DB_PORT=5432
-
Применить миграции (если нужно)
poetry run alembic upgrade head
-
Запустить приложение
poetry run uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
Все настройки хранятся в файле .env. Основные параметры:
PSQL_HOST=localhost
PSQL_DB_NAME=cakedina
PSQL_USER=cakedina_user
PSQL_PASS=your_password
PSQL_DB_PORT=5432JWT_SECRET_KEY=your_secret_key_here
JWT_ALGORITHM=HS256
ACCESS_TOKEN_EXPIRE_MINUTES=11520TELEGRAM_BOT_TOKEN=your_bot_token
TELEGRAM_BOT_USERNAME=your_bot_username
TELEGRAM_BOT_ID=bot_idADMIN_USERNAME=admin
ADMIN_PASSWORD=secure_password
ADMIN_TELEGRAM_ID=123456789📝 Полный список параметров: см. .env.production.example
docker-compose up -d --builddocker-compose --profile with-nginx up -d --buildmake deploy # Только бэкенд
make deploy-nginx # С Nginx
make logs # Просмотр логов
make health # Проверка здоровья📖 Подробная документация:
- QUICK_START.md - быстрый старт
- README_DEPLOYMENT.md - полное руководство
- DEVOPS_NOTES.txt - заметки для DevOps
# Логи
docker-compose logs -f backend
# Статус
docker-compose ps
# Перезапуск
docker-compose restart
# Миграции
docker-compose exec backend alembic upgrade head
# Shell в контейнере
docker-compose exec backend bash
# Остановка
docker-compose down# Активировать виртуальное окружение
poetry shell
# Запустить сервер разработки
uvicorn app.main:app --reload
# Создать новую миграцию
alembic revision --autogenerate -m "description"
# Применить миграции
alembic upgrade head
# Откатить миграцию
alembic downgrade -1
# Форматирование кода
black app/
isort app/
# Линтинг
flake8 app/
mypy app/# Создать миграцию
alembic revision --autogenerate -m "Add new table"
# Применить все миграции
alembic upgrade head
# Применить конкретную миграцию
alembic upgrade <revision>
# Откатить последнюю
alembic downgrade -1
# История миграций
alembic history
# Текущая версия БД
alembic currentПосле запуска приложения доступна интерактивная документация:
- Swagger UI: http://localhost:8000/docs
- ReDoc: http://localhost:8000/redoc
GET /api/v1/categories # Список категорий
GET /api/v1/categories/{id} # Категория по ID
GET /api/v1/products # Список продуктов
GET /api/v1/products/{id} # Продукт по ID
POST /api/v1/feedback # Отправить обратную связь
POST /api/v1/auth/telegram # Авторизация через Telegram
POST /api/v1/auth/login # Авторизация логин/пароль
GET /api/v1/auth/me # Текущий пользователь
POST /api/v1/admin/categories # Создать категорию
PUT /api/v1/admin/categories/{id} # Обновить категорию
DELETE /api/v1/admin/categories/{id} # Удалить категорию
POST /api/v1/admin/products # Создать продукт
PUT /api/v1/admin/products/{id} # Обновить продукт
DELETE /api/v1/admin/products/{id} # Удалить продукт
CakeDina/
├── app/
│ ├── api/
│ │ └── v1/
│ │ ├── admin/ # Админские эндпоинты
│ │ │ ├── categories.py
│ │ │ └── products.py
│ │ ├── auth.py # Авторизация
│ │ ├── feedback.py # Обратная связь
│ │ └── public.py # Публичные эндпоинты
│ ├── core/
│ │ ├── auth.py # JWT авторизация
│ │ ├── security.py # Хеширование паролей
│ │ ├── telegram_bot.py # Telegram бот
│ │ └── bot_states.py # Состояния бота
│ ├── models/
│ │ ├── base.py # Базовая модель
│ │ ├── category.py # Модель категории
│ │ ├── product.py # Модель продукта
│ │ └── user.py # Модель пользователя
│ ├── schemas/
│ │ ├── category.py # Pydantic схемы
│ │ ├── product.py
│ │ └── user.py
│ ├── static/ # Статические файлы
│ │ ├── admin.html # Админка
│ │ └── login.html # Страница входа
│ ├── config.py # Конфигурация
│ ├── database.py # Подключение к БД
│ └── main.py # Точка входа
├── alembic/ # Миграции
│ └── versions/
├── nginx/ # Nginx конфигурация
│ └── nginx.conf
├── docker-compose.yml # Docker Compose
├── Dockerfile # Docker образ
├── docker-entrypoint.sh # Скрипт запуска
├── Makefile # Удобные команды
├── pyproject.toml # Poetry зависимости
├── alembic.ini # Alembic конфигурация
├── .env # Переменные окружения
├── README.md # Этот файл
├── QUICK_START.md # Быстрый старт
├── README_DEPLOYMENT.md # Развертывание
└── DEVOPS_NOTES.txt # Заметки для DevOps
id- UUID, первичный ключname- название категорииdescription- описание (опционально)created_at- дата созданияupdated_at- дата обновления
id- UUID, первичный ключname- название продуктаdescription- описаниеprice- ценаcategory_id- внешний ключ на категориюimage_url- ссылка на изображение (опционально)is_available- доступностьcreated_at- дата созданияupdated_at- дата обновления
id- UUID, первичный ключtelegram_id- Telegram ID (уникальный)username- логин для входаhashed_password- хешированный парольis_admin- флаг администратораcreated_at- дата созданияupdated_at- дата обновления
┌─────────────┐ ┌──────────────┐
│ Category │ │ Product │
├─────────────┤ ├──────────────┤
│ id │◄──────│ id │
│ name │ 1:N │ name │
│ description │ │ description │
│ created_at │ │ price │
│ updated_at │ │ category_id │
└─────────────┘ │ image_url │
│ is_available │
│ created_at │
│ updated_at │
└──────────────┘
┌─────────────┐
│ User │
├─────────────┤
│ id │
│ telegram_id │
│ username │
│ hashed_pwd │
│ is_admin │
│ created_at │
│ updated_at │
└─────────────┘
Проект использует Alembic для управления миграциями базы данных.
7b1808e02b1a- Начальная миграция (категории и продукты)5d0f5215373c- Добавление таблицы пользователей47b766f62229- Добавление описания к категориям и цены к продуктам
# Применить все миграции
alembic upgrade head
# Откатить последнюю
alembic downgrade -1
# Создать новую миграцию
alembic revision --autogenerate -m "Description"
# Показать историю
alembic history
# Текущая версия
alembic currentПроект поддерживает два метода авторизации:
- Telegram OAuth - для пользователей Telegram
- Username/Password - для администраторов
- Алгоритм: HS256
- Срок действия: 8 дней (настраивается)
- Передача: Bearer token в заголовке Authorization
Все эндпоинты в /api/v1/admin/* требуют JWT токен.
Пример использования:
curl -H "Authorization: Bearer YOUR_JWT_TOKEN" \
http://localhost:8000/api/v1/admin/categoriescurl http://localhost:8000/api/v1/categoriescurl -X POST http://localhost:8000/api/v1/admin/products \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Торт Наполеон",
"description": "Классический слоеный торт",
"price": 1500,
"category_id": "category-uuid-here",
"is_available": true
}'curl -X POST http://localhost:8000/api/v1/feedback \
-H "Content-Type: application/json" \
-d '{
"name": "Иван",
"email": "ivan@example.com",
"message": "Отличные торты!"
}'# Установить dev-зависимости
poetry install --with dev
# Запустить тесты
poetry run pytest
# С покрытием
poetry run pytest --cov=app
# Конкретный тест
poetry run pytest tests/test_api.pycurl http://localhost:8000/health
# Ответ: {"status":"ok","service":"CakeDina"}# Docker
docker-compose logs -f backend
# Локально
tail -f logs/app.log- Fork проекта
- Создайте feature branch (
git checkout -b feature/AmazingFeature) - Commit изменений (
git commit -m 'Add some AmazingFeature') - Push в branch (
git push origin feature/AmazingFeature) - Откройте Pull Request
Этот проект является частной разработкой для кондитерской CakeDina.
- Telegram: WebZella bot
- Email: mail@webzella.ru
- FastAPI - за отличный фреймворк
- SQLAlchemy - за мощную ORM
- Aiogram - за удобную работу с Telegram
- Poetry - за управление зависимостями
Сделано WEB Студией WEBZELLA с ❤️ для CakeDina