Skip to content

Бекенд для сайта Дины (кондитерская)

Notifications You must be signed in to change notification settings

TiestoPesto/CakeDina

Repository files navigation

🍰 CakeDina - Backend API

FastAPI бэкенд для кондитерской с интеграцией Telegram бота и админ-панелью

Python FastAPI PostgreSQL Docker

📋 Содержание

🎯 Описание

CakeDina - это современный REST API для управления кондитерской, который включает:

  • 🛍️ Каталог продукции - категории и товары с описаниями и ценами
  • 🤖 Telegram бот - прием заказов через мессенджер
  • 🔐 Админ-панель - управление каталогом через веб-интерфейс
  • 📝 Обратная связь - прием отзывов и обращений клиентов
  • 🔒 Авторизация - JWT токены + Telegram OAuth

🚀 Технологии

Backend

  • FastAPI - современный веб-фреймворк
  • SQLAlchemy 2.0 - ORM для работы с БД
  • Alembic - миграции базы данных
  • Pydantic - валидация данных
  • asyncpg - асинхронный драйвер PostgreSQL

Database

  • PostgreSQL - основная база данных

Telegram

  • Aiogram 3 - фреймворк для Telegram ботов
  • Telegram OAuth - авторизация через Telegram

Security

  • python-jose - JWT токены
  • passlib + bcrypt - хеширование паролей

DevOps

  • Docker - контейнеризация
  • Docker Compose - оркестрация
  • Nginx - reverse proxy (опционально)
  • Poetry - управление зависимостями

⚡ Быстрый старт

Для DevOps (Docker)

# 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 (для управления зависимостями)

Шаги установки

  1. Клонировать репозиторий

    git clone <repository-url>
    cd CakeDina
  2. Установить Poetry (если не установлен)

    curl -sSL https://install.python-poetry.org | python3 -
  3. Установить зависимости

    poetry install
  4. Настроить .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
  5. Применить миграции (если нужно)

    poetry run alembic upgrade head
  6. Запустить приложение

    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=5432

JWT Security

JWT_SECRET_KEY=your_secret_key_here
JWT_ALGORITHM=HS256
ACCESS_TOKEN_EXPIRE_MINUTES=11520

Telegram Bot

TELEGRAM_BOT_TOKEN=your_bot_token
TELEGRAM_BOT_USERNAME=your_bot_username
TELEGRAM_BOT_ID=bot_id

Admin

ADMIN_USERNAME=admin
ADMIN_PASSWORD=secure_password
ADMIN_TELEGRAM_ID=123456789

📝 Полный список параметров: см. .env.production.example

🐳 Docker развертывание

Вариант 1: Только бэкенд

docker-compose up -d --build

Вариант 2: С Nginx reverse proxy

docker-compose --profile with-nginx up -d --build

Вариант 3: Через Makefile

make deploy          # Только бэкенд
make deploy-nginx    # С Nginx
make logs            # Просмотр логов
make health          # Проверка здоровья

📖 Подробная документация:

Полезные команды

# Логи
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

📚 API документация

После запуска приложения доступна интерактивная документация:

Основные эндпоинты

Public API (без авторизации)

GET  /api/v1/categories          # Список категорий
GET  /api/v1/categories/{id}     # Категория по ID
GET  /api/v1/products            # Список продуктов
GET  /api/v1/products/{id}       # Продукт по ID
POST /api/v1/feedback            # Отправить обратную связь

Auth API

POST /api/v1/auth/telegram       # Авторизация через Telegram
POST /api/v1/auth/login          # Авторизация логин/пароль
GET  /api/v1/auth/me             # Текущий пользователь

Admin API (требуется JWT токен)

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

🗄️ База данных

Модели

Category (Категория)

  • id - UUID, первичный ключ
  • name - название категории
  • description - описание (опционально)
  • created_at - дата создания
  • updated_at - дата обновления

Product (Продукт)

  • id - UUID, первичный ключ
  • name - название продукта
  • description - описание
  • price - цена
  • category_id - внешний ключ на категорию
  • image_url - ссылка на изображение (опционально)
  • is_available - доступность
  • created_at - дата создания
  • updated_at - дата обновления

User (Пользователь)

  • id - UUID, первичный ключ
  • telegram_id - Telegram ID (уникальный)
  • username - логин для входа
  • hashed_password - хешированный пароль
  • is_admin - флаг администратора
  • created_at - дата создания
  • updated_at - дата обновления

ER диаграмма

┌─────────────┐       ┌──────────────┐
│  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 для управления миграциями базы данных.

Доступные миграции

  1. 7b1808e02b1a - Начальная миграция (категории и продукты)
  2. 5d0f5215373c - Добавление таблицы пользователей
  3. 47b766f62229 - Добавление описания к категориям и цены к продуктам

Команды миграций

# Применить все миграции
alembic upgrade head

# Откатить последнюю
alembic downgrade -1

# Создать новую миграцию
alembic revision --autogenerate -m "Description"

# Показать историю
alembic history

# Текущая версия
alembic current

🔐 Безопасность

Авторизация

Проект поддерживает два метода авторизации:

  1. Telegram OAuth - для пользователей Telegram
  2. Username/Password - для администраторов

JWT токены

  • Алгоритм: HS256
  • Срок действия: 8 дней (настраивается)
  • Передача: Bearer token в заголовке Authorization

Защищенные эндпоинты

Все эндпоинты в /api/v1/admin/* требуют JWT токен.

Пример использования:

curl -H "Authorization: Bearer YOUR_JWT_TOKEN" \
     http://localhost:8000/api/v1/admin/categories

📝 Примеры использования

Получить список категорий

curl http://localhost:8000/api/v1/categories

Создать продукт (требуется авторизация)

curl -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.py

📊 Мониторинг

Health Check

curl http://localhost:8000/health
# Ответ: {"status":"ok","service":"CakeDina"}

Логи

# Docker
docker-compose logs -f backend

# Локально
tail -f logs/app.log

🤝 Вклад в проект

  1. Fork проекта
  2. Создайте feature branch (git checkout -b feature/AmazingFeature)
  3. Commit изменений (git commit -m 'Add some AmazingFeature')
  4. Push в branch (git push origin feature/AmazingFeature)
  5. Откройте Pull Request

📄 Лицензия

Этот проект является частной разработкой для кондитерской CakeDina.

📞 Контакты

🙏 Благодарности

  • FastAPI - за отличный фреймворк
  • SQLAlchemy - за мощную ORM
  • Aiogram - за удобную работу с Telegram
  • Poetry - за управление зависимостями

Сделано WEB Студией WEBZELLA с ❤️ для CakeDina

About

Бекенд для сайта Дины (кондитерская)

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published