architect/standards/5-format/format-file-types.md

type: standard
aspect: format
title: "Стандарт типов файлов и размещения"
status: active
version: 1.0.0
date: 2026-02-19
owner: architect


Стандарт типов файлов и размещения

Жесткие, однозначные правила работы с файлами в платформе.


ЗАЧЕМ ЭТОТ ДОКУМЕНТ

Проблемы которые решает:
- Бинарные файлы в git (раздувают репозиторий)
- Медиа разбросаны по разным местам
- Нет четких правил "что куда класть"
- Нарушение принципа CODE/DATA separation

Принцип: Каждый тип файла имеет ОДНО место размещения.


ТРИ ЗОНЫ ХРАНЕНИЯ

export WORKSPACE=/opt/claude-workspace    # КОД (git)
export DATASPACE=/mnt/beget-s3            # ДАННЫЕ (S3)
export MEDIASPACE=$DATASPACE/media        # МЕДИА (S3)

WORKSPACE — Код

Что: Исходный код, документация, конфигурация
Где: /opt/claude-workspace
Хранение: Git
Backup: Git remote + бэкапы

Разрешено:
- Код (.py, .js, .ts, .php)
- Документация (.md, .txt)
- Конфигурация (.yaml, .json)
- Скрипты (.sh)
- Шаблоны (.twig, .tpl)
- Стили (.css, .less)
- Мелкая графика (.svg, .png < 50KB)

Запрещено:
- Бинарные данные
- Изображения > 50KB
- Видео, аудио
- Таблицы данных (.xlsx, .csv > 100KB)
- Зависимости (venv/, node_modules/)


DATASPACE — Данные

Что: Структурированные данные, прайсы, файлы обработки
Где: /mnt/beget-s3
Хранение: S3 (Beget)
Backup: S3 versioning

Разрешено:
- Таблицы (.xlsx, .xls, .csv)
- Базы данных (.db, .sqlite)
- JSON данные (> 1MB)
- Архивы данных (.zip, .tar.gz)
- Логи приложений
- Бэкапы БД

Запрещено:
- Исходный код
- Массовые изображения (→ MEDIASPACE)
- Видео (→ MEDIASPACE)


MEDIASPACE — Медиа

Что: Изображения, видео, документы (медиа-файлы)
Где: $DATASPACE/media = /mnt/beget-s3/media
Хранение: S3 (Beget)
Доступ: Через nginx proxy (files.0kt.ru/images/)

Структура:

$MEDIASPACE/
├── images/              ← изображения
│   ├── products/        ← товары
│   ├── categories/      ← категории
│   ├── logos/           ← логотипы
│   └── temp/            ← временные (auto-cleanup 30d)
├── video/               ← видео
├── audio/               ← аудио
└── documents/           ← PDF, DOCX

Разрешено:
- Изображения (.jpg, .png > 50KB, .webp, .gif)
- Видео (.mp4, .avi, .mov)
- Аудио (.mp3, .wav)
- Документы (.pdf, .docx, .doc)

Запрещено:
- Код
- Конфиги
- Данные приложений


11 КЛАССОВ ФАЙЛОВ

1. CODE — Исходный код

Тип Где Git Примеры
.py $WORKSPACE library/, system/, projects/
.js, .ts, .tsx $WORKSPACE system/agents/, infra/web/
.php $WORKSPACE projects/lideravto/ (CS-Cart)
.go, .c, .cpp $WORKSPACE Если используются

Правило: Исходный код ТОЛЬКО в $WORKSPACE (git).

Исключения:
- venv/ → ❌ НЕ в git (в .gitignore)
- node_modules/ → ❌ НЕ в git (в .gitignore)
- __pycache__/ → ❌ НЕ в git (в .gitignore)


2. DOCUMENTATION — Документация

