architect/arh/design/MASTER_PLAN.md

MASTER PLAN — Unified Commerce Platform

Версия: 1.0.0
Дата: 2025-12-19
Кодовое имя: PRO


ТЕКУЩАЯ ИНФРАСТРУКТУРА

┌─────────────────────────────────────────────────────────────────┐
                         СЕРВЕРА                                  
├─────────────────────────────┬───────────────────────────────────┤
 DEV-PRO (91.218.142.168)     DEV-PROD-RF (45.144.177.147)      
 Control Plane                Production Platform               
 2 CPU, 2GB RAM               8 CPU, 16GB RAM                   
├─────────────────────────────┼───────────────────────────────────┤
 Сейчас:                      Сейчас:                           
  Claude Code workspace       34 Docker контейнера            
  NocoDB + PostgreSQL         seller1.ru (PROD)               
  @mp1.service (8504)         Odoo 18 (erp.0kt.ru)            
  pro1/@admin (8505)          NPM (все домены)                
├─────────────────────────────┼───────────────────────────────────┤
 БУДЕТ: DEV                   БУДЕТ: PROD                       
  pro.dev.0kt.ru              pro.0kt.ru (Docker)             
  Разработка, тесты           Production 24/7                 
└─────────────────────────────┴───────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
                         ХРАНИЛИЩЕ                                
├─────────────────────────────────────────────────────────────────┤
 Beget S3 (s3.beget.com)                                         
  Прайсы поставщиков (/projects/pirotehnika/prices/)            
  Изображения товаров (/projects/pirotehnika/images/)           
  Бэкапы БД (/projects/pirotehnika/backups/)                    
  Монтируется как $DATASPACE/ на обоих серверах              
└─────────────────────────────────────────────────────────────────┘

СТРАТЕГИЯ

Что НЕ трогаем

Сервис Причина
@mp1.service Работает, берём код отсюда
NocoDB База данных остаётся
seller1.ru Production, не трогаем

Что делаем

Проект Что
PRO Новая платформа на базе pro1
DEV Разработка на DEV-PRO
PROD Production на DEV-PROD-RF в Docker

АРХИТЕКТУРА DEV/PROD

                    ┌─────────────────┐
                    │   Разработчик   │
                    └────────┬────────┘
                             │
              ┌──────────────┴──────────────┐
              ▼                              ▼
┌─────────────────────────┐    ┌─────────────────────────┐
│     DEV-PRO Server      │    │   DEV-PROD-RF Server    │
│   91.218.142.168        │    │   45.144.177.147        │
├─────────────────────────┤    ├─────────────────────────┤
│                         │    │                         │
│  pro.dev.0kt.ru:8505    │───▶│  pro.0kt.ru (Docker)    │
│  (uvicorn напрямую)     │push│  (Gunicorn + Nginx)     │
│                         │    │                         │
│  PostgreSQL (NocoDB)    │    │  PostgreSQL (реплика)   │
│  ───────────────────    │sync│  ───────────────────    │
│  pt7k98pv0fwi1el        │───▶│  pro_production         │
│                         │    │                         │
└─────────────────────────┘    └─────────────────────────┘
              │                              │
              └──────────────┬───────────────┘
                             ▼
                    ┌─────────────────┐
                    │    Beget S3     │
                    │  (общие данные) │
                    │  /prices/       │
                    │  /images/       │
                    └─────────────────┘

ПОДПРОЕКТЫ (параллельные потоки)

Поток 0: CORE (фундамент)

projects/pro1/
└── @core/
    ├── CLAUDE.md
    ├── TZ.md                  Техническое задание
    ├── SCHEMA.md              Схема таблиц (auth)
    └── solution/
        ├── app/
           ├── main.py
           ├── config.py
           ├── database.py
           └── core/
               ├── auth/      JWT, сессии
               ├── users/     Пользователи
               └── middleware/
        └── requirements.txt

Результат: Авторизация, layout, навигация.
Зависимости: Нет.
Источник кода: pro1/@admin.service.


