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

type: standard
aspect: policy
title: "Разделение КОД / ДАННЫЕ"
version: 1.0.0
date: 2026-02-19
status: active


Разделение КОД / ДАННЫЕ

Версия: 3.0.0
Дата: 2025-12-23
Статус: ОБЯЗАТЕЛЬНО


ПРИНЦИП

WORKSPACE ($WORKSPACE)  = ИСХОДНИКИ  → git, разработка
DATASPACE ($DATASPACE)  = ДАННЫЕ     → S3, без git
                        + РЕЛИЗЫ     → сборки для деплоя

ГДЕ ЧТО ХРАНИТСЯ

WORKSPACE (git-трекинг)

Тип Расширения Примеры
Код .py, .sh, .js, .ts, .go Скрипты, приложения
Конфиги .yaml, .json, .toml Настройки (без секретов!)
Документация .md, .rst, .txt README, CLAUDE.md, спецификации
Шаблоны .html, .jinja2, .sql Шаблоны (без данных)
Примеры .example, .sample config.json.example

Максимальный размер файла: 100KB (мягкий лимит), 1MB (жёсткий)

DATASPACE (S3, без git)

Тип Расширения Примеры
Изображения .jpg, .png, .gif, .webp, .svg Фото товаров, скриншоты
Документы .pdf, .docx, .doc Сертификаты, договоры
Таблицы данных .xlsx, .xls, .csv Прайсы, отчёты, экспорты
Дампы данных .json (>1MB) Экспорты API, номенклатура
Медиа .mp4, .mp3, .avi Видео, аудио
Архивы .zip, .tar.gz, .rar Любые архивы
Бэкапы .sql.gz, .dump Дампы БД
Релизы .zip Сборки модулей для деплоя

СТРУКТУРА

$WORKSPACE/                          $DATASPACE/
├── architect/     100% КОД          
├── system/        100% КОД          ├── projects/               ДАННЫЕ проектов
├── infra/         100% КОД             ├── pirotehnika/
├── library/       100% КОД                ├── inbox/          входящие
   ├── _draft/                            ├── prices/         прайсы xlsx
   ├── _beta/                             ├── images/         фото товаров
   ├── connectors/                        └── archive/        старое
   ├── extensions/                     └── lideravto/
   └── applications/                       └── ...
                                    
└── projects/                        └── releases/               РЕЛИЗЫ (сборки)
    ├── my/            личные           ├── connectors/
    └── org/           организации         └── ozon/
        ├── pirotehnika/                        ├── v1.0.zip
           ├── CLAUDE.md     КОД              └── latest.zip
           ├── data/         КОД       ├── extensions/
           └── app/          КОД          └── cms/cs-cart/
        └── lideravto/                          └── smart_images/
            └── ...                                 ├── v2.0.zip
                                                    └── v2.1.zip
                                         └── applications/
                                             └── ...

ВАЖНО:
- Папка data/ в git — это КОД ПРО данные, а не сами данные
- Папка releases/ — готовые сборки для деплоя на серверы

Папка Содержит Примеры
library/ в git Исходники модулей src/*.py, index.yaml
$DATASPACE/projects/ Бинарные данные prices/.xlsx, images/.jpg
$DATASPACE/releases/ Сборки для деплоя smart_images/v2.1.zip

ПРАВИЛА

1. Никаких бинарных файлов в git

# ЗАПРЕЩЕНО в $WORKSPACE:
*.jpg, *.png, *.gif, *.webp    # изображения
*.pdf, *.docx, *.doc           # документы
*.xlsx, *.xls                  # таблицы
*.mp4, *.mp3                   # медиа
*.zip, *.tar.gz, *.rar         # архивы

2. Большие JSON → DATASPACE

# Если файл > 1MB — перемещаем в DATASPACE
mv large_export.json $DATASPACE/projects/myproject/exports/

3. Данные с сайтов → _inbox

# Все загрузки сначала в _inbox
$DATASPACE/projects/pirotehnika/_inbox/

4. Секреты → .gitignore

# Обязательно в .gitignore:
.env
.credentials.md
**/config.json      # содержит пароли
**/api_config.json  # содержит токены

5. Симлинки для удобства

# В проекте можно создать симлинк на данные
ln -s $DATASPACE/projects/pirotehnika/prices ./prices
# Но симлинк в .gitignore!

ПРОВЕРКА СООТВЕТСТВИЯ

Найти нарушения в workspace

# Бинарные файлы
find $WORKSPACE -type f \( \
    -name "*.jpg" -o -name "*.png" -o -name "*.gif" -o \
    -name "*.pdf" -o -name "*.xlsx" -o -name "*.xls" \
\) 2>/dev/null | wc -l

# Большие файлы (>1MB)
find $WORKSPACE -type f -size +1M 2>/dev/null | head -20

Проверить размер git

du -sh $WORKSPACE/.git/
# Должен быть < 100MB для чистого репо

МИГРАЦИЯ СУЩЕСТВУЮЩИХ ДАННЫХ

Шаг 1: Скопировать в DATASPACE

# Прайсы
rsync -av SOURCE/prices/ $DATASPACE/projects/PROJECT/prices/

# Изображения
rsync -av SOURCE/images/ $DATASPACE/projects/PROJECT/images/

Шаг 2: Удалить из workspace

rm -rf $WORKSPACE/projects/PROJECT/старая_папка_с_данными/

Шаг 3: Очистить git history (опционально)

# Осторожно! Только после бэкапа!
git filter-repo --path projects/PROJECT/старая_папка --invert-paths
git gc --aggressive --prune=now

МОНИТОРИНГ

Автопроверка (cron)

# Добавить в cron
0 6 * * * $WORKSPACE/infra/@backup.service/scripts/check-data-separation.sh

Скрипт проверки

#!/bin/bash
VIOLATIONS=$(find $WORKSPACE -type f \( -name "*.jpg" -o -name "*.pdf" -o -name "*.xlsx" \) | wc -l)
if [ "$VIOLATIONS" -gt 0 ]; then
    echo "WARNING: $VIOLATIONS binary files in workspace!"
fi

ИСКЛЮЧЕНИЯ

Путь Причина
archive/ Исторический архив (read-only)
*.svg Векторная графика в документации
*.ico Иконки приложений
fonts/ Шрифты для веб-приложений

Версия: 3.0.0