type: standard
aspect: lifecycle
title: "Жизненный цикл данных (Data Lifecycle)"
version: 1.0.0
date: 2026-02-19
status: active
Версия: 1.0.0
Дата: 2025-12-20
Статус: active
Стандарт управления состояниями бинарных данных в проектах.
Применяется к: файлы которые не версионируются в git (xlsx, csv, pdf, jpg, mp4 и т.д.)
Не применяется к: код, документация (.md), конфигурации — для них достаточно git.
┌─────────┐ ┌─────────┐ ┌─────────┐
│ inbox │ ──────► │ work │ ──────► │ archive │
│ (новые) │ │(рабочие)│ │ (старые)│
└─────────┘ └─────────┘ └─────────┘
▲ │
│ ◄─────────────────────────── │
│ (при необходимости) │
└────────────────────────────────────────┘
| Состояние | Описание | Действия |
|---|---|---|
| inbox | Новые, необработанные | Загрузка, ожидание обработки |
| work | Рабочие, актуальные | Использование, обновление |
| archive | Старые, устаревшие | Хранение для истории |
data/
├── inbox/ ← Входящие файлы
├── prices/ ← Рабочие прайсы
├── images/ ← Рабочие изображения
├── exports/ ← Рабочие выгрузки
└── archive/ ← Архив
├── 2025-12/
└── 2025-11/
$DATASPACE/projects/{project}/
├── inbox/ ← Входящие (загрузка через upload.0kt.ru)
├── prices/ ← Рабочие прайсы
├── images/ ← Рабочие изображения
├── exports/ ← Выгрузки
├── products/ ← Данные товаров
└── archive/ ← Архив
└── {YYYY-MM}/
Когда: файл обработан и готов к использованию
Как:
1. Обработать файл (парсинг, валидация)
2. Переименовать по стандарту: {source}_{YYYY-MM-DD}.{ext}
3. Переместить в соответствующую рабочую папку
4. Удалить из inbox
Пример:
inbox/price_new.xlsx
↓ (обработан)
prices/jf_2025-12-20.xlsx
Когда: файл устарел, появилась новая версия
Как:
1. Переместить старый файл в archive/{YYYY-MM}/
2. Добавить новый файл в work
Пример:
prices/jf_2025-11-15.xlsx
↓ (новая версия)
archive/2025-11/jf_2025-11-15.xlsx
prices/jf_2025-12-20.xlsx ← новый
Когда: нужно восстановить старую версию
Как:
1. Скопировать (не перемещать) из archive
2. Переименовать с актуальной датой
{source}_{YYYY-MM-DD}.{ext}
{source}_{YYYY-MM-DD}_{suffix}.{ext}
Примеры:
jf_2025-12-20.xlsx ← прайс JF от 20.12.2025
maxsem_2025-12-20.xlsx ← прайс Maxsem от 20.12.2025
ozon_orders_2025-12-20.csv ← заказы OZON от 20.12.2025
archive/{YYYY-MM}/
Примеры:
archive/2025-12/
archive/2025-11/
archive/2025-10/
# data/scripts/process_inbox.py
def process_inbox():
"""Обработать все файлы в inbox/"""
for file in inbox_dir.iterdir():
if is_price(file):
process_price(file)
move_to_work(file, 'prices/')
elif is_image(file):
process_image(file)
move_to_work(file, 'images/')
# data/scripts/archive_old.py
def archive_old(days=30):
"""Переместить файлы старше N дней в архив"""
cutoff = datetime.now() - timedelta(days=days)
for folder in ['prices/', 'images/', 'exports/']:
for file in folder.iterdir():
if file.stat().st_mtime < cutoff.timestamp():
archive_file(file)
| Метрика | Порог | Действие |
|---|---|---|
| Файлов в inbox | >10 | Обработать |
| Размер archive | >5GB | Очистить старое |
| Файлов без даты | >0 | Переименовать |
# Проверить inbox
ls -la $DATASPACE/projects/pirotehnika/inbox/
# Размер архива
du -sh $DATASPACE/projects/pirotehnika/archive/
# Файлы старше 90 дней
find $DATASPACE/projects/pirotehnika/archive/ -mtime +90
$DATASPACE/projects/pirotehnika/
├── inbox/ ← Загрузка через upload.0kt.ru
├── prices/ ← Прайсы поставщиков
│ ├── jf_2025-12-20.xlsx
│ ├── maxsem_2025-12-20.xlsx
│ └── piroff_2025-12-20.xlsx
├── images/ ← Фото товаров
├── exports/ ← Выгрузки для OZON
├── products/ ← Данные 1С
└── archive/
├── 2025-12/
└── 2025-11/
$DATASPACE/projects/lideravto/
├── inbox/ ← Входящие
├── prices/ ← Прайсы BAZON
├── images/ ← Фото запчастей
└── archive/
| Стандарт | Связь |
|---|---|
| LINKS.md | Декларация источников данных |
| ../1-structure/structure-organization.md | Слой DATA в архитектуре |
| ../4-policy/policy-code-data-separation.md | Разделение код/данные |
| Дата | Версия | Изменения |
|---|---|---|
| 2025-12-20 | 1.0.0 | Создание стандарта |
Стандарт: architect/standards/DATA_LIFECYCLE.md