Поток 1: PIM (товары)

projects/pro1/
└── @pim/
    ├── CLAUDE.md
    ├── TZ.md                  Техническое задание
    ├── SCHEMA.md              Схема таблиц (pim_*)
    └── solution/
        └── app/modules/pim/
            ├── router.py      API
            ├── views.py       HTML страницы
            ├── models.py      SQLAlchemy
            ├── schemas.py     Pydantic
            └── services.py    Бизнес-логика

Результат: Список товаров, карточка, редактирование.
Зависимости: CORE.
Источник данных: NocoDB pim_products (5623).


Поток 2: ORDERS (заказы)

projects/pro1/
└── @orders/
    ├── CLAUDE.md
    ├── TZ.md
    ├── SCHEMA.md              Схема таблиц (ord_*, ozon_*)
    └── solution/
        └── app/modules/orders/
            ├── router.py
            ├── views.py
            ├── models.py
            ├── schemas.py
            └── services.py

Результат: Список заказов, детали, статусы.
Зависимости: CORE.
Источник кода: @mp1.service/api/v1/orders.


Поток 3: MARKETPLACE (OZON)

projects/pro1/
└── @marketplace/
    ├── CLAUDE.md
    ├── TZ.md
    ├── SCHEMA.md              Схема таблиц (ozon_*)
    └── solution/
        └── app/modules/marketplace/
            ├── router.py
            ├── views.py
            ├── ozon/          OZON API client
               ├── client.py
               ├── orders.py
               └── products.py
            └── services.py

Результат: Синхронизация OZON, этикетки, отгрузки.
Зависимости: CORE, ORDERS.
Источник кода: @mp1.service + @ozon.api.


Поток 4: CRM (клиенты) — Q2

projects/pro1/
└── @crm/
    ├── CLAUDE.md
    ├── TZ.md
    ├── SCHEMA.md              Схема таблиц (crm_*)
    └── solution/
        └── app/modules/crm/

Зависимости: CORE, ORDERS.
Источник: mcrm/.


Поток 5: DROPSHIP (поставщики) — Q2

projects/pro1/
└── @dropship/
    ├── CLAUDE.md
    ├── TZ.md
    ├── SCHEMA.md              Схема таблиц (drop_*, Prices_History)
    └── solution/
        └── app/modules/dropship/

Зависимости: CORE, PIM.
Источник данных: Prices_History (4126), Suppliers.


СТРУКТУРА ФАЙЛОВ ПОДПРОЕКТА

Каждый подпроект содержит:

@{module}/
├── CLAUDE.md           ← Контекст для Claude
├── TZ.md               ← Техническое задание
│   ├── Цель
│   ├── Функционал MVP
│   ├── API endpoints
│   ├── UI страницы
│   └── Критерии готовности
│
├── SCHEMA.md           ← Схема данных
│   ├── Таблицы (CREATE TABLE)
│   ├── Связи (FK)
│   ├── Индексы
│   └── Миграции
│
├── API.md              ← Документация API
│   ├── Endpoints
│   ├── Request/Response
│   └── Примеры
│
└── solution/           ← Код
    └── app/modules/{name}/

СХЕМА ТАБЛИЦ (общая)

Префиксы

Префикс Модуль Примеры
usr_ CORE usr_users, usr_roles, usr_sessions
pim_ PIM pim_products, pim_categories, pim_prices
ord_ ORDERS ord_orders, ord_items, ord_shipments
ozon_ MARKETPLACE ozon_orders, ozon_products, ozon_accounts
wb_ MARKETPLACE wb_orders (Q3)
crm_ CRM crm_clients, crm_segments
drop_ DROPSHIP drop_suppliers, drop_purchases
fin_ FINANCE fin_transactions
bot_ ROBOTS bot_robots, bot_logs

Существующие таблицы (NocoDB)

