Добро пожаловать в "Топ энергетиков" — backend-приложение на FastAPI, созданное для оценки и выбора лучших энергетических напитков. Здесь пользователи могут оставлять отзывы, выставлять оценки и анализировать статистику популярных напитков. Проект использует PostgreSQL и Alembic для надежного хранения и управления данными. 🚀
energy-backend/
│
├── .github/
│ └── workflows/
│ └── docker-deploy.yml # CI/CD: деплой Docker-контейнера
│
├── alembic/
│ ├── versions/ # Папка с миграциями
│ └── env.py # Конфигурация Alembic
│
├── app/
│ ├── api/
│ │ ├── v1/
│ │ │ ├── endpoints/
│ │ │ │ ├── __init__.py # Инициализация модуля Python
│ │ │ │ └── ... .py # Роуты API (эндпоинты)
│ │ │ ├── __init__.py # Инициализация модуля Python
│ │ │ └── router.py # Объединяет маршруты версии v1
│ │ └── __init__.py # Инициализация модуля Python
│ ├── core/
│ │ ├── __init__.py # Инициализация модуля Python
│ │ ├── config.py # Конфигурация приложения
│ │ └── security.py # Логика авторизации (JWT, валидация)
│ ├── db/
│ │ ├── models/
│ │ │ ├── __init__.py # Инициализация модуля Python
│ │ │ ├── base.py # Базовый класс для моделей
│ │ │ └── ... .py # SQLAlchemy модели
│ │ ├── __init__.py # Инициализация модуля Python
│ │ └── database.py # Настройка подключения к БД
│ ├── schemas/
│ │ ├── __init__.py # Инициализация модуля Python
│ │ └── ... .py # Pydantic схемы
│ ├── services/
│ │ ├── __init__.py # Инициализация модуля Python
│ │ └── ... .py # CRUD операции (Бизнес логика)
│ ├── test/
│ │ ├── __init__.py # Инициализация модуля Python
│ │ └── load_test_data.py # Скрипт загрузки тестовых данных (включает миграции)
│ ├── __init__.py # Инициализация модуля Python
│ └── main.py # Точка входа FastAPI
│
├── .dockerignore # Исключения для сборки контейнера
├── .env.sample # Пример файла с переменными окружения
├── .gitignore # Исключаемые файлы
├── alembic.ini # Файл конфигурации Alembic
├── docker-compose-server.yml # Конфигурация Docker с PostgreSQL для сервера
├── docker-compose.yml # Конфигурация Docker
├── Dockerfile # Docker конфигурация
├── README.md # Документация
├── requirements.txt # Зависимости проекта
└── test_data.csv # Тестовые данные
Скопируйте .env.sample
, переименуйте в .env
и добавьте свои данные.
Создание
python -m venv venv
Активация
venv\Scripts\activate # Windows
source venv/bin/activate # Linux/macOS
pip install -r requirements.txt
Выполните команду для инициализации базы данных, применения миграций и загрузки тестовых данных:
python -m app.test.load_test_data
uvicorn app.main:app --reload
API будет доступно по адресу:
📍 http://localhost:8000
Доступны два способа:
-
Проверьте
docker-compose.yml
-
Выполните сборку и пуш:
docker compose build
docker compose up -d
docker push <your-dockerhub>
-
В файле
.github/workflows/docker-deploy.yml
уже всё готово -
При пуше в
main
ветку произойдёт автоматическая сборка и публикация образа в DockerHub
На прод-сервере можете использовать docker-compose-server.yml
из репозитория backend. Скопируйте .env.example
, переименуйте в .env
и добавьте свои данные.
Если вам нужно поменять тестовые данные на сервере, то вы можете сделать следующее:
Войти в контейнер
docker exec -it energy-backend-1 /bin/sh
Установить nano (по желанию, если вам удобнее пользоваться nano):
apk add --no-cache nano # если контейнер на Alpine
или
apt-get update && apt-get install -y nano # если Debian/Ubuntu
Заменить тестовые данные на свои
nano test_data.csv
Если папки versions нет, создать ее:
mkdir -p /app/alembic/versions
Запустить скрипт загрузки тестовых данных
python -m app.test.load_test_data
1️⃣ Проверить, существует ли папка с изображениями уже на сервере
find / -type d -name "image-backup" 2>/dev/null
2️⃣ Скопировать папку uploads из контейнера на сервер
docker cp energy-backend-1:/app/uploads /image-backup/
3️⃣ Скопировать с сервера на локальную машину
👉 Linux/macOS:
scp -r user@server:/image-backup/ ~/Downloads/
👉 Windows (PowerShell):
scp -r user@server:/image-backup/ C:\Users\USER\Downloads\
4️⃣ Очистить временную папку на сервере
rm -rf /image-backup/
5️⃣ Проверить, осталась ли папка на сервере
find / -type d -name "image-backup" 2>/dev/null
1️⃣ Проверить, существует ли папка с изображениями уже на сервере
find / -type d -name "image-backup" 2>/dev/null
2️⃣ Скопировать изображения с локалки на сервер
👉 Windows (PowerShell):
scp -r "C:\Users\USER\Downloads\image-backup\*" user@server:/image-backup/
👉 Linux/macOS:
scp -r ~/Downloads/image-backup/ user@server:/image-backup/
3️⃣ Перенести изображения с сервера в контейнер
docker cp /image-backup/. energy-backend-1:/app/uploads
4️⃣ Очистить временную папку на сервере
rm -rf /image-backup/
5️⃣ Проверить, осталась ли папка на сервере
find / -type d -name "image-backup" 2>/dev/null
1️⃣ Проверить, существует ли бэкап уже на сервере
find / -type f -name "*energy_drink*" 2>/dev/null
2️⃣ Заходим в контейнер с PostgreSQL:
docker exec -it energy-postgres-1 bash
3️⃣ Делаем дамп базы:
pg_dump -U postgres -d energy_drinks_db -Fc > /tmp/energy_drinks_db_backup.dump
4️⃣ Выходим из контейнера:
exit
5️⃣ Копируем дамп из контейнера на сервер:
docker cp energy-postgres-1:/tmp/energy_drinks_db_backup.dump ./energy_drinks_db_backup.dump
6️⃣ Скачиваем дамп на локальную машину:
👉 Windows (PowerShell):
scp user@server:./energy_drinks_db_backup.dump C:\Users\USER\Downloads\
👉 Linux/macOS:
scp user@server:./energy_drinks_db_backup.dump ~/Downloads/
7️⃣ Подключаемся снова к серверу и чистим временные файлы:
Удаляем бэкап на сервере:
rm ./energy_drinks_db_backup.dump
Заходим в контейнер
docker exec -it energy-postgres-1 bash
Удаляем бэкап с контейнера
rm /tmp/energy_drinks_db_backup.dump
1️⃣ Проверить, существует ли бэкап уже на сервере
find / -type f -name "*energy_drink*" 2>/dev/null
2️⃣ Загружаем дамп на сервер:
👉 Windows (PowerShell):
scp C:\Users\USER\Downloads\energy_drinks_db_backup.dump user@server:./energy_drinks_db_backup.dump
👉 Linux/macOS:
scp -r ~/Downloads/energy_drinks_db_backup.dump user@server:./energy_drinks_db_backup.dump
3️⃣ Копируем дамп в контейнер:
docker cp ./energy_drinks_db_backup.dump energy-postgres-1:/tmp/energy_drinks_db_backup.dump
4️⃣ Удаляем старую базу и создаём новую:
Останавливаем бэк
docker stop energy-backend-1
Дропаем бдшку
docker exec -it energy-postgres-1 psql -U postgres -c "DROP DATABASE IF EXISTS energy_drinks_db;"
Запускаем заново бэк
docker start energy-backend-1
Пересоздаем бдшку
docker exec -it energy-postgres-1 psql -U postgres -c "CREATE DATABASE energy_drinks_db;"
5️⃣ Восстанавливаем базу из дампа:
docker exec -i energy-postgres-1 pg_restore -U postgres -d energy_drinks_db --verbose /tmp/energy_drinks_db_backup.dump
Backend работает в связке с frontend-приложением energy-frontend.
Убедитесь, что:
-
REACT_APP_BACKEND_URL
указывает на корректный хост backend-а, -
разрешено CORS-соединение с фронта.
Alembic используется для управления миграциями базы данных.
- 📌 Создание новой миграции:
alembic revision --autogenerate -m "Описание изменений"
- 📌 Применение миграций:
alembic upgrade head
- 📌 Откат миграции:
alembic downgrade -1
📌 Просмотр установленных зависимостей
pip list
💾 Сохранение зависимостей
pip freeze > requirements.txt
🗑 Удаление всех зависимостей
pip uninstall -y -r requirements.txt
🧹 Удаление виртуального окружения venv
Get-ChildItem -Path . -Recurse -Directory -Filter "venv" | Remove-Item -Recurse -Force #windows
🧹 Удаление кеша pycache
Get-ChildItem -Recurse -Directory -Include "__pycache__", ".mypy_cache", ".pytest_cache" | Remove-Item -Recurse -Force #windows
Get-ChildItem -Recurse -Include *.pyc | Remove-Item -Force #windows
💡 Если у вас есть вопросы или предложения по улучшению проекта, создайте issue! 🚀