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)
Что: Исходный код, документация, конфигурация
Где: /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/)
Что: Структурированные данные, прайсы, файлы обработки
Где: /mnt/beget-s3
Хранение: S3 (Beget)
Backup: S3 versioning
Разрешено:
- Таблицы (.xlsx, .xls, .csv)
- Базы данных (.db, .sqlite)
- JSON данные (> 1MB)
- Архивы данных (.zip, .tar.gz)
- Логи приложений
- Бэкапы БД
Запрещено:
- Исходный код
- Массовые изображения (→ 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)
Запрещено:
- Код
- Конфиги
- Данные приложений
| Тип | Где | 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)
| Тип | Где | 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 (содержит секреты)
| Тип | Где | 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 (шаблон без секретов)
| Тип | Где | Git | Размер | Примеры |
|---|---|---|---|---|
.csv |
$DATASPACE | ❌ | > 100KB | Экспорты, данные |
.csv |
$WORKSPACE | ✅ | < 100KB | Fixtures, тестовые данные |
.xlsx, .xls |
$DATASPACE | ❌ | Любой | Прайс-листы, импорт |
.ods |
$DATASPACE | ❌ | Любой | LibreOffice таблицы |
Правило:
- Маленькие CSV (< 100KB) → $WORKSPACE
- Большие таблицы → $DATASPACE
| Тип | Где | 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 (векторная графика)
| Тип | Где | Git | Примеры |
|---|---|---|---|
.mp4 |
$MEDIASPACE | ❌ | Видео товаров, демо |
.avi, .mov |
$MEDIASPACE | ❌ | Исходники видео |
.webm |
$MEDIASPACE | ❌ | Веб-видео |
Правило: Видео ТОЛЬКО в $MEDIASPACE.
| Тип | Где | Git | Примеры |
|---|---|---|---|
.mp3 |
$MEDIASPACE | ❌ | Аудио-контент |
.wav |
$MEDIASPACE | ❌ | Исходники аудио |
Правило: Аудио ТОЛЬКО в $MEDIASPACE.
| Тип | Где | Git | Примеры |
|---|---|---|---|
.pdf |
$MEDIASPACE | ❌ | Инструкции, сертификаты |
.docx, .doc |
$MEDIASPACE | ❌ | Word документы |
.rtf |
$MEDIASPACE | ❌ | Rich Text |
Правило: Документы (бинарные) ТОЛЬКО в $MEDIASPACE.
| Тип | Где | Git | Примеры |
|---|---|---|---|
.html |
$WORKSPACE | ✅ | Шаблоны, статика |
.css |
$WORKSPACE | ✅ | Стили |
.less, .scss |
$WORKSPACE | ✅ | Препроцессоры |
.woff2, .ttf |
$WORKSPACE | ✅ | Веб-шрифты |
Правило: Исходники веб-ресурсов в $WORKSPACE.
| Тип | Где | Git | Примеры |
|---|---|---|---|
.twig |
$WORKSPACE | ✅ | Drupal шаблоны |
.tpl |
$WORKSPACE | ✅ | Smarty (CS-Cart) |
.j2 |
$WORKSPACE | ✅ | Jinja2 шаблоны |
Правило: Шаблоны в $WORKSPACE (это код).
| Тип | Где | Git | Примеры |
|---|---|---|---|
.sql |
$WORKSPACE | ✅ | Схемы, миграции |
.db, .sqlite |
$DATASPACE | ❌ | Локальные БД |
Правило:
- SQL-скрипты → $WORKSPACE (git)
- Файлы БД → $DATASPACE (не в 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
❌ ИЗОБРАЖЕНИЯ (массовые)
.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
Разрешено ТОЛЬКО:
✅ .svg (векторная графика, любой размер)
✅ .png < 50KB (иконки, favicon)
✅ .ico < 20KB (favicon)
Запрещено:
❌ .jpg (любой размер) → MEDIASPACE
❌ .png > 50KB → MEDIASPACE
❌ .gif → MEDIASPACE
❌ .webp → MEDIASPACE
Вся массовая графика:
✅ .jpg, .jpeg
✅ .png > 50KB
✅ .gif
✅ .webp
$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
README.md
CLAUDE.md
PROJECT.md
LICENSE
{name}.ai.md
architect.ai.md
pim.ai.md
.credentials.md
.env
schedule.yaml
config.json
settings.toml
backup.sh
sessions.py
__init__.py
client.py
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
Правильно:
# ✅ В 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
Где:
/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 минут
Где:
/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 минут
Где:
/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 минут
Текущий конфиг:
# /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 минут
Создать: .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
#!/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
Базовый шаблон для всех проектов:
# Зависимости
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 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
Версия: 1.0.0
Автор: Claude Opus (Architect)
Статус: ACTIVE