Update README with comprehensive project documentation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
161
README.md
161
README.md
@@ -1,3 +1,160 @@
|
|||||||
# evo-sync
|
# ЭВОСИНК (EvoSync)
|
||||||
|
|
||||||
evo-sync is a command-line synchronization tool that fetches product, group, and store data from the Evo platform and syncs it with VK (VKontakte).
|
Сервис автоматической синхронизации товарного каталога из [Эвотор](https://evotor.ru) в [ВКонтакте](https://vk.com).
|
||||||
|
|
||||||
|
## Возможности
|
||||||
|
|
||||||
|
- Подключение аккаунта Эвотор через OAuth
|
||||||
|
- Подключение сообщества ВКонтакте через токен
|
||||||
|
- Фильтрация по магазинам, группам и товарам (включить/исключить)
|
||||||
|
- Автоматическая фоновая синхронизация по расписанию
|
||||||
|
- Создание, обновление и удаление товаров в ВК-магазине
|
||||||
|
- Личный кабинет с веб-интерфейсом
|
||||||
|
- Просмотр закешированного каталога товаров
|
||||||
|
|
||||||
|
## Стек технологий
|
||||||
|
|
||||||
|
- **Backend**: FastAPI, SQLAlchemy ORM, Alembic
|
||||||
|
- **База данных**: MariaDB (драйвер pymysql)
|
||||||
|
- **Шаблоны**: Jinja2 (интерфейс на русском языке)
|
||||||
|
- **Аутентификация**: Cookie-сессии, bcrypt
|
||||||
|
- **Деплой**: Docker Compose
|
||||||
|
|
||||||
|
## Быстрый старт
|
||||||
|
|
||||||
|
### Требования
|
||||||
|
|
||||||
|
- Docker и Docker Compose
|
||||||
|
- MariaDB/MySQL (можно использовать хост-машину или отдельный контейнер)
|
||||||
|
|
||||||
|
### Настройка
|
||||||
|
|
||||||
|
1. Скопируйте файл переменных окружения:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cp .env.example .env
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Отредактируйте `.env`:
|
||||||
|
|
||||||
|
```env
|
||||||
|
# База данных
|
||||||
|
DATABASE_URL=mysql+pymysql://evosync:evosync@db:3306/evosync
|
||||||
|
|
||||||
|
# Безопасность (обязательно измените в production)
|
||||||
|
SECRET_KEY=your-random-secret-key-here
|
||||||
|
|
||||||
|
# URL приложения (используется в OAuth-редиректах)
|
||||||
|
BASE_URL=https://your-domain.ru
|
||||||
|
|
||||||
|
# Эвотор
|
||||||
|
EVOTOR_APP_ID=your-evotor-app-id
|
||||||
|
EVOTOR_WEBHOOK_SECRET=your-webhook-secret
|
||||||
|
|
||||||
|
# Для отдельного MySQL-контейнера (опционально)
|
||||||
|
DB_ROOT_PASSWORD=rootpass
|
||||||
|
DB_NAME=evosync
|
||||||
|
DB_USER=evosync
|
||||||
|
DB_PASSWORD=evosync
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Запустите сервис:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
Приложение будет доступно по адресу `http://localhost:8080`.
|
||||||
|
|
||||||
|
При старте контейнер автоматически применяет миграции базы данных (`alembic upgrade head`).
|
||||||
|
|
||||||
|
## Переменные окружения
|
||||||
|
|
||||||
|
| Переменная | Обязательно | По умолчанию | Описание |
|
||||||
|
|---|---|---|---|
|
||||||
|
| `DATABASE_URL` | Да | — | MySQL connection string (pymysql) |
|
||||||
|
| `SECRET_KEY` | Да | `change-me-in-production` | Ключ для подписи сессий |
|
||||||
|
| `BASE_URL` | Да | `http://localhost:8080` | Публичный URL (для OAuth-callback) |
|
||||||
|
| `EVOTOR_APP_ID` | Да | — | ID приложения Эвотор |
|
||||||
|
| `EVOTOR_WEBHOOK_SECRET` | Да | — | Секрет для верификации вебхуков Эвотор |
|
||||||
|
| `VK_API_VERSION` | Нет | `5.131` | Версия VK API |
|
||||||
|
| `VK_DEFAULT_PHOTO_PATH` | Нет | `/app/default_product.png` | Путь к изображению товара по умолчанию |
|
||||||
|
| `JIVOSITE_WIDGET_ID` | Нет | — | ID виджета Jivosite (онлайн-чат) |
|
||||||
|
| `SYNC_INTERVAL_SECONDS` | Нет | `3600` | Интервал синхронизации (сек) |
|
||||||
|
| `CATALOG_REFRESH_INTERVAL_SECONDS` | Нет | `3600` | Интервал обновления каталога (сек) |
|
||||||
|
| `HEALTH_CHECK_INTERVAL_SECONDS` | Нет | `600` | Интервал проверки соединений (сек) |
|
||||||
|
|
||||||
|
## Структура проекта
|
||||||
|
|
||||||
|
```
|
||||||
|
evo-sync/
|
||||||
|
├── web/
|
||||||
|
│ ├── main.py # FastAPI-приложение, регистрация роутеров, фоновые задачи
|
||||||
|
│ ├── config.py # Настройки из переменных окружения (pydantic-settings)
|
||||||
|
│ ├── models.py # SQLAlchemy-модели (User, EvotorConnection, VkConnection, ...)
|
||||||
|
│ ├── database.py # Движок и сессия SQLAlchemy
|
||||||
|
│ ├── auth.py # Хеширование паролей, работа с сессиями
|
||||||
|
│ ├── schemas.py # Pydantic-схемы для форм
|
||||||
|
│ ├── sync_engine.py # Фоновый движок синхронизации (Эвотор → ВК)
|
||||||
|
│ ├── routes/
|
||||||
|
│ │ ├── auth.py # Регистрация, вход, выход, подтверждение email
|
||||||
|
│ │ ├── profile.py # Профиль пользователя
|
||||||
|
│ │ ├── reset.py # Сброс пароля
|
||||||
|
│ │ ├── evotor.py # OAuth-подключение Эвотор
|
||||||
|
│ │ ├── vk.py # Подключение ВКонтакте (ввод токена)
|
||||||
|
│ │ ├── connections.py # Обзор всех подключений
|
||||||
|
│ │ ├── sync.py # Настройка и управление синхронизацией
|
||||||
|
│ │ └── catalog.py # Просмотр закешированного каталога
|
||||||
|
│ ├── templates/ # Jinja2-шаблоны (русский интерфейс)
|
||||||
|
│ └── migrations/ # Alembic-миграции
|
||||||
|
├── Dockerfile.web # Docker-образ веб-приложения (Python 3.12-slim)
|
||||||
|
├── docker-compose.yml # Оркестрация сервисов
|
||||||
|
├── docker-entrypoint.sh # Скрипт запуска контейнера
|
||||||
|
├── alembic.ini # Конфигурация миграций
|
||||||
|
├── requirements.txt # Python-зависимости
|
||||||
|
└── .env.example # Шаблон переменных окружения
|
||||||
|
```
|
||||||
|
|
||||||
|
## Модели базы данных
|
||||||
|
|
||||||
|
| Модель | Таблица | Назначение |
|
||||||
|
|---|---|---|
|
||||||
|
| `User` | `users` | Аккаунт пользователя |
|
||||||
|
| `EvotorConnection` | `evotor_connections` | OAuth-токен Эвотор |
|
||||||
|
| `VkConnection` | `vk_connections` | Токен сообщества ВКонтакте |
|
||||||
|
| `SyncConfig` | `sync_configs` | Настройки синхронизации пользователя |
|
||||||
|
| `SyncFilter` | `sync_filters` | Фильтры по магазинам/группам/товарам |
|
||||||
|
| `CachedStore` | `cached_stores` | Кеш магазинов Эвотор |
|
||||||
|
| `CachedGroup` | `cached_groups` | Кеш групп товаров Эвотор |
|
||||||
|
| `CachedProduct` | `cached_products` | Кеш товаров Эвотор + статус синхронизации |
|
||||||
|
|
||||||
|
## Как работает синхронизация
|
||||||
|
|
||||||
|
1. По расписанию (каждые `SYNC_INTERVAL_SECONDS` секунд) запускается `sync_engine.run_sync()`
|
||||||
|
2. Для каждого пользователя с активным `SyncConfig` и подключёнными Эвотор и ВК:
|
||||||
|
- Загружаются товары и группы из Эвотор API
|
||||||
|
- Применяются фильтры (включить/исключить магазины, группы, товары)
|
||||||
|
- Загружаются текущие товары и альбомы из ВК
|
||||||
|
- Создаются/обновляются/удаляются альбомы и товары в ВК-магазине
|
||||||
|
- В БД обновляется поле `synced_at` у синхронизированных товаров
|
||||||
|
|
||||||
|
**Особенности:**
|
||||||
|
- Товары на развес (единицы измерения в граммах) получают скорректированную цену (×10)
|
||||||
|
- Совпадение товаров ВК и Эвотор происходит по нормализованному названию
|
||||||
|
- Товары с `allow_to_sell=false` не синхронизируются в ВК
|
||||||
|
|
||||||
|
## Разработка
|
||||||
|
|
||||||
|
Для локальной разработки с горячей перезагрузкой кода папка `./web` монтируется в контейнер как volume. После изменения Python-файлов uvicorn перезапустится автоматически.
|
||||||
|
|
||||||
|
Создание новой миграции:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose exec web alembic revision --autogenerate -m "описание изменений"
|
||||||
|
```
|
||||||
|
|
||||||
|
Применение миграций вручную:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose exec web alembic upgrade head
|
||||||
|
```
|
||||||
|
|||||||
Reference in New Issue
Block a user