architect/_archive/2025-11-26-cleanup/projects-remote-beget-kondurov/projects/pirotehnika-opencart/IMAGE_RESTORATION_REPORT_2025-11-14.md

Отчёт: Восстановление фотографий pirotehnika.spb.ru

Дата: 2025-11-14
Проект: pirotehnika-opencart
Сервер: kondurov.beget.tech


📊 ИТОГОВАЯ СТАТИСТИКА

Восстановление из backup

До восстановления:
- ✅ Файлов существовало: 1,279
- ❌ Файлов отсутствовало: 90

После восстановления:
- ✅ Файлов существует: 1,363
- ❌ Файлов отсутствует: 6
- ✅ ВОССТАНОВЛЕНО: 84 ФАЙЛА!

Эффективность


🔍 ЧТО БЫЛО СДЕЛАНО

1. Диагностика проблемы

Обнаружено:
- Товаров в БД: 5,075
- Товаров без изображения: 300 (пустое поле)
- Товаров с no_image.png: ~3,396 (стандартная заглушка)
- Товаров с битыми ссылками: 90 (файлы отсутствуют)

Найден backup:
- Файл: import_files_backup_quality85_2025-11-14.tar.gz
- Размер: 4.9 GB
- Файлов: 3,725 изображений
- Создан: 14 ноября 2025 в 06:56

2. Анализ структуры

Текущая структура image/:

image/
├── catalog/           # 26 MB (в основном demo)
├── cache/            # Кэш миниатюр OpenCart
├── import_files/     # 1.1 GB, 4,179 файлов (ОСНОВНОЕ ХРАНИЛИЩЕ)
│   ├── 03/
│   ├── 04/
│   ├── ...
│   └── ff/
├── payment/
└── import_files_backup_quality85_2025-11-14.tar.gz  # 4.9 GB backup

Пути в БД:
- Формат: import_files/fc/fcbec4ac6efb11ee919d3cecefa69fd9_19c4898a8cba11ee919d3cecefa69fd9.png
- Структура: подпапки по первым 2 символам UUID

3. Восстановление файлов

Процесс:

  1. Создан список всех отсутствующих файлов (90 штук)
  2. Извлечены файлы из backup архива командой:
    bash tar -xzf import_files_backup_quality85_2025-11-14.tar.gz -T /tmp/missing_files.txt
  3. Восстановлено: 84 файла

Результат:
- ✅ Большинство файлов восстановлено из backup
- ❌ 6 файлов joker_JF_*.jpg отсутствуют в backup (никогда не были там)


❌ НЕРЕШЁННЫЕ ПРОБЛЕМЫ

6 файлов joker_JF_*.jpg

Список:
1. import_files/joker_JF_MCP-25.jpg (дублируется 2 раза)
2. import_files/joker_JF_TS14-40.jpg
3. import_files/joker_JF_CV30-72.jpg
4. import_files/joker_JF_CV20_25_30-100_01___31_.jpg
5. import_files/joker_JF_CV20_25_30_38-138.jpg

Проблема:
- Файлы отсутствуют в backup архиве
- Не найдены в старой версии сайта (/old/)
- Вероятно были удалены или никогда не загружались

Рекомендуемые действия:
1. Найти оригинальные изображения этих товаров
2. Загрузить через админку OpenCart
3. ИЛИ Поставить placeholder:
sql UPDATE oc_product SET image = 'no_image.png' WHERE image LIKE 'import_files/joker_JF_%';

300 товаров без изображений

Статус: Не обработано

Описание:
- 300 товаров имеют пустое поле image в БД
- Это товары, у которых изначально не было фото
- Требуется загрузка изображений вручную или через импорт

Рекомендуемые действия:
1. Экспортировать список товаров без изображений
2. Подготовить изображения для каждого товара
3. Загрузить через:
- Админку OpenCart (массовая загрузка)
- CSV импорт
- API OpenCart


📋 SQL ЗАПРОСЫ ДЛЯ ПРОВЕРКИ

Проверить товары без изображений

