architect/standards/4-policy/policy-data.md

type: standard
aspect: policy
title: "Политика хранения данных проектов"
version: 1.0.0
date: 2026-02-19
status: active


Политика хранения данных проектов

Версия: 1.1.0
Дата: 2025-12-18


Принцип разделения

$WORKSPACE = КОД (git)     → Что ДЕЛАЕТ система
$DATASPACE = ДАННЫЕ (S3)   → С чем РАБОТАЕТ система

Переменные окружения:

WORKSPACE=$WORKSPACE
DATASPACE=$DATASPACE

Файлы vs База данных

Принцип

ФАЙЛЫ ($DATASPACE)     → Неструктурированные, входящие, временные
БАЗА ДАННЫХ (NocoDB)   → Структурированные, рабочие, постоянные

Когда файлы

Тип данных Формат Пример
Входящие от поставщиков xlsx, csv Прайс-лист
Изображения jpg, png Фото товаров
Документы pdf, docx Договоры
Бэкапы sql, tar.gz Дампы БД
Временные/разовые любой Тестовые данные

Когда база данных

Тип данных Таблица Пример
Справочники Products, Categories Товары, категории
Транзакции Orders, Payments Заказы, платежи
Связи SKU_Mappings Связь артикулов
Аналитика Analytics_Daily Агрегаты по дням
Состояние Clients, Tasks CRM данные

Иерархия баз данных

┌─────────────────────────────────────────────────────────┐
│                    NocoDB Server                         │
│                  (data.0kt.ru:8443)                      │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  ┌─────────────────┐  ← ПЛАТФОРМА (общие)              │
│  │ Platform Base   │    - Users, Roles                  │
│  │                 │    - Settings                      │
│  └─────────────────┘    - Integrations                  │
│                                                         │
│  ┌─────────────────┐  ← БИЗНЕС (pirotehnika)           │
│  │ Пиротехника     │    - Products (4626)               │
│  │ pt7k98pv0fwi1el │    - SKU_Mappings (1702)          │
│  │                 │    - OZON_Orders                   │
│  │                 │    - PriceList                     │
│  └─────────────────┘    - Channel                       │
│                                                         │
│  ┌─────────────────┐  ← БИЗНЕС (mcrm)                  │
│  │ MCRM            │    - Clients (3087)                │
│  │ pkxgq45k5mwsdwh │    - Tasks                         │
│  │                 │    - Campaigns                     │
│  └─────────────────┘    - Messages                      │
│                                                         │
│  ┌─────────────────┐  ← БИЗНЕС (lideravto)             │
│  │ Лидер Авто      │    - Products                      │
│  │ (будущее)       │    - Categories                    │
│  └─────────────────┘    - Orders                        │
│                                                         │
└─────────────────────────────────────────────────────────┘

Уровни

Уровень База Что хранит
Платформа Platform Общие справочники, пользователи, настройки
Бизнес {business} Данные конкретного бизнеса
Проект (в рамках бизнеса) Отдельные таблицы с префиксом

Префиксы таблиц внутри базы бизнеса

Префикс Назначение Пример
(без) Общие сущности Products, Orders
ozon_ Данные OZON ozon_transactions
pim_ PIM система pim_attributes
sync_ Синхронизация sync_log

Поток данных: Файл → База

1. ВХОДЯЩИЕ           2. ОБРАБОТКА           3. ХРАНЕНИЕ

_inbox/price.xlsx    Python скрипт       NocoDB: Products
   (файл)              (парсинг)            (структурированно)

                                           
   archive/2025/                      SELECT/UPDATE
   (после обработки)                  (работа с данными)

Правила потока

  1. Файл в _inbox/ — точка входа
  2. Скрипт обрабатывает — парсит, валидирует
  3. Данные в БД — INSERT/UPSERT
  4. Файл в archive/ — после успешной обработки
  5. Работа только с БД — приложения читают из базы