-- Уже есть (не трогаем структуру)
pim_products          -- 5623 товаров
pim_categories        -- Категории
pim_cost_rules        -- Правила наценок
Prices_History        -- 4126 цен от поставщиков
OZON_Orders           -- Заказы OZON
OZON_Accounts         -- 3 аккаунта

Новые таблицы (создаём)

-- CORE
usr_users (id, email, password_hash, role, created_at)
usr_sessions (id, user_id, token, expires_at)

-- ORDERS (универсальные)
ord_orders (id, source, source_id, status, customer_name, total, created_at)
ord_items (id, order_id, product_id, quantity, price)
ord_shipments (id, order_id, tracking, shipped_at)

-- CRM
crm_clients (id, name, phone, email, source, created_at)
crm_orders (client_id, order_id)  -- связка

-- DROPSHIP
drop_suppliers (id, name, contact, email)
drop_purchases (id, supplier_id, order_id, status, total)

ХРАНИЛИЩЕ ДАННЫХ (S3)

Что в S3

s3://hub/projects/pirotehnika/
├── prices/            Прайсы поставщиков (xlsx)
   ├── jf/
   ├── maxsem/
   └── ...
├── images/            Фото товаров
   ├── products/
   └── categories/
├── exports/           Выгрузки
└── backups/           Бэкапы БД
    └── pro_*.sql.gz

Доступ из приложения

# config.py
S3_ENDPOINT = "s3.beget.com"
S3_BUCKET = "hub"
S3_PREFIX = "projects/pirotehnika"

# Или через mount
DATA_PATH = "$DATASPACE/projects/pirotehnika"

ПЛАН РЕАЛИЗАЦИИ

Фаза 0: Подготовка (1 день)

[ ] Создать структуру projects/pro1/
[ ] Настроить Docker на DEV-PROD-RF
[ ] Создать домены pro.dev.0kt.ru, pro.0kt.ru
[ ] Подключить S3 mount

Фаза 1: CORE (2-3 дня)

[ ] Перенести auth из pro1/@admin.service
[ ] Создать base layout (sidebar, header)
[ ] Настроить SQLAlchemy к NocoDB PostgreSQL
[ ] Login/logout UI
[ ] Тест на DEV

Фаза 2: PIM (2-3 дня) — параллельно с Orders

[ ] Модели pim_products, pim_categories
[ ] API: GET /pim/products, GET /pim/products/{id}
[ ] UI: Список товаров с фильтрами
[ ] UI: Карточка товара
[ ] Тест

Фаза 3: ORDERS (2-3 дня) — параллельно с PIM

[ ] Перенести код из @mp1.service
[ ] Универсальная модель ord_orders
[ ] API: GET /orders, GET /orders/{id}
[ ] UI: Список заказов
[ ] UI: Детали заказа

Фаза 4: MARKETPLACE (3-4 дня)

[ ] Перенести OZON client из @ozon.api
[ ] Синхронизация заказов
[ ] Этикетки (PDF)
[ ] Отгрузка
[ ] UI: страница синхронизации

Фаза 5: Deploy PROD (1 день)

[ ] Docker image
[ ] docker-compose.yml
[ ] Nginx config в NPM
[ ] Миграция данных
[ ] Smoke test

ПАРАЛЛЕЛЬНЫЕ ПОТОКИ

          День 1    День 2    День 3    День 4    День 5    День 6
          ─────────────────────────────────────────────────────────
Поток 0   [===CORE===]
          (auth, layout)

Поток 1               [=======PIM=======]
                      (товары)

Поток 2               [======ORDERS=====]
                      (заказы)

Поток 3                                   [====MARKETPLACE====]
                                          (OZON)

Deploy                                                    [PROD]

Можно запускать параллельно: Поток 1 (PIM) + Поток 2 (ORDERS) после готовности CORE.


СЛЕДУЮЩИЙ ШАГ

  1. Создать структуру projects/pro1/ с подпроектами
  2. Написать TZ.md для каждого подпроекта
  3. Настроить Docker на DEV-PROD-RF

Начинаем?