SELECT COUNT(*) as total,
       SUM(CASE WHEN image = '' OR image IS NULL THEN 1 ELSE 0 END) as no_image,
       SUM(CASE WHEN image = 'no_image.png' THEN 1 ELSE 0 END) as placeholder
FROM oc_product;

Список товаров с joker файлами

SELECT p.product_id, p.model, pd.name, p.image
FROM oc_product p
JOIN oc_product_description pd ON p.product_id = pd.product_id
WHERE p.image LIKE 'import_files/joker_JF_%'
ORDER BY p.product_id;

Проверить существование файлов (через PHP)

<?php
$db = new mysqli("localhost", "kondurov_pspb", "7Dl*9Gh2", "kondurov_pspb");
$base_path = "/home/k/kondurov/pirotehnika.spb.ru/public_html/image/";

$res = $db->query("SELECT COUNT(*) as total FROM oc_product WHERE image != '' AND image != 'no_image.png'");
$row = $res->fetch_assoc();
$total = $row['total'];

$res = $db->query("SELECT image FROM oc_product WHERE image != '' AND image != 'no_image.png'");
$missing = 0;
while($row = $res->fetch_assoc()) {
    if (!file_exists($base_path . $row["image"])) {
        $missing++;
    }
}

echo "Товаров с изображениями: $total\n";
echo "Битых ссылок: $missing\n";
echo "Исправных: " . ($total - $missing) . "\n";

✅ СЛЕДУЮЩИЕ ШАГИ

Приоритет 1: Исправить 6 joker файлов

  1. Найти оригинальные изображения или заменить placeholder
  2. Обновить БД или загрузить файлы

Приоритет 2: Загрузить фото для 300 товаров

  1. Экспортировать список товаров:
    sql SELECT p.product_id, p.model, pd.name FROM oc_product p JOIN oc_product_description pd ON p.product_id = pd.product_id WHERE p.image = '' OR p.image IS NULL;
  2. Подготовить изображения
  3. Массовая загрузка через админку

Приоритет 3: Очистить backup

После подтверждения что всё работает:

# Переместить backup в безопасное место
mv ~/pirotehnika.spb.ru/public_html/image/import_files_backup_quality85_2025-11-14.tar.gz \
   ~/backups/pirotehnika/

# Освободит 4.9 GB места

🔒 BACKUP И БЕЗОПАСНОСТЬ

Созданные backup файлы

  1. import_files_backup_quality85_2025-11-14.tar.gz
    - Размер: 4.9 GB
    - Расположение: ~/pirotehnika.spb.ru/public_html/image/
    - Содержит: 3,725 оригинальных изображений
    - Статус: ✅ Сохранён

  2. backup_security_2025-11-14/
    - Размер: 42 KB
    - Расположение: ~/pirotehnika.spb.ru/
    - Содержит: Удалённые файлы безопасности (info.php, install.php, etc)
    - Статус: ✅ Сохранён

Рекомендации


📊 ТЕХНИЧЕСКАЯ ИНФОРМАЦИЯ

База данных:
- Host: localhost
- Database: kondurov_pspb
- User: kondurov_pspb
- Password: 7Dl*9Gh2
- Prefix: oc_

Файловая система:
- Корень сайта: /home/k/kondurov/pirotehnika.spb.ru/public_html/
- Изображения: /home/k/kondurov/pirotehnika.spb.ru/public_html/image/
- Основное хранилище: image/import_files/ (4,179 файлов, 1.1 GB)

OpenCart:
- Версия: 3.0.3.7 (ocStore)
- Товаров: 5,075
- Структура изображений: UUID-based в подпапках по hex


📝 ИСТОРИЯ ИЗМЕНЕНИЙ

2025-11-14 (сегодня)

06:56 - Создан backup оригинальных изображений (4.9 GB)
Время неизвестно - Произведена оптимизация/сжатие изображений (quality85)
Сейчас - Восстановлено 84 из 90 отсутствующих файлов


Отчёт создан: 2025-11-14
Автор: Claude Code Workspace
Статус: ✅ Основные задачи выполнены (93.3% success rate)