Версия: 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-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/ │
└─────────────────┘
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.
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).
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.
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.
projects/pro1/
└── @crm/
├── CLAUDE.md
├── TZ.md
├── SCHEMA.md ← Схема таблиц (crm_*)
└── solution/
└── app/modules/crm/
Зависимости: CORE, ORDERS.
Источник: mcrm/.
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 |
-- Уже есть (не трогаем структуру)
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://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"
[ ] Создать структуру projects/pro1/
[ ] Настроить Docker на DEV-PROD-RF
[ ] Создать домены pro.dev.0kt.ru, pro.0kt.ru
[ ] Подключить S3 mount
[ ] Перенести auth из pro1/@admin.service
[ ] Создать base layout (sidebar, header)
[ ] Настроить SQLAlchemy к NocoDB PostgreSQL
[ ] Login/logout UI
[ ] Тест на DEV
[ ] Модели pim_products, pim_categories
[ ] API: GET /pim/products, GET /pim/products/{id}
[ ] UI: Список товаров с фильтрами
[ ] UI: Карточка товара
[ ] Тест
[ ] Перенести код из @mp1.service
[ ] Универсальная модель ord_orders
[ ] API: GET /orders, GET /orders/{id}
[ ] UI: Список заказов
[ ] UI: Детали заказа
[ ] Перенести OZON client из @ozon.api
[ ] Синхронизация заказов
[ ] Этикетки (PDF)
[ ] Отгрузка
[ ] UI: страница синхронизации
[ ] 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.
projects/pro1/ с подпроектамиНачинаем?