Тип Где Git Примеры
.md $WORKSPACE CLAUDE.md, README.md, standards/
.ai.md $WORKSPACE system/agents/*.ai.md
.txt $WORKSPACE requirements.txt, .gitignore
.rst $WORKSPACE Документация Python

Правило: Вся документация в $WORKSPACE (git).

Исключения:
- .credentials.md → ❌ НЕ в git (содержит секреты)


3. CONFIGURATION — Конфигурация

Тип Где Git Примеры
.yaml, .yml $WORKSPACE system/config/, architect/index.yaml
.json $WORKSPACE package.json, tsconfig.json
.toml $WORKSPACE pyproject.toml
.ini, .conf $WORKSPACE Конфиги приложений

Правило: Конфигурация в $WORKSPACE (git).

Исключения:
- .env → ❌ НЕ в git (секреты)
- .env.example → ✅ В git (шаблон без секретов)


4. DATA — Структурированные данные

Тип Где Git Размер Примеры
.csv $DATASPACE > 100KB Экспорты, данные
.csv $WORKSPACE < 100KB Fixtures, тестовые данные
.xlsx, .xls $DATASPACE Любой Прайс-листы, импорт
.ods $DATASPACE Любой LibreOffice таблицы

Правило:
- Маленькие CSV (< 100KB) → $WORKSPACE
- Большие таблицы → $DATASPACE


5. IMAGES — Изображения

Тип Где Git Размер Примеры
.svg $WORKSPACE Любой Иконки, логотипы
.png $WORKSPACE < 50KB Favicon, мелкие иконки
.png $MEDIASPACE > 50KB Скриншоты, UI
.jpg, .jpeg $MEDIASPACE Любой Фото товаров
.webp $MEDIASPACE Любой Оптимизированные изображения
.gif $MEDIASPACE Любой Анимация
.ico $WORKSPACE < 20KB Favicon

ЖЕСТКОЕ ПРАВИЛО:

.jpg  ТОЛЬКО $MEDIASPACE (NO EXCEPTIONS)
.png  $WORKSPACE если < 50KB, иначе $MEDIASPACE
.svg  ТОЛЬКО $WORKSPACE (векторная графика)

6. VIDEO — Видео

Тип Где Git Примеры
.mp4 $MEDIASPACE Видео товаров, демо
.avi, .mov $MEDIASPACE Исходники видео
.webm $MEDIASPACE Веб-видео

Правило: Видео ТОЛЬКО в $MEDIASPACE.


7. AUDIO — Аудио

Тип Где Git Примеры
.mp3 $MEDIASPACE Аудио-контент
.wav $MEDIASPACE Исходники аудио

Правило: Аудио ТОЛЬКО в $MEDIASPACE.


8. DOCUMENTS — Документы

Тип Где Git Примеры
.pdf $MEDIASPACE Инструкции, сертификаты
.docx, .doc $MEDIASPACE Word документы
.rtf $MEDIASPACE Rich Text

Правило: Документы (бинарные) ТОЛЬКО в $MEDIASPACE.


9. WEB — Веб-ресурсы

Тип Где Git Примеры
.html $WORKSPACE Шаблоны, статика
.css $WORKSPACE Стили
.less, .scss $WORKSPACE Препроцессоры
.woff2, .ttf $WORKSPACE Веб-шрифты

Правило: Исходники веб-ресурсов в $WORKSPACE.


10. TEMPLATES — Шаблоны

Тип Где Git Примеры
.twig $WORKSPACE Drupal шаблоны
.tpl $WORKSPACE Smarty (CS-Cart)
.j2 $WORKSPACE Jinja2 шаблоны

Правило: Шаблоны в $WORKSPACE (это код).


11. DATABASES — Базы данных

Тип Где Git Примеры
.sql $WORKSPACE Схемы, миграции
.db, .sqlite $DATASPACE Локальные БД

Правило:
- SQL-скрипты → $WORKSPACE (git)
- Файлы БД → $DATASPACE (не в git)


БЕЛЫЙ СПИСОК (разрешено в git)

 КОД
.py .js .ts .tsx .jsx .php .go .c .cpp .h .sh .bat .ps1

 ДОКУМЕНТАЦИЯ
.md .ai.md .txt .rst

 КОНФИГУРАЦИЯ
.yaml .yml .json .toml .ini .conf .xml .env.example

 WEB
.html .css .less .scss .svg .woff2 .ttf

 ШАБЛОНЫ
.twig .tpl .j2

 SQL
.sql

 МЕЛКАЯ ГРАФИКА
.svg (любой размер)
.png (< 50KB)
.ico (< 20KB)

 СПЕЦИАЛЬНЫЕ
.gitignore .gitkeep .editorconfig
Dockerfile Makefile LICENSE README

ЧЕРНЫЙ СПИСОК (запрещено в git)

 ИЗОБРАЖЕНИЯ (массовые)
.jpg .jpeg .gif .webp
.png (> 50KB)

 МЕДИА
.mp4 .avi .mov .mp3 .wav

 ДОКУМЕНТЫ
.pdf .docx .doc .rtf

 ДАННЫЕ
.xlsx .xls .ods
.csv (> 100KB)

 БАЗЫ ДАННЫХ
.db .sqlite

 АРХИВЫ ДАННЫХ
.zip .tar .gz (если содержат данные, не код)

 CREDENTIALS
.env .key .pem (приватные)

 ВРЕМЕННЫЕ
.pyc .log .tmp .cache

 ЗАВИСИМОСТИ
venv/ node_modules/ __pycache__/
.so .exe .pak

ПРАВИЛА ПО РАЗМЕРАМ

Размер Где Правило
< 50 KB $WORKSPACE (git) Можно коммитить
50 KB - 1 MB $WORKSPACE или $DATASPACE Только если критично важно
> 1 MB $DATASPACE или $MEDIASPACE Запрещено в git

Исключения:
- Статичные активы инфры (.js.gz, .css.br) → допустимо в git
- Шрифты (.woff2) → допустимо в git


ПРАВИЛА ПО ИЗОБРАЖЕНИЯМ

В git (WORKSPACE)

Разрешено ТОЛЬКО:

✅ .svg (векторная графика, любой размер)
✅ .png < 50KB (иконки, favicon)
✅ .ico < 20KB (favicon)

Запрещено:

❌ .jpg (любой размер) → MEDIASPACE
❌ .png > 50KB → MEDIASPACE
❌ .gif → MEDIASPACE
❌ .webp → MEDIASPACE

В MEDIASPACE

Вся массовая графика:

✅ .jpg, .jpeg
✅ .png > 50KB
✅ .gif
✅ .webp

СТРУКТУРА $MEDIASPACE

$MEDIASPACE/                    = /mnt/beget-s3/media/
├── images/
│   ├── products/               ← изображения товаров
│   │   ├── 001234.jpg
│   │   └── 001235.jpg
│   ├── categories/             ← изображения категорий
│   ├── logos/                  ← логотипы
│   ├── banners/                ← баннеры
│   └── temp/                   ← временные (auto-cleanup)
│
├── video/                      ← видео
│   ├── products/
│   └── demo/
│
├── audio/                      ← аудио
│
└── documents/                  ← PDF, DOCX
    ├── certificates/
    ├── manuals/
    └── contracts/

Доступ через nginx:

https://files.0kt.ru/images/products/001234.jpg
→ nginx proxy
→ /mnt/beget-s3/media/images/products/001234.jpg

ИМЕНОВАНИЕ ФАЙЛОВ

Документы (UPPERCASE)

README.md
CLAUDE.md
PROJECT.md
LICENSE

Агенты

{name}.ai.md
architect.ai.md
pim.ai.md

Credentials (скрытые)

.credentials.md
.env

Конфиги (lowercase)

schedule.yaml
config.json
settings.toml

Код (snake_case)

backup.sh
sessions.py
__init__.py
client.py

Модули PHP

addon.xml
init.php
func.php

ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ

Добавить изображение товара

Неправильно:

# ❌ В git
cp product.jpg /opt/claude-workspace/projects/pirotehnika/images/
git add images/product.jpg

Правильно:

# ✅ В MEDIASPACE
cp product.jpg $MEDIASPACE/images/products/12345.jpg
# Доступ: https://files.0kt.ru/images/products/12345.jpg

Добавить прайс-лист

Неправильно:

# ❌ В git
cp price.xlsx /opt/claude-workspace/projects/pirotehnika/data/

Правильно:

# ✅ В DATASPACE
cp price.xlsx $DATASPACE/projects/pirotehnika/inbox/price_2026-02-19.xlsx

Добавить иконку (< 50KB)

Правильно:

# ✅ В git (если < 50KB)
cp favicon.png /opt/claude-workspace/infra/web/assets/
git add infra/web/assets/favicon.png

Добавить конфигурацию

Правильно:

# ✅ В git
vim /opt/claude-workspace/system/config/new-service.yaml
git add system/config/new-service.yaml

МИГРАЦИЯ ТЕКУЩИХ ПРОБЛЕМ

Проблема 1: 156 .jpg в git (pirotehnika)

Где:

/opt/claude-workspace/projects/org/pirotehnika/
├── app/*/images/*.jpg
└── data/images/*.jpg

Решение:

# 1. Найти все .jpg
find /opt/claude-workspace/projects/org/pirotehnika -name "*.jpg" -type f

# 2. Переместить в MEDIASPACE
mkdir -p $MEDIASPACE/images/products
mv найденные.jpg $MEDIASPACE/images/products/

# 3. Обновить пути в коде (если есть хардкод)
# Заменить: /opt/claude-workspace/projects/org/pirotehnika/images/
# На: $MEDIASPACE/images/products/
# Или URL: https://files.0kt.ru/images/products/

# 4. Удалить из git
git rm --cached app/*/images/*.jpg data/images/*.jpg

# 5. Добавить в .gitignore
echo "*.jpg" >> .gitignore

# 6. Коммит
git commit -m "chore: Move .jpg to MEDIASPACE"

Оценка: 15 минут


Проблема 2: 32 .xlsx в git (pirotehnika)

Где:

/opt/claude-workspace/projects/org/pirotehnika/data/*.xlsx

Решение:

# 1. Найти все .xlsx
find /opt/claude-workspace/projects/org/pirotehnika -name "*.xlsx" -type f

# 2. Переместить в DATASPACE
mkdir -p $DATASPACE/projects/pirotehnika/inbox
mv найденные.xlsx $DATASPACE/projects/pirotehnika/inbox/

# 3. Обновить пути в скриптах
# Заменить: /opt/claude-workspace/.../data/file.xlsx
# На: $DATASPACE/projects/pirotehnika/inbox/file.xlsx

# 4. Удалить из git
git rm --cached data/*.xlsx

# 5. Добавить в .gitignore
echo "*.xlsx" >> .gitignore
echo "*.xls" >> .gitignore

# 6. Коммит
git commit -m "chore: Move .xlsx to DATASPACE"

Оценка: 10 минут


Проблема 3: venv в git (6000+ файлов)

Где:

/opt/claude-workspace/projects/org/pirotehnika/app/*/venv/