Доступ к базам в коде

# NocoDB URL из окружения
NOCODB_URL = os.environ.get('NOCODB_URL')  # https://data.0kt.ru:8443

# База бизнеса из .env проекта
NOCODB_BASE_ID = os.environ.get('NOCODB_BASE_ID')  # pt7k98pv0fwi1el

# PostgreSQL напрямую (для аналитики)
DATABASE_URL = os.environ.get('DATABASE_URL')
# postgresql://user:pass@host:5432/nocodb

Что где хранится

$WORKSPACE (код, git)

Тип Расширения Примеры
Исходный код .py, .php, .js, .sh app/, scripts/
Конфиги (шаблоны) .example, .yaml, .json config.yaml, .env.example
Документация .md CLAUDE.md, README.md
SQL миграции .sql migrations/
Шаблоны .html, .jinja2 templates/
Тесты .py, .js tests/

$DATASPACE (данные, S3)

Тип Расширения Папка
Входящие файлы любые _inbox/
Прайсы/каталоги .xlsx, .csv prices/
Изображения .jpg, .png, .webp images/
Экспорты/отчёты .xlsx, .csv, .json exports/
Бэкапы .sql, .tar.gz, .zip backups/
Архив любые archive/{год}/

Стандартная структура проекта

$WORKSPACE/projects/{name}/

{name}/
├── CLAUDE.md           ← AI контекст
├── index.yaml          ← Метаданные
├── .env                ← Секреты (не в git!)
│
├── app/                ← Код приложения
├── scripts/            ← Утилиты
├── modules/            ← Модули/аддоны
├── docs/               ← Документация
└── management/         ← STATUS.md, TODO.md

$DATASPACE/projects/{name}/

{name}/
├── _inbox/              Входящие (необработанные)
├── prices/              Прайсы поставщиков
├── images/              Фото товаров
├── exports/             Выгрузки, отчёты
├── backups/             Бэкапы БД и файлов
└── archive/             Архив
    └── {год}/

Правила

1. Точка входа — _inbox/

Все внешние файлы сначала попадают в _inbox/:
- Прайсы от поставщиков
- Базы клиентов
- Документы от партнёров

После обработки — перемещаются в соответствующую папку или archive/.

2. Результаты скриптов — exports/

Всё что генерирует код:
- Отчёты
- Выгрузки для маркетплейсов
- Аналитика

3. Архивация по годам

archive/
├── 2024/
   ├── prices/
   └── exports/
└── 2025/

4. Никаких данных в $WORKSPACE

Если в git появился .xlsx, .csv, .jpg — это ошибка.
Исключение: тестовые fixtures (маленькие файлы для тестов).


Доступ к данным в коде

import os

DATASPACE = os.environ.get('DATASPACE')
WORKSPACE = os.environ.get('WORKSPACE')

# Данные
INBOX_DIR = os.path.join(DATASPACE, 'projects/myproject/_inbox')
PRICES_DIR = os.path.join(DATASPACE, 'projects/myproject/prices')
EXPORTS_DIR = os.path.join(DATASPACE, 'projects/myproject/exports')

# Код
PROJECT_DIR = os.path.join(WORKSPACE, 'projects/myproject')

Миграция существующих данных

При обнаружении данных в $WORKSPACE:

# 1. Создать структуру
mkdir -p $DATASPACE/projects/{name}/{_inbox,prices,images,exports,backups,archive}

# 2. Перенести данные
mv $WORKSPACE/projects/{name}/data/* $DATASPACE/projects/{name}/

# 3. Обновить пути в коде
# DATASPACE = os.environ.get('DATASPACE')

Проверка соответствия

# Не должно быть данных в WORKSPACE
find $WORKSPACE/projects -type f \( -name "*.xlsx" -o -name "*.csv" -o -name "*.xls" \) \
  | grep -v venv | grep -v node_modules

# Должно вернуть 0 файлов

Версия: 1.1.0