Решение:

cd /opt/claude-workspace/projects/org/pirotehnika

# 1. Создать requirements.txt
pip freeze > requirements.txt

# 2. Добавить в .gitignore
echo "venv/" >> .gitignore
echo "**/__pycache__/" >> .gitignore
echo "*.pyc" >> .gitignore

# 3. Удалить из git (НЕ удаляет локально)
git rm -r --cached app/*/venv/

# 4. Коммит
git commit -m "chore: Remove venv from git

- Use requirements.txt instead
- Add proper .gitignore rules
"

# 5. Пересоздать venv (на других машинах)
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt

Оценка: 20 минут


Проблема 4: Nginx неправильный путь

Текущий конфиг:

# /etc/nginx/sites-enabled/files.0kt.ru
location /images/ {
    alias /mnt/beget-s3/projects/pirotehnika/images/;  # ← НЕПРАВИЛЬНО
}

Решение:

# 1. Исправить nginx конфиг
sudo vim /etc/nginx/sites-enabled/files.0kt.ru

# Заменить:
# alias /mnt/beget-s3/projects/pirotehnika/images/;
# На:
# alias /mnt/beget-s3/media/images/;

# 2. Проверить синтаксис
sudo nginx -t

# 3. Перезагрузить
sudo systemctl reload nginx

# 4. Проверить
curl -I https://files.0kt.ru/images/

Правильный конфиг:

location /images/ {
    alias /mnt/beget-s3/media/images/;
    autoindex on;
    charset utf-8;

    # CORS для OZON
    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Methods "GET, OPTIONS";

    # Cache
    expires 30d;
    add_header Cache-Control "public, immutable";
}

Оценка: 5 минут


PRE-COMMIT HOOKS (примеры)

Блокировка запрещенных типов

Создать: .git/hooks/pre-commit

#!/bin/bash

# Список запрещенных расширений
BLACKLIST=".jpg .jpeg .xlsx .pdf .mp4 .db .sqlite"

echo "Проверка запрещенных файлов..."

# Проверка staged файлов
for ext in $BLACKLIST; do
  FILES=$(git diff --cached --name-only --diff-filter=A | grep "$ext$")

  if [ -n "$FILES" ]; then
    echo "❌ ОШИБКА: Попытка добавить $ext файл в git:"
    echo "$FILES"
    echo ""
    echo "Файлы $ext запрещены в git."
    echo "Используйте \$DATASPACE или \$MEDIASPACE."
    exit 1
  fi
done

echo "✅ Проверка пройдена"
exit 0

Установка:

chmod +x .git/hooks/pre-commit

Проверка размера файлов

#!/bin/bash

MAX_SIZE=1048576  # 1MB в байтах

echo "Проверка размера файлов..."

# Проверка staged файлов
git diff --cached --name-only --diff-filter=A | while read file; do
  if [ -f "$file" ]; then
    size=$(stat -f%z "$file" 2>/dev/null || stat -c%s "$file" 2>/dev/null)

    if [ $size -gt $MAX_SIZE ]; then
      echo "❌ ОШИБКА: Файл $file превышает 1MB ($size байт)"
      echo "Переместите в \$DATASPACE или \$MEDIASPACE"
      exit 1
    fi
  fi
done

echo "✅ Проверка пройдена"
exit 0

Проверка .png размера

#!/bin/bash

MAX_PNG_SIZE=51200  # 50KB

echo "Проверка размера .png..."

git diff --cached --name-only --diff-filter=A | grep "\.png$" | while read file; do
  if [ -f "$file" ]; then
    size=$(stat -f%z "$file" 2>/dev/null || stat -c%s "$file" 2>/dev/null)

    if [ $size -gt $MAX_PNG_SIZE ]; then
      echo "❌ ОШИБКА: .png файл $file превышает 50KB ($size байт)"
      echo "Переместите в \$MEDIASPACE/images/"
      exit 1
    fi
  fi
done

echo "✅ .png проверка пройдена"
exit 0

.gitignore ШАБЛОН

Базовый шаблон для всех проектов:

# Зависимости
venv/
node_modules/
__pycache__/

# Компиляция
*.pyc
*.pyo
*.so
*.exe

# Базы данных
*.db
*.sqlite
*.sqlite3

# Credentials
.env
*.key
*.pem
.credentials.md

# Временные
*.log
*.tmp
*.cache
.DS_Store
Thumbs.db

# Изображения (массовые)
*.jpg
*.jpeg
*.gif
*.webp

# Данные
*.xlsx
*.xls
*.ods

# Медиа
*.mp4
*.avi
*.mov
*.mp3
*.wav

# Документы
*.pdf
*.docx
*.doc

# Архивы данных
*.zip
*.tar.gz

# IDE
.idea/
.vscode/
*.swp
*.swo

# Исключения (разрешены маленькие PNG и SVG)
!*.svg
!favicon.png
!logo.png

ПРОВЕРКА СОБЛЮДЕНИЯ

Аудит git репозитория

# Найти все запрещенные файлы в git
git ls-files | grep -E '\.(jpg|jpeg|xlsx|mp4|db)$'

# Если вывод не пустой → нарушение стандарта

Аудит по размеру

# Найти файлы > 1MB в git
git ls-files | while read file; do
  size=$(git cat-file -s $(git ls-tree HEAD "$file" | awk '{print $3}') 2>/dev/null)
  if [ $size -gt 1048576 ]; then
    echo "$file: $size bytes"
  fi
done

CHANGELOG

2026-02-19 — v1.0.0


ССЫЛКИ


Версия: 1.0.0
Автор: Claude Opus (Architect)
Статус: ACTIVE